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
@@ -4,245 +4,243 @@ module MilkTea
4
4
  module LSP
5
5
  class Server
6
6
  module ServerDiagnosticsScheduling
7
- private
8
-
9
- def schedule_diagnostics(uri, force: false, lint_tier: :full)
10
- content = @workspace.get_content(uri)
11
- content_digest = Digest::SHA256.hexdigest(content)
12
- normalized_lint_tier = Linter.normalize_lint_tier(lint_tier)
13
- enqueue = false
14
-
15
- @diagnostics_mutex.synchronize do
16
- previous = @diagnostics_last_scheduled_hash[uri]
17
- if !force && previous && previous[:digest] == content_digest && lint_tier_rank(previous[:lint_tier]) >= lint_tier_rank(normalized_lint_tier)
18
- @diagnostics_perf[:skipped_unchanged] += 1 if perf_logging?
19
- return
20
- end
7
+ def schedule_diagnostics(uri, force: false, lint_tier: :full)
8
+ content = @workspace.get_content(uri)
9
+ content_digest = Digest::SHA256.hexdigest(content)
10
+ normalized_lint_tier = Linter.normalize_lint_tier(lint_tier)
11
+ enqueue = false
12
+
13
+ @diagnostics_mutex.synchronize do
14
+ previous = @diagnostics_last_scheduled_hash[uri]
15
+ if !force && previous && previous[:digest] == content_digest && lint_tier_rank(previous[:lint_tier]) >= lint_tier_rank(normalized_lint_tier)
16
+ @diagnostics_perf[:skipped_unchanged] += 1 if perf_logging?
17
+ return
18
+ end
19
+
20
+ @diagnostics_generation[uri] += 1
21
+ @diagnostics_last_scheduled_hash[uri] = {
22
+ digest: content_digest,
23
+ lint_tier: normalized_lint_tier,
24
+ }
25
+ @diagnostics_perf[:scheduled] += 1 if perf_logging?
26
+
27
+ pending = @diagnostics_pending[uri]
28
+ pending_lint_tier = pending ? pending[:lint_tier] : normalized_lint_tier
29
+ merged_lint_tier = if pending && pending[:content] == content
30
+ more_strict_lint_tier(pending_lint_tier, normalized_lint_tier)
31
+ else
32
+ normalized_lint_tier
33
+ end
34
+
35
+ @diagnostics_pending[uri] = {
36
+ generation: @diagnostics_generation[uri],
37
+ content: content,
38
+ lint_tier: merged_lint_tier,
39
+ }
21
40
 
22
- @diagnostics_generation[uri] += 1
23
- @diagnostics_last_scheduled_hash[uri] = {
24
- digest: content_digest,
25
- lint_tier: normalized_lint_tier,
26
- }
27
- @diagnostics_perf[:scheduled] += 1 if perf_logging?
28
-
29
- pending = @diagnostics_pending[uri]
30
- pending_lint_tier = pending ? pending[:lint_tier] : normalized_lint_tier
31
- merged_lint_tier = if pending && pending[:content] == content
32
- more_strict_lint_tier(pending_lint_tier, normalized_lint_tier)
33
- else
34
- normalized_lint_tier
35
- end
36
-
37
- @diagnostics_pending[uri] = {
38
- generation: @diagnostics_generation[uri],
39
- content: content,
40
- lint_tier: merged_lint_tier,
41
- }
42
-
43
- unless @diagnostics_enqueued.include?(uri)
44
- @diagnostics_enqueued << uri
45
- enqueue = true
41
+ unless @diagnostics_enqueued.include?(uri)
42
+ @diagnostics_enqueued << uri
43
+ enqueue = true
44
+ end
46
45
  end
47
- end
48
46
 
49
- if enqueue
50
- @diagnostics_queue << uri
51
- if perf_logging?
52
- @diagnostics_perf[:queue_peak] = [@diagnostics_perf[:queue_peak], @diagnostics_queue.length].max
47
+ if enqueue
48
+ @diagnostics_queue << uri
49
+ if perf_logging?
50
+ @diagnostics_perf[:queue_peak] = [@diagnostics_perf[:queue_peak], @diagnostics_queue.length].max
51
+ end
53
52
  end
54
53
  end
55
- end
56
54
 
57
- def cancel_diagnostics(uri)
58
- @diagnostics_mutex.synchronize do
59
- @diagnostics_generation[uri] += 1
60
- @diagnostics_pending.delete(uri)
61
- @diagnostics_last_scheduled_hash.delete(uri)
62
- @diagnostics_perf[:cancelled] += 1 if perf_logging?
55
+ def cancel_diagnostics(uri)
56
+ @diagnostics_mutex.synchronize do
57
+ @diagnostics_generation[uri] += 1
58
+ @diagnostics_pending.delete(uri)
59
+ @diagnostics_last_scheduled_hash.delete(uri)
60
+ @diagnostics_perf[:cancelled] += 1 if perf_logging?
61
+ end
63
62
  end
64
- end
65
63
 
66
- def start_diagnostics_workers
67
- return if @diagnostics_workers.any?(&:alive?)
64
+ def start_diagnostics_workers
65
+ return if @diagnostics_workers.any?(&:alive?)
68
66
 
69
- DIAGNOSTICS_WORKER_COUNT.times do |index|
70
- @diagnostics_workers << Thread.new do
71
- if Thread.current.respond_to?(:name=)
72
- Thread.current.name = "mt-lsp-diagnostics-#{index + 1}"
73
- end
67
+ DIAGNOSTICS_WORKER_COUNT.times do |index|
68
+ @diagnostics_workers << Thread.new do
69
+ if Thread.current.respond_to?(:name=)
70
+ Thread.current.name = "mt-lsp-diagnostics-#{index + 1}"
71
+ end
74
72
 
75
- loop do
76
- uri = @diagnostics_queue.pop
77
- break if uri == :__stop__
73
+ loop do
74
+ uri = @diagnostics_queue.pop
75
+ break if uri == :__stop__
78
76
 
79
- process_diagnostics_for_uri(uri)
77
+ process_diagnostics_for_uri(uri)
78
+ end
79
+ rescue StandardError => e
80
+ warn "LSP diagnostics worker error: #{e.message}"
81
+ warn " #{e.backtrace.first(8).join("\n ")}" if e.backtrace
80
82
  end
81
- rescue StandardError => e
82
- warn "LSP diagnostics worker error: #{e.message}"
83
- warn " #{e.backtrace.first(8).join("\n ")}" if e.backtrace
84
83
  end
85
84
  end
86
- end
87
85
 
88
- def stop_diagnostics_workers
89
- workers = @diagnostics_workers
90
- return if workers.empty?
86
+ def stop_diagnostics_workers
87
+ workers = @diagnostics_workers
88
+ return if workers.empty?
91
89
 
92
- workers.length.times { @diagnostics_queue << :__stop__ }
93
- workers.each do |worker|
94
- worker.join(1.0)
95
- next unless worker.alive?
90
+ workers.length.times { @diagnostics_queue << :__stop__ }
91
+ workers.each do |worker|
92
+ worker.join(1.0)
93
+ next unless worker.alive?
96
94
 
97
- worker.kill
98
- worker.join
95
+ worker.kill
96
+ worker.join
97
+ end
98
+ @diagnostics_workers = []
99
+ rescue StandardError => e
100
+ warn "LSP diagnostics worker shutdown error: #{e.message}"
99
101
  end
100
- @diagnostics_workers = []
101
- rescue StandardError => e
102
- warn "LSP diagnostics worker shutdown error: #{e.message}"
103
- end
104
102
 
105
- def drain_diagnostics_queue
106
- @diagnostics_queue.clear
107
- nil
108
- end
103
+ def drain_diagnostics_queue
104
+ @diagnostics_queue.clear
105
+ nil
106
+ end
109
107
 
110
- def process_diagnostics_for_uri(uri)
111
- loop do
112
- snapshot = nil
113
- @diagnostics_mutex.synchronize do
114
- snapshot = @diagnostics_pending.delete(uri)
115
- end
116
- break unless snapshot
108
+ def process_diagnostics_for_uri(uri)
109
+ loop do
110
+ snapshot = nil
111
+ @diagnostics_mutex.synchronize do
112
+ snapshot = @diagnostics_pending.delete(uri)
113
+ end
114
+ break unless snapshot
117
115
 
118
- @diagnostics_perf[:dequeued] += 1 if perf_logging?
116
+ @diagnostics_perf[:dequeued] += 1 if perf_logging?
119
117
 
120
- diagnostics = collect_diagnostics_for_content(uri, snapshot[:content], lint_tier: snapshot[:lint_tier])
121
- publish = false
122
- @diagnostics_mutex.synchronize do
123
- publish = snapshot[:generation] == @diagnostics_generation[uri]
124
- end
118
+ diagnostics = collect_diagnostics_for_content(uri, snapshot[:content], lint_tier: snapshot[:lint_tier])
119
+ publish = false
120
+ @diagnostics_mutex.synchronize do
121
+ publish = snapshot[:generation] == @diagnostics_generation[uri]
122
+ end
125
123
 
126
- if publish
127
- if defined?(@pull_diagnostics_active) && @pull_diagnostics_active
128
- @diagnostics_perf[:collected_for_pull] += 1 if perf_logging?
129
- else
130
- @diagnostics_perf[:published] += 1 if perf_logging?
131
- @protocol.write_notification('textDocument/publishDiagnostics', {
132
- uri: uri,
133
- diagnostics: diagnostics
134
- })
135
- notify_diagnostic_errors(uri, diagnostics)
136
-
137
- cross = @workspace.cross_file_diagnostics
138
- if cross&.any?
139
- cross.each do |target_uri, items|
140
- @protocol.write_notification('textDocument/publishDiagnostics', {
141
- uri: target_uri,
142
- diagnostics: items
143
- })
124
+ if publish
125
+ if defined?(@pull_diagnostics_active) && @pull_diagnostics_active
126
+ @diagnostics_perf[:collected_for_pull] += 1 if perf_logging?
127
+ else
128
+ @diagnostics_perf[:published] += 1 if perf_logging?
129
+ @protocol.write_notification('textDocument/publishDiagnostics', {
130
+ uri: uri,
131
+ diagnostics: diagnostics
132
+ })
133
+ notify_diagnostic_errors(uri, diagnostics)
134
+
135
+ cross = @workspace.cross_file_diagnostics
136
+ if cross&.any?
137
+ cross.each do |target_uri, items|
138
+ @protocol.write_notification('textDocument/publishDiagnostics', {
139
+ uri: target_uri,
140
+ diagnostics: items
141
+ })
142
+ end
144
143
  end
145
144
  end
145
+ elsif perf_logging?
146
+ @diagnostics_perf[:dropped_stale] += 1
146
147
  end
147
- elsif perf_logging?
148
- @diagnostics_perf[:dropped_stale] += 1
149
148
  end
150
- end
151
- ensure
152
- requeue = false
153
- @diagnostics_mutex.synchronize do
154
- @diagnostics_enqueued.delete(uri)
155
- if @diagnostics_pending.key?(uri)
156
- @diagnostics_enqueued << uri
157
- requeue = true
149
+ ensure
150
+ requeue = false
151
+ @diagnostics_mutex.synchronize do
152
+ @diagnostics_enqueued.delete(uri)
153
+ if @diagnostics_pending.key?(uri)
154
+ @diagnostics_enqueued << uri
155
+ requeue = true
156
+ end
158
157
  end
159
- end
160
158
 
161
- if requeue
162
- @diagnostics_perf[:requeued] += 1 if perf_logging?
163
- @diagnostics_queue << uri
164
- if perf_logging?
165
- @diagnostics_perf[:queue_peak] = [@diagnostics_perf[:queue_peak], @diagnostics_queue.length].max
159
+ if requeue
160
+ @diagnostics_perf[:requeued] += 1 if perf_logging?
161
+ @diagnostics_queue << uri
162
+ if perf_logging?
163
+ @diagnostics_perf[:queue_peak] = [@diagnostics_perf[:queue_peak], @diagnostics_queue.length].max
164
+ end
166
165
  end
167
166
  end
168
- end
169
-
170
- def collect_diagnostics_for_content(uri, _content, lint_tier: :full)
171
- @workspace.collect_diagnostics(uri, lint_tier: lint_tier)
172
- rescue StandardError => e
173
- warn "LSP diagnostics error #{uri}: #{e.message}"
174
- warn " #{e.backtrace.first(6).join("\n ")}" if e.backtrace
175
- []
176
- end
177
167
 
178
- def lint_tier_rank(lint_tier)
179
- case Linter.normalize_lint_tier(lint_tier)
180
- when :full
181
- 2
182
- when :fast
183
- 1
184
- else
185
- 0
168
+ def collect_diagnostics_for_content(uri, _content, lint_tier: :full)
169
+ @workspace.collect_diagnostics(uri, lint_tier: lint_tier)
170
+ rescue StandardError => e
171
+ warn "LSP diagnostics error #{uri}: #{e.message}"
172
+ warn " #{e.backtrace.first(6).join("\n ")}" if e.backtrace
173
+ []
186
174
  end
187
- end
188
-
189
- def more_strict_lint_tier(a, b)
190
- lint_tier_rank(a) >= lint_tier_rank(b) ? Linter.normalize_lint_tier(a) : Linter.normalize_lint_tier(b)
191
- end
192
175
 
193
- def dependency_import_fingerprint(content)
194
- content.to_s.each_line.filter_map do |line|
195
- stripped = line.strip
196
- next if stripped.empty? || stripped.start_with?('#')
197
- next unless stripped.start_with?('import ')
176
+ def lint_tier_rank(lint_tier)
177
+ case Linter.normalize_lint_tier(lint_tier)
178
+ when :full
179
+ 2
180
+ when :fast
181
+ 1
182
+ else
183
+ 0
184
+ end
185
+ end
198
186
 
199
- stripped
200
- end.join("\n")
201
- end
187
+ def more_strict_lint_tier(a, b)
188
+ lint_tier_rank(a) >= lint_tier_rank(b) ? Linter.normalize_lint_tier(a) : Linter.normalize_lint_tier(b)
189
+ end
202
190
 
203
- def dependency_export_surface_fingerprint(content)
204
- content.to_s.each_line.filter_map do |line|
205
- stripped = line.strip
206
- next if stripped.empty? || stripped.start_with?('#')
191
+ def dependency_import_fingerprint(content)
192
+ content.to_s.each_line.filter_map do |line|
193
+ stripped = line.strip
194
+ next if stripped.empty? || stripped.start_with?('#')
195
+ next unless stripped.start_with?('import ')
207
196
 
208
- if stripped.match?(/\A(?:public\s+)?(?:type|struct|union|enum|flags|variant|interface|event|function|const|var)\b/)
209
197
  stripped
210
- elsif stripped.match?(/\Aextending\b/)
211
- stripped
212
- elsif stripped.match?(/\Apublic\s+(?:function|const|var|type)\b/)
213
- stripped
214
- end
215
- end.join("\n")
216
- end
198
+ end.join("\n")
199
+ end
217
200
 
218
- def dependency_refresh_required_for_edit?(changed_uri, previous_content, current_content)
219
- return false if previous_content == current_content
220
- return true if dependency_import_fingerprint(previous_content) != dependency_import_fingerprint(current_content)
201
+ def dependency_export_surface_fingerprint(content)
202
+ content.to_s.each_line.filter_map do |line|
203
+ stripped = line.strip
204
+ next if stripped.empty? || stripped.start_with?('#')
205
+
206
+ if stripped.match?(/\A(?:public\s+)?(?:type|struct|union|enum|flags|variant|interface|event|function|const|var)\b/)
207
+ stripped
208
+ elsif stripped.match?(/\Aextending\b/)
209
+ stripped
210
+ elsif stripped.match?(/\Apublic\s+(?:function|const|var|type)\b/)
211
+ stripped
212
+ end
213
+ end.join("\n")
214
+ end
221
215
 
222
- related_uris = @workspace.related_open_document_uris(changed_uri)
223
- return false unless related_uris.length > 1
216
+ def dependency_refresh_required_for_edit?(changed_uri, previous_content, current_content)
217
+ return false if previous_content == current_content
218
+ return true if dependency_import_fingerprint(previous_content) != dependency_import_fingerprint(current_content)
224
219
 
225
- dependency_export_surface_fingerprint(previous_content) != dependency_export_surface_fingerprint(current_content)
226
- end
220
+ related_uris = @workspace.related_open_document_uris(changed_uri)
221
+ return false unless related_uris.length > 1
227
222
 
228
- def semantic_tokens_allow_last_good_fallback?(uri)
229
- @diagnostics_mutex.synchronize do
230
- @diagnostics_pending.key?(uri) || @diagnostics_enqueued.include?(uri)
223
+ dependency_export_surface_fingerprint(previous_content) != dependency_export_surface_fingerprint(current_content)
231
224
  end
232
- end
233
225
 
234
- def notify_diagnostic_errors(uri, diagnostics)
235
- errors = diagnostics.select { |d| d.is_a?(Hash) && (d["severity"] || d[:severity]) == 1 }
236
- return if errors.empty?
226
+ def semantic_tokens_allow_last_good_fallback?(uri)
227
+ @diagnostics_mutex.synchronize do
228
+ @diagnostics_pending.key?(uri) || @diagnostics_enqueued.include?(uri)
229
+ end
230
+ end
237
231
 
238
- @notified_error_uris ||= Set.new
239
- return if @notified_error_uris.include?(uri)
232
+ def notify_diagnostic_errors(uri, diagnostics)
233
+ errors = diagnostics.select { |d| d.is_a?(Hash) && (d["severity"] || d[:severity]) == 1 }
234
+ return if errors.empty?
240
235
 
241
- @notified_error_uris.add(uri)
242
- path = uri_to_path(uri) || uri
243
- short_path = path.split("/").last(1).join
244
- show_message(:warning, "#{short_path}: #{errors.length} error#{errors.length == 1 ? '' : 's'}")
245
- end
236
+ @notified_error_uris ||= Set.new
237
+ return if @notified_error_uris.include?(uri)
238
+
239
+ @notified_error_uris.add(uri)
240
+ path = uri_to_path(uri) || uri
241
+ short_path = path.split("/").last(1).join
242
+ show_message(:warning, "#{short_path}: #{errors.length} error#{errors.length == 1 ? '' : 's'}")
243
+ end
246
244
  end
247
245
  end
248
246
  end
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module LSP
5
5
  class Server
6
6
  module ServerExecuteCommand
7
- private
8
-
9
7
  def handle_execute_command(params)
10
8
  command = params["command"]
11
9
  case command
@@ -4,8 +4,6 @@ module MilkTea
4
4
  module LSP
5
5
  class Server
6
6
  module ServerFoldingRange
7
- private
8
-
9
7
  BLOCK_START_PATTERN = /\A(public\s+)?(async\s+)?(editable\s+)?(function|struct|enum|flags|variant|union|interface|if|while|for|match|unsafe|extending|defer)\b/
10
8
 
11
9
  CONTINUATION_KEYWORDS = %w[else elif when].freeze
@@ -27,8 +25,6 @@ module MilkTea
27
25
  folds
28
26
  end
29
27
 
30
- private
31
-
32
28
  def compute_block_folds(lines, folds)
33
29
  stack = [] # [[start_line, indent], ...]
34
30
  last_indent = 0