@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
@@ -0,0 +1,112 @@
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 CanonicalUri, type TextVersion, textHash } from '@hydranium/protocol';
11
+ import { type TextDocument } from 'vscode-languageserver-textdocument';
12
+
13
+ /** What {@link TextLedger} holds for a document: where its version sequence stands, kept across closes and reopens. */
14
+ export interface TextRecord {
15
+ readonly version: TextVersion;
16
+ /** {@link textHash} of the text at that version. */
17
+ readonly hash: string;
18
+ }
19
+
20
+ /**
21
+ * Where each document's {@link TextVersion} sequence stands, and who authored
22
+ * each version; the text-side counterpart of `ModelLedger`.
23
+ *
24
+ * A record survives the document's release and is never pruned, not even when
25
+ * the file is deleted: a sequence that restarts lets a write based on the old
26
+ * text pass the base-version gate. Authors last only until the release.
27
+ */
28
+ export interface TextLedger {
29
+ /**
30
+ * The version a first open of `key` with `text` starts at: the record's
31
+ * version when the text is unchanged, one step on when it changed;
32
+ * `undefined` without a record.
33
+ */
34
+ openingVersion(key: CanonicalUri, text: string): TextVersion | undefined;
35
+ /** Keep where the sequence of the released `document` stands. */
36
+ record(key: CanonicalUri, document: TextDocument): void;
37
+ recordOf(key: CanonicalUri): TextRecord | undefined;
38
+ /**
39
+ * Text reached the closed document `key` outside the store's write paths.
40
+ * Steps the record iff `text` differs from it, and starts one at `0` when
41
+ * there is none.
42
+ */
43
+ reconcile(key: CanonicalUri, text: string): TextVersion;
44
+ /** {@link textHash} of `document`'s text, taken once per version. */
45
+ hashOf(document: TextDocument): string;
46
+ setAuthor(key: CanonicalUri, version: TextVersion, author: string): void;
47
+ /** The author of `version`, or of the latest version when `version` is omitted. */
48
+ authorOf(key: CanonicalUri, version?: TextVersion): string | undefined;
49
+ clearAuthors(key: CanonicalUri): void;
50
+ }
51
+
52
+ export class DefaultTextLedger implements TextLedger {
53
+ protected readonly records = new Map<CanonicalUri, TextRecord>();
54
+ protected readonly authors = new Map<CanonicalUri, string[]>();
55
+ protected readonly hashes = new WeakMap<TextDocument, { readonly version: number; readonly hash: string }>();
56
+
57
+ openingVersion(key: CanonicalUri, text: string): TextVersion | undefined {
58
+ const recorded = this.records.get(key);
59
+ if (recorded === undefined) {
60
+ return undefined;
61
+ }
62
+ return recorded.hash === textHash(text) ? recorded.version : recorded.version + 1;
63
+ }
64
+
65
+ record(key: CanonicalUri, document: TextDocument): void {
66
+ this.records.set(key, { version: document.version, hash: this.hashOf(document) });
67
+ }
68
+
69
+ recordOf(key: CanonicalUri): TextRecord | undefined {
70
+ return this.records.get(key);
71
+ }
72
+
73
+ reconcile(key: CanonicalUri, text: string): TextVersion {
74
+ const hash = textHash(text);
75
+ const recorded = this.records.get(key);
76
+ if (recorded?.hash === hash) {
77
+ return recorded.version;
78
+ }
79
+ const version = recorded === undefined ? 0 : recorded.version + 1;
80
+ this.records.set(key, { version, hash });
81
+ return version;
82
+ }
83
+
84
+ hashOf(document: TextDocument): string {
85
+ const taken = this.hashes.get(document);
86
+ if (taken?.version === document.version) {
87
+ return taken.hash;
88
+ }
89
+ const hash = textHash(document.getText());
90
+ this.hashes.set(document, { version: document.version, hash });
91
+ return hash;
92
+ }
93
+
94
+ setAuthor(key: CanonicalUri, version: TextVersion, author: string): void {
95
+ let history = this.authors.get(key);
96
+ if (!history) {
97
+ history = [];
98
+ this.authors.set(key, history);
99
+ }
100
+ history[version] = author;
101
+ }
102
+
103
+ authorOf(key: CanonicalUri, version?: TextVersion): string | undefined {
104
+ const history = this.authors.get(key);
105
+ // `!== undefined` so version 0 is not read as "latest".
106
+ return version !== undefined ? history?.[version] : history?.at(-1);
107
+ }
108
+
109
+ clearAuthors(key: CanonicalUri): void {
110
+ this.authors.delete(key);
111
+ }
112
+ }
@@ -0,0 +1,289 @@
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 { DocumentState, type LangiumDocument, type URI } from '@hydranium/langium';
11
+ import { type Tracer, UNRECORDED_VERSION, describeError, describeErrorWithStack } from '@hydranium/protocol';
12
+ import { Disposable, Emitter, type Event } from 'vscode-languageserver-protocol';
13
+ import { type LogNameOptions } from '../langium/diagnostics/logger.js';
14
+ import { type ServerSharedServices } from '../langium/module.js';
15
+ import { HydraniumWorkspaceLock } from '../langium/workspace/hydranium-workspace-lock.js';
16
+ import { HydraniumTextDocuments } from './hydranium-text-documents.js';
17
+
18
+ /** A build {@link VersionSyncService.requestRecoveryBuild} schedules. */
19
+ export interface RecoveryBuildRequest {
20
+ /** Remove the document instead of building it. */
21
+ readonly deleted?: boolean;
22
+ /** Staged for the build, as `HydraniumDocumentBuilder.scheduleUpdate` takes it. */
23
+ readonly reason?: string;
24
+ /** Asked again inside the lock, where a build that ran meanwhile may have made the request moot. */
25
+ readonly stillNeeded: () => boolean;
26
+ /** Build even while a {@link VersionSyncService.registerDeferredBuilds} check holds the URI back. */
27
+ readonly ignoreDeferred?: boolean;
28
+ }
29
+
30
+ /**
31
+ * Keeps each workspace root's `ModelLedger` record in step with the
32
+ * text store, and owns every build that syncs a root to its text or recovers
33
+ * one a build left behind.
34
+ */
35
+ export interface VersionSyncService {
36
+ /**
37
+ * Report a root a factory, registry, integrity repair or other producer
38
+ * made. Below `Parsed` it is marked a placeholder. Otherwise `origin.version`,
39
+ * the store's version read before the parse, is recorded; a registered
40
+ * document is then reconciled with the store, re-versioned and recorded at
41
+ * the store's version of its text, built if behind, and announced on
42
+ * {@link onDidRecordModel}. `origin.text` stands for a root whose CST is not
43
+ * the text it describes.
44
+ */
45
+ modelProduced(document: LangiumDocument, origin?: { version?: number; text?: string }): void;
46
+ /**
47
+ * Build `uri` from a `WorkspaceLock` read, so the build queues behind a
48
+ * running one rather than cancelling it. Requests made while one for `uri`
49
+ * is pending share its next build. Resolves once a build that carried this
50
+ * request completed, or once a check before a build found it no longer
51
+ * needed or deferred. A build a later write cancelled does not count: the
52
+ * request rides the next one. Rejects with the last build's error once builds
53
+ * carrying this request have failed more often than it may retry, so a
54
+ * caller waiting on the build can stop; the caller ends that failure, and
55
+ * logs it if nothing else reports it.
56
+ */
57
+ requestRecoveryBuild(uri: URI, request: RecoveryBuildRequest): Promise<void>;
58
+ /**
59
+ * Build `uri` unless it is {@link isSyncedTo synced to} `textVersion`, asked
60
+ * again inside the lock. `undefined` when no build is needed, else the
61
+ * {@link requestRecoveryBuild} promise.
62
+ */
63
+ syncTo(uri: URI, textVersion: number): Promise<void> | undefined;
64
+ /**
65
+ * Build `document` through {@link requestRecoveryBuild}, unless it is no
66
+ * longer the document for its URI by then. Nothing waits on the build, so
67
+ * a failure is logged here.
68
+ */
69
+ rebuildWhileCurrent(document: LangiumDocument): void;
70
+ /**
71
+ * Whether `uri`'s root was parsed from text at `textVersion` or later; requests
72
+ * nothing. A root with no recorded version or a placeholder counts as synced,
73
+ * since no build records a version for it, and so does a URI with no document.
74
+ */
75
+ isSyncedTo(uri: URI, textVersion: number): boolean;
76
+ /**
77
+ * Register `isDeferred`, which answers whether its caller holds back a build
78
+ * of a URI it will request later, as the update handler does for a debounced
79
+ * editor change. A caller that drops a held change has to leave the URI to
80
+ * another build.
81
+ */
82
+ registerDeferredBuilds(isDeferred: (uri: URI) => boolean): Disposable;
83
+ /**
84
+ * Fires for every reconciled root. A cancel cannot skip it, unlike a
85
+ * `Parsed` phase listener. It can fire inside a build's write lock, so a
86
+ * listener that requests a build must not await it.
87
+ */
88
+ readonly onDidRecordModel: Event<LangiumDocument>;
89
+ }
90
+
91
+ /** A request waiting in {@link PendingRecoveryBuilds}, with the failed builds that carried it. */
92
+ export interface QueuedRecoveryBuild {
93
+ readonly request: RecoveryBuildRequest;
94
+ failures: number;
95
+ /** Settles the request once a build carried it or it was no longer needed. */
96
+ readonly resolve: () => void;
97
+ /** Settles the request once it has used its retries, with the last build's error. */
98
+ readonly reject: (error: unknown) => void;
99
+ }
100
+
101
+ /** The requests waiting on one URI's builds in {@link DefaultVersionSyncService}. */
102
+ export interface PendingRecoveryBuilds {
103
+ readonly queued: QueuedRecoveryBuild[];
104
+ }
105
+
106
+ /**
107
+ * Collaborators are resolved per call: the registry and its document factory,
108
+ * which construct each other, report roots to this service.
109
+ */
110
+ export class DefaultVersionSyncService implements VersionSyncService {
111
+ protected readonly tracer: Tracer;
112
+ protected readonly recordedEmitter = new Emitter<LangiumDocument>();
113
+ protected readonly deferredBuildChecks = new Set<(uri: URI) => boolean>();
114
+ protected readonly pendingBuilds = new Map<string, PendingRecoveryBuilds>();
115
+ /** Retries of each request after a failed build before it is rejected. */
116
+ protected readonly maxBuildRetries: number = 1;
117
+
118
+ constructor(
119
+ protected readonly services: ServerSharedServices,
120
+ options: LogNameOptions = {}
121
+ ) {
122
+ this.tracer = services.Tracer.for(options.logName ?? 'VersionSyncService').trace('instantiated');
123
+ }
124
+
125
+ get onDidRecordModel(): Event<LangiumDocument> {
126
+ return this.recordedEmitter.event;
127
+ }
128
+
129
+ modelProduced(document: LangiumDocument, origin: { version?: number; text?: string } = {}): void {
130
+ const workspace = this.services.workspace;
131
+ const ledger = workspace.ModelLedger;
132
+ const root = document.parseResult.value;
133
+ if (document.state < DocumentState.Parsed) {
134
+ ledger.markPlaceholder(root);
135
+ return;
136
+ }
137
+ if (origin.version !== undefined) {
138
+ ledger.record(root, origin.version, origin.text);
139
+ }
140
+ const store = workspace.TextDocuments;
141
+ // Unregistered, it is a probe or a load whose registration reports it again.
142
+ if (!(store instanceof HydraniumTextDocuments) || workspace.LangiumDocuments.getDocument(document.uri) !== document) {
143
+ return;
144
+ }
145
+ const uri = document.uri.toString();
146
+ // Against the parsed text: the text document may already hold a newer edit.
147
+ const version = store.reconcileExternalContent(uri, origin.text ?? this.parsedText(document));
148
+ if (version !== undefined) {
149
+ if (document.textDocument.version !== version) {
150
+ // An empty-changes update only re-stamps the version.
151
+ store.update(document.textDocument, [], version);
152
+ }
153
+ ledger.record(root, version, origin.text);
154
+ }
155
+ // Nothing waits on this build, so its failure ends here.
156
+ this.syncTo(document.uri, store.version(uri))?.catch((error: unknown) =>
157
+ this.tracer.withUri(uri).error(`The build that would sync the root to its text failed. ${describeErrorWithStack(error)}`)
158
+ );
159
+ this.recordedEmitter.fire(document);
160
+ }
161
+
162
+ syncTo(uri: URI, textVersion: number): Promise<void> | undefined {
163
+ const behind = (): boolean => !this.isSyncedTo(uri, textVersion);
164
+ return behind() ? this.requestRecoveryBuild(uri, { stillNeeded: behind }) : undefined;
165
+ }
166
+
167
+ rebuildWhileCurrent(document: LangiumDocument): void {
168
+ const uri = document.uri;
169
+ this.requestRecoveryBuild(uri, { stillNeeded: () => this.services.workspace.LangiumDocuments.getDocument(uri) === document }).catch(
170
+ (error: unknown) =>
171
+ this.tracer.withUri(uri.toString()).error(`The rebuild of a current document failed. ${describeErrorWithStack(error)}`)
172
+ );
173
+ }
174
+
175
+ requestRecoveryBuild(uri: URI, request: RecoveryBuildRequest): Promise<void> {
176
+ return new Promise<void>((resolve, reject) => {
177
+ const key = uri.toString();
178
+ const queued: QueuedRecoveryBuild = { request, failures: 0, resolve, reject };
179
+ const pending = this.pendingBuilds.get(key);
180
+ if (pending) {
181
+ // Not dropped: the pending build may have read the text before this request's change.
182
+ pending.queued.push(queued);
183
+ return;
184
+ }
185
+ const entry: PendingRecoveryBuilds = { queued: [queued] };
186
+ this.pendingBuilds.set(key, entry);
187
+ void this.runBuilds(key, uri, entry);
188
+ });
189
+ }
190
+
191
+ registerDeferredBuilds(isDeferred: (uri: URI) => boolean): Disposable {
192
+ this.deferredBuildChecks.add(isDeferred);
193
+ return Disposable.create(() => this.deferredBuildChecks.delete(isDeferred));
194
+ }
195
+
196
+ isSyncedTo(uri: URI, textVersion: number): boolean {
197
+ const root = this.services.workspace.LangiumDocuments.getDocument(uri)?.parseResult.value;
198
+ if (root === undefined) {
199
+ return true;
200
+ }
201
+ const ledger = this.services.workspace.ModelLedger;
202
+ const recorded = ledger.versionOf(root);
203
+ return recorded === UNRECORDED_VERSION || ledger.isPlaceholder(root) || recorded >= textVersion;
204
+ }
205
+
206
+ /** The text `document`'s root was parsed from, or for a root built without either record or CST, the document's own. */
207
+ protected parsedText(document: LangiumDocument): string {
208
+ return this.services.workspace.ModelLedger.textOf(document.parseResult.value) ?? document.textDocument.getText();
209
+ }
210
+
211
+ /**
212
+ * Run `entry`'s requests, one build per batch, until none is queued, and
213
+ * settle each. A request a failed build carried is queued again
214
+ * {@link maxBuildRetries} times, then rejected; one a cancelled
215
+ * build carried is queued again without counting. The entry is dropped
216
+ * in the same tick as the last check of the queue, so no request lands in
217
+ * an entry nothing runs any more.
218
+ */
219
+ protected async runBuilds(key: string, uri: URI, entry: PendingRecoveryBuilds): Promise<void> {
220
+ const tracer = this.tracer.withUri(key);
221
+ const lock = this.services.workspace.WorkspaceLock;
222
+ // Any other lock resolves a cancelled write as if it had completed, unnoticed.
223
+ const counting = lock instanceof HydraniumWorkspaceLock ? lock : undefined;
224
+ while (entry.queued.length > 0) {
225
+ let carried: QueuedRecoveryBuild[] = [];
226
+ let build: Promise<void> | undefined;
227
+ let cancellations: number | undefined;
228
+ try {
229
+ // The read waits until no write runs or is queued. It must not await
230
+ // the build, a write that queues behind it.
231
+ await lock.read(() => {
232
+ carried = entry.queued.splice(0);
233
+ const needed = carried.filter(queued => this.isStillNeeded(uri, queued.request));
234
+ carried.filter(queued => !needed.includes(queued)).forEach(queued => queued.resolve());
235
+ carried = needed;
236
+ if (needed.length > 0) {
237
+ build = this.scheduleBatch(
238
+ uri,
239
+ needed.map(queued => queued.request)
240
+ );
241
+ // Read after the build is queued, which cancels the write before it.
242
+ cancellations = counting?.writeCancellations;
243
+ }
244
+ });
245
+ await build;
246
+ // A write cancelled the build, before it ran or while it did.
247
+ if (cancellations !== undefined && counting?.writeCancellations !== cancellations) {
248
+ entry.queued.unshift(...carried);
249
+ continue;
250
+ }
251
+ carried.forEach(queued => queued.resolve());
252
+ } catch (err: unknown) {
253
+ const retried = carried.filter(queued => queued.failures++ < this.maxBuildRetries);
254
+ const givenUp = carried.filter(queued => !retried.includes(queued));
255
+ if (retried.length > 0) {
256
+ // The only line about this failure when the retry succeeds.
257
+ tracer.warn(`Requested build failed; retrying. ${describeErrorWithStack(err)}`);
258
+ entry.queued.unshift(...retried);
259
+ }
260
+ if (givenUp.length > 0) {
261
+ // Each requester ends the failure, so the log line is theirs.
262
+ tracer.debug(`Requested build failed again; giving up. ${describeError(err)}`);
263
+ givenUp.forEach(queued => queued.reject(err));
264
+ }
265
+ }
266
+ }
267
+ this.pendingBuilds.delete(key);
268
+ }
269
+
270
+ /** Whether `request` still needs its build, and no deferral it heeds holds it back. Runs inside the lock read. */
271
+ protected isStillNeeded(uri: URI, request: RecoveryBuildRequest): boolean {
272
+ return request.stillNeeded() && (request.ignoreDeferred === true || !this.isDeferred(uri));
273
+ }
274
+
275
+ /**
276
+ * One build for every request of `batch`, removing the document when the
277
+ * latest of them asks to, as `HydraniumDocumentBuilder.scheduleUpdate`
278
+ * merges a change and a deletion. Runs inside the lock read.
279
+ */
280
+ protected scheduleBatch(uri: URI, batch: readonly RecoveryBuildRequest[]): Promise<void> {
281
+ const deleted = batch.at(-1)?.deleted === true;
282
+ const reason = batch.find(request => request.reason !== undefined)?.reason;
283
+ return this.services.workspace.DocumentBuilder.scheduleUpdate(deleted ? [] : [uri], deleted ? [uri] : [], reason);
284
+ }
285
+
286
+ protected isDeferred(uri: URI): boolean {
287
+ return [...this.deferredBuildChecks].some(isDeferred => isDeferred(uri));
288
+ }
289
+ }
package/src/index.ts CHANGED
@@ -28,12 +28,15 @@ export * from './langium/project/index.js';
28
28
  export * from './langium/residency/index.js';
29
29
  export * from './langium/scope/index.js';
30
30
  export * from './langium/serialization/index.js';
31
+ export * from './langium/trivia/index.js';
31
32
  export * from './langium/transfer/index.js';
32
33
  export * from './langium/update-rewrite/index.js';
33
34
  export * from './langium/validation/index.js';
34
35
  export * from './langium/workspace/index.js';
35
36
  export * from './langium/service-registry.js';
36
37
  export * from './langium/language-types.js';
38
+ export * from './langium/composite-ast-reflection.js';
39
+ export * from './langium/single-langium-copy.js';
37
40
  export * from './launcher/index.js';
38
41
  export * from './locale/index.js';
39
42
  // The renderer only. The `./messages` subpath additionally enumerates this
@@ -15,6 +15,35 @@ import { type ServerLanguageServices } from '../language-module.js';
15
15
  import { Registry, type RegistryItem } from '../../util/registry.js';
16
16
  import { type AstExtensionRegistry } from './ast-extension-contribution.js';
17
17
 
18
+ /**
19
+ * The document-build phases an {@link AstExtension} may fire at. `Changed` has
20
+ * no AST yet, and `IndexedContent` carries the same per-document information
21
+ * as `Parsed`, so neither is one.
22
+ */
23
+ export type AstExtensionPhase =
24
+ | DocumentState.Parsed
25
+ | DocumentState.ComputedScopes
26
+ | DocumentState.Linked
27
+ | DocumentState.IndexedReferences
28
+ | DocumentState.Validated;
29
+
30
+ export namespace AstExtensionPhase {
31
+ /**
32
+ * Every {@link AstExtensionPhase}, in build order. `BuildPipelineIntegration`
33
+ * wires one `onDocumentPhase` listener per entry and `register` refuses a
34
+ * phase outside it, so the two cannot drift apart. A fresh array each call.
35
+ */
36
+ export function all(): readonly AstExtensionPhase[] {
37
+ return [
38
+ DocumentState.Parsed,
39
+ DocumentState.ComputedScopes,
40
+ DocumentState.Linked,
41
+ DocumentState.IndexedReferences,
42
+ DocumentState.Validated
43
+ ];
44
+ }
45
+ }
46
+
18
47
  /**
19
48
  * A registration that derives data from an AST node and attaches it to the
20
49
  * node at a declared document-build phase.
@@ -29,20 +58,23 @@ import { type AstExtensionRegistry } from './ast-extension-contribution.js';
29
58
  * are stored as non-enumerable own properties. Otherwise symbol providers,
30
59
  * folding, semantic tokens, and validators will treat them as real children.
31
60
  *
32
- * **Phase semantics:** {@link state} declares the single phase at which
61
+ * **Phase semantics:** {@link phase} declares the single phase at which
33
62
  * {@link compute} fires. The framework wires one `onDocumentPhase` listener per
34
- * useful state unconditionally, rather than deriving the set from the states
35
- * registrations declare — so a registration's state must be one of those, and
36
- * adding one is a framework change, not a registration-time choice.
63
+ * {@link AstExtensionPhase} unconditionally, rather than deriving the set from
64
+ * the phases registrations declare — so `register` refuses any other phase,
65
+ * and adding one is a framework change, not a registration-time choice.
37
66
  *
38
- * **`.ref`-dependent derivations: declare `state: ComputedScopes`, not `Linked`.**
67
+ * **`.ref`-dependent derivations: declare `phase: ComputedScopes`, not `Linked`.**
39
68
  * Lazy reference resolution is available from `ComputedScopes` onward — the
40
69
  * global scope is built by `IndexedContent` (which runs before
41
70
  * `ComputedScopes`), so reading a reference's `.ref` inside a `ComputedScopes`
42
71
  * callback triggers Langium's lazy lookup and returns the resolved target node.
72
+ * A cascade rebuild does not re-run such a derivation unless
73
+ * {@link DocumentBuilderOptions.refreshCrossDocumentComputedScopes} is set, so
74
+ * one that reads another document's node goes stale when that node changes.
43
75
  *
44
- * **DO NOT** stage a `state: ComputedScopes` placeholder hoping to refine it
45
- * via a separate `state: Linked` registration when a downstream consumer
76
+ * **DO NOT** stage a `phase: ComputedScopes` placeholder hoping to refine it
77
+ * via a separate `phase: Linked` registration when a downstream consumer
46
78
  * (typically a `ScopeExtension.addDescriptions` firing during link)
47
79
  * iterates the derived value to build a scope: `onDocumentPhase(Linked)` fires
48
80
  * AFTER Langium's `Linker.link()` has already walked the document, by which
@@ -60,32 +92,26 @@ export interface AstExtension<T extends AstNode = AstNode> extends RegistryItem
60
92
  /**
61
93
  * Per-document early-out. When set, the framework only invokes the
62
94
  * registration's callback for documents the filter accepts. If every
63
- * registration at a given state rejects the document, the framework skips
95
+ * registration at a given phase rejects the document, the framework skips
64
96
  * the `streamAllContents` walk entirely — important for large workspaces
65
97
  * where most documents carry none of the AST shapes a given extension
66
98
  * targets.
67
99
  *
68
- * Default: no filter (registration applies to every document at its state).
100
+ * Default: no filter (registration applies to every document at its phase).
69
101
  */
70
102
  documentFilter?: (document: LangiumDocument) => boolean;
71
103
  /**
72
- * The single document-build state at which {@link compute} fires.
104
+ * The single document-build phase at which {@link compute} fires.
73
105
  *
74
- * Useful values:
75
106
  * - `Parsed` — derivations from AST shape only, no `.ref` reads.
76
- * - `ComputedScopes` — lazy `.ref` resolution available; the most common state.
107
+ * - `ComputedScopes` — lazy `.ref` resolution available; the most common.
77
108
  * - `Linked` — derivations needing fully resolved cross-references.
78
109
  * - `IndexedReferences` — cross-document reverse-lookup derivations.
79
110
  * - `Validated` — derivations depending on diagnostics (rare).
80
- *
81
- * Any other state type-checks but never fires: the framework wires a
82
- * listener only for the states above. `Changed` has no AST yet, and
83
- * `IndexedContent` carries the same per-document information as `Parsed`,
84
- * so neither is wired.
85
111
  */
86
- state: DocumentState;
112
+ phase: AstExtensionPhase;
87
113
  /**
88
- * Mutate `node` for this registration at {@link state}. The framework hands
114
+ * Mutate `node` for this registration at {@link phase}. The framework hands
89
115
  * `node` typed as {@link Mutable} so computed / synthetic property
90
116
  * assignments (`node._foo = ...`) compile without per-callback
91
117
  * `asMutable(...)` casts.
@@ -109,18 +135,18 @@ export interface AstExtension<T extends AstNode = AstNode> extends RegistryItem
109
135
  *
110
136
  * Adopter overrides go through {@link DefaultAstExtensionService}; the
111
137
  * interface keeps the public API stable while internals (the bucket-
112
- * by-state cache) stay `protected` on the default class.
138
+ * by-phase cache) stay `protected` on the default class.
113
139
  */
114
140
  export interface AstExtensionService extends AstExtensionRegistry {
115
141
  /**
116
142
  * Run a single AST node through every registration declaring
117
- * `phase` as its state. Honours `documentFilter` and `nodeFilter`.
143
+ * `phase`. Honours `documentFilter` and `nodeFilter`.
118
144
  * Primarily for tests that need to invoke an extension callback without
119
145
  * driving Langium's full document-build pipeline.
120
146
  */
121
147
  extendNode(node: AstNode, document: LangiumDocument, phase: DocumentState): void;
122
148
  /**
123
- * Re-run all `compute` callbacks declaring `phase` as their state against
149
+ * Re-run all `compute` callbacks declaring `phase` against
124
150
  * every node in the document. Single-pass. Called by
125
151
  * `BuildPipelineIntegration` from an `onDocumentPhase` listener;
126
152
  * not for general adopter use.
@@ -145,18 +171,18 @@ export type AstExtensionServiceOptions = LogNameOptions;
145
171
  * owns the registry + per-node logic, not the listener lifecycle.
146
172
  *
147
173
  * **Performance:** `extendDocument` shares a single `streamAllContents` walk
148
- * per document per wired phase; cost is O(registrations-for-state × nodes),
149
- * and it early-outs when no registration targets the state or the document.
174
+ * per document per wired phase; cost is O(registrations-for-phase × nodes),
175
+ * and it early-outs when no registration targets the phase or the document.
150
176
  */
151
177
  export class DefaultAstExtensionService implements AstExtensionService {
152
178
  protected readonly extensions = new Registry<AstExtension>();
153
179
  /**
154
- * Per-state bucket of registrations targeting each state. Rebuilt lazily
180
+ * Per-phase bucket of registrations targeting each phase. Rebuilt lazily
155
181
  * on the first refresh after a registry mutation — staleness is detected
156
182
  * via reference identity of the registry's cached array (see {@link Registry.all}).
157
183
  */
158
- protected stateBuckets = new Map<DocumentState, readonly AstExtension[]>();
159
- protected stateBucketsFor: readonly AstExtension[] | undefined;
184
+ protected phaseBuckets = new Map<DocumentState, readonly AstExtension[]>();
185
+ protected phaseBucketsFor: readonly AstExtension[] | undefined;
160
186
 
161
187
  protected readonly tracer: Tracer;
162
188
 
@@ -186,6 +212,16 @@ export class DefaultAstExtensionService implements AstExtensionService {
186
212
  * which calls {@link extendDocument} for the wired phases.
187
213
  */
188
214
  register<T extends AstNode>(extension: AstExtension<T>): Disposable {
215
+ // A phase outside the wired set type-checks only past a cast, and a
216
+ // registration there is accepted and never fires.
217
+ if (!AstExtensionPhase.all().includes(extension.phase)) {
218
+ throw new Error(
219
+ `AST extension '${extension.id}' registered at phase ${DocumentState[extension.phase]} would never fire. ` +
220
+ `Allowed phases are ${AstExtensionPhase.all()
221
+ .map(phase => DocumentState[phase])
222
+ .join(', ')}.`
223
+ );
224
+ }
189
225
  // Cast: TypeScript can't see that `T extends AstNode` makes the extension
190
226
  // assignable to the default-parameter form. The runtime contract is the same.
191
227
  return this.extensions.register(extension as AstExtension);
@@ -193,10 +229,10 @@ export class DefaultAstExtensionService implements AstExtensionService {
193
229
 
194
230
  /**
195
231
  * Production code goes through {@link extendDocument} via the
196
- * `onDocumentPhase(state)` listener wired by `BuildPipelineIntegration`.
232
+ * `onDocumentPhase(phase)` listener wired by `BuildPipelineIntegration`.
197
233
  */
198
234
  extendNode(node: AstNode, document: LangiumDocument, phase: DocumentState): void {
199
- const bucket = this.getStateBucket(phase);
235
+ const bucket = this.getPhaseBucket(phase);
200
236
  for (const extension of bucket) {
201
237
  if (extension.documentFilter && !extension.documentFilter(document)) {
202
238
  continue;
@@ -225,7 +261,7 @@ export class DefaultAstExtensionService implements AstExtensionService {
225
261
  if (cancelToken?.isCancellationRequested) {
226
262
  return;
227
263
  }
228
- const bucket = this.getStateBucket(phase);
264
+ const bucket = this.getPhaseBucket(phase);
229
265
  if (bucket.length === 0) {
230
266
  return;
231
267
  }
@@ -258,33 +294,33 @@ export class DefaultAstExtensionService implements AstExtensionService {
258
294
  }
259
295
 
260
296
  /**
261
- * Bucket-by-state view of {@link extensions}, rebuilt lazily when the
297
+ * Bucket-by-phase view of {@link extensions}, rebuilt lazily when the
262
298
  * registry's cached `all()` reference changes. Replaces per-call allocation
263
299
  * on the per-node hot path — for a workspace with many documents at the
264
- * same state, the bucket is computed once and reused until the next
300
+ * same phase, the bucket is computed once and reused until the next
265
301
  * register / unregister.
266
302
  */
267
- protected getStateBucket(phase: DocumentState): readonly AstExtension[] {
303
+ protected getPhaseBucket(phase: DocumentState): readonly AstExtension[] {
268
304
  const current = this.extensions.all();
269
- if (this.stateBucketsFor !== current) {
305
+ if (this.phaseBucketsFor !== current) {
270
306
  const next = new Map<DocumentState, AstExtension[]>();
271
307
  for (const extension of current) {
272
- let bucket = next.get(extension.state);
308
+ let bucket = next.get(extension.phase);
273
309
  if (!bucket) {
274
310
  bucket = [];
275
- next.set(extension.state, bucket);
311
+ next.set(extension.phase, bucket);
276
312
  }
277
313
  bucket.push(extension);
278
314
  }
279
- this.stateBuckets = next;
280
- this.stateBucketsFor = current;
315
+ this.phaseBuckets = next;
316
+ this.phaseBucketsFor = current;
281
317
  }
282
- return this.stateBuckets.get(phase) ?? EMPTY_STATE_BUCKET;
318
+ return this.phaseBuckets.get(phase) ?? EMPTY_PHASE_BUCKET;
283
319
  }
284
320
  }
285
321
 
286
- /** Shared empty result so `getStateBucket` doesn't allocate per call on the cold path. */
287
- const EMPTY_STATE_BUCKET: readonly AstExtension[] = Object.freeze([]);
322
+ /** Shared empty result so `getPhaseBucket` doesn't allocate per call on the cold path. */
323
+ const EMPTY_PHASE_BUCKET: readonly AstExtension[] = Object.freeze([]);
288
324
 
289
325
  /**
290
326
  * Assign a non-enumerable own property — for synthetic children that must NOT