mt-lang 0.3.9 → 0.3.11

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 (204) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/docs/language-design.md +1 -2
  4. data/docs/language-manual.md +12 -1
  5. data/lib/milk_tea/base.rb +1 -2
  6. data/lib/milk_tea/bindings/bindgen/ast_parser.rb +0 -2
  7. data/lib/milk_tea/bindings/bindgen/declaration.rb +0 -2
  8. data/lib/milk_tea/bindings/bindgen/emitter.rb +0 -2
  9. data/lib/milk_tea/bindings/bindgen/overrides.rb +0 -2
  10. data/lib/milk_tea/bindings/bindgen/type_mapper.rb +51 -53
  11. data/lib/milk_tea/bindings/imported_bindings/generator.rb +7 -9
  12. data/lib/milk_tea/bindings/imported_bindings/method_source.rb +0 -2
  13. data/lib/milk_tea/bindings/imported_bindings/naming.rb +6 -8
  14. data/lib/milk_tea/bindings/imported_bindings.rb +0 -2
  15. data/lib/milk_tea/bindings/opengl_registry.rb +3 -7
  16. data/lib/milk_tea/bindings/steamworks.rb +12 -16
  17. data/lib/milk_tea/bindings/upstream_sources.rb +10 -14
  18. data/lib/milk_tea/bindings/vendored_box2d.rb +10 -12
  19. data/lib/milk_tea/bindings/vendored_cjson.rb +6 -8
  20. data/lib/milk_tea/bindings/vendored_flecs.rb +10 -12
  21. data/lib/milk_tea/bindings/vendored_glfw.rb +11 -13
  22. data/lib/milk_tea/bindings/vendored_libuv.rb +11 -13
  23. data/lib/milk_tea/bindings/vendored_pcre2.rb +11 -13
  24. data/lib/milk_tea/bindings/vendored_raylib.rb +6 -10
  25. data/lib/milk_tea/bindings/vendored_sdl3.rb +11 -13
  26. data/lib/milk_tea/bindings/vendored_steamworks.rb +1 -5
  27. data/lib/milk_tea/core/ast.rb +109 -51
  28. data/lib/milk_tea/core/async_runtime_installer.rb +0 -2
  29. data/lib/milk_tea/core/bindings/attribute_binding.rb +1 -3
  30. data/lib/milk_tea/core/c_backend/aggregate_utils.rb +147 -84
  31. data/lib/milk_tea/core/c_backend/control_flow_emission.rb +394 -396
  32. data/lib/milk_tea/core/c_backend/expressions.rb +489 -476
  33. data/lib/milk_tea/core/c_backend/feature_detection.rb +446 -437
  34. data/lib/milk_tea/core/c_backend/format_helpers.rb +0 -2
  35. data/lib/milk_tea/core/c_backend/reachability.rb +339 -341
  36. data/lib/milk_tea/core/c_backend/reinterpret.rb +231 -217
  37. data/lib/milk_tea/core/c_backend/runtime_helpers.rb +531 -526
  38. data/lib/milk_tea/core/c_backend/statements.rb +528 -530
  39. data/lib/milk_tea/core/c_backend/type_collectors.rb +1344 -1346
  40. data/lib/milk_tea/core/c_backend/type_declaration.rb +215 -213
  41. data/lib/milk_tea/core/c_backend/type_system.rb +347 -349
  42. data/lib/milk_tea/core/c_backend.rb +17 -9
  43. data/lib/milk_tea/core/compatibility_helpers.rb +0 -2
  44. data/lib/milk_tea/core/compile_time/const_eval.rb +7 -12
  45. data/lib/milk_tea/core/compile_time.rb +32 -38
  46. data/lib/milk_tea/core/control_flow/builder.rb +3 -5
  47. data/lib/milk_tea/core/control_flow/constant_propagation.rb +14 -17
  48. data/lib/milk_tea/core/control_flow/definite_assignment.rb +0 -1
  49. data/lib/milk_tea/core/ir.rb +10 -10
  50. data/lib/milk_tea/core/lexer/character_classes.rb +5 -7
  51. data/lib/milk_tea/core/lexer/format_strings.rb +7 -9
  52. data/lib/milk_tea/core/lexer/heredocs.rb +22 -22
  53. data/lib/milk_tea/core/lexer/indentation.rb +0 -2
  54. data/lib/milk_tea/core/lexer/numbers.rb +0 -2
  55. data/lib/milk_tea/core/lexer/recovery.rb +0 -2
  56. data/lib/milk_tea/core/lexer/strings.rb +0 -2
  57. data/lib/milk_tea/core/lexer/symbols.rb +0 -2
  58. data/lib/milk_tea/core/lexer/trivia.rb +0 -2
  59. data/lib/milk_tea/core/lexer.rb +0 -2
  60. data/lib/milk_tea/core/lowering/async/analysis.rb +0 -2
  61. data/lib/milk_tea/core/lowering/async/lowering.rb +1264 -1265
  62. data/lib/milk_tea/core/lowering/async/normalization.rb +5 -3
  63. data/lib/milk_tea/core/lowering/async.rb +627 -630
  64. data/lib/milk_tea/core/lowering/block.rb +413 -416
  65. data/lib/milk_tea/core/lowering/calls.rb +1381 -1384
  66. data/lib/milk_tea/core/lowering/declarations.rb +180 -183
  67. data/lib/milk_tea/core/lowering/dyn.rb +48 -50
  68. data/lib/milk_tea/core/lowering/events.rb +983 -985
  69. data/lib/milk_tea/core/lowering/expressions.rb +1513 -1518
  70. data/lib/milk_tea/core/lowering/foreign_cstr.rb +181 -184
  71. data/lib/milk_tea/core/lowering/functions.rb +185 -188
  72. data/lib/milk_tea/core/lowering/loops.rb +1028 -1031
  73. data/lib/milk_tea/core/lowering/proc.rb +363 -366
  74. data/lib/milk_tea/core/lowering/resolve.rb +2133 -2135
  75. data/lib/milk_tea/core/lowering/scans.rb +179 -181
  76. data/lib/milk_tea/core/lowering/str_buffer.rb +102 -105
  77. data/lib/milk_tea/core/lowering/utils.rb +1040 -1044
  78. data/lib/milk_tea/core/lowering.rb +5 -7
  79. data/lib/milk_tea/core/module_binder.rb +0 -2
  80. data/lib/milk_tea/core/module_loader/errors.rb +4 -2
  81. data/lib/milk_tea/core/module_loader.rb +113 -20
  82. data/lib/milk_tea/core/module_path_resolver.rb +0 -2
  83. data/lib/milk_tea/core/module_roots.rb +6 -8
  84. data/lib/milk_tea/core/parser/attributes.rb +0 -2
  85. data/lib/milk_tea/core/parser/blocks.rb +0 -2
  86. data/lib/milk_tea/core/parser/declarations.rb +7 -9
  87. data/lib/milk_tea/core/parser/expressions.rb +15 -10
  88. data/lib/milk_tea/core/parser/recovery.rb +0 -2
  89. data/lib/milk_tea/core/parser/statements.rb +8 -2
  90. data/lib/milk_tea/core/parser/types.rb +12 -14
  91. data/lib/milk_tea/core/parser.rb +0 -2
  92. data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +31 -33
  93. data/lib/milk_tea/core/pretty_printer/base_formatter.rb +0 -2
  94. data/lib/milk_tea/core/pretty_printer/ir_formatter.rb +0 -2
  95. data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +0 -2
  96. data/lib/milk_tea/core/semantic_analyzer/attributes.rb +14 -16
  97. data/lib/milk_tea/core/semantic_analyzer/calls.rb +0 -2
  98. data/lib/milk_tea/core/semantic_analyzer/expressions.rb +1 -14
  99. data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +18 -21
  100. data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +0 -3
  101. data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +14 -17
  102. data/lib/milk_tea/core/semantic_analyzer/generics.rb +57 -59
  103. data/lib/milk_tea/core/semantic_analyzer/interface_conformance.rb +0 -2
  104. data/lib/milk_tea/core/semantic_analyzer/name_resolution.rb +5 -9
  105. data/lib/milk_tea/core/semantic_analyzer/nullability.rb +0 -3
  106. data/lib/milk_tea/core/semantic_analyzer/statements.rb +35 -40
  107. data/lib/milk_tea/core/semantic_analyzer/top_level.rb +10 -12
  108. data/lib/milk_tea/core/semantic_analyzer/type_compatibility.rb +0 -6
  109. data/lib/milk_tea/core/semantic_analyzer/type_declaration.rb +106 -109
  110. data/lib/milk_tea/core/semantic_analyzer.rb +17 -8
  111. data/lib/milk_tea/core/types/layout.rb +21 -22
  112. data/lib/milk_tea/core/types/predicates.rb +0 -2
  113. data/lib/milk_tea/core/types/registry.rb +16 -18
  114. data/lib/milk_tea/core/types/visitor.rb +0 -4
  115. data/lib/milk_tea/dap/backends/lldb_dap.rb +0 -2
  116. data/lib/milk_tea/dap/protocol.rb +1 -1
  117. data/lib/milk_tea/dap/server/breakpoints.rb +0 -2
  118. data/lib/milk_tea/dap/server/debug_map.rb +0 -2
  119. data/lib/milk_tea/dap/server/handlers.rb +0 -2
  120. data/lib/milk_tea/dap/server/launch.rb +0 -2
  121. data/lib/milk_tea/dap/server/lldb_backend.rb +8 -10
  122. data/lib/milk_tea/dap/server/pause_diagnostics.rb +14 -16
  123. data/lib/milk_tea/dap/server/utilities.rb +0 -2
  124. data/lib/milk_tea/dap/server/wire.rb +0 -2
  125. data/lib/milk_tea/dap/server.rb +0 -2
  126. data/lib/milk_tea/lsp/diagnostics.rb +16 -16
  127. data/lib/milk_tea/lsp/server/call_hierarchy.rb +11 -12
  128. data/lib/milk_tea/lsp/server/code_actions.rb +355 -357
  129. data/lib/milk_tea/lsp/server/code_lens.rb +23 -25
  130. data/lib/milk_tea/lsp/server/completion.rb +873 -875
  131. data/lib/milk_tea/lsp/server/configuration.rb +129 -131
  132. data/lib/milk_tea/lsp/server/debug_info.rb +0 -2
  133. data/lib/milk_tea/lsp/server/definition.rb +564 -565
  134. data/lib/milk_tea/lsp/server/diagnostics_scheduling.rb +191 -193
  135. data/lib/milk_tea/lsp/server/execute_command.rb +0 -2
  136. data/lib/milk_tea/lsp/server/folding_range.rb +0 -4
  137. data/lib/milk_tea/lsp/server/formatting.rb +478 -480
  138. data/lib/milk_tea/lsp/server/hover.rb +1282 -1284
  139. data/lib/milk_tea/lsp/server/inlay_hints.rb +179 -181
  140. data/lib/milk_tea/lsp/server/lifecycle.rb +192 -194
  141. data/lib/milk_tea/lsp/server/linked_editing_range.rb +0 -2
  142. data/lib/milk_tea/lsp/server/on_type_formatting.rb +0 -2
  143. data/lib/milk_tea/lsp/server/progress.rb +0 -2
  144. data/lib/milk_tea/lsp/server/references.rb +316 -318
  145. data/lib/milk_tea/lsp/server/rename.rb +445 -447
  146. data/lib/milk_tea/lsp/server/selection_range.rb +0 -4
  147. data/lib/milk_tea/lsp/server/semantic_tokens.rb +1376 -1314
  148. data/lib/milk_tea/lsp/server/signature_help.rb +146 -148
  149. data/lib/milk_tea/lsp/server/text_documents.rb +99 -101
  150. data/lib/milk_tea/lsp/server/type_hierarchy.rb +2 -4
  151. data/lib/milk_tea/lsp/server/utilities.rb +397 -399
  152. data/lib/milk_tea/lsp/server.rb +0 -3
  153. data/lib/milk_tea/lsp/workspace/analysis.rb +40 -42
  154. data/lib/milk_tea/lsp/workspace/dependency_graph.rb +4 -10
  155. data/lib/milk_tea/lsp/workspace/utilities.rb +19 -19
  156. data/lib/milk_tea/packages/atomic_write.rb +4 -5
  157. data/lib/milk_tea/packages/dependency_solver.rb +15 -15
  158. data/lib/milk_tea/packages/lock.rb +4 -4
  159. data/lib/milk_tea/packages/manager_cli.rb +1 -1
  160. data/lib/milk_tea/packages/manifest.rb +3 -3
  161. data/lib/milk_tea/packages/registry_store.rb +4 -6
  162. data/lib/milk_tea/packages/services.rb +16 -16
  163. data/lib/milk_tea/packages/source_cache.rb +4 -6
  164. data/lib/milk_tea/packages/source_resolver.rb +44 -44
  165. data/lib/milk_tea/packages/version.rb +8 -8
  166. data/lib/milk_tea/tooling/build.rb +3 -7
  167. data/lib/milk_tea/tooling/build_cache.rb +0 -2
  168. data/lib/milk_tea/tooling/cli.rb +10 -4
  169. data/lib/milk_tea/tooling/debug_info_formatter.rb +31 -33
  170. data/lib/milk_tea/tooling/debug_map.rb +8 -10
  171. data/lib/milk_tea/tooling/docs_app.rb +0 -2
  172. data/lib/milk_tea/tooling/linter/doc_tags.rb +25 -27
  173. data/lib/milk_tea/tooling/linter/fix_engine.rb +87 -24
  174. data/lib/milk_tea/tooling/linter/flow_rules.rb +44 -46
  175. data/lib/milk_tea/tooling/linter/imports_platform.rb +14 -16
  176. data/lib/milk_tea/tooling/linter/release_rules.rb +3 -5
  177. data/lib/milk_tea/tooling/linter/reserved_names.rb +23 -25
  178. data/lib/milk_tea/tooling/linter/rules.rb +87 -89
  179. data/lib/milk_tea/tooling/linter/source_helpers.rb +40 -42
  180. data/lib/milk_tea/tooling/linter/trailing_comma.rb +17 -19
  181. data/lib/milk_tea/tooling/linter/visitors.rb +112 -54
  182. data/lib/milk_tea/tooling/linter.rb +0 -2
  183. data/lib/milk_tea/tooling/project_scaffold.rb +0 -2
  184. data/lib/milk_tea/tooling/run.rb +0 -2
  185. data/lib/milk_tea/tooling/toolchain_cli.rb +0 -2
  186. data/std/cli.mt +13 -32
  187. data/std/color.mt +28 -28
  188. data/std/encoding.mt +4 -4
  189. data/std/graph.mt +1 -2
  190. data/std/hash.mt +14 -14
  191. data/std/http/server.mt +3 -3
  192. data/std/input.mt +1 -1
  193. data/std/json.mt +1 -1
  194. data/std/linear_algebra.mt +6 -6
  195. data/std/net/mux.mt +1 -1
  196. data/std/noise.mt +23 -23
  197. data/std/parse.mt +2 -2
  198. data/std/process.mt +3 -4
  199. data/std/sparse_set.mt +1 -1
  200. data/std/steering.mt +5 -5
  201. data/std/str.mt +1 -1
  202. data/std/tween.mt +4 -4
  203. data/std/utility.mt +3 -3
  204. metadata +2 -2
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def current_type_params
9
7
  @current_type_substitutions || {}
10
8
  end
@@ -28,7 +26,7 @@ module MilkTea
28
26
  fallback_owner = specialization_lookup_owner
29
27
  return nil unless fallback_owner
30
28
 
31
- fallback_owner.send(:lookup_method_local_or_imported, receiver_type, name)
29
+ fallback_owner.lookup_method_local_or_imported(receiver_type, name)
32
30
  end
33
31
 
34
32
  def lookup_static_method(receiver_type, name)
@@ -39,7 +37,7 @@ module MilkTea
39
37
  fallback_owner = specialization_lookup_owner
40
38
  return nil unless fallback_owner
41
39
 
42
- fallback_owner.send(:lookup_method_local_or_imported, receiver_type, static_name)
40
+ fallback_owner.lookup_method_local_or_imported(receiver_type, static_name)
43
41
  end
44
42
 
45
43
  def lookup_method_local_or_imported(receiver_type, name)
@@ -512,7 +510,7 @@ module MilkTea
512
510
 
513
511
  def source_line(node)
514
512
  return nil unless node
515
- return node.line if node.respond_to?(:line) && node.line
513
+ return node.line if node.line
516
514
 
517
515
  case node
518
516
  when AST::MemberAccess then source_line(node.receiver)
@@ -551,7 +549,7 @@ module MilkTea
551
549
 
552
550
  def source_column(node)
553
551
  return nil unless node
554
- return node.column if node.respond_to?(:column) && node.column
552
+ return node.column if node.column
555
553
 
556
554
  case node
557
555
  when AST::MemberAccess then source_column(node.receiver)
@@ -1011,7 +1009,7 @@ module MilkTea
1011
1009
  fallback_owner = specialization_lookup_owner
1012
1010
  return nil unless fallback_owner
1013
1011
 
1014
- fallback_owner.send(:imported_module_with_private_method_local, receiver_type, method_name)
1012
+ fallback_owner.imported_module_with_private_method_local(receiver_type, method_name)
1015
1013
  end
1016
1014
 
1017
1015
  def imported_module_with_private_method_local(receiver_type, method_name)
@@ -1442,8 +1440,6 @@ module MilkTea
1442
1440
 
1443
1441
  nil
1444
1442
  end
1445
-
1446
-
1447
1443
  end
1448
1444
  end
1449
1445
  end
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def check_definite_assignment(binding)
9
7
  return unless binding.ast.respond_to?(:body)
10
8
 
@@ -415,7 +413,6 @@ module MilkTea
415
413
 
416
414
  nil
417
415
  end
418
-
419
416
  end
420
417
  end
421
418
  end
@@ -3,53 +3,51 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def check_block(statements, scopes:, return_type:, allow_return: true)
9
7
  statements ||= []
10
8
  with_return_context(return_type, allow_return:) do
11
9
  with_nested_scope(scopes) do |nested_scopes|
12
10
  with_type_resolution_scopes(nested_scopes) do
13
- statements.each_with_index do |statement, idx|
14
- begin
15
- record_local_completion_snapshot(
16
- statement.respond_to?(:line) ? statement.line : nil,
17
- statement.respond_to?(:column) ? statement.column : 0,
18
- nested_scopes,
19
- )
20
- refinements = check_statement(statement, scopes: nested_scopes, return_type:, allow_return:)
21
- apply_continuation_refinements!(nested_scopes, refinements)
22
- if @nullability_flow_result && idx + 1 < statements.length
23
- apply_nullability_continuation_refinements!(nested_scopes, statements[idx + 1])
24
- end
25
- end_line = statement_end_line(statement)
26
- # When the statement spans multiple lines (e.g. let … else:),
27
- # record an extra snapshot at the declaration line so that
28
- # hover and completion lookups on the declaration line itself
29
- # can still find the new binding.
30
- if end_line && statement.respond_to?(:line) && statement.line && end_line > statement.line
11
+ statements.each_with_index do |statement, idx|
12
+ begin
31
13
  record_local_completion_snapshot(
32
14
  statement.line,
33
- statement.respond_to?(:column) ? statement.column : 0,
15
+ statement.column || 0,
34
16
  nested_scopes,
35
17
  )
18
+ refinements = check_statement(statement, scopes: nested_scopes, return_type:, allow_return:)
19
+ apply_continuation_refinements!(nested_scopes, refinements)
20
+ if @nullability_flow_result && idx + 1 < statements.length
21
+ apply_nullability_continuation_refinements!(nested_scopes, statements[idx + 1])
22
+ end
23
+ end_line = statement_end_line(statement)
24
+ # When the statement spans multiple lines (e.g. let … else:),
25
+ # record an extra snapshot at the declaration line so that
26
+ # hover and completion lookups on the declaration line itself
27
+ # can still find the new binding.
28
+ if end_line && statement.line && end_line > statement.line
29
+ record_local_completion_snapshot(
30
+ statement.line,
31
+ statement.column || 0,
32
+ nested_scopes,
33
+ )
34
+ end
35
+ record_local_completion_snapshot(end_line, 1_000_000, nested_scopes)
36
+ rescue SemanticError => e
37
+ if @collecting_errors
38
+ @structural_errors << e
39
+ next
40
+ end
41
+
42
+ raise e unless e.line.nil?
43
+
44
+ stmt_line = statement.line
45
+ raise e if stmt_line.nil?
46
+
47
+ raise_sema_error(e.message, statement)
36
48
  end
37
- record_local_completion_snapshot(end_line, 1_000_000, nested_scopes)
38
- rescue SemanticError => e
39
- if @collecting_errors
40
- @structural_errors << e
41
- next
42
- end
43
-
44
- raise e unless e.line.nil?
45
-
46
- stmt_line = statement.respond_to?(:line) ? statement.line : nil
47
- raise e if stmt_line.nil?
48
-
49
- raise_sema_error(e.message, statement)
50
49
  end
51
50
  end
52
- end
53
51
  end
54
52
  end
55
53
  end
@@ -251,11 +249,9 @@ module MilkTea
251
249
 
252
250
  storage_type, final_type, const_value =
253
251
  if statement.else_body || statement.recovered_else
254
- check_local_decl_let_else(statement, scopes:, return_type:, allow_return:,
255
- discard_binding:, declared_type:, inferred_type:)
252
+ check_local_decl_let_else(statement, scopes:, return_type:, allow_return:, discard_binding:, declared_type:, inferred_type:)
256
253
  else
257
- check_local_decl_plain(statement, scopes:, discard_binding:,
258
- declared_type:, inferred_type:)
254
+ check_local_decl_plain(statement, scopes:, discard_binding:, declared_type:, inferred_type:)
259
255
  end
260
256
 
261
257
  if noncopyable_event_storage_type?(final_type) && !fresh_noncopyable_event_initializer?(statement.value, final_type, scopes:)
@@ -1427,7 +1423,6 @@ module MilkTea
1427
1423
  return false unless binding.type
1428
1424
  ref_type?(binding.type) || own_type?(binding.type) || (binding.mutable && binding.kind == :param)
1429
1425
  end
1430
-
1431
1426
  end
1432
1427
  end
1433
1428
  end
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def check_top_level_values
9
7
  expanded_declarations.each do |decl|
10
8
  with_error_node(decl) do
@@ -477,16 +475,16 @@ module MilkTea
477
475
  func.ast.params.each_with_index do |param, idx|
478
476
  arg_expr = arguments[idx].value
479
477
  arg_value = if scopes
480
- evaluate_compile_time_const_value(arg_expr, scopes:)
481
- else
482
- CompileTime.evaluate(
483
- arg_expr,
484
- resolve_identifier: lambda { |id| resolve_current_module_const_value(id.name) },
485
- resolve_member_access: nil,
486
- resolve_type_ref: lambda { |tr| resolve_type_ref(tr) },
487
- resolve_call: nil,
488
- )
489
- end
478
+ evaluate_compile_time_const_value(arg_expr, scopes:)
479
+ else
480
+ CompileTime.evaluate(
481
+ arg_expr,
482
+ resolve_identifier: lambda { |id| resolve_current_module_const_value(id.name) },
483
+ resolve_member_access: nil,
484
+ resolve_type_ref: lambda { |tr| resolve_type_ref(tr) },
485
+ resolve_call: nil,
486
+ )
487
+ end
490
488
  return nil unless arg_value
491
489
 
492
490
  initial_vars[param.name] = arg_value
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def call_argument_compatible?(actual_type, expected_type, scopes:, external:, expression: nil)
9
7
  return true if array_to_span_call_argument_compatible?(actual_type, expected_type, expression:, scopes:)
10
8
  return true if argument_types_compatible?(actual_type, expected_type, external:, expression:, scopes:, contextual_int_to_float: !external)
@@ -223,8 +221,6 @@ module MilkTea
223
221
  nil
224
222
  end
225
223
 
226
- private
227
-
228
224
  def simd_op_result(operator, left_type, right_type)
229
225
  if simd_type?(left_type) && simd_type?(right_type) && left_type.element_type == right_type.element_type && left_type.lane_count == right_type.lane_count
230
226
  return left_type if operator == "+" || operator == "-" || operator == "*" || operator == "/"
@@ -337,8 +333,6 @@ module MilkTea
337
333
  def function_pointer_type?(type)
338
334
  type.is_a?(Types::Function)
339
335
  end
340
-
341
-
342
336
  end
343
337
  end
344
338
  end
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def build_analysis
9
7
  Analysis.new(
10
8
  ast: @ctx.ast,
@@ -35,45 +33,45 @@ module MilkTea
35
33
  def install_builtin_types
36
34
  INSTALLABLE_BUILTIN_TYPE_NAMES.each do |name|
37
35
  @ctx.types[name] = case name
38
- when "str"
39
- Types::Registry.string_view
40
- when "Subscription"
41
- builtin_subscription_type
42
- when "EventError"
43
- builtin_event_error_type
44
- when "struct_handle"
45
- builtin_struct_handle_type
46
- when "field_handle"
47
- builtin_field_handle_type
48
- when "callable_handle"
49
- builtin_callable_handle_type
50
- when "attribute_handle"
51
- builtin_attribute_handle_type
52
- when "member_handle"
53
- builtin_member_handle_type
54
- when "type"
55
- builtin_type_meta_type
56
- when "vec2"
57
- Types::Vector.new("vec2", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 2)
58
- when "vec3"
59
- Types::Vector.new("vec3", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 3)
60
- when "vec4"
61
- Types::Vector.new("vec4", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 4)
62
- when "ivec2"
63
- Types::Vector.new("ivec2", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 2)
64
- when "ivec3"
65
- Types::Vector.new("ivec3", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 3)
66
- when "ivec4"
67
- Types::Vector.new("ivec4", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 4)
68
- when "mat3"
69
- Types::Matrix.new("mat3", dim: 3)
70
- when "mat4"
71
- Types::Matrix.new("mat4", dim: 4)
72
- when "quat"
73
- Types::Quaternion.new("quat")
74
- else
75
- Types::Registry.primitive(name)
76
- end
36
+ when "str"
37
+ Types::Registry.string_view
38
+ when "Subscription"
39
+ builtin_subscription_type
40
+ when "EventError"
41
+ builtin_event_error_type
42
+ when "struct_handle"
43
+ builtin_struct_handle_type
44
+ when "field_handle"
45
+ builtin_field_handle_type
46
+ when "callable_handle"
47
+ builtin_callable_handle_type
48
+ when "attribute_handle"
49
+ builtin_attribute_handle_type
50
+ when "member_handle"
51
+ builtin_member_handle_type
52
+ when "type"
53
+ builtin_type_meta_type
54
+ when "vec2"
55
+ Types::Vector.new("vec2", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 2)
56
+ when "vec3"
57
+ Types::Vector.new("vec3", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 3)
58
+ when "vec4"
59
+ Types::Vector.new("vec4", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 4)
60
+ when "ivec2"
61
+ Types::Vector.new("ivec2", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 2)
62
+ when "ivec3"
63
+ Types::Vector.new("ivec3", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 3)
64
+ when "ivec4"
65
+ Types::Vector.new("ivec4", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 4)
66
+ when "mat3"
67
+ Types::Matrix.new("mat3", dim: 3)
68
+ when "mat4"
69
+ Types::Matrix.new("mat4", dim: 4)
70
+ when "quat"
71
+ Types::Quaternion.new("quat")
72
+ else
73
+ Types::Registry.primitive(name)
74
+ end
77
75
  end
78
76
  end
79
77
 
@@ -226,27 +224,27 @@ module MilkTea
226
224
  validate_explicit_aggregate_c_name!(decl)
227
225
  ensure_available_type_name!(decl.name)
228
226
  @ctx.types[decl.name] = if decl.type_params.empty?
229
- Types::Struct.new(
230
- decl.name,
231
- module_name: @ctx.module_name,
232
- external: raw_module?,
233
- packed: decl.packed,
234
- alignment: decl.alignment,
235
- linkage_name: decl.c_name,
236
- lifetime_params: decl.lifetime_params,
237
- )
238
- else
239
- Types::GenericStructDefinition.new(
240
- decl.name,
241
- decl.type_params.map(&:name),
242
- module_name: @ctx.module_name,
243
- external: raw_module?,
244
- packed: decl.packed,
245
- alignment: decl.alignment,
246
- linkage_name: decl.c_name,
247
- lifetime_params: decl.lifetime_params,
248
- )
249
- end
227
+ Types::Struct.new(
228
+ decl.name,
229
+ module_name: @ctx.module_name,
230
+ external: raw_module?,
231
+ packed: decl.packed,
232
+ alignment: decl.alignment,
233
+ linkage_name: decl.c_name,
234
+ lifetime_params: decl.lifetime_params,
235
+ )
236
+ else
237
+ Types::GenericStructDefinition.new(
238
+ decl.name,
239
+ decl.type_params.map(&:name),
240
+ module_name: @ctx.module_name,
241
+ external: raw_module?,
242
+ packed: decl.packed,
243
+ alignment: decl.alignment,
244
+ linkage_name: decl.c_name,
245
+ lifetime_params: decl.lifetime_params,
246
+ )
247
+ end
250
248
  register_nested_struct_types(decl)
251
249
  when AST::UnionDecl
252
250
  validate_explicit_aggregate_c_name!(decl)
@@ -255,14 +253,14 @@ module MilkTea
255
253
  when AST::VariantDecl
256
254
  ensure_available_type_name!(decl.name)
257
255
  @ctx.types[decl.name] = if decl.type_params.empty?
258
- Types::Variant.new(decl.name, module_name: @ctx.module_name)
259
- else
260
- Types::GenericVariantDefinition.new(
261
- decl.name,
262
- decl.type_params.map(&:name),
263
- module_name: @ctx.module_name,
264
- )
265
- end
256
+ Types::Variant.new(decl.name, module_name: @ctx.module_name)
257
+ else
258
+ Types::GenericVariantDefinition.new(
259
+ decl.name,
260
+ decl.type_params.map(&:name),
261
+ module_name: @ctx.module_name,
262
+ )
263
+ end
266
264
  when AST::EnumDecl
267
265
  ensure_available_type_name!(decl.name)
268
266
  @ctx.types[decl.name] = Types::Enum.new(decl.name, module_name: @ctx.module_name, external: raw_module?)
@@ -454,16 +452,16 @@ module MilkTea
454
452
  struct_type = @ctx.types.fetch(decl.name)
455
453
  struct_type.ast_declaration = decl if struct_type.respond_to?(:ast_declaration=)
456
454
  type_params = if struct_type.is_a?(Types::GenericStructDefinition)
457
- seen = {}
458
- struct_type.type_params.each_with_object({}) do |name, params|
459
- raise_sema_error("duplicate type parameter #{decl.name}[#{name}]") if seen.key?(name)
460
-
461
- seen[name] = true
462
- params[name] = Types::TypeVar.new(name)
463
- end
464
- else
465
- {}
466
- end
455
+ seen = {}
456
+ struct_type.type_params.each_with_object({}) do |name, params|
457
+ raise_sema_error("duplicate type parameter #{decl.name}[#{name}]") if seen.key?(name)
458
+
459
+ seen[name] = true
460
+ params[name] = Types::TypeVar.new(name)
461
+ end
462
+ else
463
+ {}
464
+ end
467
465
  decl.lifetime_params.each do |lt|
468
466
  type_params[lt] = Types::LifetimeRef.new(lt)
469
467
  end if decl.respond_to?(:lifetime_params)
@@ -484,11 +482,11 @@ module MilkTea
484
482
  raise_sema_error("duplicate field #{decl.name}.#{field.name}") if fields.key?(field.name)
485
483
  raise_sema_error("duplicate member #{decl.name}.#{field.name}") if events.key?(field.name)
486
484
  unless raw_module?
487
- ensure_non_reserved_type_binding_name!(
485
+ ensure_non_reserved_value_type_name!(
488
486
  field.name,
489
487
  kind_label: "field #{decl.name}",
490
- line: field.respond_to?(:line) ? field.line : decl.line,
491
- column: field.respond_to?(:column) ? field.column : nil,
488
+ line: field.line || decl.line,
489
+ column: field.column,
492
490
  )
493
491
  end
494
492
 
@@ -578,11 +576,11 @@ module MilkTea
578
576
  decl.members.each do |member|
579
577
  raise_sema_error("duplicate member #{decl.name}.#{member.name}") if member_names.include?(member.name)
580
578
  unless raw_module?
581
- ensure_non_reserved_type_binding_name!(
579
+ ensure_non_reserved_value_type_name!(
582
580
  member.name,
583
581
  kind_label: "member #{decl.name}",
584
- line: member.respond_to?(:line) ? member.line : decl.line,
585
- column: member.respond_to?(:column) ? member.column : nil,
582
+ line: member.line || decl.line,
583
+ column: member.column,
586
584
  )
587
585
  end
588
586
 
@@ -630,16 +628,16 @@ module MilkTea
630
628
 
631
629
  variant_type = @ctx.types.fetch(decl.name)
632
630
  type_params = if variant_type.is_a?(Types::GenericVariantDefinition)
633
- seen = {}
634
- variant_type.type_params.each_with_object({}) do |name, params|
635
- raise_sema_error("duplicate type parameter #{decl.name}[#{name}]") if seen.key?(name)
636
-
637
- seen[name] = true
638
- params[name] = Types::TypeVar.new(name)
639
- end
640
- else
641
- {}
642
- end
631
+ seen = {}
632
+ variant_type.type_params.each_with_object({}) do |name, params|
633
+ raise_sema_error("duplicate type parameter #{decl.name}[#{name}]") if seen.key?(name)
634
+
635
+ seen[name] = true
636
+ params[name] = Types::TypeVar.new(name)
637
+ end
638
+ else
639
+ {}
640
+ end
643
641
  type_param_constraints = variant_type.is_a?(Types::GenericVariantDefinition) ? variant_type.type_param_constraints : {}
644
642
  seen_arms = []
645
643
  arms_hash = {}
@@ -647,11 +645,11 @@ module MilkTea
647
645
  begin
648
646
  raise_sema_error("duplicate arm #{decl.name}.#{arm.name}") if seen_arms.include?(arm.name)
649
647
  unless raw_module?
650
- ensure_non_reserved_type_binding_name!(
648
+ ensure_non_reserved_value_type_name!(
651
649
  arm.name,
652
650
  kind_label: "arm #{decl.name}",
653
- line: arm.respond_to?(:line) ? arm.line : decl.line,
654
- column: arm.respond_to?(:column) ? arm.column : nil,
651
+ line: arm.line || decl.line,
652
+ column: arm.column,
655
653
  )
656
654
  end
657
655
 
@@ -663,11 +661,11 @@ module MilkTea
663
661
  begin
664
662
  raise_sema_error("duplicate field #{arm.name}.#{field.name}") if seen_fields.include?(field.name)
665
663
  unless raw_module?
666
- ensure_non_reserved_type_binding_name!(
664
+ ensure_non_reserved_value_type_name!(
667
665
  field.name,
668
666
  kind_label: "field #{decl.name}.#{arm.name}",
669
- line: field.respond_to?(:line) ? field.line : decl.line,
670
- column: field.respond_to?(:column) ? field.column : nil,
667
+ line: field.line || decl.line,
668
+ column: field.column,
671
669
  )
672
670
  end
673
671
 
@@ -740,7 +738,7 @@ module MilkTea
740
738
  case decl
741
739
  when AST::ConstDecl
742
740
  begin
743
- ensure_available_value_name!(decl.name, kind_label: "constant", line: decl.line, column: decl.respond_to?(:column) ? decl.column : nil)
741
+ ensure_available_value_name!(decl.name, kind_label: "constant", line: decl.line, column: decl.column)
744
742
  type = resolve_type_ref(decl.type)
745
743
  validate_stored_ref_type!(type, "constant #{decl.name}")
746
744
  raise_sema_error("constant #{decl.name} cannot store proc values") if contains_proc_type?(type)
@@ -760,7 +758,7 @@ module MilkTea
760
758
  ) unless @ctx.top_level_values.key?(decl.name)
761
759
  end
762
760
  when AST::VarDecl
763
- ensure_available_value_name!(decl.name, kind_label: "module variable", line: decl.line, column: decl.respond_to?(:column) ? decl.column : nil)
761
+ ensure_available_value_name!(decl.name, kind_label: "module variable", line: decl.line, column: decl.column)
764
762
  raise_sema_error("module variable #{decl.name} requires an explicit type") unless decl.type
765
763
 
766
764
  type = resolve_type_ref(decl.type)
@@ -852,10 +850,10 @@ module MilkTea
852
850
  qualified_name = "#{parent_name}.#{nested.name}"
853
851
  ensure_available_type_name!(qualified_name)
854
852
  nested_c_name = if @ctx.module_name && !raw_module?
855
- "#{@ctx.module_name.to_s.tr('.', '_')}_#{qualified_name.tr('.', '_')}"
856
- else
857
- qualified_name.tr('.', '_')
858
- end
853
+ "#{@ctx.module_name.to_s.tr('.', '_')}_#{qualified_name.tr('.', '_')}"
854
+ else
855
+ qualified_name.tr('.', '_')
856
+ end
859
857
  if nested.type_params.empty?
860
858
  @ctx.types[qualified_name] = Types::Struct.new(nested.name, module_name: @ctx.module_name, external: raw_module?, packed: nested.packed, alignment: nested.alignment, linkage_name: nested_c_name, lifetime_params: nested.lifetime_params)
861
859
  else
@@ -867,4 +865,3 @@ module MilkTea
867
865
  end
868
866
  end
869
867
  end
870
-
@@ -184,7 +184,7 @@ module MilkTea
184
184
  @return_context_stack = []
185
185
  end
186
186
 
187
- STRUCTURAL_PHASES = %i[
187
+ def check
188
188
  install_builtin_types
189
189
  install_builtin_attributes
190
190
  install_imports
@@ -201,10 +201,6 @@ module MilkTea
201
201
  check_attribute_applications
202
202
  declare_functions
203
203
  check_interface_conformances
204
- ].freeze
205
-
206
- def check
207
- STRUCTURAL_PHASES.each { |phase| send(phase) }
208
204
  check_top_level_values
209
205
  finalize_top_level_const_values
210
206
  check_top_level_static_asserts
@@ -279,7 +275,22 @@ module MilkTea
279
275
  @collecting_errors = true
280
276
  @structural_errors = []
281
277
 
282
- STRUCTURAL_PHASES.each { |phase| catch_structural { send(phase) } }
278
+ catch_structural { install_builtin_types }
279
+ catch_structural { install_builtin_attributes }
280
+ catch_structural { install_imports }
281
+ catch_structural { install_prelude_types }
282
+ catch_structural { declare_named_types }
283
+ catch_structural { resolve_generic_type_param_constraints }
284
+ catch_structural { resolve_type_aliases }
285
+ catch_structural { declare_attributes }
286
+ catch_structural { resolve_aggregate_fields }
287
+ catch_structural { resolve_enum_members }
288
+ catch_structural { resolve_variant_arms }
289
+ catch_structural { collect_emit_declarations }
290
+ catch_structural { declare_top_level_values }
291
+ catch_structural { check_attribute_applications }
292
+ catch_structural { declare_functions }
293
+ catch_structural { check_interface_conformances }
283
294
 
284
295
  errors = @structural_errors.dup
285
296
 
@@ -320,8 +331,6 @@ module MilkTea
320
331
 
321
332
  @structural_errors << error
322
333
  end
323
-
324
-
325
334
  end
326
335
  end
327
336
  end