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
@@ -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
@@ -615,8 +615,6 @@ module MilkTea
615
615
  end
616
616
  end
617
617
 
618
- private
619
-
620
618
  def char_array_text_type?(type)
621
619
  return false unless array_type?(type)
622
620
 
@@ -6,80 +6,78 @@ module MilkTea
6
6
  @pool = {}
7
7
  @mutex = Mutex.new
8
8
 
9
- module_function
10
-
11
- def reset!
9
+ def self.reset!
12
10
  @mutex.synchronize { @pool.clear }
13
11
  end
14
12
 
15
- def _intern(key, &construct)
13
+ def self._intern(key, &construct)
16
14
  @mutex.synchronize do
17
15
  @pool[key] ||= construct.call
18
16
  end
19
17
  end
20
18
 
21
- def primitive(name)
19
+ def self.primitive(name)
22
20
  _intern([:primitive, name]) { Primitive.new(name) }
23
21
  end
24
22
 
25
- def nullable(base)
23
+ def self.nullable(base)
26
24
  _intern([:nullable, base]) { Nullable.new(base) }
27
25
  end
28
26
 
29
- def generic_instance(name, arguments)
27
+ def self.generic_instance(name, arguments)
30
28
  args = arguments.freeze
31
29
  _intern([:generic, name, args]) { GenericInstance.new(name, args) }
32
30
  end
33
31
 
34
- def span(element_type)
32
+ def self.span(element_type)
35
33
  _intern([:span, element_type]) { Span.new(element_type) }
36
34
  end
37
35
 
38
- def task(result_type)
36
+ def self.task(result_type)
39
37
  _intern([:task, result_type]) { Task.new(result_type) }
40
38
  end
41
39
 
42
- def string_view
40
+ def self.string_view
43
41
  _intern([:string_view]) { StringView.new }
44
42
  end
45
43
 
46
- def function(name, params:, return_type:, receiver_type: nil, receiver_editable: false, variadic: false, external: false)
44
+ def self.function(name, params:, return_type:, receiver_type: nil, receiver_editable: false, variadic: false, external: false)
47
45
  params_frozen = params.freeze
48
46
  _intern([:function, name, params_frozen, return_type, receiver_type, receiver_editable, variadic, external]) {
49
47
  Function.new(name, params: params_frozen, return_type: return_type, receiver_type: receiver_type, receiver_editable: receiver_editable, variadic: variadic, external: external)
50
48
  }
51
49
  end
52
50
 
53
- def proc(params:, return_type:)
51
+ def self.proc(params:, return_type:)
54
52
  params_frozen = params.freeze
55
53
  _intern([:proc, params_frozen, return_type]) { Proc.new(params: params_frozen, return_type: return_type) }
56
54
  end
57
55
 
58
- def parameter(name, type, mutable: false, passing_mode: :plain, boundary_type: nil)
56
+ def self.parameter(name, type, mutable: false, passing_mode: :plain, boundary_type: nil)
59
57
  _intern([:parameter, name, type, mutable, passing_mode, boundary_type]) {
60
58
  Parameter.new(name, type, mutable: mutable, passing_mode: passing_mode, boundary_type: boundary_type)
61
59
  }
62
60
  end
63
61
 
64
- def tuple(element_types, field_names: nil)
62
+ def self.tuple(element_types, field_names: nil)
65
63
  et_frozen = element_types.freeze
66
64
  fn_frozen = field_names&.freeze
67
65
  _intern([:tuple, et_frozen, fn_frozen]) { Tuple.new(et_frozen, field_names: fn_frozen) }
68
66
  end
69
67
 
70
- def soa(element_type, count:)
68
+ def self.soa(element_type, count:)
71
69
  _intern([:soa, element_type, count]) { SoA.new(element_type, count: count) }
72
70
  end
73
71
 
74
- def simd(element_type, lane_count:)
72
+ def self.simd(element_type, lane_count:)
75
73
  _intern([:simd, element_type, lane_count]) { Simd.new(element_type, lane_count: lane_count) }
76
74
  end
77
75
 
78
- def lifetime_ref(name)
76
+ def self.lifetime_ref(name)
79
77
  LifetimeRef.new(name)
80
78
  end
81
79
 
82
- def dyn(interface_binding, type_arguments = [])
80
+ def self.dyn(interface_binding, type_arguments = [])
83
81
  Dyn.new(interface_binding, type_arguments)
84
82
  end
85
83
  end
@@ -188,8 +188,6 @@ module MilkTea
188
188
  end
189
189
  alias visit_function visit_proc
190
190
 
191
- private
192
-
193
191
  def visit_children(type)
194
192
  type.children.each do |child|
195
193
  visit(child)
@@ -431,8 +429,6 @@ module MilkTea
431
429
  end
432
430
  end
433
431
 
434
- private
435
-
436
432
  def with_context(new_context)
437
433
  old = @context
438
434
  @context = new_context
@@ -91,8 +91,6 @@ module MilkTea
91
91
  @stderr_thread = nil
92
92
  end
93
93
 
94
- private
95
-
96
94
  def next_seq
97
95
  seq = @next_seq
98
96
  @next_seq += 1
@@ -46,7 +46,7 @@ module MilkTea
46
46
  log_error("DAP protocol write error: #{e.message}")
47
47
  end
48
48
 
49
- private def log_error(message)
49
+ def log_error(message)
50
50
  return unless @error_output
51
51
 
52
52
  @error_output.puts(message)
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module DAP
5
5
  class Server
6
6
  module ServerBreakpoints
7
- private
8
-
9
7
  def sync_breakpoints_to_backend
10
8
  return if @breakpoints_synced_to_backend
11
9
 
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module DAP
5
5
  class Server
6
6
  module ServerDebugMap
7
- private
8
-
9
7
  def load_debug_map(runnable_path)
10
8
  @debug_map = runnable_path ? DebugMap.load_for_binary(runnable_path) : nil
11
9
  @frame_debug_functions = {}
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module DAP
5
5
  class Server
6
6
  module ServerHandlers
7
- private
8
-
9
7
  def handle_initialize(message)
10
8
  if @session.initialized?
11
9
  write_error_response(message, "initialize can only be called once")
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module DAP
5
5
  class Server
6
6
  module ServerLaunch
7
- private
8
-
9
7
  def request_start(message)
10
8
  if @session.launched?
11
9
  write_error_response(message, "Program already launched")
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module DAP
5
5
  class Server
6
6
  module ServerLLDBBackend
7
- private
8
-
9
7
  def using_lldb_backend?
10
8
  @session.backend_kind == "lldb-dap"
11
9
  end
@@ -22,14 +20,14 @@ module MilkTea
22
20
  end
23
21
 
24
22
  @lldb_backend = if @backend_factory
25
- build_backend_via_factory(adapter_command)
26
- else
27
- Backends::LLDBDAP.new(
28
- adapter_command: adapter_command,
29
- on_event: method(:handle_backend_event),
30
- on_request: method(:handle_backend_request)
31
- )
32
- end
23
+ build_backend_via_factory(adapter_command)
24
+ else
25
+ Backends::LLDBDAP.new(
26
+ adapter_command: adapter_command,
27
+ on_event: method(:handle_backend_event),
28
+ on_request: method(:handle_backend_request)
29
+ )
30
+ end
33
31
  @lldb_backend.start!
34
32
  end
35
33
 
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module DAP
5
5
  class Server
6
6
  module ServerPauseDiagnostics
7
- private
8
-
9
7
  def emit_pause_diagnostic_async(body)
10
8
  return unless body.is_a?(Hash)
11
9
 
@@ -80,22 +78,22 @@ module MilkTea
80
78
  line = dap_value(frame, "line")
81
79
 
82
80
  location_source = if !source_path.empty? && !source_path.include?("`")
83
- source_path
84
- elsif !source_name.empty?
85
- source_name
86
- elsif !source_path.empty?
87
- source_path
88
- else
89
- instruction_pointer
90
- end
81
+ source_path
82
+ elsif !source_name.empty?
83
+ source_name
84
+ elsif !source_path.empty?
85
+ source_path
86
+ else
87
+ instruction_pointer
88
+ end
91
89
 
92
90
  location = if location_source.to_s.empty?
93
- "(unknown)"
94
- elsif line.to_i.positive? && !location_source.include?(":#{line}")
95
- "#{location_source}:#{line}"
96
- else
97
- location_source
98
- end
91
+ "(unknown)"
92
+ elsif line.to_i.positive? && !location_source.include?(":#{line}")
93
+ "#{location_source}:#{line}"
94
+ else
95
+ location_source
96
+ end
99
97
 
100
98
  if include_ip && !instruction_pointer.empty? && location != instruction_pointer
101
99
  "#{frame_name} @ #{location} ip=#{instruction_pointer}"
@@ -6,8 +6,6 @@ module MilkTea
6
6
  module ServerUtilities
7
7
  PERF_LOG_THRESHOLD_MS = 20
8
8
 
9
- private
10
-
11
9
  def register_handlers
12
10
  @handlers["initialize"] = method(:handle_initialize)
13
11
  @handlers["setBreakpoints"] = method(:handle_set_breakpoints)
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module DAP
5
5
  class Server
6
6
  module ServerWire
7
- private
8
-
9
7
  def write_response(request, body)
10
8
  write_message({
11
9
  seq: @session.next_seq,
@@ -90,8 +90,6 @@ module MilkTea
90
90
  @reader_thread&.join(0.2)
91
91
  end
92
92
 
93
- private
94
-
95
93
  def start_client_reader
96
94
  return if @reader_thread&.alive?
97
95
 
@@ -77,7 +77,7 @@ module MilkTea
77
77
  imports: ast.respond_to?(:imports) ? (ast.imports || []) : [],
78
78
  directives: ast.respond_to?(:directives) ? (ast.directives || []) : [],
79
79
  declarations: ast.respond_to?(:declarations) ? (ast.declarations || []) : [],
80
- line: ast.respond_to?(:line) ? ast.line : 1,
80
+ line: ast.line || 1,
81
81
  node_ids: ast.respond_to?(:node_ids) ? ast.node_ids : {},
82
82
  )
83
83
  end
@@ -90,14 +90,14 @@ module MilkTea
90
90
  cross_by_uri = {}
91
91
  target_path = path.is_a?(String) ? File.expand_path(path) : nil
92
92
  sema_snapshot.diagnostics.reject { |diagnostic| redundant_unknown_import_diagnostic?(diagnostic, unresolved_import_paths) }
93
- .each do |diagnostic|
94
- if target_path && diagnostic.path && File.expand_path(diagnostic.path) != target_path
95
- target_uri = path_to_uri(diagnostic.path)
96
- (cross_by_uri[target_uri] ||= []) << format_tooling_diagnostic(diagnostic, stage: 'sema')
97
- else
98
- diagnostics << format_tooling_diagnostic(diagnostic, stage: 'sema')
99
- end
100
- end
93
+ .each do |diagnostic|
94
+ if target_path && diagnostic.path && File.expand_path(diagnostic.path) != target_path
95
+ target_uri = path_to_uri(diagnostic.path)
96
+ (cross_by_uri[target_uri] ||= []) << format_tooling_diagnostic(diagnostic, stage: 'sema')
97
+ else
98
+ diagnostics << format_tooling_diagnostic(diagnostic, stage: 'sema')
99
+ end
100
+ end
101
101
  sema_ms = elapsed_ms(sema_start) if sema_start
102
102
  rescue StandardError => e
103
103
  log_diagnostics_warning("Error collecting diagnostics: #{e.message}")
@@ -369,12 +369,12 @@ module MilkTea
369
369
  start_char, end_char = extract_warning_range(diagnostic, content)
370
370
 
371
371
  lsp_severity = case diagnostic.severity
372
- when :error then 1
373
- when :warning then 2
374
- when :info then 3
375
- when :hint then 4
376
- else 2
377
- end
372
+ when :error then 1
373
+ when :warning then 2
374
+ when :info then 3
375
+ when :hint then 4
376
+ else 2
377
+ end
378
378
  {
379
379
  range: {
380
380
  start: { line: line_index, character: start_char },
@@ -393,7 +393,7 @@ module MilkTea
393
393
  # Returns [start_char, end_char] in 0-based LSP coordinates.
394
394
  # Falls back to [0, 1] when a precise token span cannot be inferred.
395
395
  def self.extract_warning_range(warning, content)
396
- if warning.respond_to?(:column) && warning.column
396
+ if warning.column
397
397
  start_char = [warning.column.to_i - 1, 0].max
398
398
  len = warning.respond_to?(:length) ? warning.length.to_i : 0
399
399
  len = 1 if len <= 0
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module LSP
5
5
  class Server
6
6
  module ServerCallHierarchy
7
- private
8
-
9
7
  def handle_prepare_call_hierarchy(params)
10
8
  text_document = params["textDocument"]
11
9
  position = params["position"]
@@ -176,8 +174,8 @@ module MilkTea
176
174
  end
177
175
 
178
176
  def binding_range(binding)
179
- line = binding.ast.respond_to?(:line) ? binding.ast.line - 1 : 0
180
- col = binding.ast.respond_to?(:column) ? binding.ast.column - 1 : 0
177
+ line = binding.ast.line ? binding.ast.line - 1 : 0
178
+ col = binding.ast.column ? binding.ast.column - 1 : 0
181
179
  length = binding.name.length
182
180
  {
183
181
  start: { line: line, character: col },
@@ -188,8 +186,8 @@ module MilkTea
188
186
  def selection_range_from_binding(binding)
189
187
  name_len = binding.name.length
190
188
  ast = binding.ast
191
- line = ast.respond_to?(:line) ? ast.line - 1 : 0
192
- col = ast.respond_to?(:column) ? ast.column - 1 : 0
189
+ line = ast.line ? ast.line - 1 : 0
190
+ col = ast.column ? ast.column - 1 : 0
193
191
 
194
192
  if ast.respond_to?(:name)
195
193
  name_ast = ast.name
@@ -226,11 +224,12 @@ module MilkTea
226
224
  callee_name = extract_callee_name(node.callee, facts)
227
225
  next unless callee_name
228
226
 
227
+ callee = node.callee
228
+ line_start = callee.line ? callee.line - 1 : 0
229
+ col_start = callee.column ? callee.column - 1 : 0
229
230
  range = {
230
- start: { line: node.callee.respond_to?(:line) ? node.callee.line - 1 : 0,
231
- character: node.callee.respond_to?(:column) ? node.callee.column - 1 : 0 },
232
- end: { line: node.callee.respond_to?(:line) ? node.callee.line - 1 : 0,
233
- character: (node.callee.respond_to?(:column) ? node.callee.column - 1 : 0) + callee_name.length },
231
+ start: { line: line_start, character: col_start },
232
+ end: { line: line_start, character: col_start + callee_name.length },
234
233
  }
235
234
 
236
235
  callees[callee_name] ||= []
@@ -260,8 +259,8 @@ module MilkTea
260
259
  end
261
260
 
262
261
  def token_range(token)
263
- line = token.respond_to?(:line) ? token.line - 1 : 0
264
- col = token.respond_to?(:column) ? token.column - 1 : 0
262
+ line = token.line ? token.line - 1 : 0
263
+ col = token.column ? token.column - 1 : 0
265
264
  len = token.respond_to?(:lexeme) ? token.lexeme.length : 0
266
265
  {
267
266
  start: { line: line, character: col },