mt-lang 0.3.9 → 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 +8 -9
  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 +0 -2
  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 +112 -54
  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_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
@@ -5,19 +5,18 @@ require_relative "types"
5
5
 
6
6
  module MilkTea
7
7
  module Layout
8
- module_function
9
8
 
10
9
  POINTER_SIZE = Fiddle::SIZEOF_VOIDP
11
10
 
12
- def size_of(type)
11
+ def self.size_of(type)
13
12
  size_and_alignment(type, {})&.first
14
13
  end
15
14
 
16
- def alignment_of(type)
15
+ def self.alignment_of(type)
17
16
  size_and_alignment(type, {})&.last
18
17
  end
19
18
 
20
- def offset_of(type, field_name)
19
+ def self.offset_of(type, field_name)
21
20
  case type
22
21
  when Types::Struct, Types::StructInstance, Types::Span, Types::StringView, Types::Task
23
22
  fields = ordered_fields(type)
@@ -38,7 +37,7 @@ module MilkTea
38
37
  end
39
38
  end
40
39
 
41
- def size_and_alignment(type, stack)
40
+ def self.size_and_alignment(type, stack)
42
41
  case type
43
42
  when Types::Primitive
44
43
  primitive_layout(type)
@@ -82,7 +81,7 @@ module MilkTea
82
81
  end
83
82
  end
84
83
 
85
- def primitive_layout(type)
84
+ def self.primitive_layout(type)
86
85
  case type.name
87
86
  when "bool", "byte", "ubyte", "char"
88
87
  [1, 1]
@@ -99,7 +98,7 @@ module MilkTea
99
98
  end
100
99
  end
101
100
 
102
- def generic_layout(type, stack)
101
+ def self.generic_layout(type, stack)
103
102
  case type.name
104
103
  when "ptr", "const_ptr", "own", "ref"
105
104
  [POINTER_SIZE, POINTER_SIZE]
@@ -120,7 +119,7 @@ module MilkTea
120
119
  end
121
120
  end
122
121
 
123
- def variant_layout(type, stack:)
122
+ def self.variant_layout(type, stack:)
124
123
  payload_layouts = type.arm_names.filter_map do |arm_name|
125
124
  fields = type.arm(arm_name)
126
125
  next if fields.nil? || fields.empty?
@@ -134,7 +133,7 @@ module MilkTea
134
133
  struct_layout_from_infos(field_infos, packed: false, alignment: nil)
135
134
  end
136
135
 
137
- def struct_layout(fields, packed:, alignment:, stack:)
136
+ def self.struct_layout(fields, packed:, alignment:, stack:)
138
137
  field_infos = fields.map do |field_name, field_type|
139
138
  field_layout = size_and_alignment(field_type, stack)
140
139
  return nil unless field_layout
@@ -145,7 +144,7 @@ module MilkTea
145
144
  struct_layout_from_infos(field_infos, packed:, alignment:)
146
145
  end
147
146
 
148
- def union_layout(fields, packed:, alignment:, stack:)
147
+ def self.union_layout(fields, packed:, alignment:, stack:)
149
148
  field_infos = fields.map do |_field_name, field_type|
150
149
  field_layout = size_and_alignment(field_type, stack)
151
150
  return nil unless field_layout
@@ -156,7 +155,7 @@ module MilkTea
156
155
  union_layout_from_layouts(field_infos.map { |size, field_alignment| { size:, alignment: field_alignment } }, packed:, alignment:)
157
156
  end
158
157
 
159
- def struct_layout_from_infos(field_infos, packed:, alignment:)
158
+ def self.struct_layout_from_infos(field_infos, packed:, alignment:)
160
159
  offsets = {}
161
160
  offset = 0
162
161
  natural_alignment = 1
@@ -177,7 +176,7 @@ module MilkTea
177
176
  }
178
177
  end
179
178
 
180
- def union_layout_from_layouts(layouts, packed:, alignment:)
179
+ def self.union_layout_from_layouts(layouts, packed:, alignment:)
181
180
  natural_alignment = packed ? 1 : (layouts.map { |layout| layout[:alignment] }.max || 1)
182
181
  overall_alignment = [natural_alignment, alignment || 1].max
183
182
  size = layouts.map { |layout| layout[:size] }.max || 0
@@ -188,27 +187,27 @@ module MilkTea
188
187
  }
189
188
  end
190
189
 
191
- def ordered_fields(type)
190
+ def self.ordered_fields(type)
192
191
  type.fields
193
192
  end
194
193
 
195
- def packed_layout?(type)
194
+ def self.packed_layout?(type)
196
195
  type.respond_to?(:packed) && type.packed
197
196
  end
198
197
 
199
- def explicit_alignment(type)
198
+ def self.explicit_alignment(type)
200
199
  type.respond_to?(:alignment) ? type.alignment : nil
201
200
  end
202
201
 
203
- def array_type?(type)
202
+ def self.array_type?(type)
204
203
  type.arguments.length == 2 && type.arguments[1].is_a?(Types::LiteralTypeArg) && type.arguments[1].value.is_a?(Integer)
205
204
  end
206
205
 
207
- def str_buffer_type?(type)
206
+ def self.str_buffer_type?(type)
208
207
  type.arguments.length == 1 && type.arguments.first.is_a?(Types::LiteralTypeArg) && type.arguments.first.value.is_a?(Integer)
209
208
  end
210
209
 
211
- def str_buffer_fields(type)
210
+ def self.str_buffer_fields(type)
212
211
  storage_capacity = type.arguments.first.value + 1
213
212
  {
214
213
  "data" => Types::Registry.generic_instance("array", [Types::Registry.primitive("char"), Types::LiteralTypeArg.new(storage_capacity)]),
@@ -217,28 +216,28 @@ module MilkTea
217
216
  }
218
217
  end
219
218
 
220
- def layout_pointer_like_nullable_base?(base)
219
+ def self.layout_pointer_like_nullable_base?(base)
221
220
  return true if base.is_a?(Types::Function) || base.is_a?(Types::Proc) || base.is_a?(Types::Opaque)
222
221
  return true if base.is_a?(Types::Primitive) && base.name == "cstr"
223
222
 
224
223
  base.is_a?(Types::GenericInstance) && %w[ptr const_ptr own ref].include?(base.name)
225
224
  end
226
225
 
227
- def nullable_opt_layout_fields(base)
226
+ def self.nullable_opt_layout_fields(base)
228
227
  {
229
228
  "has_value" => Types::Registry.primitive("bool"),
230
229
  "value" => base,
231
230
  }
232
231
  end
233
232
 
234
- def align_up(value, alignment)
233
+ def self.align_up(value, alignment)
235
234
  return value if alignment <= 1
236
235
 
237
236
  remainder = value % alignment
238
237
  remainder.zero? ? value : value + alignment - remainder
239
238
  end
240
239
 
241
- def with_stack(type, stack)
240
+ def self.with_stack(type, stack)
242
241
  return if stack[type]
243
242
 
244
243
  stack[type] = true
@@ -615,8 +615,6 @@ module MilkTea
615
615
  end
616
616
  end
617
617
 
618
- private
619
-
620
618
  def char_array_text_type?(type)
621
619
  return false unless array_type?(type)
622
620