mt-lang 0.3.4 → 0.3.5

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.
@@ -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
@@ -288,6 +289,7 @@ module MilkTea
288
289
  include Statements
289
290
  include ControlFlowEmission
290
291
  include RuntimeHelpers
292
+ include FormatHelpers
291
293
  include TypeDeclaration
292
294
  include Expressions
293
295
  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