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_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
|
|
@@ -5,19 +5,18 @@ require_relative "types"
|
|
|
5
5
|
|
|
6
6
|
module MilkTea
|
|
7
7
|
module Layout
|
|
8
|
-
module_function
|
|
9
8
|
|
|
10
9
|
POINTER_SIZE = Fiddle::SIZEOF_VOIDP
|
|
11
10
|
|
|
12
|
-
def size_of(type)
|
|
11
|
+
def self.size_of(type)
|
|
13
12
|
size_and_alignment(type, {})&.first
|
|
14
13
|
end
|
|
15
14
|
|
|
16
|
-
def alignment_of(type)
|
|
15
|
+
def self.alignment_of(type)
|
|
17
16
|
size_and_alignment(type, {})&.last
|
|
18
17
|
end
|
|
19
18
|
|
|
20
|
-
def offset_of(type, field_name)
|
|
19
|
+
def self.offset_of(type, field_name)
|
|
21
20
|
case type
|
|
22
21
|
when Types::Struct, Types::StructInstance, Types::Span, Types::StringView, Types::Task
|
|
23
22
|
fields = ordered_fields(type)
|
|
@@ -38,7 +37,7 @@ module MilkTea
|
|
|
38
37
|
end
|
|
39
38
|
end
|
|
40
39
|
|
|
41
|
-
def size_and_alignment(type, stack)
|
|
40
|
+
def self.size_and_alignment(type, stack)
|
|
42
41
|
case type
|
|
43
42
|
when Types::Primitive
|
|
44
43
|
primitive_layout(type)
|
|
@@ -82,7 +81,7 @@ module MilkTea
|
|
|
82
81
|
end
|
|
83
82
|
end
|
|
84
83
|
|
|
85
|
-
def primitive_layout(type)
|
|
84
|
+
def self.primitive_layout(type)
|
|
86
85
|
case type.name
|
|
87
86
|
when "bool", "byte", "ubyte", "char"
|
|
88
87
|
[1, 1]
|
|
@@ -99,7 +98,7 @@ module MilkTea
|
|
|
99
98
|
end
|
|
100
99
|
end
|
|
101
100
|
|
|
102
|
-
def generic_layout(type, stack)
|
|
101
|
+
def self.generic_layout(type, stack)
|
|
103
102
|
case type.name
|
|
104
103
|
when "ptr", "const_ptr", "own", "ref"
|
|
105
104
|
[POINTER_SIZE, POINTER_SIZE]
|
|
@@ -120,7 +119,7 @@ module MilkTea
|
|
|
120
119
|
end
|
|
121
120
|
end
|
|
122
121
|
|
|
123
|
-
def variant_layout(type, stack:)
|
|
122
|
+
def self.variant_layout(type, stack:)
|
|
124
123
|
payload_layouts = type.arm_names.filter_map do |arm_name|
|
|
125
124
|
fields = type.arm(arm_name)
|
|
126
125
|
next if fields.nil? || fields.empty?
|
|
@@ -134,7 +133,7 @@ module MilkTea
|
|
|
134
133
|
struct_layout_from_infos(field_infos, packed: false, alignment: nil)
|
|
135
134
|
end
|
|
136
135
|
|
|
137
|
-
def struct_layout(fields, packed:, alignment:, stack:)
|
|
136
|
+
def self.struct_layout(fields, packed:, alignment:, stack:)
|
|
138
137
|
field_infos = fields.map do |field_name, field_type|
|
|
139
138
|
field_layout = size_and_alignment(field_type, stack)
|
|
140
139
|
return nil unless field_layout
|
|
@@ -145,7 +144,7 @@ module MilkTea
|
|
|
145
144
|
struct_layout_from_infos(field_infos, packed:, alignment:)
|
|
146
145
|
end
|
|
147
146
|
|
|
148
|
-
def union_layout(fields, packed:, alignment:, stack:)
|
|
147
|
+
def self.union_layout(fields, packed:, alignment:, stack:)
|
|
149
148
|
field_infos = fields.map do |_field_name, field_type|
|
|
150
149
|
field_layout = size_and_alignment(field_type, stack)
|
|
151
150
|
return nil unless field_layout
|
|
@@ -156,7 +155,7 @@ module MilkTea
|
|
|
156
155
|
union_layout_from_layouts(field_infos.map { |size, field_alignment| { size:, alignment: field_alignment } }, packed:, alignment:)
|
|
157
156
|
end
|
|
158
157
|
|
|
159
|
-
def struct_layout_from_infos(field_infos, packed:, alignment:)
|
|
158
|
+
def self.struct_layout_from_infos(field_infos, packed:, alignment:)
|
|
160
159
|
offsets = {}
|
|
161
160
|
offset = 0
|
|
162
161
|
natural_alignment = 1
|
|
@@ -177,7 +176,7 @@ module MilkTea
|
|
|
177
176
|
}
|
|
178
177
|
end
|
|
179
178
|
|
|
180
|
-
def union_layout_from_layouts(layouts, packed:, alignment:)
|
|
179
|
+
def self.union_layout_from_layouts(layouts, packed:, alignment:)
|
|
181
180
|
natural_alignment = packed ? 1 : (layouts.map { |layout| layout[:alignment] }.max || 1)
|
|
182
181
|
overall_alignment = [natural_alignment, alignment || 1].max
|
|
183
182
|
size = layouts.map { |layout| layout[:size] }.max || 0
|
|
@@ -188,27 +187,27 @@ module MilkTea
|
|
|
188
187
|
}
|
|
189
188
|
end
|
|
190
189
|
|
|
191
|
-
def ordered_fields(type)
|
|
190
|
+
def self.ordered_fields(type)
|
|
192
191
|
type.fields
|
|
193
192
|
end
|
|
194
193
|
|
|
195
|
-
def packed_layout?(type)
|
|
194
|
+
def self.packed_layout?(type)
|
|
196
195
|
type.respond_to?(:packed) && type.packed
|
|
197
196
|
end
|
|
198
197
|
|
|
199
|
-
def explicit_alignment(type)
|
|
198
|
+
def self.explicit_alignment(type)
|
|
200
199
|
type.respond_to?(:alignment) ? type.alignment : nil
|
|
201
200
|
end
|
|
202
201
|
|
|
203
|
-
def array_type?(type)
|
|
202
|
+
def self.array_type?(type)
|
|
204
203
|
type.arguments.length == 2 && type.arguments[1].is_a?(Types::LiteralTypeArg) && type.arguments[1].value.is_a?(Integer)
|
|
205
204
|
end
|
|
206
205
|
|
|
207
|
-
def str_buffer_type?(type)
|
|
206
|
+
def self.str_buffer_type?(type)
|
|
208
207
|
type.arguments.length == 1 && type.arguments.first.is_a?(Types::LiteralTypeArg) && type.arguments.first.value.is_a?(Integer)
|
|
209
208
|
end
|
|
210
209
|
|
|
211
|
-
def str_buffer_fields(type)
|
|
210
|
+
def self.str_buffer_fields(type)
|
|
212
211
|
storage_capacity = type.arguments.first.value + 1
|
|
213
212
|
{
|
|
214
213
|
"data" => Types::Registry.generic_instance("array", [Types::Registry.primitive("char"), Types::LiteralTypeArg.new(storage_capacity)]),
|
|
@@ -217,28 +216,28 @@ module MilkTea
|
|
|
217
216
|
}
|
|
218
217
|
end
|
|
219
218
|
|
|
220
|
-
def layout_pointer_like_nullable_base?(base)
|
|
219
|
+
def self.layout_pointer_like_nullable_base?(base)
|
|
221
220
|
return true if base.is_a?(Types::Function) || base.is_a?(Types::Proc) || base.is_a?(Types::Opaque)
|
|
222
221
|
return true if base.is_a?(Types::Primitive) && base.name == "cstr"
|
|
223
222
|
|
|
224
223
|
base.is_a?(Types::GenericInstance) && %w[ptr const_ptr own ref].include?(base.name)
|
|
225
224
|
end
|
|
226
225
|
|
|
227
|
-
def nullable_opt_layout_fields(base)
|
|
226
|
+
def self.nullable_opt_layout_fields(base)
|
|
228
227
|
{
|
|
229
228
|
"has_value" => Types::Registry.primitive("bool"),
|
|
230
229
|
"value" => base,
|
|
231
230
|
}
|
|
232
231
|
end
|
|
233
232
|
|
|
234
|
-
def align_up(value, alignment)
|
|
233
|
+
def self.align_up(value, alignment)
|
|
235
234
|
return value if alignment <= 1
|
|
236
235
|
|
|
237
236
|
remainder = value % alignment
|
|
238
237
|
remainder.zero? ? value : value + alignment - remainder
|
|
239
238
|
end
|
|
240
239
|
|
|
241
|
-
def with_stack(type, stack)
|
|
240
|
+
def self.with_stack(type, stack)
|
|
242
241
|
return if stack[type]
|
|
243
242
|
|
|
244
243
|
stack[type] = true
|