@hydranium/core 1.0.0-next.39 → 1.0.0-next.390

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 (805) hide show
  1. package/README.md +78 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +77 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +169 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +32 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +40 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +254 -140
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +311 -128
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +40 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +453 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +918 -504
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +153 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +186 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +3 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +3 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +75 -36
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +141 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  116. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  117. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  118. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  119. package/lib/langium/diagnostics/log-preamble.js +1 -1
  120. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  121. package/lib/langium/diagnostics/logger.d.ts +25 -6
  122. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  123. package/lib/langium/diagnostics/logger.js +49 -17
  124. package/lib/langium/diagnostics/logger.js.map +1 -1
  125. package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
  126. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/lsp-logger.js +81 -46
  128. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  129. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  130. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  131. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  132. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  133. package/lib/langium/document-builder/build-pipeline-integration.js +43 -30
  134. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  135. package/lib/langium/document-builder/build-session.d.ts +6 -5
  136. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-session.js +5 -5
  138. package/lib/langium/document-builder/build-session.js.map +1 -1
  139. package/lib/langium/document-builder/document-builder.d.ts +390 -40
  140. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  141. package/lib/langium/document-builder/document-builder.js +635 -102
  142. package/lib/langium/document-builder/document-builder.js.map +1 -1
  143. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  144. package/lib/langium/documentation/comment-provider.js.map +1 -1
  145. package/lib/langium/integration-services.d.ts +20 -23
  146. package/lib/langium/integration-services.d.ts.map +1 -1
  147. package/lib/langium/integration-services.js.map +1 -1
  148. package/lib/langium/integrity/integrity-rule.d.ts +22 -8
  149. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  150. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  151. package/lib/langium/integrity/integrity-service.d.ts +217 -29
  152. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  153. package/lib/langium/integrity/integrity-service.js +588 -84
  154. package/lib/langium/integrity/integrity-service.js.map +1 -1
  155. package/lib/langium/keys/containment.d.ts +3 -2
  156. package/lib/langium/keys/containment.d.ts.map +1 -1
  157. package/lib/langium/keys/containment.js.map +1 -1
  158. package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
  159. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.js +24 -12
  161. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  162. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  164. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  165. package/lib/langium/labeling/label-provider.js.map +1 -1
  166. package/lib/langium/language-module.d.ts +30 -5
  167. package/lib/langium/language-module.d.ts.map +1 -1
  168. package/lib/langium/language-module.js +21 -5
  169. package/lib/langium/language-module.js.map +1 -1
  170. package/lib/langium/model-service/client-session.d.ts +405 -0
  171. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  172. package/lib/langium/model-service/client-session.js +479 -0
  173. package/lib/langium/model-service/client-session.js.map +1 -0
  174. package/lib/langium/model-service/index.d.ts +2 -0
  175. package/lib/langium/model-service/index.d.ts.map +1 -1
  176. package/lib/langium/model-service/index.js +2 -0
  177. package/lib/langium/model-service/index.js.map +1 -1
  178. package/lib/langium/model-service/model-events.d.ts +68 -0
  179. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  180. package/lib/langium/model-service/model-events.js +10 -0
  181. package/lib/langium/model-service/model-events.js.map +1 -0
  182. package/lib/langium/model-service/model-service.d.ts +441 -323
  183. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  184. package/lib/langium/model-service/model-service.js +602 -407
  185. package/lib/langium/model-service/model-service.js.map +1 -1
  186. package/lib/langium/module.d.ts +96 -37
  187. package/lib/langium/module.d.ts.map +1 -1
  188. package/lib/langium/module.js +41 -29
  189. package/lib/langium/module.js.map +1 -1
  190. package/lib/langium/naming/name-provider.d.ts +32 -7
  191. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  192. package/lib/langium/naming/name-provider.js +10 -4
  193. package/lib/langium/naming/name-provider.js.map +1 -1
  194. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  195. package/lib/langium/project/abstract-project-manager.d.ts +184 -13
  196. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  197. package/lib/langium/project/abstract-project-manager.js +336 -16
  198. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  199. package/lib/langium/project/project-change-event.d.ts +22 -3
  200. package/lib/langium/project/project-change-event.d.ts.map +1 -1
  201. package/lib/langium/project/project-manager.d.ts +28 -2
  202. package/lib/langium/project/project-manager.d.ts.map +1 -1
  203. package/lib/langium/project/single-project-manager.d.ts +7 -1
  204. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  205. package/lib/langium/project/single-project-manager.js +12 -0
  206. package/lib/langium/project/single-project-manager.js.map +1 -1
  207. package/lib/langium/residency/cst-residency-service.d.ts +92 -52
  208. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  209. package/lib/langium/residency/cst-residency-service.js +154 -58
  210. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  211. package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
  212. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  213. package/lib/langium/scope/ast-node-description-provider.js +88 -15
  214. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  215. package/lib/langium/scope/built-local-symbols.d.ts +12 -0
  216. package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
  217. package/lib/langium/scope/built-local-symbols.js +11 -0
  218. package/lib/langium/scope/built-local-symbols.js.map +1 -0
  219. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  220. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  221. package/lib/langium/scope/fallback-scope.js +35 -0
  222. package/lib/langium/scope/fallback-scope.js.map +1 -0
  223. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  224. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  225. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  226. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  227. package/lib/langium/scope/hydranium-scope-provider.d.ts +122 -32
  228. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  229. package/lib/langium/scope/hydranium-scope-provider.js +217 -39
  230. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  231. package/lib/langium/scope/index.d.ts +1 -0
  232. package/lib/langium/scope/index.d.ts.map +1 -1
  233. package/lib/langium/scope/index.js +1 -0
  234. package/lib/langium/scope/index.js.map +1 -1
  235. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  236. package/lib/langium/scope/reference-builder.js.map +1 -1
  237. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  238. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  239. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  240. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  241. package/lib/langium/scope/scope-extension-service.d.ts +69 -37
  242. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  243. package/lib/langium/scope/scope-extension-service.js +102 -29
  244. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  245. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  246. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  247. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  248. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  249. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  250. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  251. package/lib/langium/serialization/abstract-serializer.js +54 -30
  252. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  253. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  254. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  255. package/lib/langium/serialization/json-serializer.js +13 -3
  256. package/lib/langium/serialization/json-serializer.js.map +1 -1
  257. package/lib/langium/serialization/serializer.d.ts +1 -1
  258. package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
  259. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  260. package/lib/langium/serialization/yaml-serializer.js +24 -4
  261. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  262. package/lib/langium/service-registry.d.ts +29 -1
  263. package/lib/langium/service-registry.d.ts.map +1 -1
  264. package/lib/langium/service-registry.js +37 -0
  265. package/lib/langium/service-registry.js.map +1 -1
  266. package/lib/langium/shared-services.d.ts +10 -4
  267. package/lib/langium/shared-services.d.ts.map +1 -1
  268. package/lib/langium/shared-services.js.map +1 -1
  269. package/lib/langium/single-langium-copy.d.ts +22 -0
  270. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  271. package/lib/langium/single-langium-copy.js +36 -0
  272. package/lib/langium/single-langium-copy.js.map +1 -0
  273. package/lib/langium/transfer/transfer-encoder.d.ts +60 -39
  274. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  275. package/lib/langium/transfer/transfer-encoder.js +35 -24
  276. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  277. package/lib/langium/trivia/comment-preserver.d.ts +543 -0
  278. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  279. package/lib/langium/trivia/comment-preserver.js +1165 -0
  280. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  281. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  282. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  283. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  284. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  285. package/lib/langium/trivia/index.d.ts +14 -0
  286. package/lib/langium/trivia/index.d.ts.map +1 -0
  287. package/lib/langium/trivia/index.js +14 -0
  288. package/lib/langium/trivia/index.js.map +1 -0
  289. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  290. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  291. package/lib/langium/trivia/trivia-contribution.js +10 -0
  292. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  293. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  294. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  295. package/lib/langium/trivia/trivia-preserver.js +10 -0
  296. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  297. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  298. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  299. package/lib/langium/trivia/trivia-service.js +56 -0
  300. package/lib/langium/trivia/trivia-service.js.map +1 -0
  301. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  302. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  303. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  304. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  305. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  306. package/lib/langium/validation/document-validator.d.ts +168 -23
  307. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  308. package/lib/langium/validation/document-validator.js +264 -26
  309. package/lib/langium/validation/document-validator.js.map +1 -1
  310. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  311. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  312. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  313. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  314. package/lib/langium/workspace/ast-node-locator.d.ts +24 -0
  315. package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
  316. package/lib/langium/workspace/ast-node-locator.js +32 -0
  317. package/lib/langium/workspace/ast-node-locator.js.map +1 -0
  318. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  319. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  320. package/lib/langium/workspace/document-uri-policy.js +22 -13
  321. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  322. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  323. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  324. package/lib/langium/workspace/file-not-found.js +31 -0
  325. package/lib/langium/workspace/file-not-found.js.map +1 -0
  326. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  327. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  328. package/lib/langium/workspace/file-system-provider.js +115 -13
  329. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  330. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +78 -4
  331. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  332. package/lib/langium/workspace/hydranium-langium-document-factory.js +188 -5
  333. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  334. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +50 -1
  335. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  336. package/lib/langium/workspace/hydranium-workspace-lock.js +73 -1
  337. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  338. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +105 -21
  339. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  340. package/lib/langium/workspace/hydranium-workspace-manager.js +186 -31
  341. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  342. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  343. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  344. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  345. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  346. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  347. package/lib/langium/workspace/index-manager.js.map +1 -1
  348. package/lib/langium/workspace/index.d.ts +3 -0
  349. package/lib/langium/workspace/index.d.ts.map +1 -1
  350. package/lib/langium/workspace/index.js +3 -0
  351. package/lib/langium/workspace/index.js.map +1 -1
  352. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  353. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  354. package/lib/langium/workspace/initialize-workspace.js +68 -3
  355. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  356. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  357. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  358. package/lib/langium/workspace/langium-documents.js +18 -1
  359. package/lib/langium/workspace/langium-documents.js.map +1 -1
  360. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  361. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  362. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  363. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  364. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +7 -9
  365. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  366. package/lib/{documents → langium/workspace}/self-save-registry.js +9 -11
  367. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  368. package/lib/langium/workspace/syntax-errors.d.ts +23 -0
  369. package/lib/langium/workspace/syntax-errors.d.ts.map +1 -0
  370. package/lib/langium/workspace/syntax-errors.js +29 -0
  371. package/lib/langium/workspace/syntax-errors.js.map +1 -0
  372. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  373. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  374. package/lib/langium/workspace/virtual-document.js +87 -24
  375. package/lib/langium/workspace/virtual-document.js.map +1 -1
  376. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  377. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  378. package/lib/langium/workspace/write-lock-scope.js +15 -5
  379. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  380. package/lib/launcher/integrated-server.d.ts +3 -1
  381. package/lib/launcher/integrated-server.d.ts.map +1 -1
  382. package/lib/locale/server-locale.d.ts +6 -6
  383. package/lib/locale/server-locale.d.ts.map +1 -1
  384. package/lib/locale/server-locale.js.map +1 -1
  385. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  386. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  387. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  388. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  389. package/lib/lsp/connection-features.d.ts +23 -0
  390. package/lib/lsp/connection-features.d.ts.map +1 -0
  391. package/lib/lsp/connection-features.js +60 -0
  392. package/lib/lsp/connection-features.js.map +1 -0
  393. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  394. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  395. package/lib/lsp/diagnostics-connection.js +53 -0
  396. package/lib/lsp/diagnostics-connection.js.map +1 -0
  397. package/lib/lsp/edit-requests-guard.d.ts +31 -0
  398. package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
  399. package/lib/lsp/edit-requests-guard.js +125 -0
  400. package/lib/lsp/edit-requests-guard.js.map +1 -0
  401. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  402. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  403. package/lib/lsp/hydranium-document-update-handler.js +234 -101
  404. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  405. package/lib/lsp/index.d.ts +6 -2
  406. package/lib/lsp/index.d.ts.map +1 -1
  407. package/lib/lsp/index.js +6 -2
  408. package/lib/lsp/index.js.map +1 -1
  409. package/lib/lsp/lsp-latency.d.ts +39 -0
  410. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  411. package/lib/lsp/lsp-latency.js +58 -0
  412. package/lib/lsp/lsp-latency.js.map +1 -0
  413. package/lib/lsp/save-text-document.d.ts +31 -0
  414. package/lib/lsp/save-text-document.d.ts.map +1 -0
  415. package/lib/lsp/save-text-document.js +52 -0
  416. package/lib/lsp/save-text-document.js.map +1 -0
  417. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  418. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  419. package/lib/lsp/semantic-token-provider.js +98 -9
  420. package/lib/lsp/semantic-token-provider.js.map +1 -1
  421. package/lib/lsp/shared-module.d.ts +4 -8
  422. package/lib/lsp/shared-module.d.ts.map +1 -1
  423. package/lib/lsp/shared-module.js.map +1 -1
  424. package/lib/lsp/start-language-server.d.ts +12 -7
  425. package/lib/lsp/start-language-server.d.ts.map +1 -1
  426. package/lib/lsp/start-language-server.js +21 -7
  427. package/lib/lsp/start-language-server.js.map +1 -1
  428. package/lib/messages/carriers.d.ts +4 -6
  429. package/lib/messages/carriers.d.ts.map +1 -1
  430. package/lib/messages/carriers.js +4 -6
  431. package/lib/messages/carriers.js.map +1 -1
  432. package/lib/messages/index.d.ts +2 -2
  433. package/lib/messages/index.d.ts.map +1 -1
  434. package/lib/messages/index.js +2 -2
  435. package/lib/messages/index.js.map +1 -1
  436. package/lib/messages/renderer.d.ts +10 -4
  437. package/lib/messages/renderer.d.ts.map +1 -1
  438. package/lib/messages/renderer.js +6 -0
  439. package/lib/messages/renderer.js.map +1 -1
  440. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  441. package/lib/node/event-loop-monitor.js +3 -2
  442. package/lib/node/event-loop-monitor.js.map +1 -1
  443. package/lib/node/heap-ceiling.d.ts +61 -0
  444. package/lib/node/heap-ceiling.d.ts.map +1 -0
  445. package/lib/node/heap-ceiling.js +72 -0
  446. package/lib/node/heap-ceiling.js.map +1 -0
  447. package/lib/node/index.d.ts +1 -1
  448. package/lib/node/index.d.ts.map +1 -1
  449. package/lib/node/index.js +5 -1
  450. package/lib/node/index.js.map +1 -1
  451. package/lib/node/latency-from-env.d.ts +1 -1
  452. package/lib/node/latency-from-env.js +1 -1
  453. package/lib/node/lint-grammar.js.map +1 -1
  454. package/lib/node/log-file-sink.d.ts +3 -2
  455. package/lib/node/log-file-sink.d.ts.map +1 -1
  456. package/lib/node/log-file-sink.js +6 -2
  457. package/lib/node/log-file-sink.js.map +1 -1
  458. package/lib/node/log-preamble-node.d.ts +5 -3
  459. package/lib/node/log-preamble-node.d.ts.map +1 -1
  460. package/lib/node/log-preamble-node.js +13 -10
  461. package/lib/node/log-preamble-node.js.map +1 -1
  462. package/lib/node/measure-memory.d.ts.map +1 -1
  463. package/lib/node/measure-memory.js +5 -4
  464. package/lib/node/measure-memory.js.map +1 -1
  465. package/lib/node/memory-monitor.d.ts +2 -2
  466. package/lib/node/memory-monitor.d.ts.map +1 -1
  467. package/lib/node/memory-monitor.js +9 -10
  468. package/lib/node/memory-monitor.js.map +1 -1
  469. package/lib/node/node-file-system-provider.d.ts +67 -9
  470. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  471. package/lib/node/node-file-system-provider.js +198 -53
  472. package/lib/node/node-file-system-provider.js.map +1 -1
  473. package/lib/node/profile-capture.d.ts +12 -4
  474. package/lib/node/profile-capture.d.ts.map +1 -1
  475. package/lib/node/profile-capture.js +8 -6
  476. package/lib/node/profile-capture.js.map +1 -1
  477. package/lib/node/profile-digest.js.map +1 -1
  478. package/lib/node/profiling-run.d.ts +13 -3
  479. package/lib/node/profiling-run.d.ts.map +1 -1
  480. package/lib/node/profiling-run.js +17 -8
  481. package/lib/node/profiling-run.js.map +1 -1
  482. package/lib/node/rename-over-open-readers.d.ts +61 -0
  483. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  484. package/lib/node/rename-over-open-readers.js +80 -0
  485. package/lib/node/rename-over-open-readers.js.map +1 -0
  486. package/lib/node/server-diagnostics.js +1 -1
  487. package/lib/node/server-diagnostics.js.map +1 -1
  488. package/lib/node/server-state-snapshot.d.ts +6 -5
  489. package/lib/node/server-state-snapshot.d.ts.map +1 -1
  490. package/lib/node/server-state-snapshot.js +20 -17
  491. package/lib/node/server-state-snapshot.js.map +1 -1
  492. package/lib/node/socket-launcher.d.ts +43 -7
  493. package/lib/node/socket-launcher.d.ts.map +1 -1
  494. package/lib/node/socket-launcher.js +42 -7
  495. package/lib/node/socket-launcher.js.map +1 -1
  496. package/lib/node/startup-cpu-profile.d.ts +29 -0
  497. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  498. package/lib/node/startup-cpu-profile.js +91 -0
  499. package/lib/node/startup-cpu-profile.js.map +1 -0
  500. package/lib/node/stdio-launcher.d.ts +13 -13
  501. package/lib/node/stdio-launcher.d.ts.map +1 -1
  502. package/lib/node/stdio-launcher.js +21 -11
  503. package/lib/node/stdio-launcher.js.map +1 -1
  504. package/lib/node/validate-workspace.d.ts +1 -1
  505. package/lib/node/validate-workspace.d.ts.map +1 -1
  506. package/lib/node/validate-workspace.js +5 -1
  507. package/lib/node/validate-workspace.js.map +1 -1
  508. package/lib/testing/document-uri-policy-conformance.js +1 -1
  509. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  510. package/lib/testing/fake-description.js.map +1 -1
  511. package/lib/testing/fake-document.d.ts +2 -1
  512. package/lib/testing/fake-document.d.ts.map +1 -1
  513. package/lib/testing/fake-document.js.map +1 -1
  514. package/lib/testing/index.d.ts +1 -1
  515. package/lib/testing/index.d.ts.map +1 -1
  516. package/lib/testing/index.js +2 -1
  517. package/lib/testing/index.js.map +1 -1
  518. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  519. package/lib/testing/langium-test-helpers.js +1 -0
  520. package/lib/testing/langium-test-helpers.js.map +1 -1
  521. package/lib/testing/make-noop-language-services.js.map +1 -1
  522. package/lib/testing/make-noop-shared-services.js.map +1 -1
  523. package/lib/testing/make-test-services.d.ts +45 -14
  524. package/lib/testing/make-test-services.d.ts.map +1 -1
  525. package/lib/testing/make-test-services.js +23 -7
  526. package/lib/testing/make-test-services.js.map +1 -1
  527. package/lib/testing/make-test-tracer.d.ts +12 -0
  528. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  529. package/lib/testing/make-test-tracer.js +13 -0
  530. package/lib/testing/make-test-tracer.js.map +1 -1
  531. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  532. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  533. package/lib/testing/node/applied-edit-capture.js +117 -0
  534. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  535. package/lib/testing/node/golden-corpus.js.map +1 -1
  536. package/lib/testing/node/index.d.ts +4 -1
  537. package/lib/testing/node/index.d.ts.map +1 -1
  538. package/lib/testing/node/index.js +4 -1
  539. package/lib/testing/node/index.js.map +1 -1
  540. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  541. package/lib/testing/node/lsp-harness.js +2 -0
  542. package/lib/testing/node/lsp-harness.js.map +1 -1
  543. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  544. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  545. package/lib/testing/node/lsp-server-connection.js +49 -106
  546. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  547. package/lib/testing/node/scratch-workspace.d.ts +2 -1
  548. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  549. package/lib/testing/node/scratch-workspace.js +12 -6
  550. package/lib/testing/node/scratch-workspace.js.map +1 -1
  551. package/lib/testing/node/settle-server.d.ts +33 -0
  552. package/lib/testing/node/settle-server.d.ts.map +1 -0
  553. package/lib/testing/node/settle-server.js +84 -0
  554. package/lib/testing/node/settle-server.js.map +1 -0
  555. package/lib/testing/node/spawned-server.d.ts +30 -1
  556. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  557. package/lib/testing/node/spawned-server.js +39 -2
  558. package/lib/testing/node/spawned-server.js.map +1 -1
  559. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  560. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  561. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  562. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  563. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  564. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  565. package/lib/testing/playwright/index.d.ts +1 -0
  566. package/lib/testing/playwright/index.d.ts.map +1 -1
  567. package/lib/testing/playwright/index.js +1 -0
  568. package/lib/testing/playwright/index.js.map +1 -1
  569. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  570. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  571. package/lib/testing/playwright/server-log-capture.js +111 -40
  572. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  573. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  574. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  575. package/lib/testing/playwright/server-log-fixture.js +25 -6
  576. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  577. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  578. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  579. package/lib/testing/playwright/server-log-region.js +30 -0
  580. package/lib/testing/playwright/server-log-region.js.map +1 -0
  581. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  582. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  583. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  584. package/lib/testing/run-update-pipeline.d.ts +8 -5
  585. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  586. package/lib/testing/run-update-pipeline.js.map +1 -1
  587. package/lib/testing/stub-ast-document-manager.d.ts +11 -51
  588. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  589. package/lib/testing/stub-ast-document-manager.js +31 -59
  590. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  591. package/lib/testing/stub-document-builder.d.ts +25 -11
  592. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  593. package/lib/testing/stub-document-builder.js +91 -2
  594. package/lib/testing/stub-document-builder.js.map +1 -1
  595. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  596. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  597. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  598. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  599. package/lib/testing/stub-index-manager.js.map +1 -1
  600. package/lib/testing/stub-langium-documents.d.ts +3 -2
  601. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  602. package/lib/testing/stub-langium-documents.js.map +1 -1
  603. package/lib/testing/stub-model-service.d.ts +8 -7
  604. package/lib/testing/stub-model-service.d.ts.map +1 -1
  605. package/lib/testing/stub-model-service.js +4 -4
  606. package/lib/testing/stub-model-service.js.map +1 -1
  607. package/lib/testing/stub-project-manager.d.ts.map +1 -1
  608. package/lib/testing/stub-project-manager.js +10 -0
  609. package/lib/testing/stub-project-manager.js.map +1 -1
  610. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  611. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  612. package/lib/testing/stub-service-registry.d.ts +1 -1
  613. package/lib/testing/stub-service-registry.js.map +1 -1
  614. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  615. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  616. package/lib/testing/stub-writable-file-system.js +2 -1
  617. package/lib/testing/stub-writable-file-system.js.map +1 -1
  618. package/lib/util/connection-liveness.d.ts +22 -6
  619. package/lib/util/connection-liveness.d.ts.map +1 -1
  620. package/lib/util/connection-liveness.js +75 -15
  621. package/lib/util/connection-liveness.js.map +1 -1
  622. package/lib/util/environment.d.ts +7 -0
  623. package/lib/util/environment.d.ts.map +1 -1
  624. package/lib/util/environment.js +15 -1
  625. package/lib/util/environment.js.map +1 -1
  626. package/lib/util/registry.d.ts.map +1 -1
  627. package/package.json +41 -60
  628. package/src/browser/host-heads-in-worker.ts +218 -0
  629. package/src/browser/index.ts +17 -0
  630. package/src/browser/indexeddb-file-system-store.ts +192 -0
  631. package/src/browser/start-language-server-in-worker.ts +56 -0
  632. package/src/documents/ast-document-manager.ts +477 -250
  633. package/src/documents/client-ids.ts +5 -22
  634. package/src/documents/client-session-errors.ts +26 -0
  635. package/src/documents/client-session-registry.ts +262 -0
  636. package/src/documents/dirty-state-tracker.ts +167 -0
  637. package/src/documents/document-release-handler.ts +404 -0
  638. package/src/documents/document-release-scheduler.ts +121 -0
  639. package/src/documents/file-system-task-queue.ts +77 -0
  640. package/src/documents/hydranium-text-documents.ts +1044 -615
  641. package/src/documents/index.ts +10 -2
  642. package/src/documents/language-client-shadow.ts +501 -0
  643. package/src/documents/model-ledger.ts +66 -0
  644. package/src/documents/text-ledger.ts +112 -0
  645. package/src/documents/version-sync-service.ts +304 -0
  646. package/src/index.ts +3 -0
  647. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  648. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  649. package/src/langium/bootstrap.ts +79 -43
  650. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  651. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  652. package/src/langium/composite-ast-reflection.ts +112 -0
  653. package/src/langium/config/configuration-provider.ts +119 -0
  654. package/src/langium/config/index.ts +1 -0
  655. package/src/langium/diagnostics/console-tee.ts +150 -0
  656. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  657. package/src/langium/diagnostics/log-preamble.ts +1 -1
  658. package/src/langium/diagnostics/logger.ts +51 -17
  659. package/src/langium/diagnostics/lsp-logger.ts +83 -45
  660. package/src/langium/document-builder/build-pipeline-integration.ts +57 -32
  661. package/src/langium/document-builder/build-session.ts +4 -3
  662. package/src/langium/document-builder/document-builder.ts +773 -106
  663. package/src/langium/integration-services.ts +20 -23
  664. package/src/langium/integrity/integrity-rule.ts +22 -8
  665. package/src/langium/integrity/integrity-service.ts +656 -90
  666. package/src/langium/keys/containment.ts +3 -2
  667. package/src/langium/keys/name-based-key-provider.ts +24 -12
  668. package/src/langium/language-module.ts +52 -9
  669. package/src/langium/model-service/client-session.ts +769 -0
  670. package/src/langium/model-service/index.ts +2 -0
  671. package/src/langium/model-service/model-events.ts +82 -0
  672. package/src/langium/model-service/model-service.ts +885 -532
  673. package/src/langium/module.ts +141 -65
  674. package/src/langium/naming/name-provider.ts +34 -8
  675. package/src/langium/project/abstract-project-manager.ts +409 -20
  676. package/src/langium/project/project-change-event.ts +25 -3
  677. package/src/langium/project/project-manager.ts +31 -2
  678. package/src/langium/project/single-project-manager.ts +16 -1
  679. package/src/langium/residency/cst-residency-service.ts +210 -87
  680. package/src/langium/scope/ast-node-description-provider.ts +111 -16
  681. package/src/langium/scope/built-local-symbols.ts +13 -0
  682. package/src/langium/scope/fallback-scope.ts +38 -0
  683. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  684. package/src/langium/scope/hydranium-scope-provider.ts +245 -41
  685. package/src/langium/scope/index.ts +1 -0
  686. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  687. package/src/langium/scope/scope-extension-service.ts +148 -56
  688. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  689. package/src/langium/serialization/abstract-serializer.ts +57 -41
  690. package/src/langium/serialization/json-serializer.ts +14 -3
  691. package/src/langium/serialization/serializer.ts +1 -1
  692. package/src/langium/serialization/yaml-serializer.ts +26 -4
  693. package/src/langium/service-registry.ts +41 -2
  694. package/src/langium/shared-services.ts +13 -4
  695. package/src/langium/single-langium-copy.ts +42 -0
  696. package/src/langium/transfer/transfer-encoder.ts +76 -50
  697. package/src/langium/trivia/comment-preserver.ts +1410 -0
  698. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  699. package/src/langium/trivia/index.ts +14 -0
  700. package/src/langium/trivia/trivia-contribution.ts +39 -0
  701. package/src/langium/trivia/trivia-preserver.ts +56 -0
  702. package/src/langium/trivia/trivia-service.ts +99 -0
  703. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  704. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  705. package/src/langium/validation/document-validator.ts +312 -31
  706. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  707. package/src/langium/workspace/ast-node-locator.ts +33 -0
  708. package/src/langium/workspace/document-uri-policy.ts +32 -18
  709. package/src/langium/workspace/file-not-found.ts +35 -0
  710. package/src/langium/workspace/file-system-provider.ts +258 -16
  711. package/src/langium/workspace/hydranium-langium-document-factory.ts +239 -4
  712. package/src/langium/workspace/hydranium-workspace-lock.ts +101 -2
  713. package/src/langium/workspace/hydranium-workspace-manager.ts +214 -35
  714. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  715. package/src/langium/workspace/index.ts +3 -0
  716. package/src/langium/workspace/initialize-workspace.ts +96 -4
  717. package/src/langium/workspace/langium-documents.ts +19 -1
  718. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  719. package/src/{documents → langium/workspace}/self-save-registry.ts +12 -14
  720. package/src/langium/workspace/syntax-errors.ts +34 -0
  721. package/src/langium/workspace/virtual-document.ts +106 -25
  722. package/src/langium/workspace/write-lock-scope.ts +27 -12
  723. package/src/launcher/integrated-server.ts +3 -1
  724. package/src/locale/server-locale.ts +6 -6
  725. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  726. package/src/lsp/connection-features.ts +67 -0
  727. package/src/lsp/diagnostics-connection.ts +56 -0
  728. package/src/lsp/edit-requests-guard.ts +152 -0
  729. package/src/lsp/hydranium-document-update-handler.ts +284 -110
  730. package/src/lsp/index.ts +6 -2
  731. package/src/lsp/lsp-latency.ts +62 -0
  732. package/src/lsp/save-text-document.ts +63 -0
  733. package/src/lsp/semantic-token-provider.ts +146 -8
  734. package/src/lsp/shared-module.ts +4 -8
  735. package/src/lsp/start-language-server.ts +21 -7
  736. package/src/messages/carriers.ts +4 -6
  737. package/src/messages/index.ts +11 -2
  738. package/src/messages/renderer.ts +11 -3
  739. package/src/node/event-loop-monitor.ts +3 -4
  740. package/src/node/heap-ceiling.ts +108 -0
  741. package/src/node/index.ts +5 -1
  742. package/src/node/latency-from-env.ts +1 -1
  743. package/src/node/log-file-sink.ts +6 -2
  744. package/src/node/log-preamble-node.ts +20 -10
  745. package/src/node/measure-memory.ts +5 -4
  746. package/src/node/memory-monitor.ts +10 -10
  747. package/src/node/node-file-system-provider.ts +214 -57
  748. package/src/node/profile-capture.ts +16 -15
  749. package/src/node/profiling-run.ts +30 -8
  750. package/src/node/rename-over-open-readers.ts +94 -0
  751. package/src/node/server-diagnostics.ts +1 -1
  752. package/src/node/server-state-snapshot.ts +28 -20
  753. package/src/node/socket-launcher.ts +78 -14
  754. package/src/node/startup-cpu-profile.ts +94 -0
  755. package/src/node/stdio-launcher.ts +29 -19
  756. package/src/node/validate-workspace.ts +8 -2
  757. package/src/testing/document-uri-policy-conformance.ts +1 -1
  758. package/src/testing/fake-document.ts +2 -1
  759. package/src/testing/index.ts +2 -1
  760. package/src/testing/langium-test-helpers.ts +1 -0
  761. package/src/testing/make-test-services.ts +83 -31
  762. package/src/testing/make-test-tracer.ts +26 -0
  763. package/src/testing/node/applied-edit-capture.ts +141 -0
  764. package/src/testing/node/index.ts +4 -1
  765. package/src/testing/node/lsp-harness.ts +2 -0
  766. package/src/testing/node/lsp-server-connection.ts +83 -119
  767. package/src/testing/node/scratch-workspace.ts +12 -6
  768. package/src/testing/node/settle-server.ts +89 -0
  769. package/src/testing/node/spawned-server.ts +57 -3
  770. package/src/testing/parse-semantic-root.ts +1 -1
  771. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  772. package/src/testing/playwright/index.ts +1 -0
  773. package/src/testing/playwright/server-log-capture.ts +137 -47
  774. package/src/testing/playwright/server-log-fixture.ts +46 -6
  775. package/src/testing/playwright/server-log-region.ts +32 -0
  776. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  777. package/src/testing/run-update-pipeline.ts +8 -5
  778. package/src/testing/stub-ast-document-manager.ts +47 -123
  779. package/src/testing/stub-document-builder.ts +128 -15
  780. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  781. package/src/testing/stub-langium-documents.ts +3 -2
  782. package/src/testing/stub-model-service.ts +9 -8
  783. package/src/testing/stub-project-manager.ts +10 -0
  784. package/src/testing/stub-self-save-registry.ts +1 -1
  785. package/src/testing/stub-service-registry.ts +1 -1
  786. package/src/testing/stub-writable-file-system.ts +3 -2
  787. package/src/util/connection-liveness.ts +81 -15
  788. package/src/util/environment.ts +24 -2
  789. package/lib/documents/language-client-text-shadow.d.ts +0 -124
  790. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  791. package/lib/documents/language-client-text-shadow.js +0 -190
  792. package/lib/documents/language-client-text-shadow.js.map +0 -1
  793. package/lib/documents/self-save-registry.d.ts.map +0 -1
  794. package/lib/documents/self-save-registry.js.map +0 -1
  795. package/lib/lsp/instrument-connection.d.ts +0 -36
  796. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  797. package/lib/lsp/instrument-connection.js +0 -62
  798. package/lib/lsp/instrument-connection.js.map +0 -1
  799. package/lib/node/process-memory.d.ts +0 -66
  800. package/lib/node/process-memory.d.ts.map +0 -1
  801. package/lib/node/process-memory.js +0 -252
  802. package/lib/node/process-memory.js.map +0 -1
  803. package/src/documents/language-client-text-shadow.ts +0 -211
  804. package/src/lsp/instrument-connection.ts +0 -66
  805. package/src/node/process-memory.ts +0 -299
@@ -7,25 +7,79 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Deferred, type Project, type Tracer, UNQUALIFIED_PROJECT_REFERENCE } from '@hydranium/protocol';
10
+ import { Deferred, type Project, type Tracer, UNQUALIFIED_PROJECT_REFERENCE, describeErrorWithStack } from '@hydranium/protocol';
11
11
  import {
12
12
  type AstNode,
13
13
  AstUtils,
14
- type DocumentBuilder,
14
+ DocumentState,
15
15
  type FileSystemProvider,
16
+ isOperationCancelled,
16
17
  type LangiumDocument,
17
18
  type LangiumDocuments,
19
+ OperationCancelled,
18
20
  type URI,
19
- UriUtils
21
+ UriUtils,
22
+ type WorkspaceLock
20
23
  } from '@hydranium/langium';
21
- import { Disposable } from 'vscode-languageserver';
24
+ import { CancellationToken, Disposable } from 'vscode-languageserver';
22
25
  import type { WorkspaceFolder } from 'vscode-languageserver-types';
23
26
  import type { LogNameOptions } from '../diagnostics/logger.js';
27
+ import { HYDRANIUM_BUILD_REASONS, type HydraniumDocumentBuilder } from '../document-builder/document-builder.js';
24
28
  import { type ServerSharedServicesMinimal } from '../shared-services.js';
25
29
  import { isVirtualUri } from '../workspace/virtual-document.js';
26
- import type { ProjectChangeEvent, ProjectChangeListener } from './project-change-event.js';
30
+ import type {
31
+ MemberRelinkFinishedEvent,
32
+ MemberRelinkFinishedListener,
33
+ MemberRelinkStartedListener,
34
+ ProjectChangeEvent,
35
+ ProjectChangeListener
36
+ } from './project-change-event.js';
27
37
  import type { ProjectManager } from './project-manager.js';
28
38
 
39
+ /** Constructor options for {@link AbstractProjectManager}. */
40
+ export interface ProjectManagerOptions extends LogNameOptions {
41
+ /**
42
+ * Relink the member documents a descriptor change affects in a build of
43
+ * their own, queued once the build of the change has ended. The write that
44
+ * changed the descriptor then answers without waiting for them, and they
45
+ * keep the links they had until that build starts. An explicit
46
+ * `DocumentBuilder.build`, such as workspace initialization, keeps them in
47
+ * the build of the change, as without the option. Default `false`.
48
+ *
49
+ * A member already below its last phase stays in the build of the change,
50
+ * which builds it anyway. That includes every member with a linking error,
51
+ * which Langium relinks in every update. So a save that adds a dependency
52
+ * still waits for the members it makes resolve.
53
+ *
54
+ * A write that lands while that build runs cancels it. The write's own
55
+ * build then relinks the members still below `Validated`, since an update
56
+ * builds every such document, and the next follow-up takes the rest. A
57
+ * save made once that build has started therefore waits for part of the
58
+ * relink. The follow-up is queued behind every write, so while writes keep
59
+ * arriving, the members keep the links they had until the writes pause.
60
+ *
61
+ * A test or a teardown awaits {@link ProjectManager.memberRelinkSettled}
62
+ * after a descriptor change, or the relink runs against a workspace already
63
+ * removed.
64
+ *
65
+ * A member counts as relinked only once a build links it, so under
66
+ * Langium's `eagerLinking: false`, which skips that phase, the follow-up
67
+ * builds even a member a later write has built.
68
+ */
69
+ readonly deferMemberRelink?: boolean;
70
+ /**
71
+ * Which projects a project's references resolve against:
72
+ * `'transitive'`, the default, is the closure of its
73
+ * {@link Project.dependencies}, and `'direct'` only the projects it names.
74
+ *
75
+ * It decides visibility only. A change still rebuilds every project that
76
+ * reaches the changed one through its dependencies, at any depth, since a
77
+ * rebuild replaces the nodes their references point to, and a project two
78
+ * steps away that is not relinked keeps references to the replaced nodes.
79
+ */
80
+ readonly visibility?: 'transitive' | 'direct';
81
+ }
82
+
29
83
  /**
30
84
  * Abstract base for project-aware {@link ProjectManager} implementations.
31
85
  * Implements the machinery: registry, auto-subscription to
@@ -56,7 +110,13 @@ import type { ProjectManager } from './project-manager.js';
56
110
  * transitively in reverse (projects whose dep closure touches a changed
57
111
  * project also rebuild). Override for a different rebuild policy.
58
112
  * - {@link getVisibleProjects} — default walks {@link Project.dependencies}
59
- * transitively. Override for a different visibility model.
113
+ * as far as {@link ProjectManagerOptions.visibility} reaches. Override for
114
+ * a different visibility model.
115
+ * - {@link shouldDeferMemberRelink} — default follows
116
+ * {@link ProjectManagerOptions.deferMemberRelink}. Override for a different
117
+ * choice of which builds leave the members to a follow-up build.
118
+ * - {@link collectAffectedDocuments} — default collects the affected
119
+ * projects' members. Override to add documents a change affects otherwise.
60
120
  * - {@link computeProject} — default uses closest-ancestor-descriptor-folder
61
121
  * membership. Override for a different membership model; overriding
62
122
  * {@link getProject} instead loses the memoization it wraps.
@@ -86,20 +146,67 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
86
146
 
87
147
  protected readonly fileSystemProvider: FileSystemProvider;
88
148
  protected readonly langiumDocuments: LangiumDocuments;
89
- protected readonly documentBuilder: DocumentBuilder;
149
+ protected readonly documentBuilder: HydraniumDocumentBuilder;
150
+ protected readonly workspaceLock: WorkspaceLock;
90
151
  protected readonly tracer: Tracer;
152
+ /** Resolved from {@link ProjectManagerOptions.deferMemberRelink}. */
153
+ protected readonly deferMemberRelink: boolean;
154
+ /** Resolved from {@link ProjectManagerOptions.visibility}. */
155
+ protected readonly visibility: 'transitive' | 'direct';
156
+
157
+ /** Member documents a deferred relink has yet to take, by URI string. */
158
+ protected readonly pendingMemberRelink = new Map<string, URI>();
159
+ /** The keys of {@link pendingMemberRelink} to reset before they are built, whatever their state. */
160
+ protected readonly pendingMemberResets = new Set<string>();
161
+ /**
162
+ * The keys of every queued or taken member that no build has relinked yet.
163
+ * A member leaves once a build links it and then delivers its last phase
164
+ * to every listener, whichever build that is: `Validated`, or
165
+ * `IndexedReferences` when that build does not validate it.
166
+ */
167
+ protected readonly unrelinkedMembers = new Set<string>();
168
+ /** The keys of {@link unrelinkedMembers} a build has linked since they were queued. */
169
+ protected readonly linkedMembers = new Set<string>();
170
+ /** Set from {@link queueMemberRelink} until {@link runMemberRelink} takes {@link pendingMemberRelink}. */
171
+ protected memberRelinkQueued = false;
172
+ /** Set once {@link registerMemberPhaseListeners} has run. */
173
+ protected memberPhaseListenersRegistered = false;
174
+ /** One per {@link runMemberRelink}, until it ends. */
175
+ protected readonly memberRelinks = new Set<Promise<void>>();
176
+ protected readonly memberRelinkStartedListeners = new Set<MemberRelinkStartedListener>();
177
+ protected readonly memberRelinkFinishedListeners = new Set<MemberRelinkFinishedListener>();
91
178
 
92
179
  constructor(
93
180
  protected readonly services: ServerSharedServicesMinimal,
94
- options: LogNameOptions = {}
181
+ options: ProjectManagerOptions = {}
95
182
  ) {
96
183
  this.fileSystemProvider = services.workspace.FileSystemProvider;
97
184
  this.langiumDocuments = services.workspace.LangiumDocuments;
98
185
  this.documentBuilder = services.workspace.DocumentBuilder;
186
+ this.workspaceLock = services.workspace.WorkspaceLock;
187
+ this.deferMemberRelink = options.deferMemberRelink ?? false;
188
+ this.visibility = options.visibility ?? 'transitive';
99
189
  this.tracer = services.Tracer.for(options.logName ?? this.constructor.name).trace('instantiated');
100
190
  this.documentBuilder.onUpdate((changed, deleted) => this.onBuildUpdate(changed, deleted));
101
191
  }
102
192
 
193
+ /**
194
+ * Track members through every build from the first deferred relink on.
195
+ * Registered then rather than here, so a manager that never defers adds no
196
+ * listener to each document's phases.
197
+ */
198
+ protected registerMemberPhaseListeners(): void {
199
+ this.memberPhaseListenersRegistered = true;
200
+ this.documentBuilder.onDocumentPhase(DocumentState.Linked, document => this.onMemberLinked(document.uri));
201
+ for (const phase of [DocumentState.IndexedReferences, DocumentState.Validated]) {
202
+ this.documentBuilder.onDocumentPhaseDelivered(phase, document => {
203
+ if (this.lastPhaseOf(document) === phase) {
204
+ this.onMemberDelivered(document.uri);
205
+ }
206
+ });
207
+ }
208
+ }
209
+
103
210
  get ready(): Promise<void> {
104
211
  return this.readyDeferred.promise;
105
212
  }
@@ -225,7 +332,7 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
225
332
  try {
226
333
  entries = await this.fileSystemProvider.readDirectory(folder);
227
334
  } catch (error) {
228
- this.tracer.warn(`Failed to read directory ${folder.toString()}: ${error}`);
335
+ this.tracer.warn(`Failed to read directory ${folder.toString()}: ${describeErrorWithStack(error)}`);
229
336
  return;
230
337
  }
231
338
  for (const entry of entries) {
@@ -258,10 +365,10 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
258
365
  * Compute the set of projects whose member documents need to rebuild
259
366
  * given the directly changed projects. Default walks the dependency
260
367
  * graph in reverse — any project whose declared {@link Project.dependencies}
261
- * include a changed id transitively also rebuilds (cycle-safe).
368
+ * include a changed id transitively also rebuilds (cycle-safe), whatever
369
+ * {@link visibility} is (see {@link ProjectManagerOptions.visibility}).
262
370
  *
263
- * Override for a different rebuild policy (no transitivity, custom
264
- * reachability, etc.).
371
+ * Override for a different rebuild policy (custom reachability, etc.).
265
372
  */
266
373
  protected getAffectedProjects(directlyChanged: readonly string[]): readonly string[] {
267
374
  const result = new Set(directlyChanged);
@@ -304,13 +411,19 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
304
411
  }
305
412
 
306
413
  /**
307
- * Default: transitive closure of {@link Project.dependencies} including
308
- * the source project itself. Override for a different visibility model.
414
+ * Default: the source project itself, then the closure of its
415
+ * {@link Project.dependencies}, or only the dependencies it names when
416
+ * {@link visibility} is `'direct'`. A dependency that is not registered is
417
+ * skipped. Override for a different visibility model.
309
418
  */
310
419
  getVisibleProjects(projectId: string): readonly string[] {
311
- if (!this.projects.has(projectId)) {
420
+ const project = this.projects.get(projectId);
421
+ if (!project) {
312
422
  return [];
313
423
  }
424
+ if (this.visibility === 'direct') {
425
+ return [...new Set([projectId, ...(project.dependencies ?? []).filter(dep => this.projects.has(dep))])];
426
+ }
314
427
  const visited = new Set<string>();
315
428
  const ordered: string[] = [];
316
429
  this.collectVisibleProjects(projectId, visited, ordered);
@@ -377,6 +490,13 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
377
490
  protected async loadDescriptor(uri: URI): Promise<TProject | undefined> {
378
491
  try {
379
492
  const document = await this.langiumDocuments.getOrCreateDocument(uri);
493
+ if (document.state < DocumentState.Parsed) {
494
+ // `onUpdate` fires before the build parses, so the AST is still the previous edit's.
495
+ // The state is restored so the build still runs, and notifies, its own parse phase.
496
+ const state = document.state;
497
+ await this.services.workspace.LangiumDocumentFactory.update(document, CancellationToken.None);
498
+ document.state = state;
499
+ }
380
500
  const project = await this.parseProjectDescriptor(uri, document);
381
501
  if (project) {
382
502
  this.projects.set(project.id, project);
@@ -387,7 +507,7 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
387
507
  }
388
508
  return project;
389
509
  } catch (error) {
390
- this.tracer.error(`Failed to parse ${this.conceptName()} descriptor at ${uri.toString()}: ${error}`);
510
+ this.tracer.error(`Failed to parse ${this.conceptName()} descriptor at ${uri.toString()}: ${describeErrorWithStack(error)}`);
391
511
  return undefined;
392
512
  }
393
513
  }
@@ -403,9 +523,22 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
403
523
  *
404
524
  * Descriptor URIs that triggered the cycle are excluded from
405
525
  * {@link ProjectChangeEvent.affectedDocuments} — re-adding them would
406
- * loop.
526
+ * loop. When {@link shouldDeferMemberRelink} holds, the event carries only
527
+ * the members already below their last phase, which this build builds
528
+ * anyway, and the rest are queued for a follow-up build. The last phase
529
+ * is the one of the build that last carried each member, since this
530
+ * build's phases have not started yet. If validation was turned on since,
531
+ * a member that build left at `IndexedReferences` is deferred, and this
532
+ * build validates it before the follow-up relinks it.
533
+ *
534
+ * An override calls `super` before its first await, since
535
+ * {@link shouldDeferMemberRelink} only answers for the calling build until
536
+ * then.
407
537
  */
408
538
  protected async onBuildUpdate(changed: readonly URI[], deleted: readonly URI[]): Promise<void> {
539
+ // Asked before the first await, while the builder still answers for
540
+ // this call.
541
+ const deferRelink = this.shouldDeferMemberRelink();
409
542
  const changedDescriptors = changed.filter(uri => this.isDescriptorUri(uri));
410
543
  const deletedDescriptors = deleted.filter(uri => this.isDescriptorUri(uri));
411
544
  if (changedDescriptors.length === 0 && deletedDescriptors.length === 0) {
@@ -498,10 +631,44 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
498
631
  }
499
632
  const affectedDocuments = this.collectAffectedDocuments(affectedProjectIds, excluded);
500
633
 
501
- this.emit({ added, updated, removed, affectedDocuments });
634
+ if (deferRelink) {
635
+ // The build of the change already builds what it was given.
636
+ const building = new Set(changed.map(uri => uri.toString()));
637
+ const carried: URI[] = [];
638
+ const deferred: URI[] = [];
639
+ for (const uri of affectedDocuments) {
640
+ if (building.has(uri.toString())) {
641
+ continue;
642
+ }
643
+ const document = this.langiumDocuments.getDocument(uri);
644
+ // Below its last phase, the build of the change builds it anyway.
645
+ (document && document.state < this.lastPhaseOf(document) ? carried : deferred).push(uri);
646
+ }
647
+ this.queueMemberRelink(deferred);
648
+ this.emit({ added, updated, removed, affectedDocuments: carried });
649
+ } else {
650
+ this.emit({ added, updated, removed, affectedDocuments });
651
+ }
502
652
  }
503
653
 
504
- /** Iterate the document set once, collecting URIs whose owning project is in the affected set. */
654
+ /**
655
+ * Whether the build calling {@link onBuildUpdate} leaves the documents a
656
+ * change affects to a follow-up build. Default: under
657
+ * {@link deferMemberRelink}, unless an explicit `build` calls it. Called
658
+ * before the first await of {@link onBuildUpdate}, where
659
+ * `isInsideBuildUpdate` still answers for that call.
660
+ */
661
+ protected shouldDeferMemberRelink(): boolean {
662
+ return this.deferMemberRelink && !this.documentBuilder.isInsideBuildUpdate();
663
+ }
664
+
665
+ /**
666
+ * Iterate the document set once, collecting URIs whose owning project is in
667
+ * the affected set. Override to add documents a change affects otherwise,
668
+ * such as those reached through a project's type, calling `super` to keep
669
+ * the members. What it returns is relinked as the members are, in the
670
+ * build of the change or in the follow-up build.
671
+ */
505
672
  protected collectAffectedDocuments(affectedProjectIds: ReadonlySet<string>, excludedUris: ReadonlySet<string>): URI[] {
506
673
  const result: URI[] = [];
507
674
  for (const document of this.langiumDocuments.all) {
@@ -517,6 +684,228 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
517
684
  return result;
518
685
  }
519
686
 
687
+ // ============================================================
688
+ // Deferred member relink
689
+ // ============================================================
690
+
691
+ /** One that throws is logged and skipped. */
692
+ onMemberRelinkStarted(listener: MemberRelinkStartedListener): Disposable {
693
+ this.memberRelinkStartedListeners.add(listener);
694
+ return Disposable.create(() => this.memberRelinkStartedListeners.delete(listener));
695
+ }
696
+
697
+ /** One that throws is logged and skipped. */
698
+ onMemberRelinkFinished(listener: MemberRelinkFinishedListener): Disposable {
699
+ this.memberRelinkFinishedListeners.add(listener);
700
+ return Disposable.create(() => this.memberRelinkFinishedListeners.delete(listener));
701
+ }
702
+
703
+ async memberRelinkSettled(): Promise<void> {
704
+ while (this.memberRelinks.size > 0) {
705
+ await Promise.all(this.memberRelinks);
706
+ }
707
+ }
708
+
709
+ /**
710
+ * Add `documents` to {@link pendingMemberRelink}, to be reset before they
711
+ * are built when `reset` holds, and start a {@link runMemberRelink} unless
712
+ * one is already waiting to take them.
713
+ */
714
+ protected queueMemberRelink(documents: readonly URI[], reset = true): void {
715
+ if (!this.memberPhaseListenersRegistered && documents.length > 0) {
716
+ this.registerMemberPhaseListeners();
717
+ }
718
+ for (const uri of documents) {
719
+ const key = uri.toString();
720
+ this.pendingMemberRelink.set(key, uri);
721
+ this.unrelinkedMembers.add(key);
722
+ if (reset) {
723
+ this.pendingMemberResets.add(key);
724
+ this.linkedMembers.delete(key);
725
+ }
726
+ }
727
+ if (this.memberRelinkQueued || this.pendingMemberRelink.size === 0) {
728
+ return;
729
+ }
730
+ this.memberRelinkQueued = true;
731
+ const settled = this.runMemberRelink();
732
+ this.memberRelinks.add(settled);
733
+ void settled.finally(() => this.memberRelinks.delete(settled));
734
+ }
735
+
736
+ /**
737
+ * Take {@link pendingMemberRelink} in a lock read and build it in a write
738
+ * queued from there. The read runs once no write runs or is queued, so the
739
+ * write does not cancel the build of the change, as one queued from inside
740
+ * that build would. It still cancels a write another read of the same batch
741
+ * queued before it. If that write is a build that has started, the
742
+ * follow-up builds the documents it reset, since an update builds every
743
+ * document below `Validated`. The read does not await its write, which
744
+ * waits for the read to end.
745
+ *
746
+ * The follow-up waits for any build already running outside the lock to
747
+ * end, so it does not start alongside one. A build started outside the lock
748
+ * after that can still overlap it, as any two such builds can. The wait
749
+ * runs after the read rather than in it, since a wait under the lock would
750
+ * hold back every write, and a write queued outside a read could cancel one
751
+ * already queued, so the read runs again.
752
+ */
753
+ protected async runMemberRelink(): Promise<void> {
754
+ const next = await this.workspaceLock.read(() => {
755
+ const running = this.documentBuilder.activeBuild;
756
+ if (running) {
757
+ return { running };
758
+ }
759
+ this.memberRelinkQueued = false;
760
+ const uris = [...this.pendingMemberRelink.values()];
761
+ const resets = new Set(this.pendingMemberResets);
762
+ this.pendingMemberRelink.clear();
763
+ this.pendingMemberResets.clear();
764
+ // A write cancels the one queued before it, so none is queued for nothing.
765
+ if (uris.length === 0) {
766
+ return { relink: Promise.resolve() };
767
+ }
768
+ return { relink: this.workspaceLock.write(token => this.relinkMembers(uris, resets, token)) };
769
+ });
770
+ if (next.running) {
771
+ await next.running;
772
+ return this.runMemberRelink();
773
+ }
774
+ return next.relink;
775
+ }
776
+
777
+ /**
778
+ * The write action of a deferred relink: take the documents still loaded
779
+ * that no build has relinked since they were queued, and build them. Those
780
+ * in `resets`, and those already at their last phase, are reset first by a
781
+ * {@link ProjectChangeEvent} that carries only them, so the workspace
782
+ * manager's `onProjectsChanged` resets them as it does without the option.
783
+ * An `update` with no URIs builds what is left below `Validated`, and
784
+ * Langium relinks every document with a linking error too, without
785
+ * reporting the members to `onUpdate` listeners as changed.
786
+ *
787
+ * A write cancelled before it starts is queued again as it was, unannounced.
788
+ * A cancelled build is queued again, without resets, with only the members
789
+ * it did not relink. One a cancel left at its last phase before its
790
+ * listeners all ran is reset then, since Langium does not run them again.
791
+ * If none is left, nothing is built or announced. A build that ends,
792
+ * completed or failed, stops tracking the members it took, except those a
793
+ * change queued again meanwhile. A failed build is not queued again, since
794
+ * it would fail again. Never throws, so {@link memberRelinkSettled} never
795
+ * rejects.
796
+ */
797
+ protected async relinkMembers(uris: readonly URI[], resets: ReadonlySet<string>, token: CancellationToken): Promise<void> {
798
+ const loaded: URI[] = [];
799
+ for (const uri of uris) {
800
+ const key = uri.toString();
801
+ if (!this.unrelinkedMembers.has(key)) {
802
+ continue;
803
+ }
804
+ if (this.langiumDocuments.getDocument(uri)) {
805
+ loaded.push(uri);
806
+ } else {
807
+ this.forgetMember(key);
808
+ }
809
+ }
810
+ if (loaded.length === 0) {
811
+ return;
812
+ }
813
+ const forgetTaken = (): void =>
814
+ loaded.filter(uri => !this.pendingMemberRelink.has(uri.toString())).forEach(uri => this.forgetMember(uri.toString()));
815
+ if (token.isCancellationRequested) {
816
+ this.queueMemberRelink(loaded.filter(uri => resets.has(uri.toString())));
817
+ this.queueMemberRelink(
818
+ loaded.filter(uri => !resets.has(uri.toString())),
819
+ false
820
+ );
821
+ return;
822
+ }
823
+ this.notifyMemberRelink(this.memberRelinkStartedListeners, loaded);
824
+ let completed = false;
825
+ try {
826
+ const reset = loaded.filter(uri => {
827
+ const document = this.langiumDocuments.getDocument(uri);
828
+ return document !== undefined && (resets.has(uri.toString()) || document.state >= this.lastPhaseOf(document));
829
+ });
830
+ if (reset.length > 0) {
831
+ reset.forEach(uri => this.linkedMembers.delete(uri.toString()));
832
+ this.emit({ added: [], updated: [], removed: [], affectedDocuments: reset });
833
+ }
834
+ this.documentBuilder.markNextReason(HYDRANIUM_BUILD_REASONS.memberRelink);
835
+ await this.documentBuilder.update([], [], token);
836
+ // A cancel a last-phase listener swallowed can leave `update` resolved.
837
+ if (token.isCancellationRequested) {
838
+ throw OperationCancelled;
839
+ }
840
+ completed = true;
841
+ // Built all the same if no listener saw it linked or delivered.
842
+ forgetTaken();
843
+ } catch (error: unknown) {
844
+ if (isOperationCancelled(error)) {
845
+ // A cancel can skip the Linked listeners, and Langium does not
846
+ // notify that phase again.
847
+ for (const uri of loaded) {
848
+ const document = this.langiumDocuments.getDocument(uri);
849
+ if (document && document.state >= DocumentState.Linked) {
850
+ this.onMemberLinked(uri);
851
+ }
852
+ }
853
+ this.queueMemberRelink(
854
+ loaded.filter(uri => this.unrelinkedMembers.has(uri.toString())),
855
+ false
856
+ );
857
+ } else {
858
+ forgetTaken();
859
+ this.tracer.error(`Relinking ${this.conceptName()} members failed: ${describeErrorWithStack(error)}`);
860
+ }
861
+ } finally {
862
+ this.notifyMemberRelink<MemberRelinkFinishedEvent>(this.memberRelinkFinishedListeners, { completed });
863
+ }
864
+ }
865
+
866
+ /** Record that a build linked `uri`, if it is a member not relinked yet. */
867
+ protected onMemberLinked(uri: URI): void {
868
+ const key = uri.toString();
869
+ if (this.unrelinkedMembers.has(key)) {
870
+ this.linkedMembers.add(key);
871
+ }
872
+ }
873
+
874
+ /** The last phase the build that carries `document` takes it to. */
875
+ protected lastPhaseOf(document: LangiumDocument): DocumentState {
876
+ return this.documentBuilder.shouldValidateDocument(document) ? DocumentState.Validated : DocumentState.IndexedReferences;
877
+ }
878
+
879
+ /**
880
+ * A member linked since it was queued and now delivered at its last phase
881
+ * is relinked, whichever build did it, so no follow-up builds it again.
882
+ */
883
+ protected onMemberDelivered(uri: URI): void {
884
+ const key = uri.toString();
885
+ if (this.linkedMembers.has(key)) {
886
+ this.forgetMember(key);
887
+ this.pendingMemberRelink.delete(key);
888
+ this.pendingMemberResets.delete(key);
889
+ }
890
+ }
891
+
892
+ /** Drop `key` from the relink bookkeeping. */
893
+ protected forgetMember(key: string): void {
894
+ this.unrelinkedMembers.delete(key);
895
+ this.linkedMembers.delete(key);
896
+ }
897
+
898
+ /** Call each of `listeners` with `value`, each in isolation. */
899
+ protected notifyMemberRelink<T>(listeners: ReadonlySet<(value: T) => void>, value: T): void {
900
+ for (const listener of [...listeners]) {
901
+ try {
902
+ listener(value);
903
+ } catch (error: unknown) {
904
+ this.tracer.error(`A member relink listener failed: ${describeErrorWithStack(error)}`);
905
+ }
906
+ }
907
+ }
908
+
520
909
  // ============================================================
521
910
  // Queries
522
911
  // ============================================================
@@ -612,7 +1001,7 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
612
1001
  try {
613
1002
  listener(event);
614
1003
  } catch (error) {
615
- this.tracer.error(`Project change listener failed: ${error}`);
1004
+ this.tracer.error(`Project change listener failed: ${describeErrorWithStack(error)}`);
616
1005
  }
617
1006
  }
618
1007
  }
@@ -28,8 +28,12 @@ import type { URI } from '@hydranium/langium';
28
28
  * - {@link affectedDocuments} lists URIs whose reachable scope changed. The
29
29
  * default cascade plumbing in `HydraniumWorkspaceManager` subscribes to
30
30
  * this event and re-runs `DocumentBuilder.resetToState` for each entry,
31
- * which the next build cycle picks up. Consumers can subscribe
32
- * independently for other reactions.
31
+ * which the build of the update that changed the descriptor picks up.
32
+ * Empty when the project manager relinks them in a follow-up build of its
33
+ * own instead (`ProjectManagerOptions.deferMemberRelink`). That build
34
+ * emits an event of its own, with no project in it, carrying the members
35
+ * it resets.
36
+ * Consumers can subscribe independently for other reactions.
33
37
  */
34
38
  export interface ProjectChangeEvent<TProject extends Project = Project> {
35
39
  /** Ids of projects newly registered since the last event. */
@@ -54,7 +58,8 @@ export interface ProjectChangeEvent<TProject extends Project = Project> {
54
58
  * rebuild. Includes the changed projects' own member documents plus
55
59
  * any transitive dependents according to the concrete
56
60
  * `ProjectManager`'s visibility model (see
57
- * `AbstractProjectManager.getAffectedProjects`).
61
+ * `AbstractProjectManager.getAffectedProjects`). In the event a deferred
62
+ * relink emits, the members it resets.
58
63
  *
59
64
  * Descriptor URIs themselves are intentionally excluded: they triggered
60
65
  * this cycle and re-adding them would loop.
@@ -64,3 +69,20 @@ export interface ProjectChangeEvent<TProject extends Project = Project> {
64
69
 
65
70
  /** Callback shape for `ProjectManager.onProjectsChanged`. */
66
71
  export type ProjectChangeListener<TProject extends Project = Project> = (event: ProjectChangeEvent<TProject>) => void;
72
+
73
+ /** Callback shape for `ProjectManager.onMemberRelinkStarted`: the documents the follow-up build relinks. */
74
+ export type MemberRelinkStartedListener = (documents: readonly URI[]) => void;
75
+
76
+ /** What `ProjectManager.onMemberRelinkFinished` tells a listener. */
77
+ export interface MemberRelinkFinishedEvent {
78
+ /**
79
+ * `false` when the follow-up build was cancelled or failed. A cancelled
80
+ * one is queued again, and another started and finished pair follows only
81
+ * if members are left, since the cancelling write may build them all.
82
+ * Await `ProjectManager.memberRelinkSettled` to learn the relink is done.
83
+ */
84
+ readonly completed: boolean;
85
+ }
86
+
87
+ /** Callback shape for `ProjectManager.onMemberRelinkFinished`. */
88
+ export type MemberRelinkFinishedListener = (event: MemberRelinkFinishedEvent) => void;
@@ -11,7 +11,7 @@ import type { Project } from '@hydranium/protocol';
11
11
  import type { AstNode, URI } from '@hydranium/langium';
12
12
  import type { Disposable } from 'vscode-languageserver';
13
13
  import type { WorkspaceFolder } from 'vscode-languageserver-types';
14
- import type { ProjectChangeListener } from './project-change-event.js';
14
+ import type { MemberRelinkFinishedListener, MemberRelinkStartedListener, ProjectChangeListener } from './project-change-event.js';
15
15
 
16
16
  /**
17
17
  * Manages the **project tier** sitting between the LSP `WorkspaceFolder`
@@ -91,6 +91,32 @@ export interface ProjectManager<TProject extends Project = Project> {
91
91
  */
92
92
  onProjectsChanged(listener: ProjectChangeListener<TProject>): Disposable;
93
93
 
94
+ /**
95
+ * Subscribe to the start of a follow-up build that relinks a changed
96
+ * project's members, with the documents it relinks. Fires only for a
97
+ * manager that defers that relink (`AbstractProjectManager` under its
98
+ * `deferMemberRelink` option), so an adopter forwards it to show progress.
99
+ */
100
+ onMemberRelinkStarted(listener: MemberRelinkStartedListener): Disposable;
101
+
102
+ /** Subscribe to the end of each build {@link onMemberRelinkStarted} announced. */
103
+ onMemberRelinkFinished(listener: MemberRelinkFinishedListener): Disposable;
104
+
105
+ /**
106
+ * Resolves once no deferred member relink is pending, queued or building,
107
+ * including one queued while this waits. It covers only relinks already
108
+ * queued, so a test awaits the build of the change first. A test that
109
+ * drives a descriptor change awaits it, and so does a teardown, or the
110
+ * relink runs against a workspace already removed. Resolved at once by a
111
+ * manager that never defers.
112
+ *
113
+ * Never await it inside a workspace lock write or read, which includes a
114
+ * request handler that answers under a read: the relink needs a write,
115
+ * which waits for both. Nor in a listener of a build running outside the
116
+ * lock, since the relink waits for that build to end.
117
+ */
118
+ memberRelinkSettled(): Promise<void>;
119
+
94
120
  // ============================================================
95
121
  // Queries
96
122
  // ============================================================
@@ -136,7 +162,10 @@ export interface ProjectManager<TProject extends Project = Project> {
136
162
  *
137
163
  * Default behaviour in `AbstractProjectManager` is the **transitive
138
164
  * closure** of {@link Project.dependencies}, including the project
139
- * itself. An adopter can override to use a different visibility model.
165
+ * itself, or only the dependencies it names under its `visibility: 'direct'`
166
+ * option, which narrows visibility only: a change still rebuilds every
167
+ * transitive dependent. An adopter can override to use a different
168
+ * visibility model.
140
169
  *
141
170
  * `SingleProjectManager` returns `[id]` for its synthetic workspace
142
171
  * project, which combined with "synthetic project owns every URI"
@@ -12,7 +12,7 @@ import { type AstNode, type LangiumDocuments, type URI } from '@hydranium/langiu
12
12
  import { Disposable } from 'vscode-languageserver';
13
13
  import { type LogNameOptions } from '../diagnostics/logger.js';
14
14
  import { type ServerSharedServicesMinimal } from '../shared-services.js';
15
- import type { ProjectChangeListener } from './project-change-event.js';
15
+ import type { MemberRelinkFinishedListener, MemberRelinkStartedListener, ProjectChangeListener } from './project-change-event.js';
16
16
  import type { ProjectManager } from './project-manager.js';
17
17
 
18
18
  /**
@@ -64,6 +64,21 @@ export class SingleProjectManager implements ProjectManager {
64
64
  return Disposable.create(() => undefined);
65
65
  }
66
66
 
67
+ /** Never fires: a fixed registry has no member relink to defer. */
68
+ onMemberRelinkStarted(_listener: MemberRelinkStartedListener): Disposable {
69
+ return Disposable.create(() => undefined);
70
+ }
71
+
72
+ /** Never fires, as {@link onMemberRelinkStarted} does not. */
73
+ onMemberRelinkFinished(_listener: MemberRelinkFinishedListener): Disposable {
74
+ return Disposable.create(() => undefined);
75
+ }
76
+
77
+ /** Resolved at once: nothing is ever deferred. */
78
+ memberRelinkSettled(): Promise<void> {
79
+ return Promise.resolve();
80
+ }
81
+
67
82
  isProjectDescriptor(_uri: URI | string): boolean {
68
83
  return false;
69
84
  }