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.
- checksums.yaml +4 -4
- data/lib/milk_tea/base.rb +1 -2
- data/lib/milk_tea/bindings/bindgen/ast_parser.rb +0 -2
- data/lib/milk_tea/bindings/bindgen/declaration.rb +0 -2
- data/lib/milk_tea/bindings/bindgen/emitter.rb +0 -2
- data/lib/milk_tea/bindings/bindgen/overrides.rb +0 -2
- data/lib/milk_tea/bindings/bindgen/type_mapper.rb +51 -53
- data/lib/milk_tea/bindings/imported_bindings/generator.rb +7 -9
- data/lib/milk_tea/bindings/imported_bindings/method_source.rb +0 -2
- data/lib/milk_tea/bindings/imported_bindings/naming.rb +6 -8
- data/lib/milk_tea/bindings/imported_bindings.rb +0 -2
- data/lib/milk_tea/bindings/opengl_registry.rb +3 -7
- data/lib/milk_tea/bindings/steamworks.rb +12 -16
- data/lib/milk_tea/bindings/upstream_sources.rb +10 -14
- data/lib/milk_tea/bindings/vendored_box2d.rb +10 -12
- data/lib/milk_tea/bindings/vendored_cjson.rb +6 -8
- data/lib/milk_tea/bindings/vendored_flecs.rb +10 -12
- data/lib/milk_tea/bindings/vendored_glfw.rb +11 -13
- data/lib/milk_tea/bindings/vendored_libuv.rb +11 -13
- data/lib/milk_tea/bindings/vendored_pcre2.rb +11 -13
- data/lib/milk_tea/bindings/vendored_raylib.rb +6 -10
- data/lib/milk_tea/bindings/vendored_sdl3.rb +11 -13
- data/lib/milk_tea/bindings/vendored_steamworks.rb +1 -5
- data/lib/milk_tea/core/ast.rb +103 -45
- data/lib/milk_tea/core/async_runtime_installer.rb +0 -2
- data/lib/milk_tea/core/bindings/attribute_binding.rb +1 -3
- data/lib/milk_tea/core/c_backend/aggregate_utils.rb +147 -84
- data/lib/milk_tea/core/c_backend/control_flow_emission.rb +394 -396
- data/lib/milk_tea/core/c_backend/expressions.rb +489 -476
- data/lib/milk_tea/core/c_backend/feature_detection.rb +446 -437
- data/lib/milk_tea/core/c_backend/format_helpers.rb +0 -2
- data/lib/milk_tea/core/c_backend/reachability.rb +339 -341
- data/lib/milk_tea/core/c_backend/reinterpret.rb +231 -217
- data/lib/milk_tea/core/c_backend/runtime_helpers.rb +531 -526
- data/lib/milk_tea/core/c_backend/statements.rb +528 -530
- data/lib/milk_tea/core/c_backend/type_collectors.rb +1344 -1346
- data/lib/milk_tea/core/c_backend/type_declaration.rb +215 -213
- data/lib/milk_tea/core/c_backend/type_system.rb +347 -349
- data/lib/milk_tea/core/c_backend.rb +17 -9
- data/lib/milk_tea/core/compatibility_helpers.rb +0 -2
- data/lib/milk_tea/core/compile_time/const_eval.rb +7 -12
- data/lib/milk_tea/core/compile_time.rb +32 -38
- data/lib/milk_tea/core/control_flow/builder.rb +3 -5
- data/lib/milk_tea/core/control_flow/constant_propagation.rb +14 -17
- data/lib/milk_tea/core/control_flow/definite_assignment.rb +0 -1
- data/lib/milk_tea/core/ir.rb +10 -10
- data/lib/milk_tea/core/lexer/character_classes.rb +5 -7
- data/lib/milk_tea/core/lexer/format_strings.rb +7 -9
- data/lib/milk_tea/core/lexer/heredocs.rb +22 -22
- data/lib/milk_tea/core/lexer/indentation.rb +0 -2
- data/lib/milk_tea/core/lexer/numbers.rb +0 -2
- data/lib/milk_tea/core/lexer/recovery.rb +0 -2
- data/lib/milk_tea/core/lexer/strings.rb +0 -2
- data/lib/milk_tea/core/lexer/symbols.rb +0 -2
- data/lib/milk_tea/core/lexer/trivia.rb +0 -2
- data/lib/milk_tea/core/lexer.rb +0 -2
- data/lib/milk_tea/core/lowering/async/analysis.rb +0 -2
- data/lib/milk_tea/core/lowering/async/lowering.rb +1264 -1265
- data/lib/milk_tea/core/lowering/async/normalization.rb +0 -2
- data/lib/milk_tea/core/lowering/async.rb +627 -630
- data/lib/milk_tea/core/lowering/block.rb +413 -416
- data/lib/milk_tea/core/lowering/calls.rb +1381 -1384
- data/lib/milk_tea/core/lowering/declarations.rb +180 -183
- data/lib/milk_tea/core/lowering/dyn.rb +48 -50
- data/lib/milk_tea/core/lowering/events.rb +983 -985
- data/lib/milk_tea/core/lowering/expressions.rb +1513 -1518
- data/lib/milk_tea/core/lowering/foreign_cstr.rb +181 -184
- data/lib/milk_tea/core/lowering/functions.rb +185 -188
- data/lib/milk_tea/core/lowering/loops.rb +1028 -1031
- data/lib/milk_tea/core/lowering/proc.rb +363 -366
- data/lib/milk_tea/core/lowering/resolve.rb +2133 -2135
- data/lib/milk_tea/core/lowering/scans.rb +179 -181
- data/lib/milk_tea/core/lowering/str_buffer.rb +102 -105
- data/lib/milk_tea/core/lowering/utils.rb +1040 -1044
- data/lib/milk_tea/core/lowering.rb +5 -7
- data/lib/milk_tea/core/module_binder.rb +0 -2
- data/lib/milk_tea/core/module_loader/errors.rb +4 -2
- data/lib/milk_tea/core/module_loader.rb +113 -20
- data/lib/milk_tea/core/module_path_resolver.rb +0 -2
- data/lib/milk_tea/core/module_roots.rb +6 -8
- data/lib/milk_tea/core/parser/attributes.rb +0 -2
- data/lib/milk_tea/core/parser/blocks.rb +0 -2
- data/lib/milk_tea/core/parser/declarations.rb +0 -2
- data/lib/milk_tea/core/parser/expressions.rb +31 -14
- data/lib/milk_tea/core/parser/recovery.rb +0 -2
- data/lib/milk_tea/core/parser/statements.rb +0 -2
- data/lib/milk_tea/core/parser/types.rb +8 -10
- data/lib/milk_tea/core/parser.rb +1 -3
- data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +31 -33
- data/lib/milk_tea/core/pretty_printer/base_formatter.rb +0 -2
- data/lib/milk_tea/core/pretty_printer/ir_formatter.rb +0 -2
- data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +0 -2
- data/lib/milk_tea/core/semantic_analyzer/attributes.rb +14 -16
- data/lib/milk_tea/core/semantic_analyzer/calls.rb +0 -2
- data/lib/milk_tea/core/semantic_analyzer/expressions.rb +1 -14
- data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +18 -21
- data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +0 -3
- data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +12 -15
- data/lib/milk_tea/core/semantic_analyzer/generics.rb +57 -59
- data/lib/milk_tea/core/semantic_analyzer/interface_conformance.rb +0 -2
- data/lib/milk_tea/core/semantic_analyzer/name_resolution.rb +5 -9
- data/lib/milk_tea/core/semantic_analyzer/nullability.rb +0 -3
- data/lib/milk_tea/core/semantic_analyzer/statements.rb +35 -40
- data/lib/milk_tea/core/semantic_analyzer/top_level.rb +10 -12
- data/lib/milk_tea/core/semantic_analyzer/type_compatibility.rb +0 -6
- data/lib/milk_tea/core/semantic_analyzer/type_declaration.rb +102 -105
- data/lib/milk_tea/core/semantic_analyzer.rb +17 -8
- data/lib/milk_tea/core/types/layout.rb +21 -22
- data/lib/milk_tea/core/types/predicates.rb +0 -2
- data/lib/milk_tea/core/types/registry.rb +16 -18
- data/lib/milk_tea/core/types/visitor.rb +0 -4
- data/lib/milk_tea/dap/backends/lldb_dap.rb +0 -2
- data/lib/milk_tea/dap/protocol.rb +1 -1
- data/lib/milk_tea/dap/server/breakpoints.rb +0 -2
- data/lib/milk_tea/dap/server/debug_map.rb +0 -2
- data/lib/milk_tea/dap/server/handlers.rb +0 -2
- data/lib/milk_tea/dap/server/launch.rb +0 -2
- data/lib/milk_tea/dap/server/lldb_backend.rb +8 -10
- data/lib/milk_tea/dap/server/pause_diagnostics.rb +14 -16
- data/lib/milk_tea/dap/server/utilities.rb +0 -2
- data/lib/milk_tea/dap/server/wire.rb +0 -2
- data/lib/milk_tea/dap/server.rb +0 -2
- data/lib/milk_tea/lsp/diagnostics.rb +16 -16
- data/lib/milk_tea/lsp/server/call_hierarchy.rb +11 -12
- data/lib/milk_tea/lsp/server/code_actions.rb +355 -357
- data/lib/milk_tea/lsp/server/code_lens.rb +23 -25
- data/lib/milk_tea/lsp/server/completion.rb +873 -875
- data/lib/milk_tea/lsp/server/configuration.rb +129 -131
- data/lib/milk_tea/lsp/server/debug_info.rb +0 -2
- data/lib/milk_tea/lsp/server/definition.rb +564 -565
- data/lib/milk_tea/lsp/server/diagnostics_scheduling.rb +191 -193
- data/lib/milk_tea/lsp/server/execute_command.rb +0 -2
- data/lib/milk_tea/lsp/server/folding_range.rb +0 -4
- data/lib/milk_tea/lsp/server/formatting.rb +478 -480
- data/lib/milk_tea/lsp/server/hover.rb +1282 -1284
- data/lib/milk_tea/lsp/server/inlay_hints.rb +179 -181
- data/lib/milk_tea/lsp/server/lifecycle.rb +192 -194
- data/lib/milk_tea/lsp/server/linked_editing_range.rb +0 -2
- data/lib/milk_tea/lsp/server/on_type_formatting.rb +0 -2
- data/lib/milk_tea/lsp/server/progress.rb +0 -2
- data/lib/milk_tea/lsp/server/references.rb +316 -318
- data/lib/milk_tea/lsp/server/rename.rb +445 -447
- data/lib/milk_tea/lsp/server/selection_range.rb +0 -4
- data/lib/milk_tea/lsp/server/semantic_tokens.rb +1318 -1320
- data/lib/milk_tea/lsp/server/signature_help.rb +146 -148
- data/lib/milk_tea/lsp/server/text_documents.rb +99 -101
- data/lib/milk_tea/lsp/server/type_hierarchy.rb +2 -4
- data/lib/milk_tea/lsp/server/utilities.rb +397 -399
- data/lib/milk_tea/lsp/server.rb +0 -3
- data/lib/milk_tea/lsp/workspace/analysis.rb +40 -42
- data/lib/milk_tea/lsp/workspace/dependency_graph.rb +4 -10
- data/lib/milk_tea/lsp/workspace/utilities.rb +19 -19
- data/lib/milk_tea/packages/atomic_write.rb +4 -5
- data/lib/milk_tea/packages/dependency_solver.rb +15 -15
- data/lib/milk_tea/packages/lock.rb +4 -4
- data/lib/milk_tea/packages/manager_cli.rb +1 -1
- data/lib/milk_tea/packages/manifest.rb +3 -3
- data/lib/milk_tea/packages/registry_store.rb +4 -6
- data/lib/milk_tea/packages/services.rb +16 -16
- data/lib/milk_tea/packages/source_cache.rb +4 -6
- data/lib/milk_tea/packages/source_resolver.rb +44 -44
- data/lib/milk_tea/packages/version.rb +8 -8
- data/lib/milk_tea/tooling/build.rb +3 -7
- data/lib/milk_tea/tooling/build_cache.rb +0 -2
- data/lib/milk_tea/tooling/debug_info_formatter.rb +31 -33
- data/lib/milk_tea/tooling/debug_map.rb +8 -10
- data/lib/milk_tea/tooling/docs_app.rb +0 -2
- data/lib/milk_tea/tooling/linter/doc_tags.rb +25 -27
- data/lib/milk_tea/tooling/linter/fix_engine.rb +87 -24
- data/lib/milk_tea/tooling/linter/flow_rules.rb +44 -46
- data/lib/milk_tea/tooling/linter/imports_platform.rb +14 -16
- data/lib/milk_tea/tooling/linter/release_rules.rb +3 -5
- data/lib/milk_tea/tooling/linter/reserved_names.rb +23 -25
- data/lib/milk_tea/tooling/linter/rules.rb +87 -89
- data/lib/milk_tea/tooling/linter/source_helpers.rb +40 -42
- data/lib/milk_tea/tooling/linter/trailing_comma.rb +17 -19
- data/lib/milk_tea/tooling/linter/visitors.rb +162 -50
- data/lib/milk_tea/tooling/linter.rb +0 -2
- data/lib/milk_tea/tooling/project_scaffold.rb +0 -2
- data/lib/milk_tea/tooling/run.rb +0 -2
- data/lib/milk_tea/tooling/toolchain_cli.rb +0 -2
- data/std/cli.mt +13 -32
- data/std/color.mt +28 -28
- data/std/encoding.mt +4 -4
- data/std/graph.mt +1 -2
- data/std/hash.mt +14 -14
- data/std/http/server.mt +3 -3
- data/std/input.mt +1 -1
- data/std/json.mt +1 -1
- data/std/linear_algebra.mt +6 -6
- data/std/net/mux.mt +1 -1
- data/std/noise.mt +23 -23
- data/std/parse.mt +2 -2
- data/std/process.mt +3 -4
- data/std/sparse_set.mt +1 -1
- data/std/steering.mt +5 -5
- data/std/str.mt +1 -1
- data/std/tween.mt +4 -4
- data/std/utility.mt +3 -3
- 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.
|
|
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
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
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.
|
|
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.
|
|
667
|
-
nested_line = nested
|
|
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
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
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}"
|
|
@@ -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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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 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.
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|