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_attribute_applications
9
7
  expanded_declarations.each do |decl|
10
8
  with_error_node(decl) do
@@ -114,20 +112,20 @@ module MilkTea
114
112
 
115
113
  arguments.each do |argument|
116
114
  param = if argument.name
117
- params.find { |candidate| candidate.name == argument.name }.tap do |candidate|
118
- raise_sema_error("unknown attribute argument #{binding.name}.#{argument.name}") unless candidate
119
- end
120
- else
121
- while next_position < params.length && bound_arguments.key?(params[next_position].name)
122
- next_position += 1
123
- end
124
-
125
- raise_sema_error("attribute #{binding.name} expects #{params.length} arguments, got #{arguments.length}") if next_position >= params.length
126
-
127
- param = params[next_position]
128
- next_position += 1
129
- param
130
- end
115
+ params.find { |candidate| candidate.name == argument.name }.tap do |candidate|
116
+ raise_sema_error("unknown attribute argument #{binding.name}.#{argument.name}") unless candidate
117
+ end
118
+ else
119
+ while next_position < params.length && bound_arguments.key?(params[next_position].name)
120
+ next_position += 1
121
+ end
122
+
123
+ raise_sema_error("attribute #{binding.name} expects #{params.length} arguments, got #{arguments.length}") if next_position >= params.length
124
+
125
+ param = params[next_position]
126
+ next_position += 1
127
+ param
128
+ end
131
129
 
132
130
  raise_sema_error("duplicate attribute argument #{binding.name}.#{param.name}") if bound_arguments.key?(param.name)
133
131
 
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def resolved_attribute_applications_for_target(target)
9
7
  target_id = case target
10
8
  when Types::StructHandle then target.declaration.object_id
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def infer_lvalue(expression, scopes:)
9
7
  case expression
10
8
  when AST::Identifier
@@ -855,7 +853,7 @@ module MilkTea
855
853
  proc_scopes = scopes.map { |scope| freeze_scope_bindings(scope) }
856
854
  proc_scope = {}
857
855
  expression.params.each do |param|
858
- ensure_non_reserved_primitive_name!(param.name, kind_label: "parameter", line: param.respond_to?(:line) ? param.line : nil, column: param.respond_to?(:column) ? param.column : nil)
856
+ ensure_non_reserved_primitive_name!(param.name, kind_label: "parameter", line: param.line, column: param.column)
859
857
  param_type = resolve_type_ref(param.type)
860
858
  validate_parameter_ref_type!(param_type, function_name: "proc", parameter_name: param.name, external: false)
861
859
  validate_parameter_proc_type!(param_type, function_name: "proc", parameter_name: param.name, external: false, foreign: false)
@@ -1535,13 +1533,6 @@ module MilkTea
1535
1533
  false
1536
1534
  end
1537
1535
 
1538
-
1539
-
1540
-
1541
-
1542
-
1543
-
1544
-
1545
1536
  def evaluate_field_of_call(arguments, scopes:)
1546
1537
  raise_sema_error("field_of does not support named arguments") if arguments.any?(&:name)
1547
1538
  raise_sema_error("field_of expects 2 arguments, got #{arguments.length}") unless arguments.length == 2
@@ -1554,7 +1545,6 @@ module MilkTea
1554
1545
  field_handle
1555
1546
  end
1556
1547
 
1557
-
1558
1548
  def evaluate_callable_of_call(arguments, scopes:)
1559
1549
  raise_sema_error("callable_of does not support named arguments") if arguments.any?(&:name)
1560
1550
  raise_sema_error("callable_of expects 1 argument, got #{arguments.length}") unless arguments.length == 1
@@ -1562,9 +1552,6 @@ module MilkTea
1562
1552
  resolve_callable_handle_argument(arguments.first.value, scopes:)
1563
1553
  end
1564
1554
 
1565
-
1566
-
1567
-
1568
1555
  def resolve_struct_handle_argument(expression, scopes:)
1569
1556
  if (type_expr = resolve_type_expression(expression))
1570
1557
  handle = struct_handle_for_type(type_expr)
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def current_actual_scope(scopes)
9
7
  scopes.reverse_each do |scope|
10
8
  return scope unless scope.is_a?(FlowScope)
@@ -24,16 +22,16 @@ module MilkTea
24
22
 
25
23
  base_scopes = scopes.last.is_a?(FlowScope) ? scopes[0...-1] : scopes
26
24
  merged_refinements = if scopes.last.is_a?(FlowScope)
27
- scopes.last.each_with_object({}) do |(name, binding), result|
28
- result[name] = if name.is_a?(String) && binding.respond_to?(:type)
29
- binding.type
30
- else
31
- binding
32
- end
33
- end
34
- else
35
- {}
36
- end
25
+ scopes.last.each_with_object({}) do |(name, binding), result|
26
+ result[name] = if name.is_a?(String) && binding.respond_to?(:type)
27
+ binding.type
28
+ else
29
+ binding
30
+ end
31
+ end
32
+ else
33
+ {}
34
+ end
37
35
  merged_refinements = merge_refinements(merged_refinements, refinements)
38
36
  flow_scope = FlowScope.new
39
37
 
@@ -107,7 +105,7 @@ module MilkTea
107
105
  snapshots: [],
108
106
  }
109
107
  @active_local_completion_stack << frame
110
- record_local_completion_snapshot(binding.ast.respond_to?(:line) ? binding.ast.line : nil, 0, scopes)
108
+ record_local_completion_snapshot(binding.ast.line, 0, scopes)
111
109
  end
112
110
 
113
111
  def finish_local_completion_frame(binding)
@@ -119,7 +117,7 @@ module MilkTea
119
117
  return
120
118
  end
121
119
 
122
- start_line = [binding.ast.respond_to?(:line) ? binding.ast.line : nil, snapshots.first.line].compact.min
120
+ start_line = [binding.ast.line, snapshots.first.line].compact.min
123
121
  end_line = snapshots.last.line
124
122
 
125
123
  # Extend end_line to cover the actual function body so that completion
@@ -186,7 +184,7 @@ module MilkTea
186
184
  def statement_end_line(statement)
187
185
  return nil unless statement
188
186
 
189
- lines = [statement.respond_to?(:line) ? statement.line : nil]
187
+ lines = [statement.line]
190
188
 
191
189
  case statement
192
190
  when AST::ErrorBlockStmt
@@ -237,7 +235,7 @@ module MilkTea
237
235
  def expression_end_line(node)
238
236
  return nil unless node
239
237
 
240
- lines = [node.respond_to?(:line) ? node.line : nil]
238
+ lines = [node.line]
241
239
 
242
240
  case node
243
241
  when AST::MemberAccess
@@ -376,28 +374,27 @@ module MilkTea
376
374
  else_lines = last_ast_line(stmt.else_body)
377
375
  [stmt.line, *branch_lines, else_lines].compact.max
378
376
  when AST::WhileStmt, AST::ForStmt, AST::UnsafeStmt, AST::ErrorBlockStmt
379
- [stmt.respond_to?(:line) ? stmt.line : nil, last_ast_line(stmt.body)].compact.max
377
+ [stmt.line, last_ast_line(stmt.body)].compact.max
380
378
  when AST::MatchStmt
381
379
  arm_lines = stmt.arms.filter_map do |arm|
382
380
  if arm.respond_to?(:body)
383
381
  last_ast_line(arm.body)
384
382
  elsif arm.respond_to?(:value)
385
- arm.value.respond_to?(:line) ? arm.value.line : nil
383
+ arm.value.line
386
384
  end
387
385
  end
388
386
  [stmt.line, *arm_lines].compact.max
389
387
  when AST::DeferStmt
390
- [stmt.respond_to?(:line) ? stmt.line : nil, last_ast_line(stmt.body)].compact.max
388
+ [stmt.line, last_ast_line(stmt.body)].compact.max
391
389
  when AST::WhenStmt
392
390
  branch_lines = stmt.branches.filter_map { |b| last_ast_line(b.body) }
393
391
  else_lines = last_ast_line(stmt.else_body)
394
392
  [stmt.line, *branch_lines, else_lines].compact.max
395
393
  else
396
- stmt.respond_to?(:line) ? stmt.line : nil
394
+ stmt.line
397
395
  end
398
396
  end.compact.max
399
397
  end
400
-
401
398
  end
402
399
  end
403
400
  end
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def validate_consuming_foreign_parameter!(type, function_name:, parameter_name:)
9
7
  if type.is_a?(Types::Nullable) || !(opaque_type?(type) || pointer_type?(type))
10
8
  raise_sema_error("consuming parameter #{parameter_name} of #{function_name} must use a non-null opaque or ptr[...] type")
@@ -153,6 +151,5 @@ module MilkTea
153
151
  binding
154
152
  end
155
153
  end
156
-
157
154
  end
158
155
  end
@@ -3,23 +3,21 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def declare_functions
9
7
  expanded_declarations.each do |decl|
10
8
  with_error_node(decl) do
11
9
  case decl
12
10
  when AST::FunctionDef
13
- ensure_available_value_name!(decl.name, kind_label: "function", line: decl.line, column: decl.respond_to?(:column) ? decl.column : nil)
11
+ ensure_available_value_name!(decl.name, kind_label: "function", line: decl.line, column: decl.column)
14
12
  @ctx.top_level_functions[decl.name] = declare_function_binding(decl)
15
13
  when AST::ExternFunctionDecl
16
- ensure_available_value_name!(decl.name, kind_label: "function", line: decl.line, column: decl.respond_to?(:column) ? decl.column : nil)
14
+ ensure_available_value_name!(decl.name, kind_label: "function", line: decl.line, column: decl.column)
17
15
  if decl.mapping && !decl.mapping.is_a?(AST::StringLiteral)
18
16
  raise_sema_error("external function #{decl.name} mapping must be a c-string literal")
19
17
  end
20
18
  @ctx.top_level_functions[decl.name] = declare_function_binding(decl, external: true)
21
19
  when AST::ForeignFunctionDecl
22
- ensure_available_value_name!(decl.name, kind_label: "function", line: decl.line, column: decl.respond_to?(:column) ? decl.column : nil)
20
+ ensure_available_value_name!(decl.name, kind_label: "function", line: decl.line, column: decl.column)
23
21
  @ctx.top_level_functions[decl.name] = declare_function_binding(decl)
24
22
  when AST::ExtendingBlock
25
23
  dispatch_receiver_type, receiver_type, receiver_type_param_names, receiver_type_param_constraints = resolve_methods_receiver_target(decl.type_name)
@@ -88,7 +86,7 @@ module MilkTea
88
86
  any_default = false
89
87
  decl.params.each do |param|
90
88
  begin
91
- ensure_non_reserved_primitive_name!(param.name, kind_label: "parameter", line: param.respond_to?(:line) ? param.line : decl.line, column: param.respond_to?(:column) ? param.column : nil)
89
+ ensure_non_reserved_primitive_name!(param.name, kind_label: "parameter", line: param.line || decl.line, column: param.column)
92
90
  type = resolve_type_ref(param.type, type_params:, type_param_constraints:)
93
91
  validate_parameter_ref_type!(type, function_name: decl.name, parameter_name: param.name, external:)
94
92
  reject_foreign_nullable_value_type!(type, function_name: decl.name, parameter_name: param.name) if foreign || external
@@ -272,7 +270,7 @@ module MilkTea
272
270
  owner = binding.owner
273
271
  prev_collecting = owner.instance_variable_get(:@collecting_errors)
274
272
  owner.instance_variable_set(:@collecting_errors, false)
275
- owner.send(:check_function, binding)
273
+ owner.check_function(binding)
276
274
  rescue SemanticError => e
277
275
  raise unless e.message.include?("cannot assign through immutable")
278
276
  ensure
@@ -529,13 +527,13 @@ module MilkTea
529
527
 
530
528
  def infer_member_access_field_type(value, scopes)
531
529
  receiver_type = case value.receiver
532
- when AST::Identifier
533
- if value.receiver.name == "this"
534
- (binding = lookup_value("this", scopes)) ? binding.type : nil
535
- else
536
- (binding = lookup_value(value.receiver.name, scopes)) ? binding.type : nil
537
- end
538
- end
530
+ when AST::Identifier
531
+ if value.receiver.name == "this"
532
+ (binding = lookup_value("this", scopes)) ? binding.type : nil
533
+ else
534
+ (binding = lookup_value(value.receiver.name, scopes)) ? binding.type : nil
535
+ end
536
+ end
539
537
  return nil unless receiver_type
540
538
 
541
539
  field_receiver = receiver_type_for_fields(receiver_type)
@@ -683,7 +681,6 @@ module MilkTea
683
681
  @current_specialization_owner = previous_specialization_owner
684
682
  @checking_function_bindings.delete(binding.object_id)
685
683
  end
686
-
687
684
  end
688
685
  end
689
686
  end
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def infer_receiver_type_substitutions(binding, receiver_type)
9
7
  declared_receiver_type = binding.declared_receiver_type
10
8
  return {} unless declared_receiver_type
@@ -117,45 +115,45 @@ module MilkTea
117
115
  receiver = nil
118
116
  receiver_type = nil
119
117
  binding = case expression.callee
120
- when AST::Identifier
121
- @ctx.top_level_functions[expression.callee.name]
122
- when AST::MemberAccess
123
- if expression.callee.receiver.is_a?(AST::Identifier) && @ctx.imports.key?(expression.callee.receiver.name)
124
- imported_module = @ctx.imports.fetch(expression.callee.receiver.name)
125
- imported_function = imported_module.functions[expression.callee.member]
126
- if imported_function.nil? && imported_module.private_function?(expression.callee.member)
127
- raise_sema_error("#{expression.callee.receiver.name}.#{expression.callee.member} is private to module #{imported_module.name}")
128
- end
129
-
130
- imported_function
131
- elsif (type_expr = resolve_type_expression(expression.callee.receiver))
132
- associated_function = lookup_method(type_expr, expression.callee.member)
133
- if associated_function&.type&.receiver_type.nil?
134
- receiver_type = type_expr
135
- associated_function
136
- else
137
- if (imported_module = imported_module_with_private_method(type_expr, expression.callee.member))
138
- raise_sema_error("#{type_expr}.#{expression.callee.member} is private to module #{imported_module.name}")
139
- end
140
-
141
- nil
142
- end
143
- else
144
- receiver_type = infer_method_receiver_type(expression.callee.receiver, scopes:, member_name: expression.callee.member)
145
- method = lookup_method(receiver_type, expression.callee.member)
146
- if method
147
- callable_kind = :method
148
- receiver = expression.callee.receiver
149
- method
150
- else
151
- if (imported_module = imported_module_with_private_method(receiver_type, expression.callee.member))
152
- raise_sema_error("#{receiver_type}.#{expression.callee.member} is private to module #{imported_module.name}")
153
- end
154
-
155
- nil
156
- end
157
- end
158
- end
118
+ when AST::Identifier
119
+ @ctx.top_level_functions[expression.callee.name]
120
+ when AST::MemberAccess
121
+ if expression.callee.receiver.is_a?(AST::Identifier) && @ctx.imports.key?(expression.callee.receiver.name)
122
+ imported_module = @ctx.imports.fetch(expression.callee.receiver.name)
123
+ imported_function = imported_module.functions[expression.callee.member]
124
+ if imported_function.nil? && imported_module.private_function?(expression.callee.member)
125
+ raise_sema_error("#{expression.callee.receiver.name}.#{expression.callee.member} is private to module #{imported_module.name}")
126
+ end
127
+
128
+ imported_function
129
+ elsif (type_expr = resolve_type_expression(expression.callee.receiver))
130
+ associated_function = lookup_method(type_expr, expression.callee.member)
131
+ if associated_function&.type&.receiver_type.nil?
132
+ receiver_type = type_expr
133
+ associated_function
134
+ else
135
+ if (imported_module = imported_module_with_private_method(type_expr, expression.callee.member))
136
+ raise_sema_error("#{type_expr}.#{expression.callee.member} is private to module #{imported_module.name}")
137
+ end
138
+
139
+ nil
140
+ end
141
+ else
142
+ receiver_type = infer_method_receiver_type(expression.callee.receiver, scopes:, member_name: expression.callee.member)
143
+ method = lookup_method(receiver_type, expression.callee.member)
144
+ if method
145
+ callable_kind = :method
146
+ receiver = expression.callee.receiver
147
+ method
148
+ else
149
+ if (imported_module = imported_module_with_private_method(receiver_type, expression.callee.member))
150
+ raise_sema_error("#{receiver_type}.#{expression.callee.member} is private to module #{imported_module.name}")
151
+ end
152
+
153
+ nil
154
+ end
155
+ end
156
+ end
159
157
  return nil unless binding
160
158
 
161
159
  type_arguments = resolve_specialization_type_arguments(expression)
@@ -265,12 +263,12 @@ module MilkTea
265
263
  argument = arguments.fetch(index)
266
264
  candidate_type = substitute_type(parameter.type, substitutions)
267
265
  expected_argument_type = if callable_type?(candidate_type)
268
- candidate_type
269
- elsif contains_type_var?(candidate_type)
270
- nil
271
- else
272
- candidate_type
273
- end
266
+ candidate_type
267
+ elsif contains_type_var?(candidate_type)
268
+ nil
269
+ else
270
+ candidate_type
271
+ end
274
272
  actual_type = foreign_argument_actual_type(parameter, argument, scopes:, function_name: binding.name, expected_type: expected_argument_type)
275
273
  collect_type_substitutions(parameter.type, actual_type, substitutions, binding.name)
276
274
  end
@@ -340,18 +338,18 @@ module MilkTea
340
338
  end
341
339
 
342
340
  actual_params = case actual_type
343
- when Types::Proc
344
- return unless actual_type.params.length == pattern_type.params.length
345
-
346
- actual_type.params
347
- when Types::Function
348
- return if actual_type.receiver_type || actual_type.variadic
349
- return unless actual_type.params.length == pattern_type.params.length
350
-
351
- actual_type.params
352
- else
353
- return
354
- end
341
+ when Types::Proc
342
+ return unless actual_type.params.length == pattern_type.params.length
343
+
344
+ actual_type.params
345
+ when Types::Function
346
+ return if actual_type.receiver_type || actual_type.variadic
347
+ return unless actual_type.params.length == pattern_type.params.length
348
+
349
+ actual_type.params
350
+ else
351
+ return
352
+ end
355
353
 
356
354
  pattern_type.params.zip(actual_params).each do |expected_param, actual_param|
357
355
  collect_type_substitutions(expected_param.type, actual_param.type, substitutions, function_name)
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def check_interface_conformances
9
7
  expanded_declarations.each do |decl|
10
8
  with_error_node(decl) do
@@ -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