mt-lang 0.3.8 → 0.3.10

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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/lib/milk_tea/base.rb +1 -2
  3. data/lib/milk_tea/bindings/bindgen/ast_parser.rb +0 -2
  4. data/lib/milk_tea/bindings/bindgen/declaration.rb +0 -2
  5. data/lib/milk_tea/bindings/bindgen/emitter.rb +0 -2
  6. data/lib/milk_tea/bindings/bindgen/overrides.rb +0 -2
  7. data/lib/milk_tea/bindings/bindgen/type_mapper.rb +51 -53
  8. data/lib/milk_tea/bindings/imported_bindings/generator.rb +7 -9
  9. data/lib/milk_tea/bindings/imported_bindings/method_source.rb +0 -2
  10. data/lib/milk_tea/bindings/imported_bindings/naming.rb +6 -8
  11. data/lib/milk_tea/bindings/imported_bindings.rb +0 -2
  12. data/lib/milk_tea/bindings/opengl_registry.rb +3 -7
  13. data/lib/milk_tea/bindings/steamworks.rb +12 -16
  14. data/lib/milk_tea/bindings/upstream_sources.rb +10 -14
  15. data/lib/milk_tea/bindings/vendored_box2d.rb +10 -12
  16. data/lib/milk_tea/bindings/vendored_cjson.rb +6 -8
  17. data/lib/milk_tea/bindings/vendored_flecs.rb +10 -12
  18. data/lib/milk_tea/bindings/vendored_glfw.rb +11 -13
  19. data/lib/milk_tea/bindings/vendored_libuv.rb +11 -13
  20. data/lib/milk_tea/bindings/vendored_pcre2.rb +11 -13
  21. data/lib/milk_tea/bindings/vendored_raylib.rb +6 -10
  22. data/lib/milk_tea/bindings/vendored_sdl3.rb +11 -13
  23. data/lib/milk_tea/bindings/vendored_steamworks.rb +1 -5
  24. data/lib/milk_tea/core/ast.rb +103 -45
  25. data/lib/milk_tea/core/async_runtime_installer.rb +0 -2
  26. data/lib/milk_tea/core/bindings/attribute_binding.rb +1 -3
  27. data/lib/milk_tea/core/c_backend/aggregate_utils.rb +147 -84
  28. data/lib/milk_tea/core/c_backend/control_flow_emission.rb +394 -396
  29. data/lib/milk_tea/core/c_backend/expressions.rb +489 -476
  30. data/lib/milk_tea/core/c_backend/feature_detection.rb +446 -437
  31. data/lib/milk_tea/core/c_backend/format_helpers.rb +0 -2
  32. data/lib/milk_tea/core/c_backend/reachability.rb +339 -341
  33. data/lib/milk_tea/core/c_backend/reinterpret.rb +231 -217
  34. data/lib/milk_tea/core/c_backend/runtime_helpers.rb +531 -526
  35. data/lib/milk_tea/core/c_backend/statements.rb +528 -530
  36. data/lib/milk_tea/core/c_backend/type_collectors.rb +1344 -1346
  37. data/lib/milk_tea/core/c_backend/type_declaration.rb +215 -213
  38. data/lib/milk_tea/core/c_backend/type_system.rb +347 -349
  39. data/lib/milk_tea/core/c_backend.rb +17 -9
  40. data/lib/milk_tea/core/compatibility_helpers.rb +0 -2
  41. data/lib/milk_tea/core/compile_time/const_eval.rb +7 -12
  42. data/lib/milk_tea/core/compile_time.rb +32 -38
  43. data/lib/milk_tea/core/control_flow/builder.rb +3 -5
  44. data/lib/milk_tea/core/control_flow/constant_propagation.rb +14 -17
  45. data/lib/milk_tea/core/control_flow/definite_assignment.rb +0 -1
  46. data/lib/milk_tea/core/ir.rb +10 -10
  47. data/lib/milk_tea/core/lexer/character_classes.rb +5 -7
  48. data/lib/milk_tea/core/lexer/format_strings.rb +7 -9
  49. data/lib/milk_tea/core/lexer/heredocs.rb +22 -22
  50. data/lib/milk_tea/core/lexer/indentation.rb +0 -2
  51. data/lib/milk_tea/core/lexer/numbers.rb +0 -2
  52. data/lib/milk_tea/core/lexer/recovery.rb +0 -2
  53. data/lib/milk_tea/core/lexer/strings.rb +0 -2
  54. data/lib/milk_tea/core/lexer/symbols.rb +0 -2
  55. data/lib/milk_tea/core/lexer/trivia.rb +0 -2
  56. data/lib/milk_tea/core/lexer.rb +0 -2
  57. data/lib/milk_tea/core/lowering/async/analysis.rb +0 -2
  58. data/lib/milk_tea/core/lowering/async/lowering.rb +1264 -1265
  59. data/lib/milk_tea/core/lowering/async/normalization.rb +0 -2
  60. data/lib/milk_tea/core/lowering/async.rb +627 -630
  61. data/lib/milk_tea/core/lowering/block.rb +413 -416
  62. data/lib/milk_tea/core/lowering/calls.rb +1381 -1384
  63. data/lib/milk_tea/core/lowering/declarations.rb +180 -183
  64. data/lib/milk_tea/core/lowering/dyn.rb +48 -50
  65. data/lib/milk_tea/core/lowering/events.rb +983 -985
  66. data/lib/milk_tea/core/lowering/expressions.rb +1513 -1518
  67. data/lib/milk_tea/core/lowering/foreign_cstr.rb +181 -184
  68. data/lib/milk_tea/core/lowering/functions.rb +185 -188
  69. data/lib/milk_tea/core/lowering/loops.rb +1028 -1031
  70. data/lib/milk_tea/core/lowering/proc.rb +363 -366
  71. data/lib/milk_tea/core/lowering/resolve.rb +2133 -2135
  72. data/lib/milk_tea/core/lowering/scans.rb +179 -181
  73. data/lib/milk_tea/core/lowering/str_buffer.rb +102 -105
  74. data/lib/milk_tea/core/lowering/utils.rb +1040 -1044
  75. data/lib/milk_tea/core/lowering.rb +5 -7
  76. data/lib/milk_tea/core/module_binder.rb +0 -2
  77. data/lib/milk_tea/core/module_loader/errors.rb +4 -2
  78. data/lib/milk_tea/core/module_loader.rb +113 -20
  79. data/lib/milk_tea/core/module_path_resolver.rb +0 -2
  80. data/lib/milk_tea/core/module_roots.rb +6 -8
  81. data/lib/milk_tea/core/parser/attributes.rb +0 -2
  82. data/lib/milk_tea/core/parser/blocks.rb +0 -2
  83. data/lib/milk_tea/core/parser/declarations.rb +0 -2
  84. data/lib/milk_tea/core/parser/expressions.rb +31 -14
  85. data/lib/milk_tea/core/parser/recovery.rb +0 -2
  86. data/lib/milk_tea/core/parser/statements.rb +0 -2
  87. data/lib/milk_tea/core/parser/types.rb +8 -10
  88. data/lib/milk_tea/core/parser.rb +1 -3
  89. data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +31 -33
  90. data/lib/milk_tea/core/pretty_printer/base_formatter.rb +0 -2
  91. data/lib/milk_tea/core/pretty_printer/ir_formatter.rb +0 -2
  92. data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +0 -2
  93. data/lib/milk_tea/core/semantic_analyzer/attributes.rb +14 -16
  94. data/lib/milk_tea/core/semantic_analyzer/calls.rb +0 -2
  95. data/lib/milk_tea/core/semantic_analyzer/expressions.rb +1 -14
  96. data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +18 -21
  97. data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +0 -3
  98. data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +12 -15
  99. data/lib/milk_tea/core/semantic_analyzer/generics.rb +57 -59
  100. data/lib/milk_tea/core/semantic_analyzer/interface_conformance.rb +0 -2
  101. data/lib/milk_tea/core/semantic_analyzer/name_resolution.rb +5 -9
  102. data/lib/milk_tea/core/semantic_analyzer/nullability.rb +0 -3
  103. data/lib/milk_tea/core/semantic_analyzer/statements.rb +35 -40
  104. data/lib/milk_tea/core/semantic_analyzer/top_level.rb +10 -12
  105. data/lib/milk_tea/core/semantic_analyzer/type_compatibility.rb +0 -6
  106. data/lib/milk_tea/core/semantic_analyzer/type_declaration.rb +102 -105
  107. data/lib/milk_tea/core/semantic_analyzer.rb +17 -8
  108. data/lib/milk_tea/core/types/layout.rb +21 -22
  109. data/lib/milk_tea/core/types/predicates.rb +0 -2
  110. data/lib/milk_tea/core/types/registry.rb +16 -18
  111. data/lib/milk_tea/core/types/visitor.rb +0 -4
  112. data/lib/milk_tea/dap/backends/lldb_dap.rb +0 -2
  113. data/lib/milk_tea/dap/protocol.rb +1 -1
  114. data/lib/milk_tea/dap/server/breakpoints.rb +0 -2
  115. data/lib/milk_tea/dap/server/debug_map.rb +0 -2
  116. data/lib/milk_tea/dap/server/handlers.rb +0 -2
  117. data/lib/milk_tea/dap/server/launch.rb +0 -2
  118. data/lib/milk_tea/dap/server/lldb_backend.rb +8 -10
  119. data/lib/milk_tea/dap/server/pause_diagnostics.rb +14 -16
  120. data/lib/milk_tea/dap/server/utilities.rb +0 -2
  121. data/lib/milk_tea/dap/server/wire.rb +0 -2
  122. data/lib/milk_tea/dap/server.rb +0 -2
  123. data/lib/milk_tea/lsp/diagnostics.rb +16 -16
  124. data/lib/milk_tea/lsp/server/call_hierarchy.rb +11 -12
  125. data/lib/milk_tea/lsp/server/code_actions.rb +355 -357
  126. data/lib/milk_tea/lsp/server/code_lens.rb +23 -25
  127. data/lib/milk_tea/lsp/server/completion.rb +873 -875
  128. data/lib/milk_tea/lsp/server/configuration.rb +129 -131
  129. data/lib/milk_tea/lsp/server/debug_info.rb +0 -2
  130. data/lib/milk_tea/lsp/server/definition.rb +564 -565
  131. data/lib/milk_tea/lsp/server/diagnostics_scheduling.rb +191 -193
  132. data/lib/milk_tea/lsp/server/execute_command.rb +0 -2
  133. data/lib/milk_tea/lsp/server/folding_range.rb +0 -4
  134. data/lib/milk_tea/lsp/server/formatting.rb +478 -480
  135. data/lib/milk_tea/lsp/server/hover.rb +1282 -1284
  136. data/lib/milk_tea/lsp/server/inlay_hints.rb +179 -181
  137. data/lib/milk_tea/lsp/server/lifecycle.rb +192 -194
  138. data/lib/milk_tea/lsp/server/linked_editing_range.rb +0 -2
  139. data/lib/milk_tea/lsp/server/on_type_formatting.rb +0 -2
  140. data/lib/milk_tea/lsp/server/progress.rb +0 -2
  141. data/lib/milk_tea/lsp/server/references.rb +316 -318
  142. data/lib/milk_tea/lsp/server/rename.rb +445 -447
  143. data/lib/milk_tea/lsp/server/selection_range.rb +0 -4
  144. data/lib/milk_tea/lsp/server/semantic_tokens.rb +1318 -1320
  145. data/lib/milk_tea/lsp/server/signature_help.rb +146 -148
  146. data/lib/milk_tea/lsp/server/text_documents.rb +99 -101
  147. data/lib/milk_tea/lsp/server/type_hierarchy.rb +2 -4
  148. data/lib/milk_tea/lsp/server/utilities.rb +397 -399
  149. data/lib/milk_tea/lsp/server.rb +0 -3
  150. data/lib/milk_tea/lsp/workspace/analysis.rb +40 -42
  151. data/lib/milk_tea/lsp/workspace/dependency_graph.rb +4 -10
  152. data/lib/milk_tea/lsp/workspace/utilities.rb +19 -19
  153. data/lib/milk_tea/packages/atomic_write.rb +4 -5
  154. data/lib/milk_tea/packages/dependency_solver.rb +15 -15
  155. data/lib/milk_tea/packages/lock.rb +4 -4
  156. data/lib/milk_tea/packages/manager_cli.rb +1 -1
  157. data/lib/milk_tea/packages/manifest.rb +3 -3
  158. data/lib/milk_tea/packages/registry_store.rb +4 -6
  159. data/lib/milk_tea/packages/services.rb +16 -16
  160. data/lib/milk_tea/packages/source_cache.rb +4 -6
  161. data/lib/milk_tea/packages/source_resolver.rb +44 -44
  162. data/lib/milk_tea/packages/version.rb +8 -8
  163. data/lib/milk_tea/tooling/build.rb +3 -7
  164. data/lib/milk_tea/tooling/build_cache.rb +0 -2
  165. data/lib/milk_tea/tooling/debug_info_formatter.rb +31 -33
  166. data/lib/milk_tea/tooling/debug_map.rb +8 -10
  167. data/lib/milk_tea/tooling/docs_app.rb +0 -2
  168. data/lib/milk_tea/tooling/linter/doc_tags.rb +25 -27
  169. data/lib/milk_tea/tooling/linter/fix_engine.rb +87 -24
  170. data/lib/milk_tea/tooling/linter/flow_rules.rb +44 -46
  171. data/lib/milk_tea/tooling/linter/imports_platform.rb +14 -16
  172. data/lib/milk_tea/tooling/linter/release_rules.rb +3 -5
  173. data/lib/milk_tea/tooling/linter/reserved_names.rb +23 -25
  174. data/lib/milk_tea/tooling/linter/rules.rb +87 -89
  175. data/lib/milk_tea/tooling/linter/source_helpers.rb +40 -42
  176. data/lib/milk_tea/tooling/linter/trailing_comma.rb +17 -19
  177. data/lib/milk_tea/tooling/linter/visitors.rb +162 -50
  178. data/lib/milk_tea/tooling/linter.rb +0 -2
  179. data/lib/milk_tea/tooling/project_scaffold.rb +0 -2
  180. data/lib/milk_tea/tooling/run.rb +0 -2
  181. data/lib/milk_tea/tooling/toolchain_cli.rb +0 -2
  182. data/std/cli.mt +13 -32
  183. data/std/color.mt +28 -28
  184. data/std/encoding.mt +4 -4
  185. data/std/graph.mt +1 -2
  186. data/std/hash.mt +14 -14
  187. data/std/http/server.mt +3 -3
  188. data/std/input.mt +1 -1
  189. data/std/json.mt +1 -1
  190. data/std/linear_algebra.mt +6 -6
  191. data/std/net/mux.mt +1 -1
  192. data/std/noise.mt +23 -23
  193. data/std/parse.mt +2 -2
  194. data/std/process.mt +3 -4
  195. data/std/sparse_set.mt +1 -1
  196. data/std/steering.mt +5 -5
  197. data/std/str.mt +1 -1
  198. data/std/tween.mt +4 -4
  199. data/std/utility.mt +3 -3
  200. 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 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)
@@ -487,8 +485,8 @@ module MilkTea
487
485
  ensure_non_reserved_type_binding_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
 
@@ -581,8 +579,8 @@ module MilkTea
581
579
  ensure_non_reserved_type_binding_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 = {}
@@ -650,8 +648,8 @@ module MilkTea
650
648
  ensure_non_reserved_type_binding_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
 
@@ -666,8 +664,8 @@ module MilkTea
666
664
  ensure_non_reserved_type_binding_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