mt-lang 0.3.8 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/lib/milk_tea/base.rb +1 -2
  3. data/lib/milk_tea/bindings/bindgen/ast_parser.rb +0 -2
  4. data/lib/milk_tea/bindings/bindgen/declaration.rb +0 -2
  5. data/lib/milk_tea/bindings/bindgen/emitter.rb +0 -2
  6. data/lib/milk_tea/bindings/bindgen/overrides.rb +0 -2
  7. data/lib/milk_tea/bindings/bindgen/type_mapper.rb +51 -53
  8. data/lib/milk_tea/bindings/imported_bindings/generator.rb +7 -9
  9. data/lib/milk_tea/bindings/imported_bindings/method_source.rb +0 -2
  10. data/lib/milk_tea/bindings/imported_bindings/naming.rb +6 -8
  11. data/lib/milk_tea/bindings/imported_bindings.rb +0 -2
  12. data/lib/milk_tea/bindings/opengl_registry.rb +3 -7
  13. data/lib/milk_tea/bindings/steamworks.rb +12 -16
  14. data/lib/milk_tea/bindings/upstream_sources.rb +10 -14
  15. data/lib/milk_tea/bindings/vendored_box2d.rb +10 -12
  16. data/lib/milk_tea/bindings/vendored_cjson.rb +6 -8
  17. data/lib/milk_tea/bindings/vendored_flecs.rb +10 -12
  18. data/lib/milk_tea/bindings/vendored_glfw.rb +11 -13
  19. data/lib/milk_tea/bindings/vendored_libuv.rb +11 -13
  20. data/lib/milk_tea/bindings/vendored_pcre2.rb +11 -13
  21. data/lib/milk_tea/bindings/vendored_raylib.rb +6 -10
  22. data/lib/milk_tea/bindings/vendored_sdl3.rb +11 -13
  23. data/lib/milk_tea/bindings/vendored_steamworks.rb +1 -5
  24. data/lib/milk_tea/core/ast.rb +103 -45
  25. data/lib/milk_tea/core/async_runtime_installer.rb +0 -2
  26. data/lib/milk_tea/core/bindings/attribute_binding.rb +1 -3
  27. data/lib/milk_tea/core/c_backend/aggregate_utils.rb +147 -84
  28. data/lib/milk_tea/core/c_backend/control_flow_emission.rb +394 -396
  29. data/lib/milk_tea/core/c_backend/expressions.rb +489 -476
  30. data/lib/milk_tea/core/c_backend/feature_detection.rb +446 -437
  31. data/lib/milk_tea/core/c_backend/format_helpers.rb +0 -2
  32. data/lib/milk_tea/core/c_backend/reachability.rb +339 -341
  33. data/lib/milk_tea/core/c_backend/reinterpret.rb +231 -217
  34. data/lib/milk_tea/core/c_backend/runtime_helpers.rb +531 -526
  35. data/lib/milk_tea/core/c_backend/statements.rb +528 -530
  36. data/lib/milk_tea/core/c_backend/type_collectors.rb +1344 -1346
  37. data/lib/milk_tea/core/c_backend/type_declaration.rb +215 -213
  38. data/lib/milk_tea/core/c_backend/type_system.rb +347 -349
  39. data/lib/milk_tea/core/c_backend.rb +17 -9
  40. data/lib/milk_tea/core/compatibility_helpers.rb +0 -2
  41. data/lib/milk_tea/core/compile_time/const_eval.rb +7 -12
  42. data/lib/milk_tea/core/compile_time.rb +32 -38
  43. data/lib/milk_tea/core/control_flow/builder.rb +3 -5
  44. data/lib/milk_tea/core/control_flow/constant_propagation.rb +14 -17
  45. data/lib/milk_tea/core/control_flow/definite_assignment.rb +0 -1
  46. data/lib/milk_tea/core/ir.rb +10 -10
  47. data/lib/milk_tea/core/lexer/character_classes.rb +5 -7
  48. data/lib/milk_tea/core/lexer/format_strings.rb +7 -9
  49. data/lib/milk_tea/core/lexer/heredocs.rb +22 -22
  50. data/lib/milk_tea/core/lexer/indentation.rb +0 -2
  51. data/lib/milk_tea/core/lexer/numbers.rb +0 -2
  52. data/lib/milk_tea/core/lexer/recovery.rb +0 -2
  53. data/lib/milk_tea/core/lexer/strings.rb +0 -2
  54. data/lib/milk_tea/core/lexer/symbols.rb +0 -2
  55. data/lib/milk_tea/core/lexer/trivia.rb +0 -2
  56. data/lib/milk_tea/core/lexer.rb +0 -2
  57. data/lib/milk_tea/core/lowering/async/analysis.rb +0 -2
  58. data/lib/milk_tea/core/lowering/async/lowering.rb +1264 -1265
  59. data/lib/milk_tea/core/lowering/async/normalization.rb +0 -2
  60. data/lib/milk_tea/core/lowering/async.rb +627 -630
  61. data/lib/milk_tea/core/lowering/block.rb +413 -416
  62. data/lib/milk_tea/core/lowering/calls.rb +1381 -1384
  63. data/lib/milk_tea/core/lowering/declarations.rb +180 -183
  64. data/lib/milk_tea/core/lowering/dyn.rb +48 -50
  65. data/lib/milk_tea/core/lowering/events.rb +983 -985
  66. data/lib/milk_tea/core/lowering/expressions.rb +1513 -1518
  67. data/lib/milk_tea/core/lowering/foreign_cstr.rb +181 -184
  68. data/lib/milk_tea/core/lowering/functions.rb +185 -188
  69. data/lib/milk_tea/core/lowering/loops.rb +1028 -1031
  70. data/lib/milk_tea/core/lowering/proc.rb +363 -366
  71. data/lib/milk_tea/core/lowering/resolve.rb +2133 -2135
  72. data/lib/milk_tea/core/lowering/scans.rb +179 -181
  73. data/lib/milk_tea/core/lowering/str_buffer.rb +102 -105
  74. data/lib/milk_tea/core/lowering/utils.rb +1040 -1044
  75. data/lib/milk_tea/core/lowering.rb +5 -7
  76. data/lib/milk_tea/core/module_binder.rb +0 -2
  77. data/lib/milk_tea/core/module_loader/errors.rb +4 -2
  78. data/lib/milk_tea/core/module_loader.rb +113 -20
  79. data/lib/milk_tea/core/module_path_resolver.rb +0 -2
  80. data/lib/milk_tea/core/module_roots.rb +6 -8
  81. data/lib/milk_tea/core/parser/attributes.rb +0 -2
  82. data/lib/milk_tea/core/parser/blocks.rb +0 -2
  83. data/lib/milk_tea/core/parser/declarations.rb +0 -2
  84. data/lib/milk_tea/core/parser/expressions.rb +31 -14
  85. data/lib/milk_tea/core/parser/recovery.rb +0 -2
  86. data/lib/milk_tea/core/parser/statements.rb +0 -2
  87. data/lib/milk_tea/core/parser/types.rb +8 -10
  88. data/lib/milk_tea/core/parser.rb +1 -3
  89. data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +31 -33
  90. data/lib/milk_tea/core/pretty_printer/base_formatter.rb +0 -2
  91. data/lib/milk_tea/core/pretty_printer/ir_formatter.rb +0 -2
  92. data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +0 -2
  93. data/lib/milk_tea/core/semantic_analyzer/attributes.rb +14 -16
  94. data/lib/milk_tea/core/semantic_analyzer/calls.rb +0 -2
  95. data/lib/milk_tea/core/semantic_analyzer/expressions.rb +1 -14
  96. data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +18 -21
  97. data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +0 -3
  98. data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +12 -15
  99. data/lib/milk_tea/core/semantic_analyzer/generics.rb +57 -59
  100. data/lib/milk_tea/core/semantic_analyzer/interface_conformance.rb +0 -2
  101. data/lib/milk_tea/core/semantic_analyzer/name_resolution.rb +5 -9
  102. data/lib/milk_tea/core/semantic_analyzer/nullability.rb +0 -3
  103. data/lib/milk_tea/core/semantic_analyzer/statements.rb +35 -40
  104. data/lib/milk_tea/core/semantic_analyzer/top_level.rb +10 -12
  105. data/lib/milk_tea/core/semantic_analyzer/type_compatibility.rb +0 -6
  106. data/lib/milk_tea/core/semantic_analyzer/type_declaration.rb +102 -105
  107. data/lib/milk_tea/core/semantic_analyzer.rb +17 -8
  108. data/lib/milk_tea/core/types/layout.rb +21 -22
  109. data/lib/milk_tea/core/types/predicates.rb +0 -2
  110. data/lib/milk_tea/core/types/registry.rb +16 -18
  111. data/lib/milk_tea/core/types/visitor.rb +0 -4
  112. data/lib/milk_tea/dap/backends/lldb_dap.rb +0 -2
  113. data/lib/milk_tea/dap/protocol.rb +1 -1
  114. data/lib/milk_tea/dap/server/breakpoints.rb +0 -2
  115. data/lib/milk_tea/dap/server/debug_map.rb +0 -2
  116. data/lib/milk_tea/dap/server/handlers.rb +0 -2
  117. data/lib/milk_tea/dap/server/launch.rb +0 -2
  118. data/lib/milk_tea/dap/server/lldb_backend.rb +8 -10
  119. data/lib/milk_tea/dap/server/pause_diagnostics.rb +14 -16
  120. data/lib/milk_tea/dap/server/utilities.rb +0 -2
  121. data/lib/milk_tea/dap/server/wire.rb +0 -2
  122. data/lib/milk_tea/dap/server.rb +0 -2
  123. data/lib/milk_tea/lsp/diagnostics.rb +16 -16
  124. data/lib/milk_tea/lsp/server/call_hierarchy.rb +11 -12
  125. data/lib/milk_tea/lsp/server/code_actions.rb +355 -357
  126. data/lib/milk_tea/lsp/server/code_lens.rb +23 -25
  127. data/lib/milk_tea/lsp/server/completion.rb +873 -875
  128. data/lib/milk_tea/lsp/server/configuration.rb +129 -131
  129. data/lib/milk_tea/lsp/server/debug_info.rb +0 -2
  130. data/lib/milk_tea/lsp/server/definition.rb +564 -565
  131. data/lib/milk_tea/lsp/server/diagnostics_scheduling.rb +191 -193
  132. data/lib/milk_tea/lsp/server/execute_command.rb +0 -2
  133. data/lib/milk_tea/lsp/server/folding_range.rb +0 -4
  134. data/lib/milk_tea/lsp/server/formatting.rb +478 -480
  135. data/lib/milk_tea/lsp/server/hover.rb +1282 -1284
  136. data/lib/milk_tea/lsp/server/inlay_hints.rb +179 -181
  137. data/lib/milk_tea/lsp/server/lifecycle.rb +192 -194
  138. data/lib/milk_tea/lsp/server/linked_editing_range.rb +0 -2
  139. data/lib/milk_tea/lsp/server/on_type_formatting.rb +0 -2
  140. data/lib/milk_tea/lsp/server/progress.rb +0 -2
  141. data/lib/milk_tea/lsp/server/references.rb +316 -318
  142. data/lib/milk_tea/lsp/server/rename.rb +445 -447
  143. data/lib/milk_tea/lsp/server/selection_range.rb +0 -4
  144. data/lib/milk_tea/lsp/server/semantic_tokens.rb +1318 -1320
  145. data/lib/milk_tea/lsp/server/signature_help.rb +146 -148
  146. data/lib/milk_tea/lsp/server/text_documents.rb +99 -101
  147. data/lib/milk_tea/lsp/server/type_hierarchy.rb +2 -4
  148. data/lib/milk_tea/lsp/server/utilities.rb +397 -399
  149. data/lib/milk_tea/lsp/server.rb +0 -3
  150. data/lib/milk_tea/lsp/workspace/analysis.rb +40 -42
  151. data/lib/milk_tea/lsp/workspace/dependency_graph.rb +4 -10
  152. data/lib/milk_tea/lsp/workspace/utilities.rb +19 -19
  153. data/lib/milk_tea/packages/atomic_write.rb +4 -5
  154. data/lib/milk_tea/packages/dependency_solver.rb +15 -15
  155. data/lib/milk_tea/packages/lock.rb +4 -4
  156. data/lib/milk_tea/packages/manager_cli.rb +1 -1
  157. data/lib/milk_tea/packages/manifest.rb +3 -3
  158. data/lib/milk_tea/packages/registry_store.rb +4 -6
  159. data/lib/milk_tea/packages/services.rb +16 -16
  160. data/lib/milk_tea/packages/source_cache.rb +4 -6
  161. data/lib/milk_tea/packages/source_resolver.rb +44 -44
  162. data/lib/milk_tea/packages/version.rb +8 -8
  163. data/lib/milk_tea/tooling/build.rb +3 -7
  164. data/lib/milk_tea/tooling/build_cache.rb +0 -2
  165. data/lib/milk_tea/tooling/debug_info_formatter.rb +31 -33
  166. data/lib/milk_tea/tooling/debug_map.rb +8 -10
  167. data/lib/milk_tea/tooling/docs_app.rb +0 -2
  168. data/lib/milk_tea/tooling/linter/doc_tags.rb +25 -27
  169. data/lib/milk_tea/tooling/linter/fix_engine.rb +87 -24
  170. data/lib/milk_tea/tooling/linter/flow_rules.rb +44 -46
  171. data/lib/milk_tea/tooling/linter/imports_platform.rb +14 -16
  172. data/lib/milk_tea/tooling/linter/release_rules.rb +3 -5
  173. data/lib/milk_tea/tooling/linter/reserved_names.rb +23 -25
  174. data/lib/milk_tea/tooling/linter/rules.rb +87 -89
  175. data/lib/milk_tea/tooling/linter/source_helpers.rb +40 -42
  176. data/lib/milk_tea/tooling/linter/trailing_comma.rb +17 -19
  177. data/lib/milk_tea/tooling/linter/visitors.rb +162 -50
  178. data/lib/milk_tea/tooling/linter.rb +0 -2
  179. data/lib/milk_tea/tooling/project_scaffold.rb +0 -2
  180. data/lib/milk_tea/tooling/run.rb +0 -2
  181. data/lib/milk_tea/tooling/toolchain_cli.rb +0 -2
  182. data/std/cli.mt +13 -32
  183. data/std/color.mt +28 -28
  184. data/std/encoding.mt +4 -4
  185. data/std/graph.mt +1 -2
  186. data/std/hash.mt +14 -14
  187. data/std/http/server.mt +3 -3
  188. data/std/input.mt +1 -1
  189. data/std/json.mt +1 -1
  190. data/std/linear_algebra.mt +6 -6
  191. data/std/net/mux.mt +1 -1
  192. data/std/noise.mt +23 -23
  193. data/std/parse.mt +2 -2
  194. data/std/process.mt +3 -4
  195. data/std/sparse_set.mt +1 -1
  196. data/std/steering.mt +5 -5
  197. data/std/str.mt +1 -1
  198. data/std/tween.mt +4 -4
  199. data/std/utility.mt +3 -3
  200. metadata +2 -2
@@ -2,229 +2,209 @@
2
2
 
3
3
  module MilkTea
4
4
  module LowererFunctions
5
- private
6
-
7
-
8
- def lower_functions
9
- lowered = []
10
-
11
- changed = true
12
- while changed
13
- changed = false
5
+ def lower_functions
6
+ lowered = []
7
+
8
+ changed = true
9
+ while changed
10
+ changed = false
11
+
12
+ expanded_declarations.each do |decl|
13
+ case decl
14
+ when AST::FunctionDef
15
+ binding = @ctx.functions.fetch(decl.name)
16
+ next if binding.body_return_type == Types::BUILTIN_TYPE_META_TYPE
17
+ if binding.type_params.any?
18
+ binding.instances.values.sort_by { |instance| instance.type_arguments.map(&:to_s).join(",") }.each do |instance|
19
+ linkage_name = function_binding_c_name(instance, module_name: @ctx.module_name)
20
+ next if @artifacts.lowered_function_linkage_names[linkage_name]
14
21
 
15
- expanded_declarations.each do |decl|
16
- case decl
17
- when AST::FunctionDef
18
- binding = @ctx.functions.fetch(decl.name)
19
- next if binding.body_return_type == Types::BUILTIN_TYPE_META_TYPE
22
+ lowered << lower_function_decl(instance)
23
+ @artifacts.lowered_function_linkage_names[linkage_name] = true
24
+ changed = true
25
+ end
26
+ else
27
+ linkage_name = function_binding_c_name(binding, module_name: @ctx.module_name)
28
+ next if @artifacts.lowered_function_linkage_names[linkage_name]
29
+
30
+ lowered << lower_function_decl(binding)
31
+ @artifacts.lowered_function_linkage_names[linkage_name] = true
32
+ if @ctx.module_name.to_s == @program.root_analysis.module_name.to_s
33
+ if (entrypoint = build_root_main_entrypoint(binding))
34
+ next if @artifacts.lowered_function_linkage_names[entrypoint.linkage_name]
35
+
36
+ lowered << entrypoint
37
+ @artifacts.lowered_function_linkage_names[entrypoint.linkage_name] = true
38
+ end
39
+ end
40
+ changed = true
41
+ end
42
+ when AST::ExtendingBlock
43
+ receiver_type = resolve_extending_receiver_type(@ctx.analysis, decl.type_name)
44
+ methods_hash = @ctx.methods[receiver_type]
45
+ unless methods_hash
46
+ methods_hash = @ctx.methods.find { |k, _| k.to_s == receiver_type.to_s }&.last
47
+ end
48
+ next unless methods_hash
49
+ decl.methods.each do |method|
50
+ binding = methods_hash[method.kind == :static ? "static:#{method.name}" : method.name]
51
+ next unless binding
20
52
  if binding.type_params.any?
21
53
  binding.instances.values.sort_by { |instance| instance.type_arguments.map(&:to_s).join(",") }.each do |instance|
22
- linkage_name = function_binding_c_name(instance, module_name: @ctx.module_name)
54
+ linkage_name = function_binding_c_name(instance, module_name: @ctx.module_name, receiver_type:)
23
55
  next if @artifacts.lowered_function_linkage_names[linkage_name]
24
56
 
25
- lowered << lower_function_decl(instance)
57
+ lowered << lower_function_decl(instance, receiver_type:)
26
58
  @artifacts.lowered_function_linkage_names[linkage_name] = true
27
59
  changed = true
28
60
  end
29
61
  else
30
- linkage_name = function_binding_c_name(binding, module_name: @ctx.module_name)
62
+ linkage_name = function_binding_c_name(binding, module_name: @ctx.module_name, receiver_type:)
31
63
  next if @artifacts.lowered_function_linkage_names[linkage_name]
32
64
 
33
- lowered << lower_function_decl(binding)
65
+ lowered << lower_function_decl(binding, receiver_type:)
34
66
  @artifacts.lowered_function_linkage_names[linkage_name] = true
35
- if @ctx.module_name.to_s == @program.root_analysis.module_name.to_s
36
- if (entrypoint = build_root_main_entrypoint(binding))
37
- next if @artifacts.lowered_function_linkage_names[entrypoint.linkage_name]
38
-
39
- lowered << entrypoint
40
- @artifacts.lowered_function_linkage_names[entrypoint.linkage_name] = true
41
- end
42
- end
43
67
  changed = true
44
68
  end
45
- when AST::ExtendingBlock
46
- receiver_type = resolve_extending_receiver_type(@ctx.analysis, decl.type_name)
47
- methods_hash = @ctx.methods[receiver_type]
48
- unless methods_hash
49
- methods_hash = @ctx.methods.find { |k, _| k.to_s == receiver_type.to_s }&.last
50
- end
51
- next unless methods_hash
52
- decl.methods.each do |method|
53
- binding = methods_hash[method.kind == :static ? "static:#{method.name}" : method.name]
54
- next unless binding
55
- if binding.type_params.any?
56
- binding.instances.values.sort_by { |instance| instance.type_arguments.map(&:to_s).join(",") }.each do |instance|
57
- linkage_name = function_binding_c_name(instance, module_name: @ctx.module_name, receiver_type:)
58
- next if @artifacts.lowered_function_linkage_names[linkage_name]
59
-
60
- lowered << lower_function_decl(instance, receiver_type:)
61
- @artifacts.lowered_function_linkage_names[linkage_name] = true
62
- changed = true
63
- end
64
- else
65
- linkage_name = function_binding_c_name(binding, module_name: @ctx.module_name, receiver_type:)
66
- next if @artifacts.lowered_function_linkage_names[linkage_name]
67
-
68
- lowered << lower_function_decl(binding, receiver_type:)
69
- @artifacts.lowered_function_linkage_names[linkage_name] = true
70
- changed = true
71
- end
72
- end
73
69
  end
74
70
  end
75
71
  end
76
-
77
- lowered
78
72
  end
79
73
 
80
- def resolve_extending_receiver_type(analysis, type_name)
81
- if type_name.is_a?(AST::TypeRef)
82
- generic_type = resolve_named_generic_type_for_analysis(analysis, type_name.name.parts)
83
- if generic_type.is_a?(Types::GenericStructDefinition) || generic_type.is_a?(Types::GenericVariantDefinition)
84
- validate_methods_receiver_type_arguments!(type_name, generic_type)
85
- return generic_type
86
- end
87
-
88
- begin
89
- return method_dispatch_receiver_type(resolve_type_ref_for_analysis(type_name, analysis))
90
- rescue LoweringError => error
91
- receiver_type_param_names = methods_receiver_type_argument_names!(type_name)
92
- raise error if receiver_type_param_names.empty?
74
+ lowered
75
+ end
93
76
 
94
- receiver_type_params = receiver_type_param_names.to_h { |name| [name, Types::TypeVar.new(name)] }
95
- receiver_type = resolve_type_ref_for_analysis(type_name, analysis, type_params: receiver_type_params)
96
- return method_dispatch_receiver_type(receiver_type)
97
- end
77
+ def resolve_extending_receiver_type(analysis, type_name)
78
+ if type_name.is_a?(AST::TypeRef)
79
+ generic_type = resolve_named_generic_type_for_analysis(analysis, type_name.name.parts)
80
+ if generic_type.is_a?(Types::GenericStructDefinition) || generic_type.is_a?(Types::GenericVariantDefinition)
81
+ validate_methods_receiver_type_arguments!(type_name, generic_type)
82
+ return generic_type
98
83
  end
99
84
 
100
- parts = type_name.name.parts
101
- if parts.length == 1
102
- return types_for_module(analysis.module_name).fetch(parts.first)
103
- end
85
+ begin
86
+ return method_dispatch_receiver_type(resolve_type_ref_for_analysis(type_name, analysis))
87
+ rescue LoweringError => error
88
+ receiver_type_param_names = methods_receiver_type_argument_names!(type_name)
89
+ raise error if receiver_type_param_names.empty?
104
90
 
105
- if parts.length == 2
106
- imported_module = imports_for_module(analysis.module_name).fetch(parts.first)
107
- return imported_module.types.fetch(parts.last)
91
+ receiver_type_params = receiver_type_param_names.to_h { |name| [name, Types::TypeVar.new(name)] }
92
+ receiver_type = resolve_type_ref_for_analysis(type_name, analysis, type_params: receiver_type_params)
93
+ return method_dispatch_receiver_type(receiver_type)
108
94
  end
95
+ end
109
96
 
110
- raise LoweringError.new("unsupported extending target #{type_name}", line: 0, column: 0, path: @ctx.current_analysis_path)
97
+ parts = type_name.name.parts
98
+ if parts.length == 1
99
+ return types_for_module(analysis.module_name).fetch(parts.first)
111
100
  end
112
101
 
113
- def lower_function_decl(binding, receiver_type: nil)
114
- decl = binding.ast
115
- params = []
116
- env = empty_env
117
- parameter_setup = []
118
- previous_type_substitutions = @ctx.current_type_substitutions
119
- @ctx.current_type_substitutions = binding.type_substitutions
102
+ if parts.length == 2
103
+ imported_module = imports_for_module(analysis.module_name).fetch(parts.first)
104
+ return imported_module.types.fetch(parts.last)
105
+ end
120
106
 
121
- return lower_async_function_decl(binding, receiver_type:) if binding.async
107
+ raise LoweringError.new("unsupported extending target #{type_name}", line: 0, column: 0, path: @ctx.current_analysis_path)
108
+ end
109
+
110
+ def lower_function_decl(binding, receiver_type: nil)
111
+ decl = binding.ast
112
+ params = []
113
+ env = empty_env
114
+ parameter_setup = []
115
+ previous_type_substitutions = @ctx.current_type_substitutions
116
+ @ctx.current_type_substitutions = binding.type_substitutions
117
+
118
+ return lower_async_function_decl(binding, receiver_type:) if binding.async
119
+
120
+ receiver_by_pointer = pointer_lowered_sync_method_receiver?(binding)
121
+
122
+ body_params = binding.body_params.dup
123
+ if binding.type.receiver_type
124
+ receiver_binding = body_params.shift
125
+ linkage_name = c_local_name(receiver_binding.name)
126
+ env[:scopes].last[receiver_binding.name] = local_binding(
127
+ type: receiver_binding.type,
128
+ linkage_name:,
129
+ mutable: receiver_binding.mutable,
130
+ pointer: receiver_by_pointer,
131
+ )
132
+ params << IR::Param.new(
133
+ name: receiver_binding.name,
134
+ linkage_name:,
135
+ type: receiver_binding.type,
136
+ pointer: receiver_by_pointer,
137
+ )
138
+ end
122
139
 
123
- receiver_by_pointer = pointer_lowered_sync_method_receiver?(binding)
140
+ body_params.each_with_index do |param_binding, index|
141
+ type = param_binding.type
124
142
 
125
- body_params = binding.body_params.dup
126
- if binding.type.receiver_type
127
- receiver_binding = body_params.shift
128
- linkage_name = c_local_name(receiver_binding.name)
129
- env[:scopes].last[receiver_binding.name] = local_binding(
130
- type: receiver_binding.type,
143
+ linkage_name = c_local_name(param_binding.name)
144
+ if array_type?(type)
145
+ input_linkage_name = "#{linkage_name}_input"
146
+ params << IR::Param.new(name: param_binding.name, linkage_name: input_linkage_name, type:, pointer: false)
147
+ env[:scopes].last[param_binding.name] = local_binding(type:, linkage_name:, mutable: false, pointer: false)
148
+ parameter_setup << IR::LocalDecl.new(
149
+ name: param_binding.name,
131
150
  linkage_name:,
132
- mutable: receiver_binding.mutable,
133
- pointer: receiver_by_pointer,
151
+ type:,
152
+ value: IR::Name.new(name: input_linkage_name, type:, pointer: false),
134
153
  )
135
- params << IR::Param.new(
136
- name: receiver_binding.name,
137
- linkage_name:,
138
- type: receiver_binding.type,
139
- pointer: receiver_by_pointer,
140
- )
141
- end
142
-
143
- body_params.each_with_index do |param_binding, index|
144
- type = param_binding.type
145
-
146
- linkage_name = c_local_name(param_binding.name)
147
- if array_type?(type)
148
- input_linkage_name = "#{linkage_name}_input"
149
- params << IR::Param.new(name: param_binding.name, linkage_name: input_linkage_name, type:, pointer: false)
150
- env[:scopes].last[param_binding.name] = local_binding(type:, linkage_name:, mutable: false, pointer: false)
151
- parameter_setup << IR::LocalDecl.new(
152
- name: param_binding.name,
153
- linkage_name:,
154
- type:,
155
- value: IR::Name.new(name: input_linkage_name, type:, pointer: false),
156
- )
157
- else
158
- env[:scopes].last[param_binding.name] = local_binding(type:, linkage_name:, mutable: false, pointer: false)
159
- params << IR::Param.new(name: param_binding.name, linkage_name:, type:, pointer: false)
160
- end
154
+ else
155
+ env[:scopes].last[param_binding.name] = local_binding(type:, linkage_name:, mutable: false, pointer: false)
156
+ params << IR::Param.new(name: param_binding.name, linkage_name:, type:, pointer: false)
161
157
  end
162
-
163
- return_type = binding.type.return_type
164
- body = lower_block(decl.body, env:, active_defers: [], return_type:, loop_flow: nil, allow_return: true)
165
- body = parameter_setup + body
166
-
167
- IR::Function.new(
168
- name: decl.name,
169
- linkage_name: function_binding_c_name(binding, module_name: @ctx.module_name, receiver_type:),
170
- params:,
171
- return_type:,
172
- body:,
173
- entry_point: false,
174
- method_receiver_param: !binding.type.receiver_type.nil?,
175
- )
176
- ensure
177
- @ctx.current_type_substitutions = previous_type_substitutions
178
158
  end
179
159
 
180
- def lower_async_function_decl(binding, receiver_type: nil)
181
- decl = binding.ast
182
- normalized_statements = normalize_async_body(binding, decl.body)
183
- constructor_linkage_name = function_binding_c_name(binding, module_name: @ctx.module_name, receiver_type:)
184
- frame_linkage_name = "#{constructor_linkage_name}__frame"
185
- resume_linkage_name = "#{constructor_linkage_name}__resume"
186
- ready_linkage_name = "#{constructor_linkage_name}__ready"
187
- set_waiter_linkage_name = "#{constructor_linkage_name}__set_waiter"
188
- release_linkage_name = "#{constructor_linkage_name}__release"
189
- take_result_linkage_name = "#{constructor_linkage_name}__take_result"
190
- cancel_linkage_name = "#{constructor_linkage_name}__cancel"
191
-
192
- async_info = analyze_async_function(binding, normalized_statements)
193
- frame_type = build_async_frame_type(frame_linkage_name, async_info)
194
-
195
- @artifacts.synthetic_structs << IR::StructDecl.new(
196
- name: frame_linkage_name,
197
- linkage_name: frame_linkage_name,
198
- fields: frame_type.fields.map { |field_name, field_type| IR::Field.new(name: field_name, type: field_type) },
199
- packed: false,
200
- alignment: nil,
201
- )
202
- @artifacts.synthetic_functions << build_async_resume_function(binding, normalized_statements, frame_type, resume_linkage_name, async_info)
203
- @artifacts.synthetic_functions << build_async_ready_function(frame_type, ready_linkage_name, async_info)
204
- @artifacts.synthetic_functions << build_async_set_waiter_function(frame_type, set_waiter_linkage_name, async_info)
205
- @artifacts.synthetic_functions << build_async_release_function(frame_type, release_linkage_name, async_info)
206
- @artifacts.synthetic_functions << build_async_take_result_function(frame_type, take_result_linkage_name, async_info)
207
- @artifacts.synthetic_functions << build_async_cancel_function(frame_type, cancel_linkage_name, async_info)
208
-
209
- if root_main_entrypoint_signature(binding)
210
- @artifacts.synthetic_functions << build_async_constructor_function(
211
- binding,
212
- decl,
213
- frame_type,
214
- constructor_linkage_name,
215
- resume_linkage_name,
216
- ready_linkage_name,
217
- set_waiter_linkage_name,
218
- release_linkage_name,
219
- take_result_linkage_name,
220
- cancel_linkage_name,
221
- async_info,
222
- )
223
-
224
- return build_async_main_entrypoint(binding, constructor_linkage_name, async_info)
225
- end
226
-
227
- build_async_constructor_function(
160
+ return_type = binding.type.return_type
161
+ body = lower_block(decl.body, env:, active_defers: [], return_type:, loop_flow: nil, allow_return: true)
162
+ body = parameter_setup + body
163
+
164
+ IR::Function.new(
165
+ name: decl.name,
166
+ linkage_name: function_binding_c_name(binding, module_name: @ctx.module_name, receiver_type:),
167
+ params:,
168
+ return_type:,
169
+ body:,
170
+ entry_point: false,
171
+ method_receiver_param: !binding.type.receiver_type.nil?,
172
+ )
173
+ ensure
174
+ @ctx.current_type_substitutions = previous_type_substitutions
175
+ end
176
+
177
+ def lower_async_function_decl(binding, receiver_type: nil)
178
+ decl = binding.ast
179
+ normalized_statements = normalize_async_body(binding, decl.body)
180
+ constructor_linkage_name = function_binding_c_name(binding, module_name: @ctx.module_name, receiver_type:)
181
+ frame_linkage_name = "#{constructor_linkage_name}__frame"
182
+ resume_linkage_name = "#{constructor_linkage_name}__resume"
183
+ ready_linkage_name = "#{constructor_linkage_name}__ready"
184
+ set_waiter_linkage_name = "#{constructor_linkage_name}__set_waiter"
185
+ release_linkage_name = "#{constructor_linkage_name}__release"
186
+ take_result_linkage_name = "#{constructor_linkage_name}__take_result"
187
+ cancel_linkage_name = "#{constructor_linkage_name}__cancel"
188
+
189
+ async_info = analyze_async_function(binding, normalized_statements)
190
+ frame_type = build_async_frame_type(frame_linkage_name, async_info)
191
+
192
+ @artifacts.synthetic_structs << IR::StructDecl.new(
193
+ name: frame_linkage_name,
194
+ linkage_name: frame_linkage_name,
195
+ fields: frame_type.fields.map { |field_name, field_type| IR::Field.new(name: field_name, type: field_type) },
196
+ packed: false,
197
+ alignment: nil,
198
+ )
199
+ @artifacts.synthetic_functions << build_async_resume_function(binding, normalized_statements, frame_type, resume_linkage_name, async_info)
200
+ @artifacts.synthetic_functions << build_async_ready_function(frame_type, ready_linkage_name, async_info)
201
+ @artifacts.synthetic_functions << build_async_set_waiter_function(frame_type, set_waiter_linkage_name, async_info)
202
+ @artifacts.synthetic_functions << build_async_release_function(frame_type, release_linkage_name, async_info)
203
+ @artifacts.synthetic_functions << build_async_take_result_function(frame_type, take_result_linkage_name, async_info)
204
+ @artifacts.synthetic_functions << build_async_cancel_function(frame_type, cancel_linkage_name, async_info)
205
+
206
+ if root_main_entrypoint_signature(binding)
207
+ @artifacts.synthetic_functions << build_async_constructor_function(
228
208
  binding,
229
209
  decl,
230
210
  frame_type,
@@ -237,6 +217,23 @@ module MilkTea
237
217
  cancel_linkage_name,
238
218
  async_info,
239
219
  )
220
+
221
+ return build_async_main_entrypoint(binding, constructor_linkage_name, async_info)
240
222
  end
223
+
224
+ build_async_constructor_function(
225
+ binding,
226
+ decl,
227
+ frame_type,
228
+ constructor_linkage_name,
229
+ resume_linkage_name,
230
+ ready_linkage_name,
231
+ set_waiter_linkage_name,
232
+ release_linkage_name,
233
+ take_result_linkage_name,
234
+ cancel_linkage_name,
235
+ async_info,
236
+ )
237
+ end
241
238
  end
242
239
  end