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.
- 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 +8 -9
- 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 +0 -2
- 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 +112 -54
- 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
|
@@ -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
|
|
@@ -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
|
-
|
|
14
|
-
|
|
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.
|
|
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
|