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
|
@@ -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
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
module MilkTea
|
|
4
4
|
class SemanticAnalyzer
|
|
5
5
|
class Checker
|
|
6
|
-
private
|
|
7
|
-
|
|
8
6
|
def check_top_level_values
|
|
9
7
|
expanded_declarations.each do |decl|
|
|
10
8
|
with_error_node(decl) do
|
|
@@ -477,16 +475,16 @@ module MilkTea
|
|
|
477
475
|
func.ast.params.each_with_index do |param, idx|
|
|
478
476
|
arg_expr = arguments[idx].value
|
|
479
477
|
arg_value = if scopes
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
478
|
+
evaluate_compile_time_const_value(arg_expr, scopes:)
|
|
479
|
+
else
|
|
480
|
+
CompileTime.evaluate(
|
|
481
|
+
arg_expr,
|
|
482
|
+
resolve_identifier: lambda { |id| resolve_current_module_const_value(id.name) },
|
|
483
|
+
resolve_member_access: nil,
|
|
484
|
+
resolve_type_ref: lambda { |tr| resolve_type_ref(tr) },
|
|
485
|
+
resolve_call: nil,
|
|
486
|
+
)
|
|
487
|
+
end
|
|
490
488
|
return nil unless arg_value
|
|
491
489
|
|
|
492
490
|
initial_vars[param.name] = arg_value
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
module MilkTea
|
|
4
4
|
class SemanticAnalyzer
|
|
5
5
|
class Checker
|
|
6
|
-
private
|
|
7
|
-
|
|
8
6
|
def call_argument_compatible?(actual_type, expected_type, scopes:, external:, expression: nil)
|
|
9
7
|
return true if array_to_span_call_argument_compatible?(actual_type, expected_type, expression:, scopes:)
|
|
10
8
|
return true if argument_types_compatible?(actual_type, expected_type, external:, expression:, scopes:, contextual_int_to_float: !external)
|
|
@@ -223,8 +221,6 @@ module MilkTea
|
|
|
223
221
|
nil
|
|
224
222
|
end
|
|
225
223
|
|
|
226
|
-
private
|
|
227
|
-
|
|
228
224
|
def simd_op_result(operator, left_type, right_type)
|
|
229
225
|
if simd_type?(left_type) && simd_type?(right_type) && left_type.element_type == right_type.element_type && left_type.lane_count == right_type.lane_count
|
|
230
226
|
return left_type if operator == "+" || operator == "-" || operator == "*" || operator == "/"
|
|
@@ -337,8 +333,6 @@ module MilkTea
|
|
|
337
333
|
def function_pointer_type?(type)
|
|
338
334
|
type.is_a?(Types::Function)
|
|
339
335
|
end
|
|
340
|
-
|
|
341
|
-
|
|
342
336
|
end
|
|
343
337
|
end
|
|
344
338
|
end
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
module MilkTea
|
|
4
4
|
class SemanticAnalyzer
|
|
5
5
|
class Checker
|
|
6
|
-
private
|
|
7
|
-
|
|
8
6
|
def build_analysis
|
|
9
7
|
Analysis.new(
|
|
10
8
|
ast: @ctx.ast,
|
|
@@ -35,45 +33,45 @@ module MilkTea
|
|
|
35
33
|
def install_builtin_types
|
|
36
34
|
INSTALLABLE_BUILTIN_TYPE_NAMES.each do |name|
|
|
37
35
|
@ctx.types[name] = case name
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
36
|
+
when "str"
|
|
37
|
+
Types::Registry.string_view
|
|
38
|
+
when "Subscription"
|
|
39
|
+
builtin_subscription_type
|
|
40
|
+
when "EventError"
|
|
41
|
+
builtin_event_error_type
|
|
42
|
+
when "struct_handle"
|
|
43
|
+
builtin_struct_handle_type
|
|
44
|
+
when "field_handle"
|
|
45
|
+
builtin_field_handle_type
|
|
46
|
+
when "callable_handle"
|
|
47
|
+
builtin_callable_handle_type
|
|
48
|
+
when "attribute_handle"
|
|
49
|
+
builtin_attribute_handle_type
|
|
50
|
+
when "member_handle"
|
|
51
|
+
builtin_member_handle_type
|
|
52
|
+
when "type"
|
|
53
|
+
builtin_type_meta_type
|
|
54
|
+
when "vec2"
|
|
55
|
+
Types::Vector.new("vec2", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 2)
|
|
56
|
+
when "vec3"
|
|
57
|
+
Types::Vector.new("vec3", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 3)
|
|
58
|
+
when "vec4"
|
|
59
|
+
Types::Vector.new("vec4", element_type: Types::BUILTIN_VECTOR_ELEMENT, width: 4)
|
|
60
|
+
when "ivec2"
|
|
61
|
+
Types::Vector.new("ivec2", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 2)
|
|
62
|
+
when "ivec3"
|
|
63
|
+
Types::Vector.new("ivec3", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 3)
|
|
64
|
+
when "ivec4"
|
|
65
|
+
Types::Vector.new("ivec4", element_type: Types::BUILTIN_IVECTOR_ELEMENT, width: 4)
|
|
66
|
+
when "mat3"
|
|
67
|
+
Types::Matrix.new("mat3", dim: 3)
|
|
68
|
+
when "mat4"
|
|
69
|
+
Types::Matrix.new("mat4", dim: 4)
|
|
70
|
+
when "quat"
|
|
71
|
+
Types::Quaternion.new("quat")
|
|
72
|
+
else
|
|
73
|
+
Types::Registry.primitive(name)
|
|
74
|
+
end
|
|
77
75
|
end
|
|
78
76
|
end
|
|
79
77
|
|
|
@@ -226,27 +224,27 @@ module MilkTea
|
|
|
226
224
|
validate_explicit_aggregate_c_name!(decl)
|
|
227
225
|
ensure_available_type_name!(decl.name)
|
|
228
226
|
@ctx.types[decl.name] = if decl.type_params.empty?
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
227
|
+
Types::Struct.new(
|
|
228
|
+
decl.name,
|
|
229
|
+
module_name: @ctx.module_name,
|
|
230
|
+
external: raw_module?,
|
|
231
|
+
packed: decl.packed,
|
|
232
|
+
alignment: decl.alignment,
|
|
233
|
+
linkage_name: decl.c_name,
|
|
234
|
+
lifetime_params: decl.lifetime_params,
|
|
235
|
+
)
|
|
236
|
+
else
|
|
237
|
+
Types::GenericStructDefinition.new(
|
|
238
|
+
decl.name,
|
|
239
|
+
decl.type_params.map(&:name),
|
|
240
|
+
module_name: @ctx.module_name,
|
|
241
|
+
external: raw_module?,
|
|
242
|
+
packed: decl.packed,
|
|
243
|
+
alignment: decl.alignment,
|
|
244
|
+
linkage_name: decl.c_name,
|
|
245
|
+
lifetime_params: decl.lifetime_params,
|
|
246
|
+
)
|
|
247
|
+
end
|
|
250
248
|
register_nested_struct_types(decl)
|
|
251
249
|
when AST::UnionDecl
|
|
252
250
|
validate_explicit_aggregate_c_name!(decl)
|
|
@@ -255,14 +253,14 @@ module MilkTea
|
|
|
255
253
|
when AST::VariantDecl
|
|
256
254
|
ensure_available_type_name!(decl.name)
|
|
257
255
|
@ctx.types[decl.name] = if decl.type_params.empty?
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
256
|
+
Types::Variant.new(decl.name, module_name: @ctx.module_name)
|
|
257
|
+
else
|
|
258
|
+
Types::GenericVariantDefinition.new(
|
|
259
|
+
decl.name,
|
|
260
|
+
decl.type_params.map(&:name),
|
|
261
|
+
module_name: @ctx.module_name,
|
|
262
|
+
)
|
|
263
|
+
end
|
|
266
264
|
when AST::EnumDecl
|
|
267
265
|
ensure_available_type_name!(decl.name)
|
|
268
266
|
@ctx.types[decl.name] = Types::Enum.new(decl.name, module_name: @ctx.module_name, external: raw_module?)
|
|
@@ -454,16 +452,16 @@ module MilkTea
|
|
|
454
452
|
struct_type = @ctx.types.fetch(decl.name)
|
|
455
453
|
struct_type.ast_declaration = decl if struct_type.respond_to?(:ast_declaration=)
|
|
456
454
|
type_params = if struct_type.is_a?(Types::GenericStructDefinition)
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
455
|
+
seen = {}
|
|
456
|
+
struct_type.type_params.each_with_object({}) do |name, params|
|
|
457
|
+
raise_sema_error("duplicate type parameter #{decl.name}[#{name}]") if seen.key?(name)
|
|
458
|
+
|
|
459
|
+
seen[name] = true
|
|
460
|
+
params[name] = Types::TypeVar.new(name)
|
|
461
|
+
end
|
|
462
|
+
else
|
|
463
|
+
{}
|
|
464
|
+
end
|
|
467
465
|
decl.lifetime_params.each do |lt|
|
|
468
466
|
type_params[lt] = Types::LifetimeRef.new(lt)
|
|
469
467
|
end if decl.respond_to?(:lifetime_params)
|
|
@@ -487,8 +485,8 @@ module MilkTea
|
|
|
487
485
|
ensure_non_reserved_type_binding_name!(
|
|
488
486
|
field.name,
|
|
489
487
|
kind_label: "field #{decl.name}",
|
|
490
|
-
line: field.
|
|
491
|
-
column: field.
|
|
488
|
+
line: field.line || decl.line,
|
|
489
|
+
column: field.column,
|
|
492
490
|
)
|
|
493
491
|
end
|
|
494
492
|
|
|
@@ -581,8 +579,8 @@ module MilkTea
|
|
|
581
579
|
ensure_non_reserved_type_binding_name!(
|
|
582
580
|
member.name,
|
|
583
581
|
kind_label: "member #{decl.name}",
|
|
584
|
-
line: member.
|
|
585
|
-
column: member.
|
|
582
|
+
line: member.line || decl.line,
|
|
583
|
+
column: member.column,
|
|
586
584
|
)
|
|
587
585
|
end
|
|
588
586
|
|
|
@@ -630,16 +628,16 @@ module MilkTea
|
|
|
630
628
|
|
|
631
629
|
variant_type = @ctx.types.fetch(decl.name)
|
|
632
630
|
type_params = if variant_type.is_a?(Types::GenericVariantDefinition)
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
631
|
+
seen = {}
|
|
632
|
+
variant_type.type_params.each_with_object({}) do |name, params|
|
|
633
|
+
raise_sema_error("duplicate type parameter #{decl.name}[#{name}]") if seen.key?(name)
|
|
634
|
+
|
|
635
|
+
seen[name] = true
|
|
636
|
+
params[name] = Types::TypeVar.new(name)
|
|
637
|
+
end
|
|
638
|
+
else
|
|
639
|
+
{}
|
|
640
|
+
end
|
|
643
641
|
type_param_constraints = variant_type.is_a?(Types::GenericVariantDefinition) ? variant_type.type_param_constraints : {}
|
|
644
642
|
seen_arms = []
|
|
645
643
|
arms_hash = {}
|
|
@@ -650,8 +648,8 @@ module MilkTea
|
|
|
650
648
|
ensure_non_reserved_type_binding_name!(
|
|
651
649
|
arm.name,
|
|
652
650
|
kind_label: "arm #{decl.name}",
|
|
653
|
-
line: arm.
|
|
654
|
-
column: arm.
|
|
651
|
+
line: arm.line || decl.line,
|
|
652
|
+
column: arm.column,
|
|
655
653
|
)
|
|
656
654
|
end
|
|
657
655
|
|
|
@@ -666,8 +664,8 @@ module MilkTea
|
|
|
666
664
|
ensure_non_reserved_type_binding_name!(
|
|
667
665
|
field.name,
|
|
668
666
|
kind_label: "field #{decl.name}.#{arm.name}",
|
|
669
|
-
line: field.
|
|
670
|
-
column: field.
|
|
667
|
+
line: field.line || decl.line,
|
|
668
|
+
column: field.column,
|
|
671
669
|
)
|
|
672
670
|
end
|
|
673
671
|
|
|
@@ -740,7 +738,7 @@ module MilkTea
|
|
|
740
738
|
case decl
|
|
741
739
|
when AST::ConstDecl
|
|
742
740
|
begin
|
|
743
|
-
ensure_available_value_name!(decl.name, kind_label: "constant", line: decl.line, column: decl.
|
|
741
|
+
ensure_available_value_name!(decl.name, kind_label: "constant", line: decl.line, column: decl.column)
|
|
744
742
|
type = resolve_type_ref(decl.type)
|
|
745
743
|
validate_stored_ref_type!(type, "constant #{decl.name}")
|
|
746
744
|
raise_sema_error("constant #{decl.name} cannot store proc values") if contains_proc_type?(type)
|
|
@@ -760,7 +758,7 @@ module MilkTea
|
|
|
760
758
|
) unless @ctx.top_level_values.key?(decl.name)
|
|
761
759
|
end
|
|
762
760
|
when AST::VarDecl
|
|
763
|
-
ensure_available_value_name!(decl.name, kind_label: "module variable", line: decl.line, column: decl.
|
|
761
|
+
ensure_available_value_name!(decl.name, kind_label: "module variable", line: decl.line, column: decl.column)
|
|
764
762
|
raise_sema_error("module variable #{decl.name} requires an explicit type") unless decl.type
|
|
765
763
|
|
|
766
764
|
type = resolve_type_ref(decl.type)
|
|
@@ -852,10 +850,10 @@ module MilkTea
|
|
|
852
850
|
qualified_name = "#{parent_name}.#{nested.name}"
|
|
853
851
|
ensure_available_type_name!(qualified_name)
|
|
854
852
|
nested_c_name = if @ctx.module_name && !raw_module?
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
853
|
+
"#{@ctx.module_name.to_s.tr('.', '_')}_#{qualified_name.tr('.', '_')}"
|
|
854
|
+
else
|
|
855
|
+
qualified_name.tr('.', '_')
|
|
856
|
+
end
|
|
859
857
|
if nested.type_params.empty?
|
|
860
858
|
@ctx.types[qualified_name] = Types::Struct.new(nested.name, module_name: @ctx.module_name, external: raw_module?, packed: nested.packed, alignment: nested.alignment, linkage_name: nested_c_name, lifetime_params: nested.lifetime_params)
|
|
861
859
|
else
|
|
@@ -867,4 +865,3 @@ module MilkTea
|
|
|
867
865
|
end
|
|
868
866
|
end
|
|
869
867
|
end
|
|
870
|
-
|
|
@@ -184,7 +184,7 @@ module MilkTea
|
|
|
184
184
|
@return_context_stack = []
|
|
185
185
|
end
|
|
186
186
|
|
|
187
|
-
|
|
187
|
+
def check
|
|
188
188
|
install_builtin_types
|
|
189
189
|
install_builtin_attributes
|
|
190
190
|
install_imports
|
|
@@ -201,10 +201,6 @@ module MilkTea
|
|
|
201
201
|
check_attribute_applications
|
|
202
202
|
declare_functions
|
|
203
203
|
check_interface_conformances
|
|
204
|
-
].freeze
|
|
205
|
-
|
|
206
|
-
def check
|
|
207
|
-
STRUCTURAL_PHASES.each { |phase| send(phase) }
|
|
208
204
|
check_top_level_values
|
|
209
205
|
finalize_top_level_const_values
|
|
210
206
|
check_top_level_static_asserts
|
|
@@ -279,7 +275,22 @@ module MilkTea
|
|
|
279
275
|
@collecting_errors = true
|
|
280
276
|
@structural_errors = []
|
|
281
277
|
|
|
282
|
-
|
|
278
|
+
catch_structural { install_builtin_types }
|
|
279
|
+
catch_structural { install_builtin_attributes }
|
|
280
|
+
catch_structural { install_imports }
|
|
281
|
+
catch_structural { install_prelude_types }
|
|
282
|
+
catch_structural { declare_named_types }
|
|
283
|
+
catch_structural { resolve_generic_type_param_constraints }
|
|
284
|
+
catch_structural { resolve_type_aliases }
|
|
285
|
+
catch_structural { declare_attributes }
|
|
286
|
+
catch_structural { resolve_aggregate_fields }
|
|
287
|
+
catch_structural { resolve_enum_members }
|
|
288
|
+
catch_structural { resolve_variant_arms }
|
|
289
|
+
catch_structural { collect_emit_declarations }
|
|
290
|
+
catch_structural { declare_top_level_values }
|
|
291
|
+
catch_structural { check_attribute_applications }
|
|
292
|
+
catch_structural { declare_functions }
|
|
293
|
+
catch_structural { check_interface_conformances }
|
|
283
294
|
|
|
284
295
|
errors = @structural_errors.dup
|
|
285
296
|
|
|
@@ -320,8 +331,6 @@ module MilkTea
|
|
|
320
331
|
|
|
321
332
|
@structural_errors << error
|
|
322
333
|
end
|
|
323
|
-
|
|
324
|
-
|
|
325
334
|
end
|
|
326
335
|
end
|
|
327
336
|
end
|