@hydranium/core 1.0.0-next.16 → 1.0.0-next.168

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 (505) hide show
  1. package/README.md +5 -1
  2. package/lib/documents/ast-document-manager.d.ts +190 -29
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +235 -38
  5. package/lib/documents/ast-document-manager.js.map +1 -1
  6. package/lib/documents/client-ids.d.ts +5 -19
  7. package/lib/documents/client-ids.d.ts.map +1 -1
  8. package/lib/documents/client-ids.js +5 -19
  9. package/lib/documents/client-ids.js.map +1 -1
  10. package/lib/documents/client-session-errors.d.ts +15 -0
  11. package/lib/documents/client-session-errors.d.ts.map +1 -0
  12. package/lib/documents/client-session-errors.js +15 -0
  13. package/lib/documents/client-session-errors.js.map +1 -0
  14. package/lib/documents/client-session-registry.d.ts +138 -0
  15. package/lib/documents/client-session-registry.d.ts.map +1 -0
  16. package/lib/documents/client-session-registry.js +187 -0
  17. package/lib/documents/client-session-registry.js.map +1 -0
  18. package/lib/documents/file-system-task-queue.d.ts +49 -0
  19. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  20. package/lib/documents/file-system-task-queue.js +34 -0
  21. package/lib/documents/file-system-task-queue.js.map +1 -0
  22. package/lib/documents/hydranium-text-documents.d.ts +439 -82
  23. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  24. package/lib/documents/hydranium-text-documents.js +769 -159
  25. package/lib/documents/hydranium-text-documents.js.map +1 -1
  26. package/lib/documents/index.d.ts +3 -0
  27. package/lib/documents/index.d.ts.map +1 -1
  28. package/lib/documents/index.js +3 -0
  29. package/lib/documents/index.js.map +1 -1
  30. package/lib/documents/language-client-text-shadow.d.ts +41 -9
  31. package/lib/documents/language-client-text-shadow.d.ts.map +1 -1
  32. package/lib/documents/language-client-text-shadow.js +56 -11
  33. package/lib/documents/language-client-text-shadow.js.map +1 -1
  34. package/lib/documents/self-save-registry.d.ts +37 -6
  35. package/lib/documents/self-save-registry.d.ts.map +1 -1
  36. package/lib/documents/self-save-registry.js +28 -15
  37. package/lib/documents/self-save-registry.js.map +1 -1
  38. package/lib/index.d.ts +3 -0
  39. package/lib/index.d.ts.map +1 -1
  40. package/lib/index.js +6 -0
  41. package/lib/index.js.map +1 -1
  42. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  43. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  44. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  45. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  46. package/lib/langium/bootstrap.d.ts.map +1 -1
  47. package/lib/langium/bootstrap.js +16 -9
  48. package/lib/langium/bootstrap.js.map +1 -1
  49. package/lib/langium/config/configuration-provider.d.ts +81 -0
  50. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  51. package/lib/langium/config/configuration-provider.js +112 -0
  52. package/lib/langium/config/configuration-provider.js.map +1 -0
  53. package/lib/langium/config/index.d.ts +1 -0
  54. package/lib/langium/config/index.d.ts.map +1 -1
  55. package/lib/langium/config/index.js +1 -0
  56. package/lib/langium/config/index.js.map +1 -1
  57. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  58. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  59. package/lib/langium/diagnostics/lsp-logger.js +40 -6
  60. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  61. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  62. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  63. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  64. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  65. package/lib/langium/document-builder/build-session.d.ts +93 -0
  66. package/lib/langium/document-builder/build-session.d.ts.map +1 -0
  67. package/lib/langium/document-builder/build-session.js +72 -0
  68. package/lib/langium/document-builder/build-session.js.map +1 -0
  69. package/lib/langium/document-builder/document-builder.d.ts +365 -19
  70. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  71. package/lib/langium/document-builder/document-builder.js +637 -44
  72. package/lib/langium/document-builder/document-builder.js.map +1 -1
  73. package/lib/langium/document-builder/index.d.ts +1 -0
  74. package/lib/langium/document-builder/index.d.ts.map +1 -1
  75. package/lib/langium/document-builder/index.js +1 -0
  76. package/lib/langium/document-builder/index.js.map +1 -1
  77. package/lib/langium/integration-services.d.ts +45 -1
  78. package/lib/langium/integration-services.d.ts.map +1 -1
  79. package/lib/langium/integration-services.js +10 -5
  80. package/lib/langium/integration-services.js.map +1 -1
  81. package/lib/langium/integrity/integrity-rule.d.ts +13 -5
  82. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  83. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  84. package/lib/langium/integrity/integrity-service.d.ts +50 -6
  85. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  86. package/lib/langium/integrity/integrity-service.js +193 -17
  87. package/lib/langium/integrity/integrity-service.js.map +1 -1
  88. package/lib/langium/keys/containment.d.ts +64 -0
  89. package/lib/langium/keys/containment.d.ts.map +1 -0
  90. package/lib/langium/keys/containment.js +53 -0
  91. package/lib/langium/keys/containment.js.map +1 -0
  92. package/lib/langium/keys/index.d.ts +1 -0
  93. package/lib/langium/keys/index.d.ts.map +1 -1
  94. package/lib/langium/keys/index.js +1 -0
  95. package/lib/langium/keys/index.js.map +1 -1
  96. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  97. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  98. package/lib/langium/keys/name-based-key-provider.js +4 -0
  99. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  100. package/lib/langium/language-module.d.ts +27 -2
  101. package/lib/langium/language-module.d.ts.map +1 -1
  102. package/lib/langium/language-module.js +16 -2
  103. package/lib/langium/language-module.js.map +1 -1
  104. package/lib/langium/model-service/client-session.d.ts +307 -0
  105. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  106. package/lib/langium/model-service/client-session.js +395 -0
  107. package/lib/langium/model-service/client-session.js.map +1 -0
  108. package/lib/langium/model-service/index.d.ts +1 -0
  109. package/lib/langium/model-service/index.d.ts.map +1 -1
  110. package/lib/langium/model-service/index.js +1 -0
  111. package/lib/langium/model-service/index.js.map +1 -1
  112. package/lib/langium/model-service/model-service.d.ts +261 -198
  113. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  114. package/lib/langium/model-service/model-service.js +234 -346
  115. package/lib/langium/model-service/model-service.js.map +1 -1
  116. package/lib/langium/module.d.ts +144 -35
  117. package/lib/langium/module.d.ts.map +1 -1
  118. package/lib/langium/module.js +45 -34
  119. package/lib/langium/module.js.map +1 -1
  120. package/lib/langium/naming/name-provider.d.ts +25 -4
  121. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  122. package/lib/langium/naming/name-provider.js +2 -1
  123. package/lib/langium/naming/name-provider.js.map +1 -1
  124. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  125. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  126. package/lib/langium/naming/name-separator-validation.js +30 -1
  127. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  128. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  129. package/lib/langium/project/abstract-project-manager.js +9 -2
  130. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  131. package/lib/langium/project/project-change-event.d.ts +2 -2
  132. package/lib/langium/residency/cst-residency-service.d.ts +31 -11
  133. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  134. package/lib/langium/residency/cst-residency-service.js +13 -56
  135. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  136. package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
  137. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  138. package/lib/langium/scope/hydranium-scope-provider.js +56 -20
  139. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  140. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  141. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  142. package/lib/langium/serialization/abstract-serializer.js +12 -21
  143. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  144. package/lib/langium/service-registry.d.ts +15 -1
  145. package/lib/langium/service-registry.d.ts.map +1 -1
  146. package/lib/langium/service-registry.js +16 -0
  147. package/lib/langium/service-registry.js.map +1 -1
  148. package/lib/langium/shared-services.d.ts +15 -2
  149. package/lib/langium/shared-services.d.ts.map +1 -1
  150. package/lib/langium/shared-services.js.map +1 -1
  151. package/lib/langium/transfer/transfer-encoder.d.ts +60 -17
  152. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  153. package/lib/langium/transfer/transfer-encoder.js +38 -16
  154. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  155. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  156. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  157. package/lib/langium/trivia/comment-preserver.js +906 -0
  158. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  159. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  160. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  161. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  162. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  163. package/lib/langium/trivia/index.d.ts +14 -0
  164. package/lib/langium/trivia/index.d.ts.map +1 -0
  165. package/lib/langium/trivia/index.js +14 -0
  166. package/lib/langium/trivia/index.js.map +1 -0
  167. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  168. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  169. package/lib/langium/trivia/trivia-contribution.js +10 -0
  170. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  171. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  172. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  173. package/lib/langium/trivia/trivia-preserver.js +10 -0
  174. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  175. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  176. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  177. package/lib/langium/trivia/trivia-service.js +56 -0
  178. package/lib/langium/trivia/trivia-service.js.map +1 -0
  179. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  180. package/lib/langium/validation/document-validator.d.ts +294 -10
  181. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  182. package/lib/langium/validation/document-validator.js +448 -5
  183. package/lib/langium/validation/document-validator.js.map +1 -1
  184. package/lib/langium/workspace/document-uri-policy.d.ts +17 -12
  185. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  186. package/lib/langium/workspace/document-uri-policy.js +10 -9
  187. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  188. package/lib/langium/workspace/file-not-found.d.ts +17 -0
  189. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  190. package/lib/langium/workspace/file-not-found.js +20 -0
  191. package/lib/langium/workspace/file-not-found.js.map +1 -0
  192. package/lib/langium/workspace/file-system-provider.d.ts +84 -8
  193. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  194. package/lib/langium/workspace/file-system-provider.js +93 -14
  195. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  196. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +25 -0
  197. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  198. package/lib/langium/workspace/hydranium-langium-document-factory.js +25 -0
  199. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  200. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +13 -0
  201. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  202. package/lib/langium/workspace/hydranium-workspace-lock.js +18 -0
  203. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  204. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +77 -8
  205. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  206. package/lib/langium/workspace/hydranium-workspace-manager.js +115 -9
  207. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  208. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +25 -2
  209. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  210. package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
  211. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  212. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  213. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  214. package/lib/langium/workspace/initialize-workspace.js +13 -5
  215. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  216. package/lib/langium/workspace/langium-documents.d.ts +79 -17
  217. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  218. package/lib/langium/workspace/langium-documents.js +91 -29
  219. package/lib/langium/workspace/langium-documents.js.map +1 -1
  220. package/lib/langium/workspace/persistent-file-system-provider.d.ts +0 -7
  221. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  222. package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
  223. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  224. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  225. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  226. package/lib/langium/workspace/virtual-document.js +78 -18
  227. package/lib/langium/workspace/virtual-document.js.map +1 -1
  228. package/lib/langium/workspace/write-lock-scope.d.ts +4 -3
  229. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  230. package/lib/langium/workspace/write-lock-scope.js +4 -3
  231. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  232. package/lib/locale/index.d.ts +10 -0
  233. package/lib/locale/index.d.ts.map +1 -0
  234. package/lib/locale/index.js +10 -0
  235. package/lib/locale/index.js.map +1 -0
  236. package/lib/locale/server-locale.d.ts +73 -0
  237. package/lib/locale/server-locale.d.ts.map +1 -0
  238. package/lib/locale/server-locale.js +61 -0
  239. package/lib/locale/server-locale.js.map +1 -0
  240. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  241. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  242. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  243. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  244. package/lib/lsp/connection-features.d.ts +23 -0
  245. package/lib/lsp/connection-features.d.ts.map +1 -0
  246. package/lib/lsp/connection-features.js +60 -0
  247. package/lib/lsp/connection-features.js.map +1 -0
  248. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  249. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  250. package/lib/lsp/diagnostics-connection.js +53 -0
  251. package/lib/lsp/diagnostics-connection.js.map +1 -0
  252. package/lib/lsp/hydranium-document-update-handler.d.ts +90 -79
  253. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  254. package/lib/lsp/hydranium-document-update-handler.js +152 -99
  255. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  256. package/lib/lsp/index.d.ts +3 -1
  257. package/lib/lsp/index.d.ts.map +1 -1
  258. package/lib/lsp/index.js +3 -1
  259. package/lib/lsp/index.js.map +1 -1
  260. package/lib/lsp/lsp-latency.d.ts +39 -0
  261. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  262. package/lib/lsp/lsp-latency.js +58 -0
  263. package/lib/lsp/lsp-latency.js.map +1 -0
  264. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  265. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  266. package/lib/lsp/semantic-token-provider.js +55 -8
  267. package/lib/lsp/semantic-token-provider.js.map +1 -1
  268. package/lib/lsp/shared-module.d.ts +4 -8
  269. package/lib/lsp/shared-module.d.ts.map +1 -1
  270. package/lib/lsp/shared-module.js.map +1 -1
  271. package/lib/lsp/start-language-server.d.ts +8 -7
  272. package/lib/lsp/start-language-server.d.ts.map +1 -1
  273. package/lib/lsp/start-language-server.js +13 -7
  274. package/lib/lsp/start-language-server.js.map +1 -1
  275. package/lib/messages/carriers.d.ts +54 -0
  276. package/lib/messages/carriers.d.ts.map +1 -0
  277. package/lib/messages/carriers.js +62 -0
  278. package/lib/messages/carriers.js.map +1 -0
  279. package/lib/messages/index.d.ts +25 -0
  280. package/lib/messages/index.d.ts.map +1 -0
  281. package/lib/messages/index.js +25 -0
  282. package/lib/messages/index.js.map +1 -0
  283. package/lib/messages/renderer.d.ts +142 -0
  284. package/lib/messages/renderer.d.ts.map +1 -0
  285. package/lib/messages/renderer.js +165 -0
  286. package/lib/messages/renderer.js.map +1 -0
  287. package/lib/node/heap-ceiling.d.ts +61 -0
  288. package/lib/node/heap-ceiling.d.ts.map +1 -0
  289. package/lib/node/heap-ceiling.js +72 -0
  290. package/lib/node/heap-ceiling.js.map +1 -0
  291. package/lib/node/index.d.ts +1 -0
  292. package/lib/node/index.d.ts.map +1 -1
  293. package/lib/node/index.js +1 -0
  294. package/lib/node/index.js.map +1 -1
  295. package/lib/node/latency-from-env.d.ts +1 -1
  296. package/lib/node/latency-from-env.js +1 -1
  297. package/lib/node/measure-memory.d.ts.map +1 -1
  298. package/lib/node/measure-memory.js +1 -0
  299. package/lib/node/measure-memory.js.map +1 -1
  300. package/lib/node/node-file-system-provider.d.ts +39 -4
  301. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  302. package/lib/node/node-file-system-provider.js +109 -49
  303. package/lib/node/node-file-system-provider.js.map +1 -1
  304. package/lib/node/profile-capture.d.ts +8 -2
  305. package/lib/node/profile-capture.d.ts.map +1 -1
  306. package/lib/node/profile-capture.js.map +1 -1
  307. package/lib/node/profiling-run.d.ts +2 -2
  308. package/lib/node/profiling-run.js +1 -1
  309. package/lib/node/profiling-run.js.map +1 -1
  310. package/lib/node/rename-over-open-readers.d.ts +52 -0
  311. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  312. package/lib/node/rename-over-open-readers.js +66 -0
  313. package/lib/node/rename-over-open-readers.js.map +1 -0
  314. package/lib/node/socket-launcher.d.ts +16 -1
  315. package/lib/node/socket-launcher.d.ts.map +1 -1
  316. package/lib/node/socket-launcher.js +4 -3
  317. package/lib/node/socket-launcher.js.map +1 -1
  318. package/lib/node/stdio-launcher.d.ts +1 -1
  319. package/lib/node/stdio-launcher.d.ts.map +1 -1
  320. package/lib/node/stdio-launcher.js +1 -1
  321. package/lib/node/stdio-launcher.js.map +1 -1
  322. package/lib/testing/fake-document.d.ts +16 -4
  323. package/lib/testing/fake-document.d.ts.map +1 -1
  324. package/lib/testing/fake-document.js +18 -3
  325. package/lib/testing/fake-document.js.map +1 -1
  326. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  327. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  328. package/lib/testing/make-noop-shared-services.js +28 -2
  329. package/lib/testing/make-noop-shared-services.js.map +1 -1
  330. package/lib/testing/make-test-services.d.ts +62 -14
  331. package/lib/testing/make-test-services.d.ts.map +1 -1
  332. package/lib/testing/make-test-services.js +27 -6
  333. package/lib/testing/make-test-services.js.map +1 -1
  334. package/lib/testing/node/index.d.ts +1 -0
  335. package/lib/testing/node/index.d.ts.map +1 -1
  336. package/lib/testing/node/index.js +1 -0
  337. package/lib/testing/node/index.js.map +1 -1
  338. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  339. package/lib/testing/node/lsp-harness.js +2 -0
  340. package/lib/testing/node/lsp-harness.js.map +1 -1
  341. package/lib/testing/node/lsp-server-connection.d.ts +11 -3
  342. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  343. package/lib/testing/node/lsp-server-connection.js +42 -9
  344. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  345. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  346. package/lib/testing/node/scratch-workspace.js +10 -5
  347. package/lib/testing/node/scratch-workspace.js.map +1 -1
  348. package/lib/testing/node/spawned-server.d.ts +14 -0
  349. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  350. package/lib/testing/node/spawned-server.js +33 -1
  351. package/lib/testing/node/spawned-server.js.map +1 -1
  352. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  353. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  354. package/lib/testing/node/unhandled-rejections.js +32 -0
  355. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  356. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  357. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  358. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  359. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  360. package/lib/testing/playwright/index.d.ts +1 -0
  361. package/lib/testing/playwright/index.d.ts.map +1 -1
  362. package/lib/testing/playwright/index.js +1 -0
  363. package/lib/testing/playwright/index.js.map +1 -1
  364. package/lib/testing/playwright/server-log-capture.d.ts +14 -4
  365. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  366. package/lib/testing/playwright/server-log-capture.js +21 -4
  367. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  368. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  369. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  370. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  371. package/lib/testing/run-update-pipeline.d.ts +4 -4
  372. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  373. package/lib/testing/stub-ast-document-manager.d.ts +10 -9
  374. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  375. package/lib/testing/stub-ast-document-manager.js +17 -9
  376. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  377. package/lib/testing/stub-document-builder.d.ts +26 -11
  378. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  379. package/lib/testing/stub-document-builder.js +57 -4
  380. package/lib/testing/stub-document-builder.js.map +1 -1
  381. package/lib/testing/stub-hydranium-text-documents.d.ts +22 -7
  382. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  383. package/lib/testing/stub-hydranium-text-documents.js +92 -15
  384. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  385. package/lib/testing/stub-langium-documents.d.ts +3 -2
  386. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  387. package/lib/testing/stub-langium-documents.js.map +1 -1
  388. package/lib/testing/stub-model-service.d.ts +7 -6
  389. package/lib/testing/stub-model-service.d.ts.map +1 -1
  390. package/lib/testing/stub-model-service.js +4 -4
  391. package/lib/testing/stub-model-service.js.map +1 -1
  392. package/lib/util/connection-liveness.d.ts +7 -6
  393. package/lib/util/connection-liveness.d.ts.map +1 -1
  394. package/lib/util/connection-liveness.js +35 -14
  395. package/lib/util/connection-liveness.js.map +1 -1
  396. package/package.json +17 -8
  397. package/src/documents/ast-document-manager.ts +348 -64
  398. package/src/documents/client-ids.ts +5 -22
  399. package/src/documents/client-session-errors.ts +24 -0
  400. package/src/documents/client-session-registry.ts +240 -0
  401. package/src/documents/file-system-task-queue.ts +68 -0
  402. package/src/documents/hydranium-text-documents.ts +959 -201
  403. package/src/documents/index.ts +3 -0
  404. package/src/documents/language-client-text-shadow.ts +59 -11
  405. package/src/documents/self-save-registry.ts +52 -13
  406. package/src/index.ts +6 -0
  407. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  408. package/src/langium/bootstrap.ts +16 -9
  409. package/src/langium/config/configuration-provider.ts +119 -0
  410. package/src/langium/config/index.ts +1 -0
  411. package/src/langium/diagnostics/lsp-logger.ts +41 -6
  412. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  413. package/src/langium/document-builder/build-session.ts +87 -0
  414. package/src/langium/document-builder/document-builder.ts +720 -43
  415. package/src/langium/document-builder/index.ts +1 -0
  416. package/src/langium/integration-services.ts +67 -6
  417. package/src/langium/integrity/integrity-rule.ts +13 -5
  418. package/src/langium/integrity/integrity-service.ts +202 -17
  419. package/src/langium/keys/containment.ts +87 -0
  420. package/src/langium/keys/index.ts +1 -0
  421. package/src/langium/keys/name-based-key-provider.ts +4 -0
  422. package/src/langium/language-module.ts +42 -4
  423. package/src/langium/model-service/client-session.ts +606 -0
  424. package/src/langium/model-service/index.ts +1 -0
  425. package/src/langium/model-service/model-service.ts +395 -351
  426. package/src/langium/module.ts +192 -63
  427. package/src/langium/naming/name-provider.ts +27 -5
  428. package/src/langium/naming/name-separator-validation.ts +34 -5
  429. package/src/langium/project/abstract-project-manager.ts +9 -1
  430. package/src/langium/project/project-change-event.ts +2 -2
  431. package/src/langium/residency/cst-residency-service.ts +36 -14
  432. package/src/langium/scope/hydranium-scope-provider.ts +60 -22
  433. package/src/langium/serialization/abstract-serializer.ts +13 -32
  434. package/src/langium/service-registry.ts +19 -2
  435. package/src/langium/shared-services.ts +19 -2
  436. package/src/langium/transfer/transfer-encoder.ts +85 -24
  437. package/src/langium/trivia/comment-preserver.ts +1100 -0
  438. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  439. package/src/langium/trivia/index.ts +14 -0
  440. package/src/langium/trivia/trivia-contribution.ts +39 -0
  441. package/src/langium/trivia/trivia-preserver.ts +54 -0
  442. package/src/langium/trivia/trivia-service.ts +99 -0
  443. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  444. package/src/langium/validation/document-validator.ts +537 -11
  445. package/src/langium/workspace/document-uri-policy.ts +17 -12
  446. package/src/langium/workspace/file-not-found.ts +23 -0
  447. package/src/langium/workspace/file-system-provider.ts +153 -16
  448. package/src/langium/workspace/hydranium-langium-document-factory.ts +34 -0
  449. package/src/langium/workspace/hydranium-workspace-lock.ts +21 -0
  450. package/src/langium/workspace/hydranium-workspace-manager.ts +133 -12
  451. package/src/langium/workspace/in-memory-file-system-provider.ts +47 -16
  452. package/src/langium/workspace/initialize-workspace.ts +43 -5
  453. package/src/langium/workspace/langium-documents.ts +113 -33
  454. package/src/langium/workspace/persistent-file-system-provider.ts +0 -7
  455. package/src/langium/workspace/virtual-document.ts +96 -19
  456. package/src/langium/workspace/write-lock-scope.ts +4 -3
  457. package/src/locale/index.ts +10 -0
  458. package/src/locale/server-locale.ts +86 -0
  459. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  460. package/src/lsp/connection-features.ts +67 -0
  461. package/src/lsp/diagnostics-connection.ts +56 -0
  462. package/src/lsp/hydranium-document-update-handler.ts +182 -106
  463. package/src/lsp/index.ts +3 -1
  464. package/src/lsp/lsp-latency.ts +62 -0
  465. package/src/lsp/semantic-token-provider.ts +74 -7
  466. package/src/lsp/shared-module.ts +4 -8
  467. package/src/lsp/start-language-server.ts +13 -7
  468. package/src/messages/carriers.ts +78 -0
  469. package/src/messages/index.ts +36 -0
  470. package/src/messages/renderer.ts +212 -0
  471. package/src/node/heap-ceiling.ts +108 -0
  472. package/src/node/index.ts +1 -0
  473. package/src/node/latency-from-env.ts +1 -1
  474. package/src/node/measure-memory.ts +1 -0
  475. package/src/node/node-file-system-provider.ts +122 -51
  476. package/src/node/profile-capture.ts +8 -2
  477. package/src/node/profiling-run.ts +3 -3
  478. package/src/node/rename-over-open-readers.ts +78 -0
  479. package/src/node/socket-launcher.ts +19 -4
  480. package/src/node/stdio-launcher.ts +1 -2
  481. package/src/testing/fake-document.ts +24 -5
  482. package/src/testing/make-noop-shared-services.ts +50 -2
  483. package/src/testing/make-test-services.ts +103 -27
  484. package/src/testing/node/index.ts +1 -0
  485. package/src/testing/node/lsp-harness.ts +2 -0
  486. package/src/testing/node/lsp-server-connection.ts +61 -11
  487. package/src/testing/node/scratch-workspace.ts +10 -5
  488. package/src/testing/node/spawned-server.ts +35 -1
  489. package/src/testing/node/unhandled-rejections.ts +31 -0
  490. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  491. package/src/testing/playwright/index.ts +1 -0
  492. package/src/testing/playwright/server-log-capture.ts +24 -5
  493. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  494. package/src/testing/run-update-pipeline.ts +4 -4
  495. package/src/testing/stub-ast-document-manager.ts +28 -21
  496. package/src/testing/stub-document-builder.ts +83 -17
  497. package/src/testing/stub-hydranium-text-documents.ts +127 -22
  498. package/src/testing/stub-langium-documents.ts +3 -2
  499. package/src/testing/stub-model-service.ts +9 -8
  500. package/src/util/connection-liveness.ts +37 -14
  501. package/lib/lsp/instrument-connection.d.ts +0 -36
  502. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  503. package/lib/lsp/instrument-connection.js +0 -62
  504. package/lib/lsp/instrument-connection.js.map +0 -1
  505. package/src/lsp/instrument-connection.ts +0 -66
@@ -9,25 +9,14 @@
9
9
  import { Debouncer, type Logger, ObservableValue, type MaybeObservableValue } from '@hydranium/protocol';
10
10
  import { URI } from '@hydranium/langium';
11
11
  import { DefaultDocumentUpdateHandler } from '@hydranium/langium/lsp';
12
- import { type HydraniumDocumentBuilder } from '../langium/document-builder/document-builder.js';
12
+ import { HYDRANIUM_BUILD_REASONS, type HydraniumDocumentBuilder } from '../langium/document-builder/document-builder.js';
13
13
  import { type ServerSharedServices } from '../langium/module.js';
14
14
  import { type SelfSaveRegistry } from '../documents/self-save-registry.js';
15
15
  import { type WritableFileSystemProvider } from '../documents/ast-document-manager.js';
16
16
  import { type HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
17
- import { type DidChangeWatchedFilesParams, type TextDocumentChangeEvent } from 'vscode-languageserver';
17
+ import { type DidChangeWatchedFilesParams, type TextDocumentChangeEvent, type TextDocumentWillSaveEvent, type TextEdit } from 'vscode-languageserver';
18
18
  import { type TextDocument } from 'vscode-languageserver-textdocument';
19
- /**
20
- * Default LSP-event reasons stamped by {@link HydraniumDocumentUpdateHandler}
21
- * onto the next `documentBuilder.update` call via `markNextReason`. Exposed
22
- * so adopters subclassing the handler can layer additional reasons or rename
23
- * existing ones without losing the canonical names the framework emits.
24
- */
25
- export declare const HYDRANIUM_BUILD_REASONS: Readonly<{
26
- readonly didOpen: "didOpen";
27
- readonly didChangeContent: "didChangeContent";
28
- readonly didChangeWatchedFiles: "didChangeWatchedFiles";
29
- readonly didClose: "didClose";
30
- }>;
19
+ export { HYDRANIUM_BUILD_REASONS };
31
20
  /**
32
21
  * Construction options for {@link HydraniumDocumentUpdateHandler}.
33
22
  */
@@ -52,6 +41,17 @@ export interface HydraniumDocumentUpdateHandlerOptions {
52
41
  * load tests).
53
42
  */
54
43
  readonly bypassNonLanguageClientChanges?: boolean;
44
+ /**
45
+ * Longest an editor's save waits on the server, in milliseconds, at each of
46
+ * its two steps: the `willSaveWaitUntil` answer waits for the server's disk
47
+ * writes of the document already queued, and server writes queued after the
48
+ * answer wait for the editor's `didSave`. Either wait that runs out is
49
+ * logged, and the editor's write and the server's can then land in either
50
+ * order. Default `1000`: VS Code gives up on an answer after about 1.5 s,
51
+ * and switches the listener off for the session once four answers, over
52
+ * all documents, timed out or failed.
53
+ */
54
+ readonly willSaveGateMs?: number;
55
55
  }
56
56
  /**
57
57
  * Framework `DocumentUpdateHandler` adding these behaviours over Langium's
@@ -66,30 +66,37 @@ export interface HydraniumDocumentUpdateHandlerOptions {
66
66
  * changes and watched-file changes bypass the debounce (their
67
67
  * producers are already coalesced).
68
68
  * 3. **Build-reason stamping** — the LSP event overrides
69
- * (`didOpenDocument`, `didChangeContent`, `didChangeWatchedFiles`,
70
- * `didCloseDocument`) populate {@link nextReason} with a canonical
71
- * reason string. {@link fireDocumentUpdate} captures the reason;
72
- * {@link dispatch} stages it on the builder via
73
- * {@link HydraniumDocumentBuilder.markNextReason}, so a subclass that
74
- * formats build logs can tag its line with the event that caused the
75
- * build without per-adopter wiring to capture it.
76
- * 4. **Last-client-close rebuild trigger** ({@link didCloseDocument}) —
77
- * when the final client closes a document, dispatch a build so the
78
- * LangiumDocument's `textDocument` is refreshed (from disk for `file:`
79
- * URIs, or removed from the index for ephemeral URIs). Langium's
80
- * default handler does not implement `didCloseDocument`, so the
81
- * in-memory text of the last writer would otherwise persist.
69
+ * (`didOpenDocument`, `didChangeContent`, `didChangeWatchedFiles`)
70
+ * populate {@link nextReason} with a canonical reason string.
71
+ * {@link fireDocumentUpdate} captures the reason; {@link dispatch} hands
72
+ * it to {@link HydraniumDocumentBuilder.scheduleUpdate}, which stages it
73
+ * through {@link HydraniumDocumentBuilder.markNextReason} when the build
74
+ * runs, so a subclass that formats build logs can tag its line with the
75
+ * event that caused the build without per-adopter wiring to capture it.
76
+ * 4. **Editor save gate** ({@link willSaveDocumentWaitUntil}) — the editor
77
+ * writes the file itself, so the server's disk writes of that document
78
+ * are ordered around it: the editor's save waits for the ones already
79
+ * queued, and the ones queued during its save wait for its `didSave`.
80
+ * Both waits are capped by
81
+ * {@link HydraniumDocumentUpdateHandlerOptions.willSaveGateMs}.
82
+ *
83
+ * The revert to disk after a document's last close is not dispatched here:
84
+ * the text store runs it for every head, the LSP head included, so a
85
+ * `didCloseDocument` added in a subclass would build the document twice. A
86
+ * change still debounced for the document is dropped when the store releases
87
+ * it: the store's revert rebuilds the document from the file system provider
88
+ * or removes it.
82
89
  *
83
90
  * Adopters with their own handler subclass should extend this class
84
91
  * (not Langium's `DefaultDocumentUpdateHandler`) so all of them are
85
92
  * preserved. The {@link dispatch} hook is the canonical override
86
- * point for adopters that need to stamp additional per-build metadata
87
- * inside the workspace-lock callback.
93
+ * point for adopters that need to stamp additional per-build metadata.
88
94
  */
89
95
  export declare class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler {
96
+ protected readonly services: ServerSharedServices;
90
97
  /**
91
98
  * Narrow Langium's `DefaultDocumentUpdateHandler.documentBuilder` typing to
92
- * the framework subclass: `markNextReason` is the only method this handler
99
+ * the framework subclass: `scheduleUpdate` is the only method this handler
93
100
  * reaches for beyond the Langium interface.
94
101
  */
95
102
  protected readonly documentBuilder: HydraniumDocumentBuilder;
@@ -117,52 +124,53 @@ export declare class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdat
117
124
  protected nextReason?: string;
118
125
  /**
119
126
  * Build-reason captured at `fireDocumentUpdate` time, drained by
120
- * {@link dispatch} into `markNextReason`. Survives across debounced
121
- * batches (`?? pendingReason` in `fireDocumentUpdate` retains the
122
- * first reason in a coalesced burst).
127
+ * {@link dispatch} into the scheduled build. Survives across debounced
128
+ * batches: `fireDocumentUpdate` replaces it with each event's reason, so a
129
+ * coalesced burst carries its latest.
123
130
  */
124
131
  protected pendingReason?: string;
132
+ protected readonly willSaveGateMs: number;
133
+ /**
134
+ * Per document URI, the release of the hold an editor's save in progress
135
+ * keeps on the document's disk queue. A second save of the document
136
+ * releases the first: its hold would otherwise keep the second's answer
137
+ * waiting until the cap. The key is the document, not the save, so for a
138
+ * client that sends its next `willSaveWaitUntil` before the previous
139
+ * `didSave`, that late `didSave` releases the next save's hold.
140
+ */
141
+ protected readonly editorSaves: Map<string, () => void>;
125
142
  constructor(services: ServerSharedServices, options?: HydraniumDocumentUpdateHandlerOptions);
126
143
  didOpenDocument(_change: TextDocumentChangeEvent<TextDocument>): void;
127
144
  didChangeContent(change: TextDocumentChangeEvent<TextDocument>): void;
145
+ didChangeWatchedFiles(params: DidChangeWatchedFilesParams): void;
128
146
  /**
129
- * Last-client close is the missing rebuild trigger in Langium's
130
- * `DefaultDocumentUpdateHandler`: `documents.onDidClose` fires on every
131
- * per-client close, but the default handler ignores the event entirely.
132
- * For multi-client servers this leaves the LangiumDocument carrying the
133
- * unsaved in-memory `textDocument` of the last writer until something
134
- * else triggers a rebuild — integrity rules walking `langiumDocuments.all`
135
- * then see stale text long after the user discarded their edits.
136
- *
137
- * We funnel the last-client transition through the same dispatch path
138
- * the other LSP events use, so the rebuild gets debouncing, workspace
139
- * locking, build-reason stamping, and `markNextReason` for free. The
140
- * scheme split governs the `DocumentBuilder.update` shape:
147
+ * Answer an editor's `willSaveWaitUntil` with no edits once the server's
148
+ * disk writes of the document already queued have landed, or after
149
+ * {@link willSaveGateMs}, whichever is first. From the moment the queue
150
+ * reaches this save, disk tasks of the document queued behind it wait for
151
+ * the editor's `didSave`, reported through
152
+ * `HydraniumTextDocuments.onDidSaveInLanguageClient`, or for
153
+ * {@link willSaveGateMs} more.
141
154
  *
142
- * - **`file:` URI** → `update([uri], [])`. Routes through
143
- * `LangiumDocuments.invalidateDocument` (doc stays in the trie) and
144
- * `LangiumDocumentFactory.update`, which consults the LSP-tracked
145
- * open-documents map first. That map is cleared LATER in the same
146
- * synchronous `notifyDidCloseTextDocument` call that fires this event,
147
- * and {@link dispatch} defers the build behind `workspaceManager.ready`
148
- * — so by the time the factory looks, the URI is gone: it falls back to
149
- * `FileSystemProvider.readFile` and the doc rebuilds from disk,
150
- * Langium's canonical close-without-save semantic. A dispatch made
151
- * synchronously here would still see the open document and re-read the
152
- * in-memory text instead.
153
- * - **non-`file:` URI** (`builtin:`, `untitled:`) → no dispatch.
154
- * Adopter-loaded schemes — documents pulled in via
155
- * `loadAdditionalDocuments` — need to stay in the workspace index;
156
- * dropping them on close would break every cross-reference that
157
- * targets them. The framework cannot enumerate adopter schemes, so the
158
- * safe default is "leave alone unless it's a file." Adopters that need
159
- * ephemeral-URI cleanup handle it explicitly.
160
- *
161
- * Per-client closes (where other clients still hold the URI) are
162
- * suppressed via {@link HydraniumTextDocuments.isOpenInAnyClient}.
155
+ * The hold is a disk task that waits only for that signal or its timer:
156
+ * waiting on a build, a save or anything else queued for the document would
157
+ * wedge its queue. Resolves in every case, since a failed request counts
158
+ * against the listener in VS Code; Langium drops the request's cancellation,
159
+ * so an abandoned request still runs to the cap. A hold that runs out is
160
+ * logged at debug only: an editor skips `didSave` for a save it cancels or
161
+ * that changed nothing.
163
162
  */
164
- didCloseDocument(change: TextDocumentChangeEvent<TextDocument>): void;
165
- didChangeWatchedFiles(params: DidChangeWatchedFilesParams): void;
163
+ willSaveDocumentWaitUntil(event: TextDocumentWillSaveEvent<TextDocument>): Promise<TextEdit[]>;
164
+ /**
165
+ * Present so that Langium advertises `save` and editors send `didSave`;
166
+ * without it every hold of {@link willSaveDocumentWaitUntil} waits out its
167
+ * cap. The hold is released on
168
+ * `HydraniumTextDocuments.onDidSaveInLanguageClient` instead: it fires as
169
+ * soon as the editor reports the save, while `onDidSave`, and so this
170
+ * method, follows only once the file has been read back, and not at all
171
+ * when the file does not hold the store's text.
172
+ */
173
+ didSaveDocument(_event: TextDocumentChangeEvent<TextDocument>): void;
166
174
  /**
167
175
  * Drop watched-file changes whose path + mtime match a recent self-save
168
176
  * record. Deletions always pass (no mtime); stat failures pass (the
@@ -177,8 +185,7 @@ export declare class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdat
177
185
  * flush immediately (`immediateFlush` or `debounceMs <= 0`) or restart
178
186
  * the trailing-edge timer. Subclasses that need to stamp per-build
179
187
  * metadata can override and inspect the merged sets — but the canonical
180
- * override point for the workspace-lock callback is {@link dispatch},
181
- * not this method.
188
+ * override point for the build is {@link dispatch}, not this method.
182
189
  */
183
190
  protected fireDocumentUpdate(changed: URI[], deleted: URI[]): void;
184
191
  /**
@@ -189,15 +196,19 @@ export declare class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdat
189
196
  */
190
197
  flushPending(): void;
191
198
  /**
192
- * Workspace-lock + `documentBuilder.update` call for the merged sets.
193
- * Mirrors Langium's `super.fireDocumentUpdate` body plus
194
- * `markNextReason(pendingReason)` inside the write-lock callback, so the
195
- * build the lock is about to run carries the LSP event that triggered it.
196
- * Adopters override to stamp additional per-build metadata — the canonical
197
- * pattern is to read the reason via `this.pendingReason`, call
198
- * `super.dispatch(...)` or replicate the
199
- * `workspaceManager.ready -> workspaceLock.write` block, and add
200
- * adopter-specific behaviour inside the write callback.
199
+ * Build the merged sets once the workspace is ready, through
200
+ * {@link HydraniumDocumentBuilder.scheduleUpdate} with the pending reason,
201
+ * so the build carries the LSP event that triggered it. A session's write
202
+ * fires the store's change event before the session rebuilds the document
203
+ * itself, and the scheduled build is what the two share.
204
+ *
205
+ * Adopters override to stamp additional per-build metadata: read the reason
206
+ * via `this.pendingReason` and call `super.dispatch(...)`; the build may
207
+ * be shared with other requests, so metadata stamped for it describes
208
+ * theirs too. An override that needs code inside the write action takes
209
+ * `workspaceLock.write` itself, as Langium's `fireDocumentUpdate` does, and
210
+ * stages the reason through `markNextReason` there; its build then cancels
211
+ * a scheduled one it coincides with rather than sharing it.
201
212
  */
202
213
  protected dispatch(changed: URI[], deleted: URI[]): void;
203
214
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hydranium-document-update-handler.d.ts","sourceRoot":"","sources":["../../src/lsp/hydranium-document-update-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,GAAG,EAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAChG,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,KAAK,2BAA2B,EAAkC,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvE;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;;EAKzB,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,qCAAqC;IACnD;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnD;;;;;;;;;OASG;IACH,QAAQ,CAAC,8BAA8B,CAAC,EAAE,OAAO,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,8BAA+B,SAAQ,4BAA4B;IAC7E;;;;OAIG;IACH,mBAA2B,eAAe,EAAE,wBAAwB,CAAC;IAErE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACtD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;IAClE,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAEvE,0FAA0F;IAC1F,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACrD,SAAS,CAAC,QAAQ,CAAC,8BAA8B,EAAE,OAAO,CAAC;IAE3D,qHAAqH;IACrH,SAAS,CAAC,cAAc,mBAA0B;IAClD,SAAS,CAAC,cAAc,mBAA0B;IAClD,sGAAsG;IACtG,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;IAC7C,iIAAiI;IACjI,SAAS,CAAC,cAAc,UAAS;IAEjC;;;;;;OAMG;IACH,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;gBAErB,QAAQ,EAAE,oBAAoB,EAAE,OAAO,GAAE,qCAA0C;IAW/F,eAAe,CAAC,OAAO,EAAE,uBAAuB,CAAC,YAAY,CAAC,GAAG,IAAI;IAU5D,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,CAAC,YAAY,CAAC,GAAG,IAAI;IAY9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,CAAC,YAAY,CAAC,GAAG,IAAI;IAa5D,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,IAAI;IA2BzE;;;;;;;OAOG;cACa,eAAe,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAiB1G;;;;;;;OAOG;cACgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI;IAwB3E;;;;;OAKG;IACI,YAAY,IAAI,IAAI;IAY3B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI;CAe1D"}
1
+ {"version":3,"file":"hydranium-document-update-handler.d.ts","sourceRoot":"","sources":["../../src/lsp/hydranium-document-update-handler.ts"],"names":[],"mappings":"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"}
@@ -6,23 +6,14 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
- import { Debouncer, ObservableValue } from '@hydranium/protocol';
9
+ import { Debouncer, Deferred, ObservableValue, TIMED_OUT } from '@hydranium/protocol';
10
10
  import { URI, UriUtils } from '@hydranium/langium';
11
11
  import { DefaultDocumentUpdateHandler } from '@hydranium/langium/lsp';
12
+ import { HYDRANIUM_BUILD_REASONS } from '../langium/document-builder/document-builder.js';
12
13
  import { LANGUAGE_CLIENT_ID } from '../documents/client-ids.js';
14
+ import { isConnectionGoneError } from '../util/connection-liveness.js';
13
15
  import { FileChangeType } from 'vscode-languageserver';
14
- /**
15
- * Default LSP-event reasons stamped by {@link HydraniumDocumentUpdateHandler}
16
- * onto the next `documentBuilder.update` call via `markNextReason`. Exposed
17
- * so adopters subclassing the handler can layer additional reasons or rename
18
- * existing ones without losing the canonical names the framework emits.
19
- */
20
- export const HYDRANIUM_BUILD_REASONS = Object.freeze({
21
- didOpen: 'didOpen',
22
- didChangeContent: 'didChangeContent',
23
- didChangeWatchedFiles: 'didChangeWatchedFiles',
24
- didClose: 'didClose'
25
- });
16
+ export { HYDRANIUM_BUILD_REASONS };
26
17
  /**
27
18
  * Framework `DocumentUpdateHandler` adding these behaviours over Langium's
28
19
  * default:
@@ -36,27 +27,34 @@ export const HYDRANIUM_BUILD_REASONS = Object.freeze({
36
27
  * changes and watched-file changes bypass the debounce (their
37
28
  * producers are already coalesced).
38
29
  * 3. **Build-reason stamping** — the LSP event overrides
39
- * (`didOpenDocument`, `didChangeContent`, `didChangeWatchedFiles`,
40
- * `didCloseDocument`) populate {@link nextReason} with a canonical
41
- * reason string. {@link fireDocumentUpdate} captures the reason;
42
- * {@link dispatch} stages it on the builder via
43
- * {@link HydraniumDocumentBuilder.markNextReason}, so a subclass that
44
- * formats build logs can tag its line with the event that caused the
45
- * build without per-adopter wiring to capture it.
46
- * 4. **Last-client-close rebuild trigger** ({@link didCloseDocument}) —
47
- * when the final client closes a document, dispatch a build so the
48
- * LangiumDocument's `textDocument` is refreshed (from disk for `file:`
49
- * URIs, or removed from the index for ephemeral URIs). Langium's
50
- * default handler does not implement `didCloseDocument`, so the
51
- * in-memory text of the last writer would otherwise persist.
30
+ * (`didOpenDocument`, `didChangeContent`, `didChangeWatchedFiles`)
31
+ * populate {@link nextReason} with a canonical reason string.
32
+ * {@link fireDocumentUpdate} captures the reason; {@link dispatch} hands
33
+ * it to {@link HydraniumDocumentBuilder.scheduleUpdate}, which stages it
34
+ * through {@link HydraniumDocumentBuilder.markNextReason} when the build
35
+ * runs, so a subclass that formats build logs can tag its line with the
36
+ * event that caused the build without per-adopter wiring to capture it.
37
+ * 4. **Editor save gate** ({@link willSaveDocumentWaitUntil}) — the editor
38
+ * writes the file itself, so the server's disk writes of that document
39
+ * are ordered around it: the editor's save waits for the ones already
40
+ * queued, and the ones queued during its save wait for its `didSave`.
41
+ * Both waits are capped by
42
+ * {@link HydraniumDocumentUpdateHandlerOptions.willSaveGateMs}.
43
+ *
44
+ * The revert to disk after a document's last close is not dispatched here:
45
+ * the text store runs it for every head, the LSP head included, so a
46
+ * `didCloseDocument` added in a subclass would build the document twice. A
47
+ * change still debounced for the document is dropped when the store releases
48
+ * it: the store's revert rebuilds the document from the file system provider
49
+ * or removes it.
52
50
  *
53
51
  * Adopters with their own handler subclass should extend this class
54
52
  * (not Langium's `DefaultDocumentUpdateHandler`) so all of them are
55
53
  * preserved. The {@link dispatch} hook is the canonical override
56
- * point for adopters that need to stamp additional per-build metadata
57
- * inside the workspace-lock callback.
54
+ * point for adopters that need to stamp additional per-build metadata.
58
55
  */
59
56
  export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler {
57
+ services;
60
58
  logger;
61
59
  selfSaveRegistry;
62
60
  fileSystemProvider;
@@ -81,13 +79,24 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
81
79
  nextReason;
82
80
  /**
83
81
  * Build-reason captured at `fireDocumentUpdate` time, drained by
84
- * {@link dispatch} into `markNextReason`. Survives across debounced
85
- * batches (`?? pendingReason` in `fireDocumentUpdate` retains the
86
- * first reason in a coalesced burst).
82
+ * {@link dispatch} into the scheduled build. Survives across debounced
83
+ * batches: `fireDocumentUpdate` replaces it with each event's reason, so a
84
+ * coalesced burst carries its latest.
87
85
  */
88
86
  pendingReason;
87
+ willSaveGateMs;
88
+ /**
89
+ * Per document URI, the release of the hold an editor's save in progress
90
+ * keeps on the document's disk queue. A second save of the document
91
+ * releases the first: its hold would otherwise keep the second's answer
92
+ * waiting until the cap. The key is the document, not the save, so for a
93
+ * client that sends its next `willSaveWaitUntil` before the previous
94
+ * `didSave`, that late `didSave` releases the next save's hold.
95
+ */
96
+ editorSaves = new Map();
89
97
  constructor(services, options = {}) {
90
98
  super(services);
99
+ this.services = services;
91
100
  this.logger = services.Logger;
92
101
  this.selfSaveRegistry = services.workspace.SelfSaveRegistry;
93
102
  this.fileSystemProvider = services.workspace.FileSystemProvider;
@@ -95,6 +104,18 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
95
104
  this.debounce = ObservableValue.from(options.debounceMs ?? 0);
96
105
  this.flushDebouncer = new Debouncer(services.Clock, () => this.flushPending(), { delayMs: this.debounce });
97
106
  this.bypassNonLanguageClientChanges = options.bypassNonLanguageClientChanges ?? true;
107
+ this.willSaveGateMs = options.willSaveGateMs ?? 1000;
108
+ this.textDocuments.onDidSaveInLanguageClient(event => this.editorSaves.get(event.uri)?.());
109
+ // A change still debounced for a document the store has released would
110
+ // build it once more after the store's own revert: from the provider
111
+ // again, or, for a document the revert removed, by reading a file that
112
+ // is not there.
113
+ this.textDocuments.onDidCloseLastOpen(event => {
114
+ this.pendingChanged.delete(URI.parse(event.uri).toString());
115
+ if (this.pendingChanged.size === 0 && this.pendingDeleted.size === 0) {
116
+ this.pendingReason = undefined;
117
+ }
118
+ });
98
119
  }
99
120
  didOpenDocument(_change) {
100
121
  // Langium also fires `didChangeContent` on open, which is what triggers
@@ -116,60 +137,21 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
116
137
  }
117
138
  super.didChangeContent(change);
118
139
  }
119
- /**
120
- * Last-client close is the missing rebuild trigger in Langium's
121
- * `DefaultDocumentUpdateHandler`: `documents.onDidClose` fires on every
122
- * per-client close, but the default handler ignores the event entirely.
123
- * For multi-client servers this leaves the LangiumDocument carrying the
124
- * unsaved in-memory `textDocument` of the last writer until something
125
- * else triggers a rebuild — integrity rules walking `langiumDocuments.all`
126
- * then see stale text long after the user discarded their edits.
127
- *
128
- * We funnel the last-client transition through the same dispatch path
129
- * the other LSP events use, so the rebuild gets debouncing, workspace
130
- * locking, build-reason stamping, and `markNextReason` for free. The
131
- * scheme split governs the `DocumentBuilder.update` shape:
132
- *
133
- * - **`file:` URI** → `update([uri], [])`. Routes through
134
- * `LangiumDocuments.invalidateDocument` (doc stays in the trie) and
135
- * `LangiumDocumentFactory.update`, which consults the LSP-tracked
136
- * open-documents map first. That map is cleared LATER in the same
137
- * synchronous `notifyDidCloseTextDocument` call that fires this event,
138
- * and {@link dispatch} defers the build behind `workspaceManager.ready`
139
- * — so by the time the factory looks, the URI is gone: it falls back to
140
- * `FileSystemProvider.readFile` and the doc rebuilds from disk,
141
- * Langium's canonical close-without-save semantic. A dispatch made
142
- * synchronously here would still see the open document and re-read the
143
- * in-memory text instead.
144
- * - **non-`file:` URI** (`builtin:`, `untitled:`) → no dispatch.
145
- * Adopter-loaded schemes — documents pulled in via
146
- * `loadAdditionalDocuments` — need to stay in the workspace index;
147
- * dropping them on close would break every cross-reference that
148
- * targets them. The framework cannot enumerate adopter schemes, so the
149
- * safe default is "leave alone unless it's a file." Adopters that need
150
- * ephemeral-URI cleanup handle it explicitly.
151
- *
152
- * Per-client closes (where other clients still hold the URI) are
153
- * suppressed via {@link HydraniumTextDocuments.isOpenInAnyClient}.
154
- */
155
- didCloseDocument(change) {
156
- if (this.textDocuments.isOpenInAnyClient(change.document.uri)) {
157
- return;
158
- }
159
- const uri = URI.parse(change.document.uri);
160
- if (uri.scheme !== 'file') {
161
- return;
162
- }
163
- this.nextReason = HYDRANIUM_BUILD_REASONS.didClose;
164
- this.immediateFlush = true;
165
- this.fireDocumentUpdate([uri], []);
166
- }
167
140
  didChangeWatchedFiles(params) {
168
141
  void this.filterSelfSaves(params)
169
142
  .then(filtered => {
170
143
  if (filtered.changes.length === 0) {
171
144
  return;
172
145
  }
146
+ // Only an open document keeps the file's text as its disk
147
+ // baseline; the store ignores the rest. The self-save filter has
148
+ // dropped the server's own writes, which set the baseline when
149
+ // they wrote.
150
+ for (const change of filtered.changes) {
151
+ this.textDocuments
152
+ .reloadDiskBaseline(change.uri)
153
+ .catch((err) => this.logger.error(`Disk baseline not reloaded for ${change.uri}. ${String(err)}`));
154
+ }
173
155
  // External file-system changes are authoritative — overwrite any
174
156
  // pending reason (typically empty here; could be `didChangeContent`
175
157
  // if a watcher event raced an in-flight Monaco edit, in which case
@@ -190,6 +172,70 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
190
172
  this.logger.error(`Watched-file update dropped for ${uris}. ${detail}`);
191
173
  });
192
174
  }
175
+ /**
176
+ * Answer an editor's `willSaveWaitUntil` with no edits once the server's
177
+ * disk writes of the document already queued have landed, or after
178
+ * {@link willSaveGateMs}, whichever is first. From the moment the queue
179
+ * reaches this save, disk tasks of the document queued behind it wait for
180
+ * the editor's `didSave`, reported through
181
+ * `HydraniumTextDocuments.onDidSaveInLanguageClient`, or for
182
+ * {@link willSaveGateMs} more.
183
+ *
184
+ * The hold is a disk task that waits only for that signal or its timer:
185
+ * waiting on a build, a save or anything else queued for the document would
186
+ * wedge its queue. Resolves in every case, since a failed request counts
187
+ * against the listener in VS Code; Langium drops the request's cancellation,
188
+ * so an abandoned request still runs to the cap. A hold that runs out is
189
+ * logged at debug only: an editor skips `didSave` for a save it cancels or
190
+ * that changed nothing.
191
+ */
192
+ willSaveDocumentWaitUntil(event) {
193
+ const uri = event.document.uri;
194
+ this.editorSaves.get(uri)?.();
195
+ const hold = new Deferred();
196
+ const release = () => {
197
+ if (this.editorSaves.get(uri) === release) {
198
+ this.editorSaves.delete(uri);
199
+ }
200
+ hold.resolve();
201
+ };
202
+ this.editorSaves.set(uri, release);
203
+ return new Promise(resolve => {
204
+ const clock = this.services.Clock;
205
+ const cap = clock.setTimer(() => {
206
+ this.logger.warn(`willSaveWaitUntil for ${uri} answered after ${this.willSaveGateMs} ms with server writes of it still queued; the editor's save may race them.`);
207
+ resolve([]);
208
+ }, this.willSaveGateMs);
209
+ try {
210
+ void this.services.workspace.FileSystemTaskQueue.enqueue(uri, async () => {
211
+ cap.dispose();
212
+ resolve([]);
213
+ if ((await clock.raceTimer(hold.promise, this.willSaveGateMs)) === TIMED_OUT) {
214
+ this.logger.debug(`No didSave for ${uri} within ${this.willSaveGateMs} ms; server writes of it no longer wait for the editor's save.`);
215
+ release();
216
+ }
217
+ });
218
+ }
219
+ catch (err) {
220
+ cap.dispose();
221
+ this.logger.error(`willSaveWaitUntil for ${uri} answered without waiting. ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);
222
+ release();
223
+ resolve([]);
224
+ }
225
+ });
226
+ }
227
+ /**
228
+ * Present so that Langium advertises `save` and editors send `didSave`;
229
+ * without it every hold of {@link willSaveDocumentWaitUntil} waits out its
230
+ * cap. The hold is released on
231
+ * `HydraniumTextDocuments.onDidSaveInLanguageClient` instead: it fires as
232
+ * soon as the editor reports the save, while `onDidSave`, and so this
233
+ * method, follows only once the file has been read back, and not at all
234
+ * when the file does not hold the store's text.
235
+ */
236
+ didSaveDocument(_event) {
237
+ // Nothing to do; see the doc comment.
238
+ }
193
239
  /**
194
240
  * Drop watched-file changes whose path + mtime match a recent self-save
195
241
  * record. Deletions always pass (no mtime); stat failures pass (the
@@ -205,7 +251,7 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
205
251
  }
206
252
  const uri = UriUtils.toUri(change.uri);
207
253
  const mtimeMs = await this.fileSystemProvider.mtimeMs?.(uri);
208
- if (mtimeMs !== undefined && this.selfSaveRegistry.matches(uri.fsPath, mtimeMs)) {
254
+ if (mtimeMs !== undefined && this.selfSaveRegistry.isRegistered(uri.fsPath, mtimeMs)) {
209
255
  return undefined;
210
256
  }
211
257
  return change;
@@ -217,15 +263,13 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
217
263
  * flush immediately (`immediateFlush` or `debounceMs <= 0`) or restart
218
264
  * the trailing-edge timer. Subclasses that need to stamp per-build
219
265
  * metadata can override and inspect the merged sets — but the canonical
220
- * override point for the workspace-lock callback is {@link dispatch},
221
- * not this method.
266
+ * override point for the build is {@link dispatch}, not this method.
222
267
  */
223
268
  fireDocumentUpdate(changed, deleted) {
224
269
  // Capture the reason set by the LSP event handler immediately before
225
- // we merge into the pending sets. `?? pendingReason` keeps the
226
- // first reason in a coalesced burst (LSP events arriving inside an
227
- // active debounce window all stamp the same `pendingReason` once,
228
- // because subsequent stamps see the field already non-undefined).
270
+ // we merge into the pending sets. Each event stamps its own reason, so
271
+ // a coalesced burst carries its latest; `?? pendingReason` keeps the
272
+ // earlier one only for a call no event stamped.
229
273
  this.pendingReason = this.nextReason ?? this.pendingReason;
230
274
  this.nextReason = undefined;
231
275
  for (const uri of changed) {
@@ -261,25 +305,34 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
261
305
  this.dispatch(changed, deleted);
262
306
  }
263
307
  /**
264
- * Workspace-lock + `documentBuilder.update` call for the merged sets.
265
- * Mirrors Langium's `super.fireDocumentUpdate` body plus
266
- * `markNextReason(pendingReason)` inside the write-lock callback, so the
267
- * build the lock is about to run carries the LSP event that triggered it.
268
- * Adopters override to stamp additional per-build metadata — the canonical
269
- * pattern is to read the reason via `this.pendingReason`, call
270
- * `super.dispatch(...)` or replicate the
271
- * `workspaceManager.ready -> workspaceLock.write` block, and add
272
- * adopter-specific behaviour inside the write callback.
308
+ * Build the merged sets once the workspace is ready, through
309
+ * {@link HydraniumDocumentBuilder.scheduleUpdate} with the pending reason,
310
+ * so the build carries the LSP event that triggered it. A session's write
311
+ * fires the store's change event before the session rebuilds the document
312
+ * itself, and the scheduled build is what the two share.
313
+ *
314
+ * Adopters override to stamp additional per-build metadata: read the reason
315
+ * via `this.pendingReason` and call `super.dispatch(...)`; the build may
316
+ * be shared with other requests, so metadata stamped for it describes
317
+ * theirs too. An override that needs code inside the write action takes
318
+ * `workspaceLock.write` itself, as Langium's `fireDocumentUpdate` does, and
319
+ * stages the reason through `markNextReason` there; its build then cancels
320
+ * a scheduled one it coincides with rather than sharing it.
273
321
  */
274
322
  dispatch(changed, deleted) {
275
323
  const reason = this.pendingReason;
276
324
  this.pendingReason = undefined;
277
325
  this.workspaceManager.ready
278
- .then(() => this.workspaceLock.write(token => {
279
- this.documentBuilder.markNextReason(reason);
280
- return this.documentBuilder.update(changed, deleted, token);
281
- }))
326
+ .then(() => this.documentBuilder.scheduleUpdate(changed, deleted, reason))
282
327
  .catch(err => {
328
+ // A deferred rebuild can finish after the LSP peer has gone away.
329
+ // Unless the head was started through `startLanguageServer`, whose
330
+ // guard absorbs it, the diagnostics publish then fails this build:
331
+ // a routine teardown race, not a failed workspace update. Keep
332
+ // genuine update failures visible.
333
+ if (isConnectionGoneError(err)) {
334
+ return;
335
+ }
283
336
  const detail = err instanceof Error ? (err.stack ?? err.message) : String(err);
284
337
  this.logger.error(`Workspace initialization failed. Could not perform document update. ${detail}`);
285
338
  });
@@ -1 +1 @@
1
- {"version":3,"file":"hydranium-document-update-handler.js","sourceRoot":"","sources":["../../src/lsp/hydranium-document-update-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,SAAS,EAAe,eAAe,EAA6B,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAIhE,OAAO,EAAoD,cAAc,EAAgC,MAAM,uBAAuB,CAAC;AAGvI;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC;IAClD,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,kBAAkB;IACpC,qBAAqB,EAAE,uBAAuB;IAC9C,QAAQ,EAAE,UAAU;CACb,CAAC,CAAC;AA4BZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,8BAA+B,SAAQ,4BAA4B;IAQ1D,MAAM,CAAS;IACf,gBAAgB,CAAmB;IACnC,kBAAkB,CAA6B;IAC/C,aAAa,CAAuC;IAEvE,0FAA0F;IACvE,QAAQ,CAA0B;IAClC,8BAA8B,CAAU;IAE3D,qHAAqH;IAC3G,cAAc,GAAG,IAAI,GAAG,EAAe,CAAC;IACxC,cAAc,GAAG,IAAI,GAAG,EAAe,CAAC;IAClD,sGAAsG;IACnF,cAAc,CAAY;IAC7C,iIAAiI;IACvH,cAAc,GAAG,KAAK,CAAC;IAEjC;;;;;;OAMG;IACO,UAAU,CAAU;IAC9B;;;;;OAKG;IACO,aAAa,CAAU;IAEjC,YAAY,QAA8B,EAAE,UAAiD,EAAE;QAC5F,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAC5D,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC;QAChE,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3G,IAAI,CAAC,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,IAAI,IAAI,CAAC;IACxF,CAAC;IAED,eAAe,CAAC,OAA8C;QAC3D,wEAAwE;QACxE,8DAA8D;QAC9D,sEAAsE;QACtE,mEAAmE;QACnE,qCAAqC;QACrC,IAAI,CAAC,UAAU,GAAG,uBAAuB,CAAC,OAAO,CAAC;QAClD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEQ,gBAAgB,CAAC,MAA6C;QACpE,mEAAmE;QACnE,yDAAyD;QACzD,IAAI,CAAC,UAAU,KAAK,uBAAuB,CAAC,gBAAgB,CAAC;QAC7D,gFAAgF;QAChF,gFAAgF;QAChF,IAAI,IAAI,CAAC,8BAA8B,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,kBAAkB,EAAE,CAAC;YACnH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,gBAAgB,CAAC,MAA6C;QAC3D,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO;QACV,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACzB,OAAO;QACV,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,uBAAuB,CAAC,QAAQ,CAAC;QACnD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAEQ,qBAAqB,CAAC,MAAmC;QAC/D,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;aAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE;YACd,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO;YACV,CAAC;YACD,iEAAiE;YACjE,oEAAoE;YACpE,mEAAmE;YACnE,6DAA6D;YAC7D,IAAI,CAAC,UAAU,GAAG,uBAAuB,CAAC,qBAAqB,CAAC;YAChE,uEAAuE;YACvE,uDAAuD;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,wDAAwD;YACxD,oEAAoE;YACpE,iEAAiE;YACjE,gEAAgE;YAChE,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACT,CAAC;IAED;;;;;;;OAOG;IACO,KAAK,CAAC,eAAe,CAAC,MAAmC;QAChE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;YAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC1C,OAAO,MAAM,CAAC;YACjB,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC/E,OAAO,SAAS,CAAC;YACpB,CAAC;YACD,OAAO,MAAM,CAAC;QACjB,CAAC,CAAC,CACJ,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAuB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;IAC1F,CAAC;IAED;;;;;;;OAOG;IACgB,kBAAkB,CAAC,OAAc,EAAE,OAAc;QACjE,qEAAqE;QACrE,+DAA+D;QAC/D,mEAAmE;QACnE,kEAAkE;QAClE,kEAAkE;QAClE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC;QAC3D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,uCAAuC;YAC5D,OAAO;QACV,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACI,YAAY;QAChB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO;QACV,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;;;OAUG;IACO,QAAQ,CAAC,OAAc,EAAE,OAAc;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,KAAK;aACvB,IAAI,CAAC,GAAG,EAAE,CACR,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC,CAAC,CACJ;aACA,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uEAAuE,MAAM,EAAE,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;IACT,CAAC;CACH"}
1
+ {"version":3,"file":"hydranium-document-update-handler.js","sourceRoot":"","sources":["../../src/lsp/hydranium-document-update-handler.ts"],"names":[],"mappings":"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"}