@hydranium/core 1.0.0-next.38 → 1.0.0-next.380

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 -127
  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 +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +445 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +903 -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 +145 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +177 -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 +355 -39
  140. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  141. package/lib/langium/document-builder/document-builder.js +578 -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 +39 -23
  146. package/lib/langium/integration-services.d.ts.map +1 -1
  147. package/lib/langium/integration-services.js +7 -4
  148. package/lib/langium/integration-services.js.map +1 -1
  149. package/lib/langium/integrity/integrity-rule.d.ts +22 -8
  150. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  151. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  152. package/lib/langium/integrity/integrity-service.d.ts +104 -27
  153. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  154. package/lib/langium/integrity/integrity-service.js +319 -65
  155. package/lib/langium/integrity/integrity-service.js.map +1 -1
  156. package/lib/langium/keys/containment.d.ts +3 -2
  157. package/lib/langium/keys/containment.d.ts.map +1 -1
  158. package/lib/langium/keys/containment.js.map +1 -1
  159. package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js +24 -12
  162. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  164. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  165. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  166. package/lib/langium/labeling/label-provider.js.map +1 -1
  167. package/lib/langium/language-module.d.ts +30 -5
  168. package/lib/langium/language-module.d.ts.map +1 -1
  169. package/lib/langium/language-module.js +21 -5
  170. package/lib/langium/language-module.js.map +1 -1
  171. package/lib/langium/model-service/client-session.d.ts +405 -0
  172. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  173. package/lib/langium/model-service/client-session.js +479 -0
  174. package/lib/langium/model-service/client-session.js.map +1 -0
  175. package/lib/langium/model-service/index.d.ts +2 -0
  176. package/lib/langium/model-service/index.d.ts.map +1 -1
  177. package/lib/langium/model-service/index.js +2 -0
  178. package/lib/langium/model-service/index.js.map +1 -1
  179. package/lib/langium/model-service/model-events.d.ts +68 -0
  180. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  181. package/lib/langium/model-service/model-events.js +10 -0
  182. package/lib/langium/model-service/model-events.js.map +1 -0
  183. package/lib/langium/model-service/model-service.d.ts +441 -323
  184. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  185. package/lib/langium/model-service/model-service.js +602 -397
  186. package/lib/langium/model-service/model-service.js.map +1 -1
  187. package/lib/langium/module.d.ts +96 -37
  188. package/lib/langium/module.d.ts.map +1 -1
  189. package/lib/langium/module.js +39 -27
  190. package/lib/langium/module.js.map +1 -1
  191. package/lib/langium/naming/name-provider.d.ts +32 -7
  192. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  193. package/lib/langium/naming/name-provider.js +10 -4
  194. package/lib/langium/naming/name-provider.js.map +1 -1
  195. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.d.ts +184 -13
  197. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  198. package/lib/langium/project/abstract-project-manager.js +336 -16
  199. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  200. package/lib/langium/project/project-change-event.d.ts +22 -3
  201. package/lib/langium/project/project-change-event.d.ts.map +1 -1
  202. package/lib/langium/project/project-manager.d.ts +28 -2
  203. package/lib/langium/project/project-manager.d.ts.map +1 -1
  204. package/lib/langium/project/single-project-manager.d.ts +7 -1
  205. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  206. package/lib/langium/project/single-project-manager.js +12 -0
  207. package/lib/langium/project/single-project-manager.js.map +1 -1
  208. package/lib/langium/residency/cst-residency-service.d.ts +81 -44
  209. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  210. package/lib/langium/residency/cst-residency-service.js +142 -46
  211. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  212. package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
  213. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  214. package/lib/langium/scope/ast-node-description-provider.js +88 -15
  215. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  216. package/lib/langium/scope/built-local-symbols.d.ts +12 -0
  217. package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
  218. package/lib/langium/scope/built-local-symbols.js +11 -0
  219. package/lib/langium/scope/built-local-symbols.js.map +1 -0
  220. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  221. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  222. package/lib/langium/scope/fallback-scope.js +35 -0
  223. package/lib/langium/scope/fallback-scope.js.map +1 -0
  224. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  225. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  226. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  227. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  228. package/lib/langium/scope/hydranium-scope-provider.d.ts +122 -32
  229. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  230. package/lib/langium/scope/hydranium-scope-provider.js +217 -39
  231. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  232. package/lib/langium/scope/index.d.ts +1 -0
  233. package/lib/langium/scope/index.d.ts.map +1 -1
  234. package/lib/langium/scope/index.js +1 -0
  235. package/lib/langium/scope/index.js.map +1 -1
  236. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  237. package/lib/langium/scope/reference-builder.js.map +1 -1
  238. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  239. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  240. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  241. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  242. package/lib/langium/scope/scope-extension-service.d.ts +69 -37
  243. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  244. package/lib/langium/scope/scope-extension-service.js +102 -29
  245. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  246. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  247. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  248. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  249. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  250. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  251. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  252. package/lib/langium/serialization/abstract-serializer.js +54 -30
  253. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  254. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  255. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  256. package/lib/langium/serialization/json-serializer.js +13 -3
  257. package/lib/langium/serialization/json-serializer.js.map +1 -1
  258. package/lib/langium/serialization/serializer.d.ts +1 -1
  259. package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
  260. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  261. package/lib/langium/serialization/yaml-serializer.js +24 -4
  262. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  263. package/lib/langium/service-registry.d.ts +29 -1
  264. package/lib/langium/service-registry.d.ts.map +1 -1
  265. package/lib/langium/service-registry.js +37 -0
  266. package/lib/langium/service-registry.js.map +1 -1
  267. package/lib/langium/shared-services.d.ts +10 -4
  268. package/lib/langium/shared-services.d.ts.map +1 -1
  269. package/lib/langium/shared-services.js.map +1 -1
  270. package/lib/langium/single-langium-copy.d.ts +22 -0
  271. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  272. package/lib/langium/single-langium-copy.js +36 -0
  273. package/lib/langium/single-langium-copy.js.map +1 -0
  274. package/lib/langium/transfer/transfer-encoder.d.ts +60 -39
  275. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  276. package/lib/langium/transfer/transfer-encoder.js +35 -24
  277. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  278. package/lib/langium/trivia/comment-preserver.d.ts +543 -0
  279. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  280. package/lib/langium/trivia/comment-preserver.js +1165 -0
  281. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  282. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  283. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  284. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  285. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  286. package/lib/langium/trivia/index.d.ts +14 -0
  287. package/lib/langium/trivia/index.d.ts.map +1 -0
  288. package/lib/langium/trivia/index.js +14 -0
  289. package/lib/langium/trivia/index.js.map +1 -0
  290. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  291. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  292. package/lib/langium/trivia/trivia-contribution.js +10 -0
  293. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  294. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  295. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  296. package/lib/langium/trivia/trivia-preserver.js +10 -0
  297. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  298. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  299. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  300. package/lib/langium/trivia/trivia-service.js +56 -0
  301. package/lib/langium/trivia/trivia-service.js.map +1 -0
  302. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  303. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  304. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  305. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  306. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  307. package/lib/langium/validation/document-validator.d.ts +168 -23
  308. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  309. package/lib/langium/validation/document-validator.js +264 -26
  310. package/lib/langium/validation/document-validator.js.map +1 -1
  311. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  312. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  313. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  314. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  315. package/lib/langium/workspace/ast-node-locator.d.ts +24 -0
  316. package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
  317. package/lib/langium/workspace/ast-node-locator.js +32 -0
  318. package/lib/langium/workspace/ast-node-locator.js.map +1 -0
  319. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  320. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  321. package/lib/langium/workspace/document-uri-policy.js +22 -13
  322. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  323. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  324. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  325. package/lib/langium/workspace/file-not-found.js +31 -0
  326. package/lib/langium/workspace/file-not-found.js.map +1 -0
  327. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  328. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  329. package/lib/langium/workspace/file-system-provider.js +115 -13
  330. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  331. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +35 -1
  332. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  333. package/lib/langium/workspace/hydranium-langium-document-factory.js +77 -0
  334. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  335. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  336. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  337. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  338. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  339. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +105 -21
  340. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  341. package/lib/langium/workspace/hydranium-workspace-manager.js +186 -31
  342. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  343. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  344. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  345. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  346. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  347. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  348. package/lib/langium/workspace/index-manager.js.map +1 -1
  349. package/lib/langium/workspace/index.d.ts +3 -0
  350. package/lib/langium/workspace/index.d.ts.map +1 -1
  351. package/lib/langium/workspace/index.js +3 -0
  352. package/lib/langium/workspace/index.js.map +1 -1
  353. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  354. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  355. package/lib/langium/workspace/initialize-workspace.js +68 -3
  356. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  357. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  358. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  359. package/lib/langium/workspace/langium-documents.js +18 -1
  360. package/lib/langium/workspace/langium-documents.js.map +1 -1
  361. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  362. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  363. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  364. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  365. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +7 -9
  366. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  367. package/lib/{documents → langium/workspace}/self-save-registry.js +9 -11
  368. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  369. package/lib/langium/workspace/syntax-errors.d.ts +23 -0
  370. package/lib/langium/workspace/syntax-errors.d.ts.map +1 -0
  371. package/lib/langium/workspace/syntax-errors.js +29 -0
  372. package/lib/langium/workspace/syntax-errors.js.map +1 -0
  373. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  374. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  375. package/lib/langium/workspace/virtual-document.js +87 -24
  376. package/lib/langium/workspace/virtual-document.js.map +1 -1
  377. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  378. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  379. package/lib/langium/workspace/write-lock-scope.js +15 -5
  380. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  381. package/lib/launcher/integrated-server.d.ts +3 -1
  382. package/lib/launcher/integrated-server.d.ts.map +1 -1
  383. package/lib/locale/server-locale.d.ts +6 -6
  384. package/lib/locale/server-locale.d.ts.map +1 -1
  385. package/lib/locale/server-locale.js.map +1 -1
  386. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  387. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  388. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  389. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  390. package/lib/lsp/connection-features.d.ts +23 -0
  391. package/lib/lsp/connection-features.d.ts.map +1 -0
  392. package/lib/lsp/connection-features.js +60 -0
  393. package/lib/lsp/connection-features.js.map +1 -0
  394. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  395. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  396. package/lib/lsp/diagnostics-connection.js +53 -0
  397. package/lib/lsp/diagnostics-connection.js.map +1 -0
  398. package/lib/lsp/edit-requests-guard.d.ts +31 -0
  399. package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
  400. package/lib/lsp/edit-requests-guard.js +125 -0
  401. package/lib/lsp/edit-requests-guard.js.map +1 -0
  402. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  403. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  404. package/lib/lsp/hydranium-document-update-handler.js +234 -101
  405. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  406. package/lib/lsp/index.d.ts +6 -2
  407. package/lib/lsp/index.d.ts.map +1 -1
  408. package/lib/lsp/index.js +6 -2
  409. package/lib/lsp/index.js.map +1 -1
  410. package/lib/lsp/lsp-latency.d.ts +39 -0
  411. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  412. package/lib/lsp/lsp-latency.js +58 -0
  413. package/lib/lsp/lsp-latency.js.map +1 -0
  414. package/lib/lsp/save-text-document.d.ts +31 -0
  415. package/lib/lsp/save-text-document.d.ts.map +1 -0
  416. package/lib/lsp/save-text-document.js +52 -0
  417. package/lib/lsp/save-text-document.js.map +1 -0
  418. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  419. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  420. package/lib/lsp/semantic-token-provider.js +98 -9
  421. package/lib/lsp/semantic-token-provider.js.map +1 -1
  422. package/lib/lsp/shared-module.d.ts +4 -8
  423. package/lib/lsp/shared-module.d.ts.map +1 -1
  424. package/lib/lsp/shared-module.js.map +1 -1
  425. package/lib/lsp/start-language-server.d.ts +12 -7
  426. package/lib/lsp/start-language-server.d.ts.map +1 -1
  427. package/lib/lsp/start-language-server.js +21 -7
  428. package/lib/lsp/start-language-server.js.map +1 -1
  429. package/lib/messages/carriers.d.ts +4 -6
  430. package/lib/messages/carriers.d.ts.map +1 -1
  431. package/lib/messages/carriers.js +4 -6
  432. package/lib/messages/carriers.js.map +1 -1
  433. package/lib/messages/index.d.ts +2 -2
  434. package/lib/messages/index.d.ts.map +1 -1
  435. package/lib/messages/index.js +2 -2
  436. package/lib/messages/index.js.map +1 -1
  437. package/lib/messages/renderer.d.ts +10 -4
  438. package/lib/messages/renderer.d.ts.map +1 -1
  439. package/lib/messages/renderer.js +6 -0
  440. package/lib/messages/renderer.js.map +1 -1
  441. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  442. package/lib/node/event-loop-monitor.js +2 -1
  443. package/lib/node/event-loop-monitor.js.map +1 -1
  444. package/lib/node/heap-ceiling.d.ts +61 -0
  445. package/lib/node/heap-ceiling.d.ts.map +1 -0
  446. package/lib/node/heap-ceiling.js +72 -0
  447. package/lib/node/heap-ceiling.js.map +1 -0
  448. package/lib/node/index.d.ts +1 -1
  449. package/lib/node/index.d.ts.map +1 -1
  450. package/lib/node/index.js +5 -1
  451. package/lib/node/index.js.map +1 -1
  452. package/lib/node/latency-from-env.d.ts +1 -1
  453. package/lib/node/latency-from-env.js +1 -1
  454. package/lib/node/lint-grammar.js.map +1 -1
  455. package/lib/node/log-file-sink.d.ts +3 -2
  456. package/lib/node/log-file-sink.d.ts.map +1 -1
  457. package/lib/node/log-file-sink.js +6 -2
  458. package/lib/node/log-file-sink.js.map +1 -1
  459. package/lib/node/log-preamble-node.d.ts +5 -3
  460. package/lib/node/log-preamble-node.d.ts.map +1 -1
  461. package/lib/node/log-preamble-node.js +13 -10
  462. package/lib/node/log-preamble-node.js.map +1 -1
  463. package/lib/node/measure-memory.d.ts.map +1 -1
  464. package/lib/node/measure-memory.js +5 -4
  465. package/lib/node/measure-memory.js.map +1 -1
  466. package/lib/node/memory-monitor.d.ts +2 -2
  467. package/lib/node/memory-monitor.d.ts.map +1 -1
  468. package/lib/node/memory-monitor.js +9 -10
  469. package/lib/node/memory-monitor.js.map +1 -1
  470. package/lib/node/node-file-system-provider.d.ts +67 -9
  471. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  472. package/lib/node/node-file-system-provider.js +198 -53
  473. package/lib/node/node-file-system-provider.js.map +1 -1
  474. package/lib/node/profile-capture.d.ts +12 -4
  475. package/lib/node/profile-capture.d.ts.map +1 -1
  476. package/lib/node/profile-capture.js +8 -6
  477. package/lib/node/profile-capture.js.map +1 -1
  478. package/lib/node/profile-digest.js.map +1 -1
  479. package/lib/node/profiling-run.d.ts +13 -3
  480. package/lib/node/profiling-run.d.ts.map +1 -1
  481. package/lib/node/profiling-run.js +17 -8
  482. package/lib/node/profiling-run.js.map +1 -1
  483. package/lib/node/rename-over-open-readers.d.ts +61 -0
  484. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  485. package/lib/node/rename-over-open-readers.js +80 -0
  486. package/lib/node/rename-over-open-readers.js.map +1 -0
  487. package/lib/node/server-diagnostics.js +1 -1
  488. package/lib/node/server-diagnostics.js.map +1 -1
  489. package/lib/node/server-state-snapshot.d.ts +1 -2
  490. package/lib/node/server-state-snapshot.d.ts.map +1 -1
  491. package/lib/node/server-state-snapshot.js +4 -4
  492. package/lib/node/server-state-snapshot.js.map +1 -1
  493. package/lib/node/socket-launcher.d.ts +43 -7
  494. package/lib/node/socket-launcher.d.ts.map +1 -1
  495. package/lib/node/socket-launcher.js +42 -7
  496. package/lib/node/socket-launcher.js.map +1 -1
  497. package/lib/node/startup-cpu-profile.d.ts +29 -0
  498. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  499. package/lib/node/startup-cpu-profile.js +91 -0
  500. package/lib/node/startup-cpu-profile.js.map +1 -0
  501. package/lib/node/stdio-launcher.d.ts +13 -13
  502. package/lib/node/stdio-launcher.d.ts.map +1 -1
  503. package/lib/node/stdio-launcher.js +21 -11
  504. package/lib/node/stdio-launcher.js.map +1 -1
  505. package/lib/node/validate-workspace.d.ts +1 -1
  506. package/lib/node/validate-workspace.d.ts.map +1 -1
  507. package/lib/node/validate-workspace.js +5 -1
  508. package/lib/node/validate-workspace.js.map +1 -1
  509. package/lib/testing/document-uri-policy-conformance.js +1 -1
  510. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  511. package/lib/testing/fake-description.js.map +1 -1
  512. package/lib/testing/fake-document.d.ts +2 -1
  513. package/lib/testing/fake-document.d.ts.map +1 -1
  514. package/lib/testing/fake-document.js.map +1 -1
  515. package/lib/testing/index.d.ts +1 -1
  516. package/lib/testing/index.d.ts.map +1 -1
  517. package/lib/testing/index.js +2 -1
  518. package/lib/testing/index.js.map +1 -1
  519. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  520. package/lib/testing/langium-test-helpers.js +1 -0
  521. package/lib/testing/langium-test-helpers.js.map +1 -1
  522. package/lib/testing/make-noop-language-services.js.map +1 -1
  523. package/lib/testing/make-noop-shared-services.js.map +1 -1
  524. package/lib/testing/make-test-services.d.ts +45 -14
  525. package/lib/testing/make-test-services.d.ts.map +1 -1
  526. package/lib/testing/make-test-services.js +23 -7
  527. package/lib/testing/make-test-services.js.map +1 -1
  528. package/lib/testing/make-test-tracer.d.ts +12 -0
  529. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  530. package/lib/testing/make-test-tracer.js +13 -0
  531. package/lib/testing/make-test-tracer.js.map +1 -1
  532. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  533. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  534. package/lib/testing/node/applied-edit-capture.js +117 -0
  535. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  536. package/lib/testing/node/golden-corpus.js.map +1 -1
  537. package/lib/testing/node/index.d.ts +1 -0
  538. package/lib/testing/node/index.d.ts.map +1 -1
  539. package/lib/testing/node/index.js +1 -0
  540. package/lib/testing/node/index.js.map +1 -1
  541. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  542. package/lib/testing/node/lsp-harness.js +2 -0
  543. package/lib/testing/node/lsp-harness.js.map +1 -1
  544. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  545. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  546. package/lib/testing/node/lsp-server-connection.js +49 -106
  547. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  548. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  549. package/lib/testing/node/scratch-workspace.js +10 -5
  550. package/lib/testing/node/scratch-workspace.js.map +1 -1
  551. package/lib/testing/node/spawned-server.d.ts +30 -1
  552. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  553. package/lib/testing/node/spawned-server.js +39 -2
  554. package/lib/testing/node/spawned-server.js.map +1 -1
  555. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  556. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  557. package/lib/testing/node/unhandled-rejections.js +32 -0
  558. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  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 +33 -11
  592. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  593. package/lib/testing/stub-document-builder.js +110 -5
  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 -249
  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 +74 -0
  640. package/src/documents/hydranium-text-documents.ts +1029 -616
  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 +289 -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 +709 -105
  663. package/src/langium/integration-services.ts +58 -27
  664. package/src/langium/integrity/integrity-rule.ts +22 -8
  665. package/src/langium/integrity/integrity-service.ts +348 -71
  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 -522
  673. package/src/langium/module.ts +139 -63
  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 +197 -73
  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 +107 -0
  712. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -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 +2 -1
  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 +6 -7
  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 +1 -0
  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 +10 -5
  768. package/src/testing/node/spawned-server.ts +57 -3
  769. package/src/testing/node/unhandled-rejections.ts +31 -0
  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 +155 -18
  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,11 +7,16 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { asMutable, type Clock, Debouncer, Format, type Tracer } from '@hydranium/protocol';
10
+ import { asMutable, type Clock, Debouncer, Format, type Tracer, UNRECORDED_VERSION } from '@hydranium/protocol';
11
11
  import {
12
12
  type AstNode,
13
+ type AstReflection,
13
14
  AstUtils,
14
15
  DocumentState,
16
+ isAstNode,
17
+ isMultiReference,
18
+ isReference,
19
+ type ReferenceInfo,
15
20
  type LangiumDocument,
16
21
  type LangiumDocumentFactory,
17
22
  type LangiumDocuments,
@@ -45,8 +50,12 @@ export const CST_RESIDENCY_PASS_PRIORITY = 1_000_000;
45
50
  * "off" toggle.
46
51
  * - `{ kind: 'shed-closed-when-idle', idleMs }`: shed a closed document's CST
47
52
  * once it has been idle (not in any build) for `idleMs`, keeping the AST
48
- * resident. Open documents are always kept. `idleMs: 0` sheds as soon as a
49
- * document is closed (a pure close-triggered threshold of this strategy).
53
+ * resident. Open documents are always kept. The timer starts when a build
54
+ * includes the document, so `idleMs: 0` sheds a closed document on the tick
55
+ * after each such build. A shed document that re-enters a build has its CST
56
+ * grafted back, which parses its text, so a window shorter than the gap
57
+ * between a document's builds parses a closed document on every build it
58
+ * rides in.
50
59
  */
51
60
  export type CstResidencyStrategy = { readonly kind: 'always-keep' } | { readonly kind: 'shed-closed-when-idle'; readonly idleMs: number };
52
61
 
@@ -69,13 +78,14 @@ export interface CstResidencyOptions extends LogNameOptions {
69
78
  }
70
79
 
71
80
  /**
72
- * The build state a shed document must be reset to so the next build re-parses it
73
- * and rebuilds its CST — and every `reference.$refNode` — before it is relinked or
74
- * re-indexed (rehydration). It is `DocumentState.Changed` by necessity: the only
75
- * state below `Parsed`, hence the only one that forces a re-parse rather than an
76
- * in-place relink. Exposed as a named landmark of the residency feature (cf.
77
- * `IntegrityService.SettledState`) so the document builder references the feature's
78
- * declared recovery contract instead of a bare enum value.
81
+ * The build state a shed document is reset to when the identity-preserving graft
82
+ * fails, so the next build re-parses it and rebuilds its CST — and every
83
+ * `reference.$refNode` — before it is relinked or re-indexed. It is
84
+ * `DocumentState.Changed` by necessity: the only state below `Parsed`, hence
85
+ * the only one that forces a re-parse rather than an in-place relink. Exposed
86
+ * as a named landmark of the residency feature (cf.
87
+ * `IntegrityService.SettledState`) so the document builder references the
88
+ * feature's declared recovery contract instead of a bare enum value.
79
89
  */
80
90
  export const CST_REHYDRATION_RESET_STATE: DocumentState = DocumentState.Changed;
81
91
 
@@ -96,8 +106,8 @@ export function isCstShed(document: LangiumDocument): boolean {
96
106
  }
97
107
 
98
108
  /**
99
- * Reattach a CST to a shed document **on demand**, without a rebuild — the
100
- * read-side counterpart of the build-side rehydrate-on-re-entry seam. Re-parses
109
+ * Reattach a CST to a shed document **on demand**, without a rebuild. Both the
110
+ * read side and the build-side rehydrate-on-re-entry seam use it. Re-parses
101
111
  * the document's retained text into a throwaway document, then **grafts** the
102
112
  * fresh CST onto the already-built, resident AST nodes — preserving AST node
103
113
  * identity, so every cross-reference *into* this document (resolved to a resident
@@ -124,10 +134,12 @@ export function isCstShed(document: LangiumDocument): boolean {
124
134
  * `reference.$refNode` is restored the same way (paired over
125
135
  * {@link AstUtils.streamReferences}).
126
136
  *
127
- * **Safe degrade.** If the re-parse diverges structurally from the resident AST
128
- * (different node count — should not happen for unchanged text, but a guard
129
- * against drift) the graft is abandoned and the document stays shed; the caller
130
- * degrades exactly as it did before (no wrong attachment).
137
+ * **Safe degrade.** If the re-parse diverges from the resident AST (a
138
+ * different node count, or a different type, container slot, reference slots
139
+ * or grammar value on any node — should not happen for unchanged text, but a
140
+ * guard against an AST changed in place) the graft is abandoned before any
141
+ * write and the document stays shed. A read-side caller degrades as it did
142
+ * before (no wrong attachment), and the build re-parses.
131
143
  *
132
144
  * **Module-private mechanism.** The public entry points are
133
145
  * {@link CstResidencyService.rehydrateNode} / {@link CstResidencyService.rehydrate},
@@ -139,7 +151,7 @@ export function isCstShed(document: LangiumDocument): boolean {
139
151
  * @returns `true` if the document now has a resident CST (already-resident is a
140
152
  * no-op `true`); `false` if the text is unrecoverable or the re-parse diverged.
141
153
  */
142
- function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory): boolean {
154
+ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory, reflection: AstReflection): boolean {
143
155
  const root = document.parseResult?.value;
144
156
  if (root === undefined) {
145
157
  return false;
@@ -155,9 +167,31 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
155
167
  const fresh = factory.fromString(text, document.uri);
156
168
  const existingNodes = [...AstUtils.streamAst(root)];
157
169
  const freshNodes = [...AstUtils.streamAst(fresh.parseResult.value)];
158
- if (existingNodes.length !== freshNodes.length) {
170
+ // Pre-order follows property order, so a property re-added in place would
171
+ // pair siblings of one type crosswise. Their container slots tell them
172
+ // apart, and their grammar values tell apart siblings that traded slots too.
173
+ const pairsDiffer = (node: AstNode, freshNode: AstNode): boolean =>
174
+ node.$type !== freshNode.$type ||
175
+ node.$containerProperty !== freshNode.$containerProperty ||
176
+ node.$containerIndex !== freshNode.$containerIndex ||
177
+ Object.keys(reflection.getTypeMetaData(node.$type).properties).some(
178
+ property => !sameGrammarValue(Reflect.get(node, property), Reflect.get(freshNode, property))
179
+ );
180
+ if (existingNodes.length !== freshNodes.length || existingNodes.some((node, index) => pairsDiffer(node, freshNodes[index]))) {
159
181
  return false; // structural divergence — stay shed rather than mis-attach
160
182
  }
183
+ // `streamReferences` yields a node's *own* cross-references only (not its
184
+ // descendants'), in property enumeration order, which a property re-added
185
+ // in place changes. So each pair must hold one property and array index.
186
+ // Checked before any write, so a divergence leaves the document shed rather
187
+ // than half grafted.
188
+ const residentRefs = existingNodes.map(node => [...AstUtils.streamReferences(node)]);
189
+ const freshRefs = freshNodes.map(node => [...AstUtils.streamReferences(node)]);
190
+ const refsDiffer = (refs: ReferenceInfo[], fresh: ReferenceInfo[]): boolean =>
191
+ refs.length !== fresh.length || refs.some((ref, index) => ref.property !== fresh[index].property || ref.index !== fresh[index].index);
192
+ if (residentRefs.some((refs, index) => refsDiffer(refs, freshRefs[index]))) {
193
+ return false;
194
+ }
161
195
  for (let index = 0; index < existingNodes.length; index++) {
162
196
  const residentNode = existingNodes[index];
163
197
  const freshNode = freshNodes[index];
@@ -169,28 +203,53 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
169
203
  // at the resident node so CST→AST navigation reaches the linked AST.
170
204
  asMutable(freshCst).astNode = residentNode;
171
205
  }
172
- // Restore each reference's `$refNode` from the fresh parse. `streamReferences`
173
- // yields a node's *own* cross-references only (not its descendants'), so this
174
- // must run per node — paired by the stable key/array order a re-parse of the
175
- // same text reproduces. The resolved `.ref` link is untouched (still resident).
176
- const residentRefs = [...AstUtils.streamReferences(residentNode)];
177
- const freshRefs = [...AstUtils.streamReferences(freshNode)];
178
- if (residentRefs.length === freshRefs.length) {
179
- for (let refIndex = 0; refIndex < residentRefs.length; refIndex++) {
180
- asMutable(residentRefs[refIndex].reference).$refNode = freshRefs[refIndex].reference.$refNode;
181
- }
182
- }
206
+ // Restore each reference's `$refNode` from the fresh parse. The resolved
207
+ // `.ref` link is untouched (still resident).
208
+ residentRefs[index].forEach((resident, refIndex) => {
209
+ asMutable(resident.reference).$refNode = freshRefs[index][refIndex].reference.$refNode;
210
+ });
183
211
  }
184
212
  return true;
185
213
  }
186
214
 
187
215
  /**
188
- * Residency policy that reclaims memory by shedding the concrete syntax tree
189
- * (CST) of closed documents while keeping their AST resident. Each build refreshes
190
- * the idle window of the documents in its batch; when a closed, sheddable
191
- * document's window elapses, every AST node's `$cstNode` and every reference's
192
- * `$refNode` are nulled, and the CST root, `Range`s and `Position`s become
193
- * unreachable and are collected.
216
+ * Whether two values of one grammar property match. Child nodes are paired on
217
+ * their own, so a reference counts by its text. A converter's `Date` counts by
218
+ * its time, and any other object as equal, since its equality is unknown.
219
+ */
220
+ function sameGrammarValue(value: unknown, freshValue: unknown): boolean {
221
+ if (Array.isArray(value)) {
222
+ return (
223
+ Array.isArray(freshValue) &&
224
+ value.length === freshValue.length &&
225
+ value.every((item, index) => sameGrammarValue(item, freshValue[index]))
226
+ );
227
+ }
228
+ if (isReference(value) || isMultiReference(value)) {
229
+ return (isReference(freshValue) || isMultiReference(freshValue)) && value.$refText === freshValue.$refText;
230
+ }
231
+ if (isAstNode(value)) {
232
+ return isAstNode(freshValue);
233
+ }
234
+ if (value instanceof Date) {
235
+ return freshValue instanceof Date && value.getTime() === freshValue.getTime();
236
+ }
237
+ if (typeof value === 'object' && value !== null) {
238
+ return typeof freshValue === 'object' && freshValue !== null;
239
+ }
240
+ return Object.is(value, freshValue);
241
+ }
242
+
243
+ /**
244
+ * Keeps a document's CST available to the readers that need one, shedding it
245
+ * for documents that have gone idle and re-grafting on demand.
246
+ *
247
+ * Each build refreshes the idle window of the documents in its batch. When a
248
+ * closed, sheddable document's window elapses, every AST node's `$cstNode` and
249
+ * every reference's `$refNode` are nulled, and the CST becomes unreachable with
250
+ * the `Range`s and `Position`s only it holds. The reference index's segments, and a
251
+ * description's segments once read, share the CST's `Range` objects, so
252
+ * those stay.
194
253
  *
195
254
  * **Terminology.** *Residency* is the state axis (is the CST in memory? —
196
255
  * `resident` vs `shed`); *shed* is both the act and the policy vocabulary (drop
@@ -200,21 +259,25 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
200
259
  * retained source text and graft it back, identity-preserving — deliberately not
201
260
  * "reload", which would suggest bytes coming back unchanged).
202
261
  *
203
- * **Re-entry is safe.** A shed document that later re-enters a build (because it
204
- * is relinked as an affected dependent, re-validated, or edited) is re-parsed
205
- * first by `HydraniumDocumentBuilder.resetToState`
206
- * ("rehydrate-on-re-entry"), which rebuilds the CST and every `$refNode`. That
262
+ * **Re-entry is safe.** A shed document that later re-enters a build has its
263
+ * CST and every `$refNode` grafted back first ("rehydrate-on-re-entry"),
264
+ * keeping its AST nodes so dependents outside the build stay linked to them.
265
+ * `HydraniumDocumentBuilder.rehydrateShedDocuments` grafts a document that is
266
+ * relinked or re-validated, before the build's phases, and
267
+ * `HydraniumLangiumDocumentFactory.update` one reset to `Changed` whose text
268
+ * has not changed. An edited document is re-parsed, and so is one whose graft
269
+ * is refused or diverges, and a build after it relinks its dependents. That
207
270
  * matters because Langium derives the reference index — and thus
208
- * `IndexManager.isAffected` and the `segment` used by rename / find-references —
209
- * from `$refNode`; without rehydration a re-index would silently drop the
210
- * document's cross-references and its dependents would stop being relinked.
271
+ * `IndexManager.isAffected` and the `segment` used by rename /
272
+ * find-references — from `$refNode`. Without rehydration a re-index would
273
+ * silently drop the document's cross-references, and it would no longer be
274
+ * relinked when its targets change.
211
275
  *
212
276
  * Constructed with `(services, options)` and self-registers a `Validated`
213
- * `BuildPhasePass`, which
214
- * is why the framework constructs it eagerly — the pass must be registered before
215
- * the first build. Shedding itself is opt-in: the bound default strategy is
216
- * `always-keep`, so the pass runs and sheds nothing until an adopter rebinds the
217
- * slot with a shedding strategy.
277
+ * `BuildPhasePass`, which is why the framework constructs it eagerly — the pass
278
+ * must be registered before the first build. Shedding itself is opt-in: the
279
+ * bound default strategy is `always-keep`, so the pass runs and sheds nothing
280
+ * until an adopter rebinds the slot with a shedding strategy.
218
281
  *
219
282
  * **Read-side navigation under a shedding strategy.** Read-only LSP requests do
220
283
  * not run a build, so they do not trigger the build-side rehydrate. Features that
@@ -231,22 +294,21 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
231
294
  * `NameProvider.getNameNode` chokepoint, the comment provider, and
232
295
  * `HydraniumLangiumDocuments.getOrCreateDocument`.
233
296
  */
234
- /**
235
- * Keeps a document's CST available to the readers that need one, shedding it
236
- * for documents that have gone idle and re-grafting on demand.
237
- */
238
297
  export interface CstResidencyService {
239
298
  /**
240
- * Ensure `document` has a CST, re-parsing its retained text if it was shed.
241
- * A resident document is left exactly as it is, so this is safe to call on
242
- * a hot path and safe to call twice.
299
+ * Ensure `document` has a CST, re-parsing its retained text if it was shed
300
+ * and that text is the one its AST was parsed from. A resident document is
301
+ * left exactly as it is, so this is safe to call on a hot path and safe to
302
+ * call twice. A document whose graft diverged is not attempted again on the
303
+ * same text.
243
304
  */
244
305
  rehydrate(document: LangiumDocument): void;
245
306
 
246
307
  /**
247
308
  * Node-level convenience over {@link rehydrate}, cheap enough for an
248
309
  * unconditional call: a node whose `$cstNode` is already set returns
249
- * without resolving its document.
310
+ * without resolving its document, and a node outside any document, such as
311
+ * a detached synthetic node, has nothing to restore and returns too.
250
312
  */
251
313
  rehydrateNode(node: AstNode): void;
252
314
  }
@@ -267,6 +329,14 @@ export class DefaultCstResidencyService implements CstResidencyService {
267
329
  * cycles, and all cancelled by {@link dispose}.
268
330
  */
269
331
  protected readonly idleTimers = new Map<string, Debouncer>();
332
+ /**
333
+ * The text each document's graft diverged on. Until its text changes, the
334
+ * document is not shed again: an AST the build keeps mutating away from its
335
+ * text would otherwise cost a graft, a re-parse and a build on every
336
+ * re-entry. Keyed by document, because the re-parse after a divergence
337
+ * replaces the root.
338
+ */
339
+ protected readonly diverged = new WeakMap<LangiumDocument, string>();
270
340
  protected shedTotal = 0;
271
341
 
272
342
  constructor(
@@ -281,7 +351,7 @@ export class DefaultCstResidencyService implements CstResidencyService {
281
351
  this.langiumDocs = services.workspace.LangiumDocuments;
282
352
  services.workspace.BuildPhasePassService.register({
283
353
  id: 'framework:cst-residency:shed',
284
- state: DocumentState.Validated,
354
+ phase: DocumentState.Validated,
285
355
  priority: options.priority ?? CST_RESIDENCY_PASS_PRIORITY,
286
356
  run: documents => this.onBuild(documents)
287
357
  });
@@ -289,8 +359,8 @@ export class DefaultCstResidencyService implements CstResidencyService {
289
359
 
290
360
  /**
291
361
  * Restore `document`'s shed CST on demand — the ergonomic entry point over
292
- * {@link rehydrateCst} (resolves the document factory itself). No-op `true`
293
- * when the CST is resident, so read-side seams call it unconditionally.
362
+ * {@link rehydrateCst} (resolves the document factory itself). A no-op when
363
+ * the CST is resident, so read-side seams call it unconditionally.
294
364
  *
295
365
  * **Residency note (deliberate).** Rehydration does NOT count as a "use" for
296
366
  * the `shed-closed-when-idle` idle timer (which is refreshed only by build
@@ -302,20 +372,39 @@ export class DefaultCstResidencyService implements CstResidencyService {
302
372
  * method is where that hook goes.
303
373
  */
304
374
  rehydrate(document: LangiumDocument): void {
305
- rehydrateCst(document, this.services.workspace.LangiumDocumentFactory);
375
+ const root = document.parseResult?.value;
376
+ // A graft from other text would attach its CST to nodes it does not
377
+ // describe. `shed` records the text the AST was parsed from.
378
+ // A diverged graft diverges again on the same text, so it is not parsed twice.
379
+ const parsedFrom = root === undefined ? undefined : this.services.workspace.ModelLedger.textOf(root);
380
+ if (
381
+ root === undefined ||
382
+ root.$cstNode !== undefined ||
383
+ parsedFrom === undefined ||
384
+ parsedFrom !== document.textDocument?.getText() ||
385
+ this.hasDiverged(document)
386
+ ) {
387
+ return;
388
+ }
389
+ if (!rehydrateCst(document, this.services.workspace.LangiumDocumentFactory, this.services.AstReflection)) {
390
+ this.diverged.set(document, parsedFrom);
391
+ }
306
392
  }
307
393
 
308
394
  /**
309
395
  * Node-level convenience over {@link rehydrate}: a resident node (its
310
396
  * `$cstNode` is set — true for every node of a non-shed document) returns
311
- * `true` without even resolving the document, so hot read paths
397
+ * without even resolving the document, so hot read paths
312
398
  * (`getNameNode`, comment lookup) call this unconditionally.
313
399
  */
314
400
  rehydrateNode(node: AstNode): void {
315
401
  if (node.$cstNode !== undefined) {
316
402
  return;
317
403
  }
318
- this.rehydrate(AstUtils.getDocument(node));
404
+ const document = AstUtils.findRootNode(node).$document;
405
+ if (document) {
406
+ this.rehydrate(document);
407
+ }
319
408
  }
320
409
 
321
410
  /**
@@ -333,13 +422,10 @@ export class DefaultCstResidencyService implements CstResidencyService {
333
422
  }
334
423
  for (const document of documents) {
335
424
  const uri = document.uri.toString();
336
- if (this.textDocuments.isOpenInAnyClient(uri)) {
425
+ if (this.textDocuments.isOpenInAnyClient(uri) || !this.canShed(document) || !this.isSheddable(document)) {
337
426
  this.idleTimers.get(uri)?.cancel();
338
427
  continue;
339
428
  }
340
- if (!this.isSheddable(document)) {
341
- continue;
342
- }
343
429
  this.idleTimerFor(uri).schedule();
344
430
  }
345
431
  }
@@ -364,14 +450,17 @@ export class DefaultCstResidencyService implements CstResidencyService {
364
450
  * Idle-timer fire: shed the document's CST if it is still closed and resident.
365
451
  * Re-checks open-state (a reopen within the window cancels the timer, but guard
366
452
  * anyway) and resolves the current document by URI (it may have been deleted,
367
- * or its object replaced by a rebuild).
453
+ * or its object replaced by a rebuild). Re-checks {@link canShed} and
454
+ * {@link isSheddable} too. The timer was armed by an earlier build, and the
455
+ * document may since be mid-rebuild or have gained an unresolved reference
456
+ * in a cancelled build.
368
457
  */
369
458
  protected onIdle(uri: string): void {
370
459
  if (this.textDocuments.isOpenInAnyClient(uri)) {
371
460
  return;
372
461
  }
373
462
  const document = this.langiumDocs.getDocument(URI.parse(uri));
374
- if (document === undefined) {
463
+ if (document === undefined || !this.canShed(document) || !this.isSheddable(document)) {
375
464
  return;
376
465
  }
377
466
  this.shedTotal += this.shed(document);
@@ -385,16 +474,42 @@ export class DefaultCstResidencyService implements CstResidencyService {
385
474
  this.idleTimers.clear();
386
475
  }
387
476
 
477
+ /** Whether `document`'s graft diverged on the text its root was parsed from. */
478
+ protected hasDiverged(document: LangiumDocument): boolean {
479
+ const text = this.diverged.get(document);
480
+ return text !== undefined && text === this.services.workspace.ModelLedger.textOf(document.parseResult.value);
481
+ }
482
+
483
+ /**
484
+ * Whether `document` can be shed without losing its AST identity or its
485
+ * references. Only a `Validated` document qualifies: the idle timer can fire
486
+ * while a build waits between documents, and a build that indexes a
487
+ * document's references without their CST drops them from the reference
488
+ * index. Its root needs a recorded version, because `shed` then records no
489
+ * text and the graft refuses it. A document whose graft diverged on its
490
+ * current text would cost a parse on every re-entry. Checked before
491
+ * {@link isSheddable}, so an override of that policy keeps these guards.
492
+ */
493
+ protected canShed(document: LangiumDocument): boolean {
494
+ return (
495
+ document.state === DocumentState.Validated &&
496
+ !this.hasDiverged(document) &&
497
+ this.services.workspace.ModelLedger.versionOf(document.parseResult.value) !== UNRECORDED_VERSION
498
+ );
499
+ }
500
+
388
501
  /**
389
502
  * Whether a closed document may have its CST shed. Only documents whose text
390
- * a re-parse on re-entry can recover are sheddable; the default admits
391
- * `file`-scheme documents (re-read from disk) and excludes synthetic / in-memory
392
- * documents — e.g. built-in definitions registered under a custom URI scheme —
393
- * whose text lives only in the CST and would be lost irrecoverably (a later
394
- * relink would `readFile` a non-existent path). Adopters override to refine.
503
+ * a re-parse can recover are sheddable, because a re-entry whose graft
504
+ * diverges re-parses from disk. The default admits `file`-scheme documents
505
+ * and excludes synthetic / in-memory documents — e.g. built-in definitions
506
+ * registered under a custom URI scheme — for which that re-parse would
507
+ * `readFile` a non-existent path. A document with an unresolved
508
+ * reference stays resident too: Langium relinks it on every update, so a shed
509
+ * would only buy a re-graft each time. Adopters override to refine.
395
510
  */
396
511
  protected isSheddable(document: LangiumDocument): boolean {
397
- return document.uri.scheme === 'file';
512
+ return document.uri.scheme === 'file' && !document.references.some(reference => reference.error !== undefined);
398
513
  }
399
514
 
400
515
  /**
@@ -407,6 +522,15 @@ export class DefaultCstResidencyService implements CstResidencyService {
407
522
  if (root === undefined || root.$cstNode === undefined) {
408
523
  return 0;
409
524
  }
525
+ // Readers of the parsed text, the `'text-diagnostics'` fingerprint among
526
+ // them, otherwise see none once the CST is gone. Recorded in the ledger
527
+ // directly: no root is produced, and reconciling it with the store would
528
+ // step a closed document's sequence for a root behind its text.
529
+ const ledger = this.services.workspace.ModelLedger;
530
+ const version = ledger.versionOf(root);
531
+ if (version !== UNRECORDED_VERSION) {
532
+ ledger.record(root, version, ledger.textOf(root));
533
+ }
410
534
  let cleared = 0;
411
535
  for (const node of AstUtils.streamAst(root)) {
412
536
  if (node.$cstNode) {
@@ -8,7 +8,15 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { type Tracer } from '@hydranium/protocol';
11
- import { type AstNode, type AstNodeDescription, DefaultAstNodeDescriptionProvider, type LangiumDocument } from '@hydranium/langium';
11
+ import {
12
+ type AstNode,
13
+ AstUtils,
14
+ CstUtils,
15
+ DefaultAstNodeDescriptionProvider,
16
+ type DocumentSegment,
17
+ type LangiumDocument,
18
+ type URI
19
+ } from '@hydranium/langium';
12
20
  import type { LogNameOptions } from '../diagnostics/logger.js';
13
21
  import type { HydraniumLanguageServices } from '../language-module.js';
14
22
  import { type DescriptionTier, type TieredAstNodeDescription } from './scoped-ast-node-description.js';
@@ -32,9 +40,11 @@ import { type DescriptionTier, type TieredAstNodeDescription } from './scoped-as
32
40
  */
33
41
  export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescriptionProvider {
34
42
  protected readonly tracer: Tracer;
43
+ protected readonly services: HydraniumLanguageServices;
35
44
 
36
45
  constructor(services: HydraniumLanguageServices, options: LogNameOptions = {}) {
37
46
  super(services);
47
+ this.services = services;
38
48
  this.tracer = services.shared.Tracer.for(options.logName ?? 'AstNodeDescriptionProvider').trace('instantiated');
39
49
  }
40
50
 
@@ -44,12 +54,11 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
44
54
  * filter pipeline. Callers that need a different tier must use
45
55
  * {@link createProject}, {@link createPublic}, or {@link createUniversal}.
46
56
  *
47
- * The named factory methods bypass this override by calling
48
- * `super.createDescription` to get a plain base before stamping the
49
- * correct tier — so there is no create-then-overwrite cost.
57
+ * Langium's own `createDescription` is not called: every factory builds
58
+ * through {@link createTiered}.
50
59
  */
51
- override createDescription(node: AstNode, name: string, document: LangiumDocument): TieredAstNodeDescription {
52
- return this.toTiered(super.createDescription(node, name, document), 'local');
60
+ override createDescription(node: AstNode, name: string | undefined, document?: LangiumDocument): TieredAstNodeDescription {
61
+ return this.createTiered(node, name, document, 'local');
53
62
  }
54
63
 
55
64
  /**
@@ -62,7 +71,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
62
71
  * never sees them, so a project tag would be unused.
63
72
  */
64
73
  createLocal(options: { readonly node: AstNode; readonly name: string; readonly document: LangiumDocument }): TieredAstNodeDescription {
65
- return this.toTiered(super.createDescription(options.node, options.name, options.document), 'local');
74
+ return this.createTiered(options.node, options.name, options.document, 'local');
66
75
  }
67
76
 
68
77
  /**
@@ -84,7 +93,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
84
93
  readonly document: LangiumDocument;
85
94
  readonly projectId: string;
86
95
  }): TieredAstNodeDescription {
87
- return this.toTiered(super.createDescription(options.node, options.name, options.document), 'project', options.projectId);
96
+ return this.createTiered(options.node, options.name, options.document, 'project', options.projectId);
88
97
  }
89
98
 
90
99
  /**
@@ -108,7 +117,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
108
117
  readonly document: LangiumDocument;
109
118
  readonly projectId: string;
110
119
  }): TieredAstNodeDescription {
111
- return this.toTiered(super.createDescription(options.node, options.name, options.document), 'public', options.projectId);
120
+ return this.createTiered(options.node, options.name, options.document, 'public', options.projectId);
112
121
  }
113
122
 
114
123
  /**
@@ -126,16 +135,102 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
126
135
  readonly name: string;
127
136
  readonly document: LangiumDocument;
128
137
  }): TieredAstNodeDescription {
129
- return this.toTiered(super.createDescription(options.node, options.name, options.document), 'universal');
138
+ return this.createTiered(options.node, options.name, options.document, 'universal');
130
139
  }
131
140
 
132
141
  /**
133
- * Attach `tier` + `projectId` fields to a plain {@link AstNodeDescription}
134
- * in place, narrowing the static type to {@link TieredAstNodeDescription}.
135
- * Mutates `base` rather than copying — the input is treated as
136
- * just-constructed and not aliased elsewhere.
142
+ * Resolve the fields of the description every factory returns and build it
143
+ * through {@link newDescription}. Mirrors Langium's `createDescription`:
144
+ * the name defaults to the name provider's, and a node without one throws.
137
145
  */
138
- protected toTiered(base: AstNodeDescription, tier: DescriptionTier, projectId?: string): TieredAstNodeDescription {
139
- return Object.assign(base, { tier, projectId }) as TieredAstNodeDescription;
146
+ protected createTiered(
147
+ node: AstNode,
148
+ name: string | undefined,
149
+ document: LangiumDocument | undefined,
150
+ tier: DescriptionTier,
151
+ projectId?: string
152
+ ): TieredAstNodeDescription {
153
+ const path = this.astNodeLocator.getAstNodePath(node);
154
+ const resolvedName = name ?? this.nameProvider.getName(node);
155
+ if (!resolvedName) {
156
+ throw new Error(`Node at path ${path} has no name.`);
157
+ }
158
+ const documentUri = (document ?? AstUtils.getDocument(node)).uri;
159
+ return this.newDescription(node, resolvedName, documentUri, path, tier, projectId);
160
+ }
161
+
162
+ /** Construct the description from resolved fields; override to build a subclass of {@link DefaultTieredAstNodeDescription}. */
163
+ protected newDescription(
164
+ node: AstNode,
165
+ name: string,
166
+ documentUri: URI,
167
+ path: string,
168
+ tier: DescriptionTier,
169
+ projectId: string | undefined
170
+ ): TieredAstNodeDescription {
171
+ return new DefaultTieredAstNodeDescription(this, node, name, documentUri, path, tier, projectId);
172
+ }
173
+
174
+ /**
175
+ * The segment of `node`'s name, or of the whole node when the name
176
+ * provider finds no name node, restoring a shed CST first: a name provider
177
+ * need not restore it, and an absent segment is not computed again.
178
+ */
179
+ nameSegmentOf(node: AstNode): DocumentSegment | undefined {
180
+ this.services.shared.workspace.CstResidencyService.rehydrateNode(node);
181
+ return CstUtils.toDocumentSegment(this.nameProvider.getNameNode(node) ?? node.$cstNode);
182
+ }
183
+
184
+ /** The segment of the whole node, restoring a shed CST first. */
185
+ selectionSegmentOf(node: AstNode): DocumentSegment | undefined {
186
+ this.services.shared.workspace.CstResidencyService.rehydrateNode(node);
187
+ return CstUtils.toDocumentSegment(node.$cstNode);
188
+ }
189
+ }
190
+
191
+ /**
192
+ * The description {@link HydraniumAstNodeDescriptionProvider} builds. Every
193
+ * field is set in the constructor, so all descriptions share one V8 hidden
194
+ * class; Langium's object literal with a `nameSegment` accessor is kept in
195
+ * dictionary mode and carries two closures, several times the bytes.
196
+ *
197
+ * `nameSegment` and `selectionSegment` are prototype getters, not own
198
+ * properties: a spread, `Object.keys`, a JSON round trip or `structuredClone`
199
+ * of a description drops them. Each is computed on its first read, from the
200
+ * node the description was built for, restoring a shed CST first; an eager
201
+ * `selectionSegment` would keep a segment per description that nothing reads.
202
+ */
203
+ export class DefaultTieredAstNodeDescription implements TieredAstNodeDescription {
204
+ readonly type: string;
205
+ // `null` records a segment computed while the node had no CST. It is
206
+ // recomputed only once the node has one again: retrying without one would
207
+ // attempt a restore, a re-parse, on every read.
208
+ protected nameSegmentCache: DocumentSegment | null | undefined;
209
+ protected selectionSegmentCache: DocumentSegment | null | undefined;
210
+
211
+ constructor(
212
+ protected readonly provider: HydraniumAstNodeDescriptionProvider,
213
+ readonly node: AstNode,
214
+ readonly name: string,
215
+ readonly documentUri: URI,
216
+ readonly path: string,
217
+ readonly tier: DescriptionTier,
218
+ readonly projectId: string | undefined
219
+ ) {
220
+ this.type = node.$type;
221
+ }
222
+
223
+ get nameSegment(): DocumentSegment | undefined {
224
+ if (this.nameSegmentCache === undefined || (this.nameSegmentCache === null && this.node.$cstNode !== undefined)) {
225
+ this.nameSegmentCache = this.provider.nameSegmentOf(this.node) ?? null;
226
+ }
227
+ return this.nameSegmentCache ?? undefined;
228
+ }
229
+
230
+ get selectionSegment(): DocumentSegment | undefined {
231
+ if (this.selectionSegmentCache === undefined || (this.selectionSegmentCache === null && this.node.$cstNode !== undefined)) {
232
+ this.selectionSegmentCache = this.provider.selectionSegmentOf(this.node) ?? null;
233
+ }
234
+ return this.selectionSegmentCache ?? undefined;
140
235
  }
141
236
  }
@@ -0,0 +1,13 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import type { AstNode, LocalSymbols } from '@hydranium/langium';
11
+
12
+ /** The local symbols each build computed, by the root it computed them for. */
13
+ export const builtLocalSymbols = new WeakMap<AstNode, LocalSymbols>();