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.
- checksums.yaml +4 -4
- data/lib/milk_tea/base.rb +1 -1
- data/lib/milk_tea/core/c_backend/feature_detection.rb +27 -55
- data/lib/milk_tea/core/c_backend/format_helpers.rb +551 -0
- data/lib/milk_tea/core/c_backend/runtime_helpers.rb +0 -542
- data/lib/milk_tea/core/c_backend/type_collectors.rb +51 -204
- data/lib/milk_tea/core/c_backend.rb +2 -0
- data/lib/milk_tea/core/compatibility_helpers.rb +1 -1
- data/lib/milk_tea/core/lowering/async/lowering.rb +147 -141
- data/lib/milk_tea/core/lowering/block.rb +759 -725
- data/lib/milk_tea/core/lowering/expressions.rb +94 -0
- data/lib/milk_tea/core/lowering/loops.rb +49 -0
- data/lib/milk_tea/core/lowering/resolve.rb +221 -214
- data/lib/milk_tea/core/lowering/utils.rb +0 -222
- data/lib/milk_tea/core/module_loader.rb +29 -48
- data/lib/milk_tea/core/parser/declarations.rb +2 -2
- data/lib/milk_tea/core/parser/recovery.rb +1 -1
- data/lib/milk_tea/core/parser.rb +1 -1
- data/lib/milk_tea/core/semantic_analyzer/expressions.rb +3 -120
- data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +116 -113
- data/lib/milk_tea/core/semantic_analyzer/generics.rb +346 -343
- data/lib/milk_tea/core/semantic_analyzer/statements.rb +37 -12
- data/lib/milk_tea/core/types/predicates.rb +501 -499
- data/lib/milk_tea/core/types/visitor.rb +1 -1
- metadata +3 -2
|
@@ -483,45 +483,52 @@ module MilkTea
|
|
|
483
483
|
proc_types
|
|
484
484
|
end
|
|
485
485
|
|
|
486
|
-
def
|
|
487
|
-
statements.each do |
|
|
488
|
-
case
|
|
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
|
-
|
|
491
|
-
|
|
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
|
-
|
|
494
|
-
|
|
493
|
+
send(expression_walker_method, stmt.target, accumulator, visited)
|
|
494
|
+
send(expression_walker_method, stmt.value, accumulator, visited)
|
|
495
495
|
when IR::BlockStmt
|
|
496
|
-
|
|
496
|
+
each_ir_statement_for_type_collection(stmt.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
497
497
|
when IR::WhileStmt
|
|
498
|
-
|
|
499
|
-
|
|
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
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
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
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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
|
-
|
|
511
|
-
|
|
512
|
-
|
|
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
|
-
|
|
516
|
-
|
|
515
|
+
send(expression_walker_method, stmt.condition, accumulator, visited)
|
|
516
|
+
send(expression_walker_method, stmt.message, accumulator, visited)
|
|
517
517
|
when IR::ReturnStmt
|
|
518
|
-
|
|
518
|
+
send(expression_walker_method, stmt.value, accumulator, visited) if stmt.value
|
|
519
519
|
when IR::ExpressionStmt
|
|
520
|
-
|
|
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
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
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
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
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
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
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
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
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
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
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
|