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