mt-lang 0.2.0

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 (258) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/AUTHORS +3 -0
  4. data/Gemfile +19 -0
  5. data/Gemfile.lock +82 -0
  6. data/LICENSE +21 -0
  7. data/README.md +1208 -0
  8. data/Rakefile +332 -0
  9. data/bin/mtc +8 -0
  10. data/bin/profile-mtc-checks +133 -0
  11. data/bin/tracy-profiler +0 -0
  12. data/docs/build-guide.md +536 -0
  13. data/docs/index.html +2778 -0
  14. data/docs/language-design.md +1519 -0
  15. data/docs/language-manual.md +1534 -0
  16. data/lib/milk_tea/base.rb +49 -0
  17. data/lib/milk_tea/bindings/bindgen/ast_parser.rb +398 -0
  18. data/lib/milk_tea/bindings/bindgen/declaration.rb +319 -0
  19. data/lib/milk_tea/bindings/bindgen/emitter.rb +387 -0
  20. data/lib/milk_tea/bindings/bindgen/overrides.rb +134 -0
  21. data/lib/milk_tea/bindings/bindgen/type_mapper.rb +622 -0
  22. data/lib/milk_tea/bindings/bindgen.rb +207 -0
  23. data/lib/milk_tea/bindings/cli.rb +121 -0
  24. data/lib/milk_tea/bindings/imported_bindings/defaults.rb +210 -0
  25. data/lib/milk_tea/bindings/imported_bindings/generator.rb +1114 -0
  26. data/lib/milk_tea/bindings/imported_bindings/method_source.rb +190 -0
  27. data/lib/milk_tea/bindings/imported_bindings/naming.rb +286 -0
  28. data/lib/milk_tea/bindings/imported_bindings.rb +215 -0
  29. data/lib/milk_tea/bindings/opengl_registry.rb +547 -0
  30. data/lib/milk_tea/bindings/raw_bindings/defaults.rb +1338 -0
  31. data/lib/milk_tea/bindings/raw_bindings.rb +269 -0
  32. data/lib/milk_tea/bindings/steamworks.rb +629 -0
  33. data/lib/milk_tea/bindings/upstream_sources.rb +352 -0
  34. data/lib/milk_tea/bindings/vendored_box2d.rb +79 -0
  35. data/lib/milk_tea/bindings/vendored_c_library.rb +322 -0
  36. data/lib/milk_tea/bindings/vendored_cjson.rb +52 -0
  37. data/lib/milk_tea/bindings/vendored_flecs.rb +78 -0
  38. data/lib/milk_tea/bindings/vendored_glfw.rb +77 -0
  39. data/lib/milk_tea/bindings/vendored_libuv.rb +75 -0
  40. data/lib/milk_tea/bindings/vendored_pcre2.rb +84 -0
  41. data/lib/milk_tea/bindings/vendored_raylib.rb +131 -0
  42. data/lib/milk_tea/bindings/vendored_sdl3.rb +78 -0
  43. data/lib/milk_tea/bindings/vendored_steamworks.rb +71 -0
  44. data/lib/milk_tea/bindings/vendored_tool.rb +71 -0
  45. data/lib/milk_tea/bindings/vendored_tools.rb +23 -0
  46. data/lib/milk_tea/bindings/vendored_tracy.rb +37 -0
  47. data/lib/milk_tea/bindings.rb +23 -0
  48. data/lib/milk_tea/core/ast.rb +311 -0
  49. data/lib/milk_tea/core/async_runtime_installer.rb +28 -0
  50. data/lib/milk_tea/core/binding_types.rb +18 -0
  51. data/lib/milk_tea/core/bindings/attribute_binding.rb +58 -0
  52. data/lib/milk_tea/core/bindings/function_binding.rb +5 -0
  53. data/lib/milk_tea/core/bindings/module_binding.rb +58 -0
  54. data/lib/milk_tea/core/bindings/value_binding.rb +21 -0
  55. data/lib/milk_tea/core/c_backend/aggregate_utils.rb +103 -0
  56. data/lib/milk_tea/core/c_backend/control_flow_emission.rb +412 -0
  57. data/lib/milk_tea/core/c_backend/expressions.rb +468 -0
  58. data/lib/milk_tea/core/c_backend/feature_detection.rb +483 -0
  59. data/lib/milk_tea/core/c_backend/reachability.rb +398 -0
  60. data/lib/milk_tea/core/c_backend/reinterpret.rb +226 -0
  61. data/lib/milk_tea/core/c_backend/runtime_helpers.rb +1080 -0
  62. data/lib/milk_tea/core/c_backend/statements.rb +563 -0
  63. data/lib/milk_tea/core/c_backend/type_collectors.rb +1545 -0
  64. data/lib/milk_tea/core/c_backend/type_declaration.rb +223 -0
  65. data/lib/milk_tea/core/c_backend/type_system.rb +345 -0
  66. data/lib/milk_tea/core/c_backend.rb +287 -0
  67. data/lib/milk_tea/core/compatibility_helpers.rb +79 -0
  68. data/lib/milk_tea/core/compile_time/const_eval.rb +187 -0
  69. data/lib/milk_tea/core/compile_time.rb +329 -0
  70. data/lib/milk_tea/core/control_flow/builder.rb +582 -0
  71. data/lib/milk_tea/core/control_flow/constant_propagation.rb +143 -0
  72. data/lib/milk_tea/core/control_flow/dataflow.rb +74 -0
  73. data/lib/milk_tea/core/control_flow/definite_assignment.rb +79 -0
  74. data/lib/milk_tea/core/control_flow/graph.rb +90 -0
  75. data/lib/milk_tea/core/control_flow/liveness.rb +24 -0
  76. data/lib/milk_tea/core/control_flow/nullability_flow.rb +43 -0
  77. data/lib/milk_tea/core/control_flow/reachability.rb +22 -0
  78. data/lib/milk_tea/core/control_flow/termination.rb +31 -0
  79. data/lib/milk_tea/core/control_flow.rb +34 -0
  80. data/lib/milk_tea/core/cst.rb +48 -0
  81. data/lib/milk_tea/core/cst_builder.rb +19 -0
  82. data/lib/milk_tea/core/ir.rb +85 -0
  83. data/lib/milk_tea/core/keywords.rb +97 -0
  84. data/lib/milk_tea/core/lexer/character_classes.rb +60 -0
  85. data/lib/milk_tea/core/lexer/format_strings.rb +225 -0
  86. data/lib/milk_tea/core/lexer/heredocs.rb +199 -0
  87. data/lib/milk_tea/core/lexer/indentation.rb +62 -0
  88. data/lib/milk_tea/core/lexer/numbers.rb +96 -0
  89. data/lib/milk_tea/core/lexer/recovery.rb +32 -0
  90. data/lib/milk_tea/core/lexer/strings.rb +167 -0
  91. data/lib/milk_tea/core/lexer/symbols.rb +71 -0
  92. data/lib/milk_tea/core/lexer/trivia.rb +53 -0
  93. data/lib/milk_tea/core/lexer.rb +430 -0
  94. data/lib/milk_tea/core/lowering/artifacts.rb +26 -0
  95. data/lib/milk_tea/core/lowering/async/analysis.rb +245 -0
  96. data/lib/milk_tea/core/lowering/async/lowering.rb +1399 -0
  97. data/lib/milk_tea/core/lowering/async/normalization.rb +459 -0
  98. data/lib/milk_tea/core/lowering/async.rb +714 -0
  99. data/lib/milk_tea/core/lowering/block.rb +1052 -0
  100. data/lib/milk_tea/core/lowering/calls.rb +1565 -0
  101. data/lib/milk_tea/core/lowering/declarations.rb +214 -0
  102. data/lib/milk_tea/core/lowering/dyn.rb +206 -0
  103. data/lib/milk_tea/core/lowering/events.rb +1054 -0
  104. data/lib/milk_tea/core/lowering/expressions.rb +1645 -0
  105. data/lib/milk_tea/core/lowering/foreign_cstr.rb +206 -0
  106. data/lib/milk_tea/core/lowering/functions.rb +242 -0
  107. data/lib/milk_tea/core/lowering/loops.rb +1087 -0
  108. data/lib/milk_tea/core/lowering/lowering_context.rb +80 -0
  109. data/lib/milk_tea/core/lowering/proc.rb +419 -0
  110. data/lib/milk_tea/core/lowering/resolve.rb +2516 -0
  111. data/lib/milk_tea/core/lowering/scans.rb +220 -0
  112. data/lib/milk_tea/core/lowering/str_buffer.rb +125 -0
  113. data/lib/milk_tea/core/lowering/utils.rb +1453 -0
  114. data/lib/milk_tea/core/lowering.rb +378 -0
  115. data/lib/milk_tea/core/module_binder.rb +181 -0
  116. data/lib/milk_tea/core/module_loader/errors.rb +21 -0
  117. data/lib/milk_tea/core/module_loader.rb +479 -0
  118. data/lib/milk_tea/core/module_path_resolver.rb +153 -0
  119. data/lib/milk_tea/core/module_roots.rb +88 -0
  120. data/lib/milk_tea/core/parser/attributes.rb +71 -0
  121. data/lib/milk_tea/core/parser/blocks.rb +119 -0
  122. data/lib/milk_tea/core/parser/declarations.rb +749 -0
  123. data/lib/milk_tea/core/parser/expressions.rb +624 -0
  124. data/lib/milk_tea/core/parser/recovery.rb +131 -0
  125. data/lib/milk_tea/core/parser/statements.rb +756 -0
  126. data/lib/milk_tea/core/parser/types.rb +271 -0
  127. data/lib/milk_tea/core/parser.rb +400 -0
  128. data/lib/milk_tea/core/prelude_installer.rb +29 -0
  129. data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +917 -0
  130. data/lib/milk_tea/core/pretty_printer/base_formatter.rb +87 -0
  131. data/lib/milk_tea/core/pretty_printer/ir_formatter.rb +300 -0
  132. data/lib/milk_tea/core/pretty_printer.rb +17 -0
  133. data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +314 -0
  134. data/lib/milk_tea/core/semantic_analyzer/attributes.rb +184 -0
  135. data/lib/milk_tea/core/semantic_analyzer/calls.rb +992 -0
  136. data/lib/milk_tea/core/semantic_analyzer/expressions.rb +1735 -0
  137. data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +355 -0
  138. data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +155 -0
  139. data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +354 -0
  140. data/lib/milk_tea/core/semantic_analyzer/generics.rb +383 -0
  141. data/lib/milk_tea/core/semantic_analyzer/interface_conformance.rb +78 -0
  142. data/lib/milk_tea/core/semantic_analyzer/module_context.rb +35 -0
  143. data/lib/milk_tea/core/semantic_analyzer/name_resolution.rb +1438 -0
  144. data/lib/milk_tea/core/semantic_analyzer/nullability.rb +421 -0
  145. data/lib/milk_tea/core/semantic_analyzer/statements.rb +1308 -0
  146. data/lib/milk_tea/core/semantic_analyzer/top_level.rb +588 -0
  147. data/lib/milk_tea/core/semantic_analyzer/type_compatibility.rb +307 -0
  148. data/lib/milk_tea/core/semantic_analyzer/type_declaration.rb +851 -0
  149. data/lib/milk_tea/core/semantic_analyzer.rb +327 -0
  150. data/lib/milk_tea/core/token.rb +26 -0
  151. data/lib/milk_tea/core/token_stream.rb +30 -0
  152. data/lib/milk_tea/core/types/layout.rb +243 -0
  153. data/lib/milk_tea/core/types/predicates.rb +609 -0
  154. data/lib/milk_tea/core/types/registry.rb +83 -0
  155. data/lib/milk_tea/core/types/types.rb +1696 -0
  156. data/lib/milk_tea/core/types/visitor.rb +442 -0
  157. data/lib/milk_tea/core.rb +25 -0
  158. data/lib/milk_tea/dap/backends/lldb_dap.rb +158 -0
  159. data/lib/milk_tea/dap/protocol.rb +58 -0
  160. data/lib/milk_tea/dap/server/breakpoints.rb +66 -0
  161. data/lib/milk_tea/dap/server/debug_map.rb +291 -0
  162. data/lib/milk_tea/dap/server/handlers.rb +374 -0
  163. data/lib/milk_tea/dap/server/launch.rb +261 -0
  164. data/lib/milk_tea/dap/server/lldb_backend.rb +380 -0
  165. data/lib/milk_tea/dap/server/pause_diagnostics.rb +109 -0
  166. data/lib/milk_tea/dap/server/utilities.rb +160 -0
  167. data/lib/milk_tea/dap/server/wire.rb +55 -0
  168. data/lib/milk_tea/dap/server.rb +131 -0
  169. data/lib/milk_tea/dap/session.rb +152 -0
  170. data/lib/milk_tea/dap.rb +6 -0
  171. data/lib/milk_tea/lsp/dependency_resolution.rb +52 -0
  172. data/lib/milk_tea/lsp/diagnostics.rb +611 -0
  173. data/lib/milk_tea/lsp/protocol.rb +104 -0
  174. data/lib/milk_tea/lsp/server/call_hierarchy.rb +274 -0
  175. data/lib/milk_tea/lsp/server/code_actions.rb +446 -0
  176. data/lib/milk_tea/lsp/server/code_lens.rb +97 -0
  177. data/lib/milk_tea/lsp/server/completion.rb +1099 -0
  178. data/lib/milk_tea/lsp/server/configuration.rb +167 -0
  179. data/lib/milk_tea/lsp/server/debug_info.rb +45 -0
  180. data/lib/milk_tea/lsp/server/definition.rb +779 -0
  181. data/lib/milk_tea/lsp/server/diagnostics_scheduling.rb +239 -0
  182. data/lib/milk_tea/lsp/server/execute_command.rb +25 -0
  183. data/lib/milk_tea/lsp/server/folding_range.rb +153 -0
  184. data/lib/milk_tea/lsp/server/formatting.rb +575 -0
  185. data/lib/milk_tea/lsp/server/hover.rb +1465 -0
  186. data/lib/milk_tea/lsp/server/inlay_hints.rb +204 -0
  187. data/lib/milk_tea/lsp/server/lifecycle.rb +234 -0
  188. data/lib/milk_tea/lsp/server/linked_editing_range.rb +43 -0
  189. data/lib/milk_tea/lsp/server/on_type_formatting.rb +73 -0
  190. data/lib/milk_tea/lsp/server/progress.rb +47 -0
  191. data/lib/milk_tea/lsp/server/references.rb +433 -0
  192. data/lib/milk_tea/lsp/server/rename.rb +598 -0
  193. data/lib/milk_tea/lsp/server/selection_range.rb +130 -0
  194. data/lib/milk_tea/lsp/server/semantic_tokens.rb +1745 -0
  195. data/lib/milk_tea/lsp/server/signature_help.rb +200 -0
  196. data/lib/milk_tea/lsp/server/text_documents.rb +125 -0
  197. data/lib/milk_tea/lsp/server/type_hierarchy.rb +167 -0
  198. data/lib/milk_tea/lsp/server/utilities.rb +520 -0
  199. data/lib/milk_tea/lsp/server.rb +415 -0
  200. data/lib/milk_tea/lsp/workspace/analysis.rb +209 -0
  201. data/lib/milk_tea/lsp/workspace/caches.rb +260 -0
  202. data/lib/milk_tea/lsp/workspace/collection.rb +98 -0
  203. data/lib/milk_tea/lsp/workspace/definition_index.rb +184 -0
  204. data/lib/milk_tea/lsp/workspace/dependency_graph.rb +282 -0
  205. data/lib/milk_tea/lsp/workspace/store.rb +154 -0
  206. data/lib/milk_tea/lsp/workspace/utilities.rb +490 -0
  207. data/lib/milk_tea/lsp/workspace.rb +127 -0
  208. data/lib/milk_tea/lsp.rb +13 -0
  209. data/lib/milk_tea/packages/atomic_write.rb +63 -0
  210. data/lib/milk_tea/packages/dependency_solver.rb +194 -0
  211. data/lib/milk_tea/packages/graph.rb +139 -0
  212. data/lib/milk_tea/packages/lock.rb +421 -0
  213. data/lib/milk_tea/packages/manager_cli.rb +485 -0
  214. data/lib/milk_tea/packages/manifest.rb +356 -0
  215. data/lib/milk_tea/packages/manifest_editor.rb +134 -0
  216. data/lib/milk_tea/packages/registry_metadata_provider.rb +34 -0
  217. data/lib/milk_tea/packages/registry_store.rb +420 -0
  218. data/lib/milk_tea/packages/services.rb +41 -0
  219. data/lib/milk_tea/packages/source_cache.rb +71 -0
  220. data/lib/milk_tea/packages/source_fetcher.rb +124 -0
  221. data/lib/milk_tea/packages/source_resolver.rb +389 -0
  222. data/lib/milk_tea/packages/version.rb +164 -0
  223. data/lib/milk_tea/packages.rb +16 -0
  224. data/lib/milk_tea/tooling/asset_pack.rb +141 -0
  225. data/lib/milk_tea/tooling/build.rb +1124 -0
  226. data/lib/milk_tea/tooling/build_cache.rb +240 -0
  227. data/lib/milk_tea/tooling/cli.rb +2688 -0
  228. data/lib/milk_tea/tooling/cst_formatter.rb +13 -0
  229. data/lib/milk_tea/tooling/debug_info_formatter.rb +456 -0
  230. data/lib/milk_tea/tooling/debug_map.rb +248 -0
  231. data/lib/milk_tea/tooling/docs_app.rb +369 -0
  232. data/lib/milk_tea/tooling/error_formatter.rb +86 -0
  233. data/lib/milk_tea/tooling/formatter.rb +787 -0
  234. data/lib/milk_tea/tooling/linter/doc_tags.rb +212 -0
  235. data/lib/milk_tea/tooling/linter/fix_engine.rb +237 -0
  236. data/lib/milk_tea/tooling/linter/flow_rules.rb +380 -0
  237. data/lib/milk_tea/tooling/linter/imports_platform.rb +841 -0
  238. data/lib/milk_tea/tooling/linter/release_rules.rb +744 -0
  239. data/lib/milk_tea/tooling/linter/reserved_names.rb +199 -0
  240. data/lib/milk_tea/tooling/linter/rules.rb +593 -0
  241. data/lib/milk_tea/tooling/linter/source_helpers.rb +407 -0
  242. data/lib/milk_tea/tooling/linter/trailing_comma.rb +139 -0
  243. data/lib/milk_tea/tooling/linter/visitors.rb +1286 -0
  244. data/lib/milk_tea/tooling/linter.rb +798 -0
  245. data/lib/milk_tea/tooling/project_scaffold.rb +82 -0
  246. data/lib/milk_tea/tooling/public/css/docs.css +166 -0
  247. data/lib/milk_tea/tooling/public/js/docs.js +94 -0
  248. data/lib/milk_tea/tooling/run.rb +408 -0
  249. data/lib/milk_tea/tooling/templates/wasm_shell.html +48 -0
  250. data/lib/milk_tea/tooling/toolchain_cli.rb +157 -0
  251. data/lib/milk_tea/tooling/views/404.erb +7 -0
  252. data/lib/milk_tea/tooling/views/index.erb +87 -0
  253. data/lib/milk_tea/tooling/views/layout.erb +69 -0
  254. data/lib/milk_tea/tooling/views/module.erb +97 -0
  255. data/lib/milk_tea/tooling/views/stdlib.erb +21 -0
  256. data/lib/milk_tea/tooling.rb +20 -0
  257. data/lib/milk_tea.rb +8 -0
  258. metadata +426 -0
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MilkTea
4
+ module DAP
5
+ class Server
6
+ module ServerWire
7
+ private
8
+
9
+ def write_response(request, body)
10
+ write_message({
11
+ seq: @session.next_seq,
12
+ type: "response",
13
+ request_seq: request["seq"],
14
+ success: true,
15
+ command: request["command"],
16
+ body: body
17
+ })
18
+ end
19
+
20
+ def write_error_response(request, message)
21
+ write_message({
22
+ seq: @session.next_seq,
23
+ type: "response",
24
+ request_seq: request && request["seq"],
25
+ success: false,
26
+ command: request && request["command"],
27
+ message: message,
28
+ body: {
29
+ error: {
30
+ id: 1,
31
+ format: message
32
+ }
33
+ }
34
+ })
35
+ end
36
+
37
+ def write_event(event, body = nil)
38
+ message = {
39
+ seq: @session.next_seq,
40
+ type: "event",
41
+ event: event
42
+ }
43
+ message[:body] = body if body
44
+ write_message(message)
45
+ end
46
+
47
+ def write_message(message)
48
+ @write_mutex.synchronize do
49
+ @protocol.write_message(message)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "open3"
5
+ require "rbconfig"
6
+ require "tmpdir"
7
+
8
+ require_relative "../tooling/debug_map"
9
+
10
+ require_relative "server/handlers"
11
+ require_relative "server/launch"
12
+ require_relative "server/lldb_backend"
13
+ require_relative "server/debug_map"
14
+ require_relative "server/breakpoints"
15
+ require_relative "server/pause_diagnostics"
16
+ require_relative "server/wire"
17
+ require_relative "server/utilities"
18
+
19
+ module MilkTea
20
+ module DAP
21
+ # Minimal DAP server with strict request/response/event envelopes.
22
+ class Server
23
+ ADAPTER_CAPABILITIES = {
24
+ supportsConfigurationDoneRequest: true,
25
+ supportsFunctionBreakpoints: true,
26
+ supportsConditionalBreakpoints: false,
27
+ supportsHitConditionalBreakpoints: false,
28
+ supportsPauseRequest: true,
29
+ supportsEvaluateForHovers: false,
30
+ supportsSetVariable: false,
31
+ supportsTerminateRequest: true,
32
+ supportTerminateDebuggee: true,
33
+ supportsLoadedSourcesRequest: true,
34
+ exceptionBreakpointFilters: [],
35
+ }.freeze
36
+
37
+ def initialize(protocol: Protocol.new, session: Session.new, backend_factory: nil, preferred_backend_kind: "process", adapter_command: nil)
38
+ @protocol = protocol
39
+ @session = session
40
+ @backend_factory = backend_factory
41
+ @preferred_backend_kind = preferred_backend_kind.to_s.empty? ? "process" : preferred_backend_kind.to_s
42
+ @default_adapter_command = adapter_command&.dup
43
+ @handlers = {}
44
+ @write_mutex = Mutex.new
45
+ @client_request_mutex = Mutex.new
46
+ @pending_client_responses = {}
47
+ @incoming_messages = Queue.new
48
+ @reader_thread = nil
49
+ @background_threads = []
50
+ @background_threads_mutex = Mutex.new
51
+ @runtime_mutex = Mutex.new
52
+ @runtime_pid = nil
53
+ @runtime_paused = false
54
+ @tmp_dirs = []
55
+ @lldb_backend = nil
56
+ @backend_initialized = false
57
+ @backend_capabilities = {}
58
+ @breakpoints_synced_to_backend = false
59
+ @function_breakpoints_synced_to_backend = false
60
+ @exception_breakpoints_synced_to_backend = false
61
+ @backend_start_thread = nil
62
+ @backend_auto_continue_after_configuration = false
63
+ @backend_stopped_thread_id = nil
64
+ @backend_pause_requested = false
65
+ @last_forwarded_continued_signature = nil
66
+ @backend_configuration_mutex = Mutex.new
67
+ @backend_configuration_condition = ConditionVariable.new
68
+ @backend_configuration_ready = false
69
+ @debug_map = nil
70
+ @frame_debug_functions = {}
71
+ @variables_reference_debug_functions = {}
72
+ @reverse_request_timeout = Float(ENV.fetch("MILK_TEA_DAP_REVERSE_REQUEST_TIMEOUT", "15"))
73
+ register_handlers
74
+ end
75
+
76
+ def run
77
+ start_client_reader
78
+
79
+ loop do
80
+ message = @incoming_messages.pop
81
+ break if message.nil?
82
+ next if message.equal?(Protocol::INVALID_MESSAGE)
83
+
84
+ process_message(message)
85
+ break if @session.should_exit?
86
+ end
87
+ ensure
88
+ @backend_start_thread&.join(0.2)
89
+ join_background_threads
90
+ @reader_thread&.join(0.2)
91
+ end
92
+
93
+ private
94
+
95
+ def start_client_reader
96
+ return if @reader_thread&.alive?
97
+
98
+ @reader_thread = Thread.new do
99
+ loop do
100
+ message = @protocol.read_message
101
+ break if message.nil?
102
+ next if message.equal?(Protocol::INVALID_MESSAGE)
103
+
104
+ if message["type"] == "response"
105
+ queue = @client_request_mutex.synchronize do
106
+ @pending_client_responses[message["request_seq"]]
107
+ end
108
+ if queue
109
+ queue.push(message)
110
+ next
111
+ end
112
+ end
113
+
114
+ @incoming_messages.push(message)
115
+ end
116
+ ensure
117
+ @incoming_messages.push(nil)
118
+ end
119
+ end
120
+
121
+ include ServerHandlers
122
+ include ServerLaunch
123
+ include ServerLLDBBackend
124
+ include ServerDebugMap
125
+ include ServerBreakpoints
126
+ include ServerPauseDiagnostics
127
+ include ServerWire
128
+ include ServerUtilities
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MilkTea
4
+ module DAP
5
+ # Holds mutable state for one DAP session.
6
+ class Session
7
+ attr_reader :program_path, :runnable_path, :program_args, :thread_id, :backend_kind,
8
+ :function_breakpoints, :exception_breakpoints
9
+
10
+ def initialize
11
+ @next_outgoing_seq = 1
12
+ @next_breakpoint_id = 1
13
+ @thread_id = 1
14
+ @initialized = false
15
+ @configuration_done = false
16
+ @launched = false
17
+ @terminated = false
18
+ @should_exit = false
19
+ @entry_stop_emitted = false
20
+ @program_path = nil
21
+ @runnable_path = nil
22
+ @program_args = []
23
+ @backend_kind = "process"
24
+ @stop_on_entry = true
25
+ @runtime_started = false
26
+ @breakpoints_by_source = {}
27
+ @function_breakpoints = []
28
+ @exception_breakpoints = nil
29
+ end
30
+
31
+ def next_seq
32
+ seq = @next_outgoing_seq
33
+ @next_outgoing_seq += 1
34
+ seq
35
+ end
36
+
37
+ def initialize!
38
+ @initialized = true
39
+ end
40
+
41
+ def initialized?
42
+ @initialized
43
+ end
44
+
45
+ def configuration_done!
46
+ @configuration_done = true
47
+ end
48
+
49
+ def configuration_done?
50
+ @configuration_done
51
+ end
52
+
53
+ def request_start!(program_path:, runnable_path:, program_args: [], stop_on_entry: true, backend_kind: "process")
54
+ @program_path = program_path
55
+ @runnable_path = runnable_path
56
+ @program_args = Array(program_args).map(&:to_s)
57
+ @backend_kind = backend_kind
58
+ @stop_on_entry = stop_on_entry
59
+ end
60
+
61
+ def launch!
62
+ @launched = true
63
+ end
64
+
65
+ def launched?
66
+ @launched
67
+ end
68
+
69
+ def stop_on_entry?
70
+ @stop_on_entry
71
+ end
72
+
73
+ def entry_stop_emitted?
74
+ @entry_stop_emitted
75
+ end
76
+
77
+ def mark_entry_stop_emitted!
78
+ @entry_stop_emitted = true
79
+ end
80
+
81
+ def mark_runtime_started!
82
+ @runtime_started = true
83
+ end
84
+
85
+ def runtime_started?
86
+ @runtime_started
87
+ end
88
+
89
+ def terminate!
90
+ @terminated = true
91
+ end
92
+
93
+ def terminated?
94
+ @terminated
95
+ end
96
+
97
+ def request_exit!
98
+ @should_exit = true
99
+ end
100
+
101
+ def should_exit?
102
+ @should_exit
103
+ end
104
+
105
+ def set_breakpoints(source_path, breakpoints)
106
+ normalized = breakpoints.map do |bp|
107
+ raw = normalize_dap_hash(bp)
108
+ raw["id"] = next_breakpoint_id
109
+ raw["verified"] = true
110
+ raw["line"] = raw["line"].to_i
111
+ raw
112
+ end
113
+ @breakpoints_by_source[source_path] = normalized
114
+ normalized
115
+ end
116
+
117
+ def set_function_breakpoints(breakpoints)
118
+ @function_breakpoints = breakpoints.map do |bp|
119
+ raw = normalize_dap_hash(bp)
120
+ raw["id"] = next_breakpoint_id
121
+ raw["verified"] = true
122
+ raw["name"] = raw["name"].to_s
123
+ raw
124
+ end
125
+ end
126
+
127
+ def set_exception_breakpoints(arguments)
128
+ @exception_breakpoints = normalize_dap_hash(arguments)
129
+ end
130
+
131
+ def each_breakpoint_source
132
+ @breakpoints_by_source.each do |source_path, breakpoints|
133
+ yield(source_path, breakpoints)
134
+ end
135
+ end
136
+
137
+ private
138
+
139
+ def normalize_dap_hash(value)
140
+ value.each_with_object({}) do |(key, entry), result|
141
+ result[key.to_s] = entry
142
+ end
143
+ end
144
+
145
+ def next_breakpoint_id
146
+ id = @next_breakpoint_id
147
+ @next_breakpoint_id += 1
148
+ id
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "dap/protocol"
4
+ require_relative "dap/backends/lldb_dap"
5
+ require_relative "dap/session"
6
+ require_relative "dap/server"
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MilkTea
4
+ module LSP
5
+ class DependencyResolution
6
+ MODES = %i[auto live locked frozen].freeze
7
+
8
+ Resolved = Data.define(:mode, :locked, :error_message) do
9
+ def ok?
10
+ error_message.nil?
11
+ end
12
+ end
13
+
14
+ def self.normalize_mode(mode)
15
+ normalized = mode.to_s.strip.downcase.to_sym
16
+ MODES.include?(normalized) ? normalized : :auto
17
+ end
18
+
19
+ def self.resolve(path, mode: :auto)
20
+ normalized_mode = normalize_mode(mode)
21
+ return Resolved.new(mode: normalized_mode, locked: false, error_message: nil) unless path && File.file?(path)
22
+
23
+ case normalized_mode
24
+ when :live
25
+ Resolved.new(mode: normalized_mode, locked: false, error_message: nil)
26
+ when :auto
27
+ lock_result = PackageLock.check(path)
28
+ Resolved.new(mode: normalized_mode, locked: lock_result.current?, error_message: nil)
29
+ when :locked
30
+ Resolved.new(mode: normalized_mode, locked: true, error_message: nil)
31
+ when :frozen
32
+ lock_result = PackageLock.check(path)
33
+ if lock_result.current?
34
+ Resolved.new(mode: normalized_mode, locked: true, error_message: nil)
35
+ elsif lock_result.missing?
36
+ Resolved.new(mode: normalized_mode, locked: true, error_message: "package.lock is missing: #{lock_result.lock_path}")
37
+ else
38
+ Resolved.new(mode: normalized_mode, locked: true, error_message: "package.lock is out of date: #{lock_result.lock_path}")
39
+ end
40
+ end
41
+ rescue PackageManifestError
42
+ Resolved.new(mode: normalized_mode, locked: false, error_message: nil)
43
+ rescue PackageLockError => e
44
+ if normalized_mode == :auto
45
+ Resolved.new(mode: normalized_mode, locked: false, error_message: nil)
46
+ else
47
+ Resolved.new(mode: normalized_mode, locked: true, error_message: e.message)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end