mt-lang 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/milk_tea/base.rb +1 -1
  3. data/lib/milk_tea/core/c_backend/expressions.rb +6 -1
  4. data/lib/milk_tea/core/c_backend/feature_detection.rb +27 -55
  5. data/lib/milk_tea/core/c_backend/format_helpers.rb +551 -0
  6. data/lib/milk_tea/core/c_backend/runtime_helpers.rb +0 -542
  7. data/lib/milk_tea/core/c_backend/statements.rb +4 -0
  8. data/lib/milk_tea/core/c_backend/type_collectors.rb +51 -204
  9. data/lib/milk_tea/core/c_backend.rb +10 -0
  10. data/lib/milk_tea/core/compatibility_helpers.rb +1 -1
  11. data/lib/milk_tea/core/compile_time.rb +19 -1
  12. data/lib/milk_tea/core/ir.rb +3 -1
  13. data/lib/milk_tea/core/lowering/async/lowering.rb +147 -141
  14. data/lib/milk_tea/core/lowering/block.rb +761 -726
  15. data/lib/milk_tea/core/lowering/declarations.rb +2 -1
  16. data/lib/milk_tea/core/lowering/expressions.rb +94 -0
  17. data/lib/milk_tea/core/lowering/loops.rb +49 -0
  18. data/lib/milk_tea/core/lowering/resolve.rb +222 -215
  19. data/lib/milk_tea/core/lowering/utils.rb +0 -222
  20. data/lib/milk_tea/core/module_loader.rb +29 -48
  21. data/lib/milk_tea/core/parser/declarations.rb +2 -2
  22. data/lib/milk_tea/core/parser/recovery.rb +1 -1
  23. data/lib/milk_tea/core/parser.rb +1 -1
  24. data/lib/milk_tea/core/semantic_analyzer/expressions.rb +3 -120
  25. data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +116 -113
  26. data/lib/milk_tea/core/semantic_analyzer/generics.rb +346 -343
  27. data/lib/milk_tea/core/semantic_analyzer/statements.rb +37 -12
  28. data/lib/milk_tea/core/semantic_analyzer/top_level.rb +23 -0
  29. data/lib/milk_tea/core/types/predicates.rb +501 -499
  30. data/lib/milk_tea/core/types/visitor.rb +1 -1
  31. data/lib/milk_tea/tooling/error_formatter.rb +18 -14
  32. data/std/mem/ptr.mt +9 -0
  33. metadata +3 -2
@@ -483,45 +483,52 @@ module MilkTea
483
483
  proc_types
484
484
  end
485
485
 
486
- def collect_proc_types_from_statements(statements, proc_types, visited)
487
- statements.each do |statement|
488
- case statement
486
+ def each_ir_statement_for_type_collection(statements, type_collector_method:, expression_walker_method:, accumulator:, visited:)
487
+ statements.each do |stmt|
488
+ case stmt
489
489
  when IR::LocalDecl
490
- collect_proc_type(statement.type, proc_types, visited)
491
- collect_proc_types_from_expression(statement.value, proc_types, visited)
490
+ send(type_collector_method, stmt.type, accumulator, visited)
491
+ send(expression_walker_method, stmt.value, accumulator, visited) if stmt.value
492
492
  when IR::Assignment
493
- collect_proc_types_from_expression(statement.target, proc_types, visited)
494
- collect_proc_types_from_expression(statement.value, proc_types, visited)
493
+ send(expression_walker_method, stmt.target, accumulator, visited)
494
+ send(expression_walker_method, stmt.value, accumulator, visited)
495
495
  when IR::BlockStmt
496
- collect_proc_types_from_statements(statement.body, proc_types, visited)
496
+ each_ir_statement_for_type_collection(stmt.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
497
497
  when IR::WhileStmt
498
- collect_proc_types_from_expression(statement.condition, proc_types, visited)
499
- collect_proc_types_from_statements(statement.body, proc_types, visited)
498
+ send(expression_walker_method, stmt.condition, accumulator, visited)
499
+ each_ir_statement_for_type_collection(stmt.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
500
500
  when IR::ForStmt
501
- collect_proc_types_from_statements([statement.init], proc_types, visited)
502
- collect_proc_types_from_expression(statement.condition, proc_types, visited)
503
- collect_proc_types_from_statements(statement.body, proc_types, visited)
504
- collect_proc_types_from_statements([statement.post], proc_types, visited)
501
+ each_ir_statement_for_type_collection([stmt.init], type_collector_method:, expression_walker_method:, accumulator:, visited:)
502
+ send(expression_walker_method, stmt.condition, accumulator, visited)
503
+ each_ir_statement_for_type_collection(stmt.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
504
+ each_ir_statement_for_type_collection([stmt.post], type_collector_method:, expression_walker_method:, accumulator:, visited:)
505
505
  when IR::IfStmt
506
- collect_proc_types_from_expression(statement.condition, proc_types, visited)
507
- collect_proc_types_from_statements(statement.then_body, proc_types, visited)
508
- collect_proc_types_from_statements(statement.else_body, proc_types, visited) if statement.else_body
506
+ send(expression_walker_method, stmt.condition, accumulator, visited)
507
+ each_ir_statement_for_type_collection(stmt.then_body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
508
+ each_ir_statement_for_type_collection(stmt.else_body, type_collector_method:, expression_walker_method:, accumulator:, visited:) if stmt.else_body
509
509
  when IR::SwitchStmt
510
- collect_proc_types_from_expression(statement.expression, proc_types, visited)
511
- statement.cases.each do |switch_case|
512
- collect_proc_types_from_statements(switch_case.body, proc_types, visited)
510
+ send(expression_walker_method, stmt.expression, accumulator, visited)
511
+ stmt.cases.each do |switch_case|
512
+ each_ir_statement_for_type_collection(switch_case.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
513
513
  end
514
514
  when IR::StaticAssert
515
- collect_proc_types_from_expression(statement.condition, proc_types, visited)
516
- collect_proc_types_from_expression(statement.message, proc_types, visited)
515
+ send(expression_walker_method, stmt.condition, accumulator, visited)
516
+ send(expression_walker_method, stmt.message, accumulator, visited)
517
517
  when IR::ReturnStmt
518
- collect_proc_types_from_expression(statement.value, proc_types, visited) if statement.value
518
+ send(expression_walker_method, stmt.value, accumulator, visited) if stmt.value
519
519
  when IR::ExpressionStmt
520
- collect_proc_types_from_expression(statement.expression, proc_types, visited)
520
+ send(expression_walker_method, stmt.expression, accumulator, visited)
521
521
  end
522
522
  end
523
523
  end
524
524
 
525
+ def collect_proc_types_from_statements(statements, proc_types, visited)
526
+ each_ir_statement_for_type_collection(statements,
527
+ type_collector_method: :collect_proc_type,
528
+ expression_walker_method: :collect_proc_types_from_expression,
529
+ accumulator: proc_types, visited:)
530
+ end
531
+
525
532
  def collect_proc_types_from_expression(expression, proc_types, visited)
526
533
  case expression
527
534
  when IR::Member
@@ -610,42 +617,10 @@ module MilkTea
610
617
  end
611
618
 
612
619
  def collect_task_types_from_statements(statements, task_types, visited)
613
- statements.each do |statement|
614
- case statement
615
- when IR::LocalDecl
616
- collect_task_type(statement.type, task_types, visited)
617
- collect_task_types_from_expression(statement.value, task_types, visited)
618
- when IR::Assignment
619
- collect_task_types_from_expression(statement.target, task_types, visited)
620
- collect_task_types_from_expression(statement.value, task_types, visited)
621
- when IR::BlockStmt
622
- collect_task_types_from_statements(statement.body, task_types, visited)
623
- when IR::WhileStmt
624
- collect_task_types_from_expression(statement.condition, task_types, visited)
625
- collect_task_types_from_statements(statement.body, task_types, visited)
626
- when IR::ForStmt
627
- collect_task_types_from_statements([statement.init], task_types, visited)
628
- collect_task_types_from_expression(statement.condition, task_types, visited)
629
- collect_task_types_from_statements(statement.body, task_types, visited)
630
- collect_task_types_from_statements([statement.post], task_types, visited)
631
- when IR::IfStmt
632
- collect_task_types_from_expression(statement.condition, task_types, visited)
633
- collect_task_types_from_statements(statement.then_body, task_types, visited)
634
- collect_task_types_from_statements(statement.else_body, task_types, visited) if statement.else_body
635
- when IR::SwitchStmt
636
- collect_task_types_from_expression(statement.expression, task_types, visited)
637
- statement.cases.each do |switch_case|
638
- collect_task_types_from_statements(switch_case.body, task_types, visited)
639
- end
640
- when IR::StaticAssert
641
- collect_task_types_from_expression(statement.condition, task_types, visited)
642
- collect_task_types_from_expression(statement.message, task_types, visited)
643
- when IR::ReturnStmt
644
- collect_task_types_from_expression(statement.value, task_types, visited) if statement.value
645
- when IR::ExpressionStmt
646
- collect_task_types_from_expression(statement.expression, task_types, visited)
647
- end
648
- end
620
+ each_ir_statement_for_type_collection(statements,
621
+ type_collector_method: :collect_task_type,
622
+ expression_walker_method: :collect_task_types_from_expression,
623
+ accumulator: task_types, visited:)
649
624
  end
650
625
 
651
626
  def collect_task_types_from_expression(expression, task_types, visited)
@@ -771,42 +746,10 @@ module MilkTea
771
746
  end
772
747
 
773
748
  def collect_generic_variant_types_from_statements(statements, generic_variant_types, visited)
774
- statements.each do |statement|
775
- case statement
776
- when IR::LocalDecl
777
- collect_generic_variant_type(statement.type, generic_variant_types, visited)
778
- collect_generic_variant_types_from_expression(statement.value, generic_variant_types, visited)
779
- when IR::Assignment
780
- collect_generic_variant_types_from_expression(statement.target, generic_variant_types, visited)
781
- collect_generic_variant_types_from_expression(statement.value, generic_variant_types, visited)
782
- when IR::BlockStmt
783
- collect_generic_variant_types_from_statements(statement.body, generic_variant_types, visited)
784
- when IR::WhileStmt
785
- collect_generic_variant_types_from_expression(statement.condition, generic_variant_types, visited)
786
- collect_generic_variant_types_from_statements(statement.body, generic_variant_types, visited)
787
- when IR::ForStmt
788
- collect_generic_variant_types_from_statements([statement.init], generic_variant_types, visited)
789
- collect_generic_variant_types_from_expression(statement.condition, generic_variant_types, visited)
790
- collect_generic_variant_types_from_statements(statement.body, generic_variant_types, visited)
791
- collect_generic_variant_types_from_statements([statement.post], generic_variant_types, visited)
792
- when IR::IfStmt
793
- collect_generic_variant_types_from_expression(statement.condition, generic_variant_types, visited)
794
- collect_generic_variant_types_from_statements(statement.then_body, generic_variant_types, visited)
795
- collect_generic_variant_types_from_statements(statement.else_body, generic_variant_types, visited) if statement.else_body
796
- when IR::SwitchStmt
797
- collect_generic_variant_types_from_expression(statement.expression, generic_variant_types, visited)
798
- statement.cases.each do |switch_case|
799
- collect_generic_variant_types_from_statements(switch_case.body, generic_variant_types, visited)
800
- end
801
- when IR::StaticAssert
802
- collect_generic_variant_types_from_expression(statement.condition, generic_variant_types, visited)
803
- collect_generic_variant_types_from_expression(statement.message, generic_variant_types, visited)
804
- when IR::ReturnStmt
805
- collect_generic_variant_types_from_expression(statement.value, generic_variant_types, visited) if statement.value
806
- when IR::ExpressionStmt
807
- collect_generic_variant_types_from_expression(statement.expression, generic_variant_types, visited)
808
- end
809
- end
749
+ each_ir_statement_for_type_collection(statements,
750
+ type_collector_method: :collect_generic_variant_type,
751
+ expression_walker_method: :collect_generic_variant_types_from_expression,
752
+ accumulator: generic_variant_types, visited:)
810
753
  end
811
754
 
812
755
  def collect_generic_variant_types_from_expression(expression, generic_variant_types, visited)
@@ -981,42 +924,10 @@ module MilkTea
981
924
  end
982
925
 
983
926
  def collect_str_buffer_types_from_statements(statements, str_buffer_types, visited)
984
- statements.each do |statement|
985
- case statement
986
- when IR::LocalDecl
987
- collect_str_buffer_type(statement.type, str_buffer_types, visited)
988
- collect_str_buffer_types_from_expression(statement.value, str_buffer_types, visited)
989
- when IR::Assignment
990
- collect_str_buffer_types_from_expression(statement.target, str_buffer_types, visited)
991
- collect_str_buffer_types_from_expression(statement.value, str_buffer_types, visited)
992
- when IR::BlockStmt
993
- collect_str_buffer_types_from_statements(statement.body, str_buffer_types, visited)
994
- when IR::WhileStmt
995
- collect_str_buffer_types_from_expression(statement.condition, str_buffer_types, visited)
996
- collect_str_buffer_types_from_statements(statement.body, str_buffer_types, visited)
997
- when IR::ForStmt
998
- collect_str_buffer_types_from_statements([statement.init], str_buffer_types, visited)
999
- collect_str_buffer_types_from_expression(statement.condition, str_buffer_types, visited)
1000
- collect_str_buffer_types_from_statements(statement.body, str_buffer_types, visited)
1001
- collect_str_buffer_types_from_statements([statement.post], str_buffer_types, visited)
1002
- when IR::IfStmt
1003
- collect_str_buffer_types_from_expression(statement.condition, str_buffer_types, visited)
1004
- collect_str_buffer_types_from_statements(statement.then_body, str_buffer_types, visited)
1005
- collect_str_buffer_types_from_statements(statement.else_body, str_buffer_types, visited) if statement.else_body
1006
- when IR::SwitchStmt
1007
- collect_str_buffer_types_from_expression(statement.expression, str_buffer_types, visited)
1008
- statement.cases.each do |switch_case|
1009
- collect_str_buffer_types_from_statements(switch_case.body, str_buffer_types, visited)
1010
- end
1011
- when IR::StaticAssert
1012
- collect_str_buffer_types_from_expression(statement.condition, str_buffer_types, visited)
1013
- collect_str_buffer_types_from_expression(statement.message, str_buffer_types, visited)
1014
- when IR::ReturnStmt
1015
- collect_str_buffer_types_from_expression(statement.value, str_buffer_types, visited) if statement.value
1016
- when IR::ExpressionStmt
1017
- collect_str_buffer_types_from_expression(statement.expression, str_buffer_types, visited)
1018
- end
1019
- end
927
+ each_ir_statement_for_type_collection(statements,
928
+ type_collector_method: :collect_str_buffer_type,
929
+ expression_walker_method: :collect_str_buffer_types_from_expression,
930
+ accumulator: str_buffer_types, visited:)
1020
931
  end
1021
932
 
1022
933
  def collect_str_buffer_types_from_expression(expression, str_buffer_types, visited)
@@ -1100,42 +1011,10 @@ module MilkTea
1100
1011
  end
1101
1012
 
1102
1013
  def collect_generic_struct_types_from_statements(statements, generic_struct_types, visited)
1103
- statements.each do |statement|
1104
- case statement
1105
- when IR::LocalDecl
1106
- collect_generic_struct_type(statement.type, generic_struct_types, visited)
1107
- collect_generic_struct_types_from_expression(statement.value, generic_struct_types, visited)
1108
- when IR::Assignment
1109
- collect_generic_struct_types_from_expression(statement.target, generic_struct_types, visited)
1110
- collect_generic_struct_types_from_expression(statement.value, generic_struct_types, visited)
1111
- when IR::BlockStmt
1112
- collect_generic_struct_types_from_statements(statement.body, generic_struct_types, visited)
1113
- when IR::WhileStmt
1114
- collect_generic_struct_types_from_expression(statement.condition, generic_struct_types, visited)
1115
- collect_generic_struct_types_from_statements(statement.body, generic_struct_types, visited)
1116
- when IR::ForStmt
1117
- collect_generic_struct_types_from_statements([statement.init], generic_struct_types, visited)
1118
- collect_generic_struct_types_from_expression(statement.condition, generic_struct_types, visited)
1119
- collect_generic_struct_types_from_statements(statement.body, generic_struct_types, visited)
1120
- collect_generic_struct_types_from_statements([statement.post], generic_struct_types, visited)
1121
- when IR::IfStmt
1122
- collect_generic_struct_types_from_expression(statement.condition, generic_struct_types, visited)
1123
- collect_generic_struct_types_from_statements(statement.then_body, generic_struct_types, visited)
1124
- collect_generic_struct_types_from_statements(statement.else_body, generic_struct_types, visited) if statement.else_body
1125
- when IR::SwitchStmt
1126
- collect_generic_struct_types_from_expression(statement.expression, generic_struct_types, visited)
1127
- statement.cases.each do |switch_case|
1128
- collect_generic_struct_types_from_statements(switch_case.body, generic_struct_types, visited)
1129
- end
1130
- when IR::StaticAssert
1131
- collect_generic_struct_types_from_expression(statement.condition, generic_struct_types, visited)
1132
- collect_generic_struct_types_from_expression(statement.message, generic_struct_types, visited)
1133
- when IR::ReturnStmt
1134
- collect_generic_struct_types_from_expression(statement.value, generic_struct_types, visited) if statement.value
1135
- when IR::ExpressionStmt
1136
- collect_generic_struct_types_from_expression(statement.expression, generic_struct_types, visited)
1137
- end
1138
- end
1014
+ each_ir_statement_for_type_collection(statements,
1015
+ type_collector_method: :collect_generic_struct_type,
1016
+ expression_walker_method: :collect_generic_struct_types_from_expression,
1017
+ accumulator: generic_struct_types, visited:)
1139
1018
  end
1140
1019
 
1141
1020
  def collect_generic_struct_types_from_expression(expression, generic_struct_types, visited)
@@ -1221,42 +1100,10 @@ module MilkTea
1221
1100
  end
1222
1101
 
1223
1102
  def collect_span_types_from_statements(statements, span_types, visited)
1224
- statements.each do |statement|
1225
- case statement
1226
- when IR::LocalDecl
1227
- collect_span_type(statement.type, span_types, visited)
1228
- collect_span_types_from_expression(statement.value, span_types, visited)
1229
- when IR::Assignment
1230
- collect_span_types_from_expression(statement.target, span_types, visited)
1231
- collect_span_types_from_expression(statement.value, span_types, visited)
1232
- when IR::BlockStmt
1233
- collect_span_types_from_statements(statement.body, span_types, visited)
1234
- when IR::WhileStmt
1235
- collect_span_types_from_expression(statement.condition, span_types, visited)
1236
- collect_span_types_from_statements(statement.body, span_types, visited)
1237
- when IR::ForStmt
1238
- collect_span_types_from_statements([statement.init], span_types, visited)
1239
- collect_span_types_from_expression(statement.condition, span_types, visited)
1240
- collect_span_types_from_statements(statement.body, span_types, visited)
1241
- collect_span_types_from_statements([statement.post], span_types, visited)
1242
- when IR::IfStmt
1243
- collect_span_types_from_expression(statement.condition, span_types, visited)
1244
- collect_span_types_from_statements(statement.then_body, span_types, visited)
1245
- collect_span_types_from_statements(statement.else_body, span_types, visited) if statement.else_body
1246
- when IR::SwitchStmt
1247
- collect_span_types_from_expression(statement.expression, span_types, visited)
1248
- statement.cases.each do |switch_case|
1249
- collect_span_types_from_statements(switch_case.body, span_types, visited)
1250
- end
1251
- when IR::StaticAssert
1252
- collect_span_types_from_expression(statement.condition, span_types, visited)
1253
- collect_span_types_from_expression(statement.message, span_types, visited)
1254
- when IR::ReturnStmt
1255
- collect_span_types_from_expression(statement.value, span_types, visited) if statement.value
1256
- when IR::ExpressionStmt
1257
- collect_span_types_from_expression(statement.expression, span_types, visited)
1258
- end
1259
- end
1103
+ each_ir_statement_for_type_collection(statements,
1104
+ type_collector_method: :collect_span_type,
1105
+ expression_walker_method: :collect_span_types_from_expression,
1106
+ accumulator: span_types, visited:)
1260
1107
  end
1261
1108
 
1262
1109
  def collect_span_types_from_expression(expression, span_types, visited)
@@ -10,6 +10,7 @@ require_relative "c_backend/control_flow_emission"
10
10
  require_relative "c_backend/runtime_helpers"
11
11
  require_relative "c_backend/type_declaration"
12
12
  require_relative "c_backend/expressions"
13
+ require_relative "c_backend/format_helpers"
13
14
  require_relative "c_backend/reinterpret"
14
15
 
15
16
  module MilkTea
@@ -54,6 +55,8 @@ module MilkTea
54
55
  @checked_index_alias_id = 0
55
56
  @loop_guard_id = 0
56
57
  @emitted_span_type_names = Set.new
58
+ @source_path = program.source_path
59
+ @current_line = nil
57
60
  end
58
61
 
59
62
  def emit
@@ -217,10 +220,16 @@ module MilkTea
217
220
  end
218
221
 
219
222
  constants.each do |constant|
223
+ @current_line = constant.line if constant.line
224
+ @source_path ||= constant.source_path if constant.source_path
220
225
  lines << "#{constant_storage(constant.type)} #{c_declaration(constant.type, constant.linkage_name)} = #{emit_initializer(constant.value)};"
221
226
  end
222
227
  @program.globals.each do |global|
223
228
  next unless emitted_globals.include?(global)
229
+ if global.respond_to?(:line) && global.line
230
+ @current_line = global.line
231
+ @source_path ||= global.source_path if global.respond_to?(:source_path) && global.source_path
232
+ end
224
233
  lines << "#{global_storage(global.type)} #{c_declaration(global.type, global.linkage_name)} = #{emit_initializer(global.value)};"
225
234
  end
226
235
  lines << "" unless constants.empty? && @program.globals.empty?
@@ -288,6 +297,7 @@ module MilkTea
288
297
  include Statements
289
298
  include ControlFlowEmission
290
299
  include RuntimeHelpers
300
+ include FormatHelpers
291
301
  include TypeDeclaration
292
302
  include Expressions
293
303
  include Reinterpret
@@ -4,7 +4,7 @@ require_relative "types/predicates"
4
4
 
5
5
  module MilkTea
6
6
  module CompatibilityHelpers
7
- include TypePredicates
7
+ include Types::Predicates
8
8
 
9
9
  BUILTIN_CSTR = Types::Registry.primitive("cstr")
10
10
 
@@ -114,7 +114,12 @@ module MilkTea
114
114
  else
115
115
  @checker.instance_variable_get(:@ctx).types
116
116
  end
117
- if (type = types[call_expr.callee.name]) && type.is_a?(Types::Struct)
117
+ callee_name = if call_expr.callee.is_a?(AST::Specialization) && call_expr.callee.callee.respond_to?(:name)
118
+ call_expr.callee.callee.name
119
+ elsif call_expr.callee.respond_to?(:name)
120
+ call_expr.callee.name
121
+ end
122
+ if callee_name && (type = types[callee_name]) && type.is_a?(Types::Struct)
118
123
  fields = {}
119
124
  call_expr.arguments.each do |argument|
120
125
  val = evaluate_expression(argument.value, scopes:)
@@ -123,6 +128,19 @@ module MilkTea
123
128
  end
124
129
  next fields
125
130
  end
131
+
132
+ if call_expr.callee.is_a?(AST::Specialization) && @checker.respond_to?(:resolve_type_expression)
133
+ resolved = @checker.send(:resolve_type_expression, call_expr.callee)
134
+ if resolved && @checker.respond_to?(:array_type?) && @checker.send(:array_type?, resolved)
135
+ values = []
136
+ call_expr.arguments.each do |argument|
137
+ val = evaluate_expression(argument.value, scopes:)
138
+ return nil unless val
139
+ values << val
140
+ end
141
+ next values
142
+ end
143
+ end
126
144
 
127
145
  @checker.send(:evaluate_compile_time_const_value, call_expr, scopes:)
128
146
  },
@@ -6,7 +6,9 @@ module MilkTea
6
6
  def initialize(module_name:, includes:, constants:, globals:, opaques:, structs:, unions:, enums:, variants:, static_asserts:, functions:, source_path: nil) = super
7
7
  end
8
8
  Include = Data.define(:header)
9
- Constant = Data.define(:name, :linkage_name, :type, :value)
9
+ Constant = Data.define(:name, :linkage_name, :type, :value, :line, :source_path) do
10
+ def initialize(name:, linkage_name:, type:, value:, line: nil, source_path: nil) = super
11
+ end
10
12
  Global = Data.define(:name, :linkage_name, :type, :value)
11
13
  OpaqueDecl = Data.define(:name, :linkage_name, :forward_declarable, :source_module) do
12
14
  def initialize(name:, linkage_name:, forward_declarable:, source_module: nil) = super