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
@@ -14,8 +14,6 @@ module MilkTea
14
14
  finish
15
15
  end
16
16
 
17
- private
18
-
19
17
  def build_comment_map(trivia)
20
18
  @blank_line_set = {}
21
19
  map = {}
@@ -146,7 +144,7 @@ module MilkTea
146
144
  end
147
145
 
148
146
  def emit_declaration(declaration)
149
- decl_line = declaration.respond_to?(:line) ? declaration.line : nil
147
+ decl_line = declaration.line
150
148
  flush_leading_comments_before(decl_line)
151
149
  header_idx = @lines.length
152
150
 
@@ -300,19 +298,19 @@ module MilkTea
300
298
 
301
299
  def render_function_signature(function, prefix: "")
302
300
  signature_prefix = if function.is_a?(AST::MethodDef)
303
- case function.kind
304
- when :editable
305
- "editable function "
306
- when :static
307
- "static function "
308
- else
309
- "function "
310
- end
311
- elsif function.is_a?(AST::ForeignFunctionDecl)
312
- "foreign function "
313
- else
314
- "function "
315
- end
301
+ case function.kind
302
+ when :editable
303
+ "editable function "
304
+ when :static
305
+ "static function "
306
+ else
307
+ "function "
308
+ end
309
+ elsif function.is_a?(AST::ForeignFunctionDecl)
310
+ "foreign function "
311
+ else
312
+ "function "
313
+ end
316
314
  async_prefix = function.respond_to?(:async) && function.async ? "async " : ""
317
315
  text = +"#{prefix}#{visibility_prefix(function)}#{async_prefix}#{signature_prefix}#{function.name}#{render_type_params(function.type_params)}(#{render_signature_params(function)})"
318
316
  text << " -> #{render_type(function.return_type)}" if function.return_type
@@ -323,10 +321,10 @@ module MilkTea
323
321
  return "" if @current_module_kind == :raw_module
324
322
 
325
323
  visibility = if declaration_or_visibility.is_a?(Symbol)
326
- declaration_or_visibility
327
- elsif declaration_or_visibility.respond_to?(:visibility)
328
- declaration_or_visibility.visibility
329
- end
324
+ declaration_or_visibility
325
+ elsif declaration_or_visibility.respond_to?(:visibility)
326
+ declaration_or_visibility.visibility
327
+ end
330
328
 
331
329
  visibility == :public ? "public " : ""
332
330
  end
@@ -414,11 +412,11 @@ module MilkTea
414
412
  prefix = +""
415
413
  prefix << "async " if method.async
416
414
  prefix << case method.kind
417
- when :editable
418
- "editable function "
419
- else
420
- "function "
421
- end
415
+ when :editable
416
+ "editable function "
417
+ else
418
+ "function "
419
+ end
422
420
 
423
421
  text = "#{prefix}#{method.name}(#{method.params.map { |param| render_param(param) }.join(', ')})"
424
422
  text << " -> #{render_type(method.return_type)}" if method.return_type
@@ -445,7 +443,7 @@ module MilkTea
445
443
  end
446
444
 
447
445
  def emit_statement(statement)
448
- stmt_line = statement.respond_to?(:line) ? statement.line : nil
446
+ stmt_line = statement.line
449
447
  flush_leading_comments_before(stmt_line)
450
448
  header_idx = @lines.length
451
449
 
@@ -663,8 +661,8 @@ module MilkTea
663
661
  end
664
662
 
665
663
  def unsafe_inline_trivia_conflict?(unsafe_stmt, nested)
666
- unsafe_line = unsafe_stmt.respond_to?(:line) ? unsafe_stmt.line : nil
667
- nested_line = nested.respond_to?(:line) ? nested.line : nil
664
+ unsafe_line = unsafe_stmt.line
665
+ nested_line = nested&.line
668
666
  return false unless unsafe_line && nested_line && nested_line > unsafe_line
669
667
 
670
668
  @comment_map.keys.any? { |line| line >= unsafe_line + 1 && line <= nested_line } ||
@@ -851,11 +849,11 @@ module MilkTea
851
849
  escape_format_text(part.value)
852
850
  when AST::FormatExprPart
853
851
  spec = case part.format_spec&.fetch(:kind)
854
- when :precision then ":.#{part.format_spec[:value]}"
855
- when :hex then part.format_spec[:uppercase] ? ":X" : ":x"
856
- when :oct then part.format_spec[:uppercase] ? ":O" : ":o"
857
- when :bin then part.format_spec[:uppercase] ? ":B" : ":b"
858
- end
852
+ when :precision then ":.#{part.format_spec[:value]}"
853
+ when :hex then part.format_spec[:uppercase] ? ":X" : ":x"
854
+ when :oct then part.format_spec[:uppercase] ? ":O" : ":o"
855
+ when :bin then part.format_spec[:uppercase] ? ":B" : ":b"
856
+ end
859
857
  "\#{#{render_expression(part.expression)}#{spec}}"
860
858
  else
861
859
  raise ArgumentError, "unsupported format string part #{part.class.name}"
@@ -10,8 +10,6 @@ module MilkTea
10
10
  @indent = 0
11
11
  end
12
12
 
13
- private
14
-
15
13
  def finish
16
14
  @lines.join("\n") + "\n"
17
15
  end
@@ -12,8 +12,6 @@ module MilkTea
12
12
  finish
13
13
  end
14
14
 
15
- private
16
-
17
15
  def emit_program(program)
18
16
  module_name = program.module_name || "(anonymous)"
19
17
  line("program #{module_name}")
@@ -3,8 +3,6 @@
3
3
  module MilkTea
4
4
  class SemanticAnalyzer
5
5
  class Checker
6
- private
7
-
8
6
  def with_unsafe
9
7
  @unsafe_depth += 1
10
8
  yield
@@ -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