@hydranium/core 1.0.0-next.29 → 1.0.0-next.298

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 (760) hide show
  1. package/README.md +65 -82
  2. package/lib/browser/index.d.ts +10 -0
  3. package/lib/browser/index.d.ts.map +1 -0
  4. package/lib/browser/index.js +14 -0
  5. package/lib/browser/index.js.map +1 -0
  6. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  7. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  8. package/lib/browser/indexeddb-file-system-store.js +181 -0
  9. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  10. package/lib/documents/ast-document-manager.d.ts +256 -124
  11. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  12. package/lib/documents/ast-document-manager.js +293 -132
  13. package/lib/documents/ast-document-manager.js.map +1 -1
  14. package/lib/documents/client-ids.d.ts +5 -19
  15. package/lib/documents/client-ids.d.ts.map +1 -1
  16. package/lib/documents/client-ids.js +5 -19
  17. package/lib/documents/client-ids.js.map +1 -1
  18. package/lib/documents/client-session-errors.d.ts +15 -0
  19. package/lib/documents/client-session-errors.d.ts.map +1 -0
  20. package/lib/documents/client-session-errors.js +15 -0
  21. package/lib/documents/client-session-errors.js.map +1 -0
  22. package/lib/documents/client-session-registry.d.ts +146 -0
  23. package/lib/documents/client-session-registry.d.ts.map +1 -0
  24. package/lib/documents/client-session-registry.js +207 -0
  25. package/lib/documents/client-session-registry.js.map +1 -0
  26. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  27. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  28. package/lib/documents/dirty-state-tracker.js +85 -0
  29. package/lib/documents/dirty-state-tracker.js.map +1 -0
  30. package/lib/documents/document-release-handler.d.ts +204 -0
  31. package/lib/documents/document-release-handler.d.ts.map +1 -0
  32. package/lib/documents/document-release-handler.js +317 -0
  33. package/lib/documents/document-release-handler.js.map +1 -0
  34. package/lib/documents/document-release-scheduler.d.ts +67 -0
  35. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  36. package/lib/documents/document-release-scheduler.js +80 -0
  37. package/lib/documents/document-release-scheduler.js.map +1 -0
  38. package/lib/documents/file-system-task-queue.d.ts +52 -0
  39. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  40. package/lib/documents/file-system-task-queue.js +37 -0
  41. package/lib/documents/file-system-task-queue.js.map +1 -0
  42. package/lib/documents/hydranium-text-documents.d.ts +419 -282
  43. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  44. package/lib/documents/hydranium-text-documents.js +856 -483
  45. package/lib/documents/hydranium-text-documents.js.map +1 -1
  46. package/lib/documents/index.d.ts +10 -2
  47. package/lib/documents/index.d.ts.map +1 -1
  48. package/lib/documents/index.js +10 -2
  49. package/lib/documents/index.js.map +1 -1
  50. package/lib/documents/language-client-shadow.d.ts +218 -0
  51. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  52. package/lib/documents/language-client-shadow.js +284 -0
  53. package/lib/documents/language-client-shadow.js.map +1 -0
  54. package/lib/documents/model-ledger.d.ts +47 -0
  55. package/lib/documents/model-ledger.d.ts.map +1 -0
  56. package/lib/documents/model-ledger.js +30 -0
  57. package/lib/documents/model-ledger.js.map +1 -0
  58. package/lib/documents/text-ledger.d.ts +64 -0
  59. package/lib/documents/text-ledger.d.ts.map +1 -0
  60. package/lib/documents/text-ledger.js +63 -0
  61. package/lib/documents/text-ledger.js.map +1 -0
  62. package/lib/documents/version-sync-service.d.ts +138 -0
  63. package/lib/documents/version-sync-service.d.ts.map +1 -0
  64. package/lib/documents/version-sync-service.js +173 -0
  65. package/lib/documents/version-sync-service.js.map +1 -0
  66. package/lib/index.d.ts +5 -0
  67. package/lib/index.d.ts.map +1 -1
  68. package/lib/index.js +8 -0
  69. package/lib/index.js.map +1 -1
  70. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  71. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  72. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  73. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  74. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  75. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  76. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  77. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  78. package/lib/langium/bootstrap.d.ts +49 -36
  79. package/lib/langium/bootstrap.d.ts.map +1 -1
  80. package/lib/langium/bootstrap.js +91 -45
  81. package/lib/langium/bootstrap.js.map +1 -1
  82. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  83. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  84. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  85. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  86. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  87. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  88. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  89. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  90. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  91. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  92. package/lib/langium/composite-ast-reflection.js +97 -0
  93. package/lib/langium/composite-ast-reflection.js.map +1 -0
  94. package/lib/langium/config/configuration-provider.d.ts +81 -0
  95. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  96. package/lib/langium/config/configuration-provider.js +112 -0
  97. package/lib/langium/config/configuration-provider.js.map +1 -0
  98. package/lib/langium/config/index.d.ts +1 -0
  99. package/lib/langium/config/index.d.ts.map +1 -1
  100. package/lib/langium/config/index.js +1 -0
  101. package/lib/langium/config/index.js.map +1 -1
  102. package/lib/langium/config/settings.js.map +1 -1
  103. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  104. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  105. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  106. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  107. package/lib/langium/diagnostics/log-preamble.js +1 -1
  108. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  109. package/lib/langium/diagnostics/logger.d.ts +19 -4
  110. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  111. package/lib/langium/diagnostics/logger.js +36 -11
  112. package/lib/langium/diagnostics/logger.js.map +1 -1
  113. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  114. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  115. package/lib/langium/diagnostics/lsp-logger.js +58 -17
  116. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  117. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  118. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  119. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  120. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  121. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  122. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  123. package/lib/langium/document-builder/build-session.d.ts +6 -5
  124. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  125. package/lib/langium/document-builder/build-session.js +5 -5
  126. package/lib/langium/document-builder/build-session.js.map +1 -1
  127. package/lib/langium/document-builder/document-builder.d.ts +309 -35
  128. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  129. package/lib/langium/document-builder/document-builder.js +511 -75
  130. package/lib/langium/document-builder/document-builder.js.map +1 -1
  131. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  132. package/lib/langium/documentation/comment-provider.js.map +1 -1
  133. package/lib/langium/integration-services.d.ts +40 -24
  134. package/lib/langium/integration-services.d.ts.map +1 -1
  135. package/lib/langium/integration-services.js +7 -4
  136. package/lib/langium/integration-services.js.map +1 -1
  137. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  138. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  139. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  140. package/lib/langium/integrity/integrity-service.d.ts +83 -27
  141. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  142. package/lib/langium/integrity/integrity-service.js +273 -63
  143. package/lib/langium/integrity/integrity-service.js.map +1 -1
  144. package/lib/langium/keys/containment.d.ts +64 -0
  145. package/lib/langium/keys/containment.d.ts.map +1 -0
  146. package/lib/langium/keys/containment.js +53 -0
  147. package/lib/langium/keys/containment.js.map +1 -0
  148. package/lib/langium/keys/index.d.ts +1 -0
  149. package/lib/langium/keys/index.d.ts.map +1 -1
  150. package/lib/langium/keys/index.js +1 -0
  151. package/lib/langium/keys/index.js.map +1 -1
  152. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  153. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  154. package/lib/langium/keys/name-based-key-provider.js +4 -0
  155. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  156. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  157. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  158. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  159. package/lib/langium/labeling/label-provider.js.map +1 -1
  160. package/lib/langium/language-module.d.ts +30 -5
  161. package/lib/langium/language-module.d.ts.map +1 -1
  162. package/lib/langium/language-module.js +18 -4
  163. package/lib/langium/language-module.js.map +1 -1
  164. package/lib/langium/model-service/client-session.d.ts +374 -0
  165. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  166. package/lib/langium/model-service/client-session.js +446 -0
  167. package/lib/langium/model-service/client-session.js.map +1 -0
  168. package/lib/langium/model-service/index.d.ts +2 -0
  169. package/lib/langium/model-service/index.d.ts.map +1 -1
  170. package/lib/langium/model-service/index.js +2 -0
  171. package/lib/langium/model-service/index.js.map +1 -1
  172. package/lib/langium/model-service/model-events.d.ts +66 -0
  173. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  174. package/lib/langium/model-service/model-events.js +10 -0
  175. package/lib/langium/model-service/model-events.js.map +1 -0
  176. package/lib/langium/model-service/model-service.d.ts +480 -289
  177. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  178. package/lib/langium/model-service/model-service.js +597 -456
  179. package/lib/langium/model-service/model-service.js.map +1 -1
  180. package/lib/langium/module.d.ts +158 -37
  181. package/lib/langium/module.d.ts.map +1 -1
  182. package/lib/langium/module.js +52 -36
  183. package/lib/langium/module.js.map +1 -1
  184. package/lib/langium/naming/name-provider.d.ts +42 -7
  185. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  186. package/lib/langium/naming/name-provider.js +10 -4
  187. package/lib/langium/naming/name-provider.js.map +1 -1
  188. package/lib/langium/naming/name-separator-validation.d.ts +23 -1
  189. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  190. package/lib/langium/naming/name-separator-validation.js +22 -0
  191. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  192. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  193. package/lib/langium/project/abstract-project-manager.js +13 -6
  194. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  195. package/lib/langium/project/project-change-event.d.ts +2 -2
  196. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  197. package/lib/langium/project/single-project-manager.js.map +1 -1
  198. package/lib/langium/residency/cst-residency-service.d.ts +35 -12
  199. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  200. package/lib/langium/residency/cst-residency-service.js +24 -58
  201. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  202. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  203. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  204. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  205. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  206. package/lib/langium/scope/fallback-scope.js +35 -0
  207. package/lib/langium/scope/fallback-scope.js.map +1 -0
  208. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  209. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  210. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  211. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  212. package/lib/langium/scope/hydranium-scope-provider.d.ts +39 -17
  213. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  214. package/lib/langium/scope/hydranium-scope-provider.js +52 -26
  215. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  216. package/lib/langium/scope/index.d.ts +1 -0
  217. package/lib/langium/scope/index.d.ts.map +1 -1
  218. package/lib/langium/scope/index.js +1 -0
  219. package/lib/langium/scope/index.js.map +1 -1
  220. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  221. package/lib/langium/scope/reference-builder.js.map +1 -1
  222. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  223. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  224. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  225. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  226. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  227. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  228. package/lib/langium/scope/scope-extension-service.js +57 -29
  229. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  230. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  231. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  232. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  233. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  234. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  235. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  236. package/lib/langium/serialization/abstract-serializer.js +54 -30
  237. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  238. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  239. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  240. package/lib/langium/serialization/json-serializer.js +13 -3
  241. package/lib/langium/serialization/json-serializer.js.map +1 -1
  242. package/lib/langium/serialization/serializer.d.ts +1 -1
  243. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  244. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  245. package/lib/langium/serialization/yaml-serializer.js +4 -0
  246. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  247. package/lib/langium/service-registry.d.ts +29 -1
  248. package/lib/langium/service-registry.d.ts.map +1 -1
  249. package/lib/langium/service-registry.js +37 -0
  250. package/lib/langium/service-registry.js.map +1 -1
  251. package/lib/langium/shared-services.d.ts +23 -6
  252. package/lib/langium/shared-services.d.ts.map +1 -1
  253. package/lib/langium/shared-services.js.map +1 -1
  254. package/lib/langium/single-langium-copy.d.ts +22 -0
  255. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  256. package/lib/langium/single-langium-copy.js +36 -0
  257. package/lib/langium/single-langium-copy.js.map +1 -0
  258. package/lib/langium/transfer/transfer-encoder.d.ts +84 -35
  259. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  260. package/lib/langium/transfer/transfer-encoder.js +34 -23
  261. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  262. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  263. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  264. package/lib/langium/trivia/comment-preserver.js +906 -0
  265. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  266. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  267. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  268. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  269. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  270. package/lib/langium/trivia/index.d.ts +14 -0
  271. package/lib/langium/trivia/index.d.ts.map +1 -0
  272. package/lib/langium/trivia/index.js +14 -0
  273. package/lib/langium/trivia/index.js.map +1 -0
  274. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  275. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  276. package/lib/langium/trivia/trivia-contribution.js +10 -0
  277. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  278. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  279. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  280. package/lib/langium/trivia/trivia-preserver.js +10 -0
  281. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  282. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  283. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  284. package/lib/langium/trivia/trivia-service.js +56 -0
  285. package/lib/langium/trivia/trivia-service.js.map +1 -0
  286. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  287. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  288. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  289. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  290. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  291. package/lib/langium/validation/document-validator.d.ts +280 -9
  292. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  293. package/lib/langium/validation/document-validator.js +453 -8
  294. package/lib/langium/validation/document-validator.js.map +1 -1
  295. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  296. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  297. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  298. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  299. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  300. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  301. package/lib/langium/workspace/document-uri-policy.js +22 -13
  302. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  303. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  304. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  305. package/lib/langium/workspace/file-not-found.js +31 -0
  306. package/lib/langium/workspace/file-not-found.js.map +1 -0
  307. package/lib/langium/workspace/file-system-provider.d.ts +165 -8
  308. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  309. package/lib/langium/workspace/file-system-provider.js +111 -13
  310. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  311. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  312. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  313. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  314. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  315. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  316. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  317. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  318. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  319. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +124 -22
  320. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  321. package/lib/langium/workspace/hydranium-workspace-manager.js +212 -31
  322. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  323. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  324. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  325. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  326. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  327. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  328. package/lib/langium/workspace/index-manager.js.map +1 -1
  329. package/lib/langium/workspace/index.d.ts +1 -0
  330. package/lib/langium/workspace/index.d.ts.map +1 -1
  331. package/lib/langium/workspace/index.js +1 -0
  332. package/lib/langium/workspace/index.js.map +1 -1
  333. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  334. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  335. package/lib/langium/workspace/initialize-workspace.js +13 -5
  336. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  337. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  338. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  339. package/lib/langium/workspace/langium-documents.js +18 -1
  340. package/lib/langium/workspace/langium-documents.js.map +1 -1
  341. package/lib/langium/workspace/persistent-file-system-provider.d.ts +15 -9
  342. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  343. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  344. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  345. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  346. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  347. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  348. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  349. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  350. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  351. package/lib/langium/workspace/virtual-document.js +87 -24
  352. package/lib/langium/workspace/virtual-document.js.map +1 -1
  353. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  354. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  355. package/lib/langium/workspace/write-lock-scope.js +15 -5
  356. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  357. package/lib/launcher/integrated-server.d.ts +3 -1
  358. package/lib/launcher/integrated-server.d.ts.map +1 -1
  359. package/lib/locale/index.d.ts +10 -0
  360. package/lib/locale/index.d.ts.map +1 -0
  361. package/lib/locale/index.js +10 -0
  362. package/lib/locale/index.js.map +1 -0
  363. package/lib/locale/server-locale.d.ts +73 -0
  364. package/lib/locale/server-locale.d.ts.map +1 -0
  365. package/lib/locale/server-locale.js +61 -0
  366. package/lib/locale/server-locale.js.map +1 -0
  367. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  368. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  369. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  370. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  371. package/lib/lsp/connection-features.d.ts +23 -0
  372. package/lib/lsp/connection-features.d.ts.map +1 -0
  373. package/lib/lsp/connection-features.js +60 -0
  374. package/lib/lsp/connection-features.js.map +1 -0
  375. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  376. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  377. package/lib/lsp/diagnostics-connection.js +53 -0
  378. package/lib/lsp/diagnostics-connection.js.map +1 -0
  379. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  380. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  381. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  382. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  383. package/lib/lsp/index.d.ts +3 -1
  384. package/lib/lsp/index.d.ts.map +1 -1
  385. package/lib/lsp/index.js +3 -1
  386. package/lib/lsp/index.js.map +1 -1
  387. package/lib/lsp/lsp-latency.d.ts +39 -0
  388. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  389. package/lib/lsp/lsp-latency.js +58 -0
  390. package/lib/lsp/lsp-latency.js.map +1 -0
  391. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  392. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  393. package/lib/lsp/semantic-token-provider.js +55 -8
  394. package/lib/lsp/semantic-token-provider.js.map +1 -1
  395. package/lib/lsp/shared-module.d.ts +4 -8
  396. package/lib/lsp/shared-module.d.ts.map +1 -1
  397. package/lib/lsp/shared-module.js.map +1 -1
  398. package/lib/lsp/start-language-server.d.ts +8 -7
  399. package/lib/lsp/start-language-server.d.ts.map +1 -1
  400. package/lib/lsp/start-language-server.js +13 -7
  401. package/lib/lsp/start-language-server.js.map +1 -1
  402. package/lib/messages/carriers.d.ts +18 -12
  403. package/lib/messages/carriers.d.ts.map +1 -1
  404. package/lib/messages/carriers.js +22 -13
  405. package/lib/messages/carriers.js.map +1 -1
  406. package/lib/messages/index.d.ts +4 -1
  407. package/lib/messages/index.d.ts.map +1 -1
  408. package/lib/messages/index.js +4 -1
  409. package/lib/messages/index.js.map +1 -1
  410. package/lib/messages/renderer.d.ts +142 -0
  411. package/lib/messages/renderer.d.ts.map +1 -0
  412. package/lib/messages/renderer.js +165 -0
  413. package/lib/messages/renderer.js.map +1 -0
  414. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  415. package/lib/node/event-loop-monitor.js +2 -1
  416. package/lib/node/event-loop-monitor.js.map +1 -1
  417. package/lib/node/heap-ceiling.d.ts +61 -0
  418. package/lib/node/heap-ceiling.d.ts.map +1 -0
  419. package/lib/node/heap-ceiling.js +72 -0
  420. package/lib/node/heap-ceiling.js.map +1 -0
  421. package/lib/node/index.d.ts +1 -1
  422. package/lib/node/index.d.ts.map +1 -1
  423. package/lib/node/index.js +5 -1
  424. package/lib/node/index.js.map +1 -1
  425. package/lib/node/latency-from-env.d.ts +1 -1
  426. package/lib/node/latency-from-env.js +1 -1
  427. package/lib/node/lint-grammar.js.map +1 -1
  428. package/lib/node/log-preamble-node.d.ts +5 -3
  429. package/lib/node/log-preamble-node.d.ts.map +1 -1
  430. package/lib/node/log-preamble-node.js +13 -10
  431. package/lib/node/log-preamble-node.js.map +1 -1
  432. package/lib/node/measure-memory.d.ts.map +1 -1
  433. package/lib/node/measure-memory.js +5 -4
  434. package/lib/node/measure-memory.js.map +1 -1
  435. package/lib/node/memory-monitor.d.ts +2 -2
  436. package/lib/node/memory-monitor.d.ts.map +1 -1
  437. package/lib/node/memory-monitor.js +9 -10
  438. package/lib/node/memory-monitor.js.map +1 -1
  439. package/lib/node/node-file-system-provider.d.ts +67 -9
  440. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  441. package/lib/node/node-file-system-provider.js +198 -53
  442. package/lib/node/node-file-system-provider.js.map +1 -1
  443. package/lib/node/profile-capture.d.ts +12 -4
  444. package/lib/node/profile-capture.d.ts.map +1 -1
  445. package/lib/node/profile-capture.js +8 -6
  446. package/lib/node/profile-capture.js.map +1 -1
  447. package/lib/node/profile-digest.js.map +1 -1
  448. package/lib/node/profiling-run.d.ts +13 -3
  449. package/lib/node/profiling-run.d.ts.map +1 -1
  450. package/lib/node/profiling-run.js +17 -8
  451. package/lib/node/profiling-run.js.map +1 -1
  452. package/lib/node/rename-over-open-readers.d.ts +61 -0
  453. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  454. package/lib/node/rename-over-open-readers.js +80 -0
  455. package/lib/node/rename-over-open-readers.js.map +1 -0
  456. package/lib/node/server-diagnostics.js +1 -1
  457. package/lib/node/server-diagnostics.js.map +1 -1
  458. package/lib/node/server-state-snapshot.js +4 -4
  459. package/lib/node/server-state-snapshot.js.map +1 -1
  460. package/lib/node/socket-launcher.d.ts +20 -4
  461. package/lib/node/socket-launcher.d.ts.map +1 -1
  462. package/lib/node/socket-launcher.js +8 -7
  463. package/lib/node/socket-launcher.js.map +1 -1
  464. package/lib/node/startup-cpu-profile.d.ts +29 -0
  465. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  466. package/lib/node/startup-cpu-profile.js +91 -0
  467. package/lib/node/startup-cpu-profile.js.map +1 -0
  468. package/lib/node/stdio-launcher.d.ts +10 -10
  469. package/lib/node/stdio-launcher.d.ts.map +1 -1
  470. package/lib/node/stdio-launcher.js +17 -9
  471. package/lib/node/stdio-launcher.js.map +1 -1
  472. package/lib/testing/document-uri-policy-conformance.js +1 -1
  473. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  474. package/lib/testing/fake-description.js.map +1 -1
  475. package/lib/testing/fake-document.d.ts +16 -4
  476. package/lib/testing/fake-document.d.ts.map +1 -1
  477. package/lib/testing/fake-document.js +18 -3
  478. package/lib/testing/fake-document.js.map +1 -1
  479. package/lib/testing/index.d.ts +1 -1
  480. package/lib/testing/index.d.ts.map +1 -1
  481. package/lib/testing/index.js +2 -1
  482. package/lib/testing/index.js.map +1 -1
  483. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  484. package/lib/testing/langium-test-helpers.js +1 -0
  485. package/lib/testing/langium-test-helpers.js.map +1 -1
  486. package/lib/testing/make-noop-language-services.js.map +1 -1
  487. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  488. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  489. package/lib/testing/make-noop-shared-services.js +28 -2
  490. package/lib/testing/make-noop-shared-services.js.map +1 -1
  491. package/lib/testing/make-test-services.d.ts +72 -14
  492. package/lib/testing/make-test-services.d.ts.map +1 -1
  493. package/lib/testing/make-test-services.js +42 -10
  494. package/lib/testing/make-test-services.js.map +1 -1
  495. package/lib/testing/make-test-tracer.d.ts +12 -0
  496. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  497. package/lib/testing/make-test-tracer.js +13 -0
  498. package/lib/testing/make-test-tracer.js.map +1 -1
  499. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  500. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  501. package/lib/testing/node/applied-edit-capture.js +117 -0
  502. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  503. package/lib/testing/node/golden-corpus.js.map +1 -1
  504. package/lib/testing/node/index.d.ts +1 -0
  505. package/lib/testing/node/index.d.ts.map +1 -1
  506. package/lib/testing/node/index.js +1 -0
  507. package/lib/testing/node/index.js.map +1 -1
  508. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  509. package/lib/testing/node/lsp-harness.js +2 -0
  510. package/lib/testing/node/lsp-harness.js.map +1 -1
  511. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  512. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  513. package/lib/testing/node/lsp-server-connection.js +49 -106
  514. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  515. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  516. package/lib/testing/node/scratch-workspace.js +10 -5
  517. package/lib/testing/node/scratch-workspace.js.map +1 -1
  518. package/lib/testing/node/spawned-server.d.ts +30 -1
  519. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  520. package/lib/testing/node/spawned-server.js +39 -2
  521. package/lib/testing/node/spawned-server.js.map +1 -1
  522. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  523. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  524. package/lib/testing/node/unhandled-rejections.js +32 -0
  525. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  526. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  527. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  528. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  529. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  530. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  531. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  532. package/lib/testing/playwright/index.d.ts +1 -0
  533. package/lib/testing/playwright/index.d.ts.map +1 -1
  534. package/lib/testing/playwright/index.js +1 -0
  535. package/lib/testing/playwright/index.js.map +1 -1
  536. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  537. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  538. package/lib/testing/playwright/server-log-capture.js +111 -40
  539. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  540. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  541. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  542. package/lib/testing/playwright/server-log-fixture.js +25 -6
  543. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  544. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  545. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  546. package/lib/testing/playwright/server-log-region.js +30 -0
  547. package/lib/testing/playwright/server-log-region.js.map +1 -0
  548. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  549. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  550. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  551. package/lib/testing/run-update-pipeline.d.ts +8 -5
  552. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  553. package/lib/testing/run-update-pipeline.js.map +1 -1
  554. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  555. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  556. package/lib/testing/stub-ast-document-manager.js +31 -62
  557. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  558. package/lib/testing/stub-document-builder.d.ts +33 -11
  559. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  560. package/lib/testing/stub-document-builder.js +103 -5
  561. package/lib/testing/stub-document-builder.js.map +1 -1
  562. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  563. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  564. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  565. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  566. package/lib/testing/stub-index-manager.js.map +1 -1
  567. package/lib/testing/stub-langium-documents.d.ts +3 -2
  568. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  569. package/lib/testing/stub-langium-documents.js.map +1 -1
  570. package/lib/testing/stub-model-service.d.ts +9 -8
  571. package/lib/testing/stub-model-service.d.ts.map +1 -1
  572. package/lib/testing/stub-model-service.js +6 -6
  573. package/lib/testing/stub-model-service.js.map +1 -1
  574. package/lib/testing/stub-project-manager.js.map +1 -1
  575. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  576. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  577. package/lib/testing/stub-service-registry.d.ts +1 -1
  578. package/lib/testing/stub-service-registry.js.map +1 -1
  579. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  580. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  581. package/lib/testing/stub-writable-file-system.js +2 -1
  582. package/lib/testing/stub-writable-file-system.js.map +1 -1
  583. package/lib/util/connection-liveness.d.ts +19 -6
  584. package/lib/util/connection-liveness.d.ts.map +1 -1
  585. package/lib/util/connection-liveness.js +61 -15
  586. package/lib/util/connection-liveness.js.map +1 -1
  587. package/lib/util/environment.d.ts.map +1 -1
  588. package/lib/util/environment.js.map +1 -1
  589. package/lib/util/registry.d.ts.map +1 -1
  590. package/package.json +38 -57
  591. package/src/browser/index.ts +14 -0
  592. package/src/browser/indexeddb-file-system-store.ts +192 -0
  593. package/src/documents/ast-document-manager.ts +467 -233
  594. package/src/documents/client-ids.ts +5 -22
  595. package/src/documents/client-session-errors.ts +24 -0
  596. package/src/documents/client-session-registry.ts +262 -0
  597. package/src/documents/dirty-state-tracker.ts +167 -0
  598. package/src/documents/document-release-handler.ts +404 -0
  599. package/src/documents/document-release-scheduler.ts +121 -0
  600. package/src/documents/file-system-task-queue.ts +74 -0
  601. package/src/documents/hydranium-text-documents.ts +976 -595
  602. package/src/documents/index.ts +10 -2
  603. package/src/documents/language-client-shadow.ts +452 -0
  604. package/src/documents/model-ledger.ts +66 -0
  605. package/src/documents/text-ledger.ts +112 -0
  606. package/src/documents/version-sync-service.ts +275 -0
  607. package/src/index.ts +8 -0
  608. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  609. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  610. package/src/langium/bootstrap.ts +95 -52
  611. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  612. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  613. package/src/langium/composite-ast-reflection.ts +112 -0
  614. package/src/langium/config/configuration-provider.ts +119 -0
  615. package/src/langium/config/index.ts +1 -0
  616. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  617. package/src/langium/diagnostics/log-preamble.ts +1 -1
  618. package/src/langium/diagnostics/logger.ts +38 -11
  619. package/src/langium/diagnostics/lsp-logger.ts +61 -16
  620. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  621. package/src/langium/document-builder/build-session.ts +4 -3
  622. package/src/langium/document-builder/document-builder.ts +616 -73
  623. package/src/langium/integration-services.ts +59 -28
  624. package/src/langium/integrity/integrity-rule.ts +16 -8
  625. package/src/langium/integrity/integrity-service.ts +296 -69
  626. package/src/langium/keys/containment.ts +87 -0
  627. package/src/langium/keys/index.ts +1 -0
  628. package/src/langium/keys/name-based-key-provider.ts +4 -0
  629. package/src/langium/language-module.ts +49 -8
  630. package/src/langium/model-service/client-session.ts +704 -0
  631. package/src/langium/model-service/index.ts +2 -0
  632. package/src/langium/model-service/model-events.ts +80 -0
  633. package/src/langium/model-service/model-service.ts +908 -485
  634. package/src/langium/module.ts +212 -67
  635. package/src/langium/naming/name-provider.ts +44 -8
  636. package/src/langium/naming/name-separator-validation.ts +25 -3
  637. package/src/langium/project/abstract-project-manager.ts +13 -5
  638. package/src/langium/project/project-change-event.ts +2 -2
  639. package/src/langium/residency/cst-residency-service.ts +51 -17
  640. package/src/langium/scope/fallback-scope.ts +38 -0
  641. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  642. package/src/langium/scope/hydranium-scope-provider.ts +64 -27
  643. package/src/langium/scope/index.ts +1 -0
  644. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  645. package/src/langium/scope/scope-extension-service.ts +74 -59
  646. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  647. package/src/langium/serialization/abstract-serializer.ts +57 -41
  648. package/src/langium/serialization/json-serializer.ts +14 -3
  649. package/src/langium/serialization/serializer.ts +1 -1
  650. package/src/langium/serialization/yaml-serializer.ts +4 -0
  651. package/src/langium/service-registry.ts +41 -2
  652. package/src/langium/shared-services.ts +26 -6
  653. package/src/langium/single-langium-copy.ts +42 -0
  654. package/src/langium/transfer/transfer-encoder.ts +102 -45
  655. package/src/langium/trivia/comment-preserver.ts +1100 -0
  656. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  657. package/src/langium/trivia/index.ts +14 -0
  658. package/src/langium/trivia/trivia-contribution.ts +39 -0
  659. package/src/langium/trivia/trivia-preserver.ts +56 -0
  660. package/src/langium/trivia/trivia-service.ts +99 -0
  661. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  662. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  663. package/src/langium/validation/document-validator.ts +528 -13
  664. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  665. package/src/langium/workspace/document-uri-policy.ts +32 -18
  666. package/src/langium/workspace/file-not-found.ts +35 -0
  667. package/src/langium/workspace/file-system-provider.ts +253 -16
  668. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  669. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  670. package/src/langium/workspace/hydranium-workspace-manager.ts +241 -35
  671. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  672. package/src/langium/workspace/index.ts +1 -0
  673. package/src/langium/workspace/initialize-workspace.ts +43 -5
  674. package/src/langium/workspace/langium-documents.ts +19 -1
  675. package/src/langium/workspace/persistent-file-system-provider.ts +26 -14
  676. package/src/langium/workspace/self-save-registry.ts +118 -0
  677. package/src/langium/workspace/virtual-document.ts +106 -25
  678. package/src/langium/workspace/write-lock-scope.ts +27 -12
  679. package/src/launcher/integrated-server.ts +3 -1
  680. package/src/locale/index.ts +10 -0
  681. package/src/locale/server-locale.ts +86 -0
  682. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  683. package/src/lsp/connection-features.ts +67 -0
  684. package/src/lsp/diagnostics-connection.ts +56 -0
  685. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  686. package/src/lsp/index.ts +3 -1
  687. package/src/lsp/lsp-latency.ts +62 -0
  688. package/src/lsp/semantic-token-provider.ts +74 -7
  689. package/src/lsp/shared-module.ts +4 -8
  690. package/src/lsp/start-language-server.ts +13 -7
  691. package/src/messages/carriers.ts +23 -15
  692. package/src/messages/index.ts +13 -1
  693. package/src/messages/renderer.ts +212 -0
  694. package/src/node/event-loop-monitor.ts +2 -1
  695. package/src/node/heap-ceiling.ts +108 -0
  696. package/src/node/index.ts +5 -1
  697. package/src/node/latency-from-env.ts +1 -1
  698. package/src/node/log-preamble-node.ts +20 -10
  699. package/src/node/measure-memory.ts +5 -4
  700. package/src/node/memory-monitor.ts +10 -10
  701. package/src/node/node-file-system-provider.ts +214 -57
  702. package/src/node/profile-capture.ts +16 -15
  703. package/src/node/profiling-run.ts +30 -8
  704. package/src/node/rename-over-open-readers.ts +94 -0
  705. package/src/node/server-diagnostics.ts +1 -1
  706. package/src/node/server-state-snapshot.ts +5 -5
  707. package/src/node/socket-launcher.ts +27 -11
  708. package/src/node/startup-cpu-profile.ts +94 -0
  709. package/src/node/stdio-launcher.ts +22 -14
  710. package/src/testing/document-uri-policy-conformance.ts +1 -1
  711. package/src/testing/fake-document.ts +24 -5
  712. package/src/testing/index.ts +2 -1
  713. package/src/testing/langium-test-helpers.ts +1 -0
  714. package/src/testing/make-noop-shared-services.ts +50 -2
  715. package/src/testing/make-test-services.ts +125 -31
  716. package/src/testing/make-test-tracer.ts +26 -0
  717. package/src/testing/node/applied-edit-capture.ts +141 -0
  718. package/src/testing/node/index.ts +1 -0
  719. package/src/testing/node/lsp-harness.ts +2 -0
  720. package/src/testing/node/lsp-server-connection.ts +83 -119
  721. package/src/testing/node/scratch-workspace.ts +10 -5
  722. package/src/testing/node/spawned-server.ts +57 -3
  723. package/src/testing/node/unhandled-rejections.ts +31 -0
  724. package/src/testing/parse-semantic-root.ts +1 -1
  725. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  726. package/src/testing/playwright/index.ts +1 -0
  727. package/src/testing/playwright/server-log-capture.ts +137 -47
  728. package/src/testing/playwright/server-log-fixture.ts +46 -6
  729. package/src/testing/playwright/server-log-region.ts +32 -0
  730. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  731. package/src/testing/run-update-pipeline.ts +8 -5
  732. package/src/testing/stub-ast-document-manager.ts +47 -128
  733. package/src/testing/stub-document-builder.ts +133 -18
  734. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  735. package/src/testing/stub-langium-documents.ts +3 -2
  736. package/src/testing/stub-model-service.ts +11 -10
  737. package/src/testing/stub-self-save-registry.ts +1 -1
  738. package/src/testing/stub-service-registry.ts +1 -1
  739. package/src/testing/stub-writable-file-system.ts +3 -2
  740. package/src/util/connection-liveness.ts +67 -15
  741. package/src/util/environment.ts +9 -1
  742. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  743. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  744. package/lib/documents/language-client-text-shadow.js +0 -156
  745. package/lib/documents/language-client-text-shadow.js.map +0 -1
  746. package/lib/documents/self-save-registry.d.ts +0 -55
  747. package/lib/documents/self-save-registry.d.ts.map +0 -1
  748. package/lib/documents/self-save-registry.js.map +0 -1
  749. package/lib/lsp/instrument-connection.d.ts +0 -36
  750. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  751. package/lib/lsp/instrument-connection.js +0 -62
  752. package/lib/lsp/instrument-connection.js.map +0 -1
  753. package/lib/node/process-memory.d.ts +0 -66
  754. package/lib/node/process-memory.d.ts.map +0 -1
  755. package/lib/node/process-memory.js +0 -252
  756. package/lib/node/process-memory.js.map +0 -1
  757. package/src/documents/language-client-text-shadow.ts +0 -175
  758. package/src/documents/self-save-registry.ts +0 -81
  759. package/src/lsp/instrument-connection.ts +0 -66
  760. package/src/node/process-memory.ts +0 -299
@@ -10,17 +10,20 @@
10
10
  import { type Logger } from '@hydranium/protocol';
11
11
  import { type LangiumSharedCoreServices } from '@hydranium/langium';
12
12
  import { type LangiumServices, type LangiumSharedServices } from '@hydranium/langium/lsp';
13
- import type { ServerSharedServicesMinimal } from './shared-services.js';
13
+ import type { ServerSharedServices } from './module.js';
14
14
  import { collectProducibleTypes } from './language-types.js';
15
- import { AstDocumentManager } from '../documents/ast-document-manager.js';
15
+ import { assertSingleLangiumCopy } from './single-langium-copy.js';
16
+ import { DefaultAstDocumentManager } from '../documents/ast-document-manager.js';
16
17
  import { HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
17
- import { BuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
18
+ import { DefaultBuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
18
19
  import { HydraniumDocumentBuilder } from './document-builder/document-builder.js';
19
- import { ModelService } from './model-service/model-service.js';
20
+ import { DefaultModelService } from './model-service/model-service.js';
20
21
  import { HydraniumScopeComputation } from './scope/hydranium-scope-computation.js';
21
22
  import { HydraniumScopeProvider } from './scope/hydranium-scope-provider.js';
22
23
  import { processEnv } from '../util/environment.js';
23
- import { TransferEncoder } from './transfer/transfer-encoder.js';
24
+ import { DefaultTransferEncoder } from './transfer/transfer-encoder.js';
25
+ import { HydraniumLangiumDocumentFactory } from './workspace/hydranium-langium-document-factory.js';
26
+ import { HydraniumLangiumDocuments } from './workspace/langium-documents.js';
24
27
  import { HydraniumWorkspaceManager } from './workspace/hydranium-workspace-manager.js';
25
28
 
26
29
  /**
@@ -73,7 +76,14 @@ const EXPECTED_SHARED_SLOTS: readonly ExpectedSlot[] = [
73
76
  side: 'shared',
74
77
  path: 'workspace.BuildPipelineIntegration',
75
78
  get: services => nested(services, 'workspace', 'BuildPipelineIntegration')
76
- }
79
+ },
80
+ // Unbound, this fails where the cause is least visible: the render pass runs
81
+ // inside the `Validated` phase, so a `TypeError` there propagates out of
82
+ // `notifyDocumentPhase` and the document reaches `Validated` with Langium's
83
+ // publisher never invoked — the client receives no diagnostics for the file
84
+ // and the stack names the document builder.
85
+ { side: 'shared', path: 'MessageRenderer', get: services => nested(services, 'MessageRenderer') },
86
+ { side: 'shared', path: 'ServerLocale', get: services => nested(services, 'ServerLocale') }
77
87
  ];
78
88
 
79
89
  /**
@@ -184,6 +194,20 @@ interface StrictSlot {
184
194
 
185
195
  const STRICT_SHARED_SLOTS: readonly StrictSlot[] = [
186
196
  { side: 'shared', path: 'workspace.TextDocuments', base: HydraniumTextDocuments, get: s => nested(s, 'workspace', 'TextDocuments') },
197
+ // Every root it builds records no version, so every write gated on one conflicts.
198
+ {
199
+ side: 'shared',
200
+ path: 'workspace.LangiumDocumentFactory',
201
+ base: HydraniumLangiumDocumentFactory,
202
+ get: s => nested(s, 'workspace', 'LangiumDocumentFactory')
203
+ },
204
+ // It reports no registered root, so none is reconciled with the text store or announced.
205
+ {
206
+ side: 'shared',
207
+ path: 'workspace.LangiumDocuments',
208
+ base: HydraniumLangiumDocuments,
209
+ get: s => nested(s, 'workspace', 'LangiumDocuments')
210
+ },
187
211
  {
188
212
  side: 'shared',
189
213
  path: 'workspace.WorkspaceManager',
@@ -199,17 +223,17 @@ const STRICT_SHARED_SLOTS: readonly StrictSlot[] = [
199
223
  {
200
224
  side: 'shared',
201
225
  path: 'workspace.AstDocumentManager',
202
- base: AstDocumentManager,
226
+ base: DefaultAstDocumentManager,
203
227
  get: s => nested(s, 'workspace', 'AstDocumentManager')
204
228
  },
205
229
  {
206
230
  side: 'shared',
207
231
  path: 'workspace.BuildPipelineIntegration',
208
- base: BuildPipelineIntegration,
232
+ base: DefaultBuildPipelineIntegration,
209
233
  get: s => nested(s, 'workspace', 'BuildPipelineIntegration')
210
234
  },
211
- { side: 'shared', path: 'model.TransferEncoder', base: TransferEncoder, get: s => nested(s, 'model', 'TransferEncoder') },
212
- { side: 'shared', path: 'model.ModelService', base: ModelService, get: s => nested(s, 'model', 'ModelService') }
235
+ { side: 'shared', path: 'model.TransferEncoder', base: DefaultTransferEncoder, get: s => nested(s, 'model', 'TransferEncoder') },
236
+ { side: 'shared', path: 'model.ModelService', base: DefaultModelService, get: s => nested(s, 'model', 'ModelService') }
213
237
  ];
214
238
 
215
239
  const STRICT_LANGUAGE_SLOTS: readonly StrictSlot[] = [
@@ -287,31 +311,40 @@ export function warnOnUnexpectedBindings(shared: LangiumSharedServices, language
287
311
  * dispatch every build-phase pass and drive AST enrichment, and
288
312
  * registers the framework integrity passes itself. The per-language
289
313
  * feature services it routes to (`ast.AstExtensionService` +
290
- * `integrity.IntegrityService`, plus `references.ScopeExtensionService`
291
- * read by the scope provider) hold the registries and the logic but own
314
+ * `integrity.IntegrityService`) hold the registries and the logic but own
292
315
  * no listeners, so they need not be eager: each language's services
293
- * construct lazily when the orchestrator (or scope provider) first
294
- * reaches them, and their constructors register that language's rules /
295
- * extensions just-in-time.
296
- * - **`profilers.LangiumProfiler`** — self-registers a `Validated`
297
- * BuildPhasePass that flushes the aggregated parse/link/validate profile
298
- * once per build. No production cost (the profiler is trace-gated), but
299
- * the pass must be registered up front.
316
+ * construct lazily when the orchestrator first reaches them, and their
317
+ * constructors register that language's rules / extensions just-in-time.
318
+ * `references.ScopeExtensionService`, read by the scope provider, does
319
+ * subscribe to the builder, but only to report its own calls, so
320
+ * constructing it at its first call misses none.
321
+ * - **`profilers.LangiumProfiler`** — subscribes to
322
+ * `documentBuilder.onBuildEnded` to flush the aggregated
323
+ * parse/link/validate profile once per build. No production cost (the
324
+ * profiler is trace-gated), but the listener must be attached before the
325
+ * first build ends.
300
326
  * - **`workspace.CstResidencyService`** — self-registers a `Validated`
301
327
  * BuildPhasePass that sheds the CST of closed documents. The framework
302
328
  * default strategy is `always-keep`, so the pass runs but sheds nothing
303
329
  * until an adopter configures a shedding strategy.
330
+ * - **`workspace.AstDocumentManager`** — subscribes to the build pipeline
331
+ * and the text store to track opens, deletions and each build's causes.
332
+ * - **`model.ModelService`** — subscribes to the settled document phase to
333
+ * bring the language client up to date. A tree without an LSP `initialize`,
334
+ * such as a headless init, may not resolve it before the first build.
304
335
  *
305
336
  * Consumers with no additional eager targets can omit the third argument
306
337
  * to {@link bootstrapLangium} — the parameter default is this exact set.
307
338
  * Adopters needing extra eager targets spread this constant into their own
308
339
  * array and append their accessors.
309
340
  */
310
- export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services: ServerSharedServicesMinimal) => unknown> = [
341
+ export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services: ServerSharedServices) => unknown> = [
311
342
  services => services.workspace.ProjectManager,
312
343
  services => services.workspace.BuildPipelineIntegration,
313
344
  services => services.profilers.LangiumProfiler,
314
- services => services.workspace.CstResidencyService
345
+ services => services.workspace.CstResidencyService,
346
+ services => services.workspace.AstDocumentManager,
347
+ services => services.model.ModelService
315
348
  ];
316
349
 
317
350
  /**
@@ -329,36 +362,39 @@ export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services: ServerSharedServic
329
362
  * discarded.
330
363
  *
331
364
  * Bootstrap responsibilities, in order:
332
- * 1. Hand the shared services to `shared.ServiceRegistry` if it accepts
365
+ * 1. {@link assertSingleLangiumCopy} — fail fast when the shared
366
+ * `AstReflection` is built on a second copy of `langium`, before any
367
+ * later check can fail first and name the wrong cause.
368
+ * 2. Hand the shared services to `shared.ServiceRegistry` if it accepts
333
369
  * them after construction, so Langium's declared-languageId lookup
334
370
  * rung works however the adopter's registry binding was built.
335
- * 2. {@link assertDistinctFileRouting} — before registration, because
371
+ * 3. {@link assertDistinctFileRouting} — before registration, because
336
372
  * `register` resolves a routing collision by last-wins and afterwards
337
373
  * the evidence is gone.
338
- * 3. Register `language` against `shared.ServiceRegistry`, the
374
+ * 4. Register `language` against `shared.ServiceRegistry`, the
339
375
  * required final step of any Langium DI bootstrap. Done before slot
340
376
  * validation so subclassed registries (typed-accessor extensions)
341
377
  * populate any side state before validation walks construct services
342
378
  * that read from the registry.
343
- * 4. {@link assertCoreSlotsBound} — fail fast if the consumer's
379
+ * 5. {@link assertCoreSlotsBound} — fail fast if the consumer's
344
380
  * `inject(...)` composition is missing a `@hydranium/core` module. May
345
381
  * trigger lazy service construction as side effect of walking the
346
382
  * slots; that construction expects a populated `ServiceRegistry`,
347
383
  * hence the order.
348
- * 5. {@link warnOnUnexpectedBindings} — opt-in (gated by
384
+ * 6. {@link warnOnUnexpectedBindings} — opt-in (gated by
349
385
  * {@link STRICT_BINDINGS_ENV}); warns when a framework slot is bound
350
386
  * to a non-subclass of its framework base. No-op unless the env is set.
351
- * 6. {@link assertReflectionCoversLanguages} — catch a clobbered shared
387
+ * 7. {@link assertReflectionCoversLanguages} — catch a clobbered shared
352
388
  * `AstReflection` before it starts silently answering `isSubtype`
353
389
  * false for a registered language's types. Skipped here, since a lone
354
390
  * language has no sibling that could clobber it.
355
- * 7. Invoke eager-construction accessors in array order.
391
+ * 8. Invoke eager-construction accessors in array order.
356
392
  *
357
393
  * Multi-grammar adopters use {@link bootstrapLangiumLanguages}, which
358
394
  * registers every language before validating slots or constructing the
359
395
  * eager set.
360
396
  */
361
- export function bootstrapLangium<TShared extends LangiumSharedServices & ServerSharedServicesMinimal, TLang extends LangiumServices>(
397
+ export function bootstrapLangium<TShared extends LangiumSharedServices & ServerSharedServices, TLang extends LangiumServices>(
362
398
  shared: TShared,
363
399
  language: TLang,
364
400
  eagerlyConstructedServices: ReadonlyArray<(services: TShared) => unknown> = DEFAULT_EAGER_SERVICES
@@ -377,32 +413,32 @@ export function bootstrapLangium<TShared extends LangiumSharedServices & ServerS
377
413
  * ORDER across languages is what makes this a distinct function rather
378
414
  * than a loop the caller could write:
379
415
  *
380
- * 1. **Every** language is registered against `shared.ServiceRegistry`
381
- * first. Slot validation and eager construction both build services
416
+ * 1. {@link assertSingleLangiumCopy} runs **once**, before anything else,
417
+ * since every language shares the one `AstReflection`.
418
+ * 2. **Every** language is registered against `shared.ServiceRegistry`
419
+ * next. Slot validation and eager construction both build services
382
420
  * that read the registry — a per-language
383
421
  * register-then-validate-then-eager loop would run them while later
384
422
  * languages were still missing, so a shared service that walks
385
423
  * `ServiceRegistry.all` (or resolves by extension) would see a
386
424
  * half-populated registry and cache the wrong answer.
387
- * 2. `assertCoreSlotsBound` / `warnOnUnexpectedBindings` per language —
425
+ * 3. `assertCoreSlotsBound` / `warnOnUnexpectedBindings` per language —
388
426
  * each language composes its own module chain, so each is checked.
389
- * 3. Eager accessors run **once**, after all registrations. They take
390
- * the shared tier, and the framework's eager set is shared-tier only
391
- * (`ProjectManager`, `BuildPipelineIntegration`, `LangiumProfiler`,
392
- * `CstResidencyService`) — `BuildPipelineIntegration` in particular
393
- * routes per document URI to each language's `IntegrityService` /
394
- * `AstExtensionService`, so it must be constructed knowing all of
395
- * them. Running the set per language would attach its
396
- * `documentBuilder` listeners N times and enforce each phase N times.
427
+ * 4. {@link assertReflectionCoversLanguages} runs **once**, on the one
428
+ * shared `AstReflection`.
429
+ * 5. Eager accessors run **once**, after all registrations. They take
430
+ * the shared tier, and the framework's eager set is shared-tier only —
431
+ * `BuildPipelineIntegration` in particular routes per document URI to
432
+ * each language's `IntegrityService` / `AstExtensionService`, so it
433
+ * must be constructed knowing all of them. Running the set per language
434
+ * would attach its `documentBuilder` listeners N times and enforce each
435
+ * phase N times.
397
436
  *
398
437
  * Throws when `languages` is empty: a shared tier with no registered
399
438
  * language never validates its slots, which silently defers a
400
439
  * composition error to the first build.
401
440
  */
402
- export function bootstrapLangiumLanguages<
403
- TShared extends LangiumSharedServices & ServerSharedServicesMinimal,
404
- TLang extends LangiumServices
405
- >(
441
+ export function bootstrapLangiumLanguages<TShared extends LangiumSharedServices & ServerSharedServices, TLang extends LangiumServices>(
406
442
  shared: TShared,
407
443
  languages: ReadonlyArray<TLang>,
408
444
  eagerlyConstructedServices: ReadonlyArray<(services: TShared) => unknown> = DEFAULT_EAGER_SERVICES
@@ -414,6 +450,11 @@ export function bootstrapLangiumLanguages<
414
450
  '`inject(...)` composition.'
415
451
  );
416
452
  }
453
+ // First, because a second copy of `langium` can make a later check fail
454
+ // first and name the wrong cause.
455
+ if (shared.AstReflection) {
456
+ assertSingleLangiumCopy(shared.AstReflection);
457
+ }
417
458
  // Back-fill the shared services onto a registry that was constructed
418
459
  // without them, so Langium's declared-languageId lookup rung works no
419
460
  // matter how the adopter's `ServiceRegistry` binding built it. An adopter
@@ -521,11 +562,11 @@ export function assertDistinctFileRouting(languages: ReadonlyArray<LangiumServic
521
562
  *
522
563
  * The check is per language, on the types its grammar can produce, and costs
523
564
  * one grammar walk per language at boot; a single-language composition, which
524
- * nothing can clobber, is skipped entirely. It cannot repair the situation — a
525
- * reflection that spans independently generated grammars is a real design piece
526
- * (a composite reflection dispatching per owning language) and is not attempted
527
- * here; the point is to turn a silent runtime misbehaviour into a boot failure
528
- * that names the language and the mistake.
565
+ * nothing can clobber, is skipped entirely. It cannot repair the situation, since
566
+ * the losing reflection is already gone; the point is to turn a silent runtime
567
+ * misbehaviour into a boot failure that names the language and the mistake. The
568
+ * repair is the adopter's: bind a `CompositeAstReflection` over every package's
569
+ * generated reflection, or generate all grammars in one `langium-cli` run.
529
570
  *
530
571
  * **Two severities, because a clobber is not always total.** Throwing only when
531
572
  * NONE of a language's types are known misses the realistic case: two grammars
@@ -567,8 +608,9 @@ export function assertReflectionCoversLanguages(shared: LangiumSharedServices, l
567
608
  `[hydranium] the shared AstReflection knows NONE of the ${produced.size} types the language ` +
568
609
  `'${languageId}' can produce (e.g. ${missing.slice(0, 3).join(', ')}). ` +
569
610
  'AstReflection is a single shared slot, so composing two independently generated language ' +
570
- 'packages leaves only the last one bound. Generate all grammars in ONE langium-cli run (one ' +
571
- 'langium-config with several entry grammars) so a single combined reflection covers them all.'
611
+ "packages leaves only the last one bound. Bind a CompositeAstReflection over every package's " +
612
+ 'generated reflection, or generate all grammars in ONE langium-cli run (one langium-config with ' +
613
+ 'several entry grammars) so a single combined reflection covers them all.'
572
614
  );
573
615
  }
574
616
  }
@@ -590,7 +632,8 @@ function warnPartialReflectionCoverage(
590
632
  'For those types `isSubtype` answers false and `getTypeMetaData` is empty, so `IndexManager.allElements` ' +
591
633
  'finds nothing, reference routing misses, and the encoder emits nothing. Most likely two independently ' +
592
634
  'generated language packages each bound the single shared AstReflection slot and the last one won — ' +
593
- 'generate all grammars in ONE langium-cli run so a single combined reflection covers them. If instead ' +
635
+ "bind a CompositeAstReflection over every package's generated reflection, or generate all grammars in " +
636
+ 'ONE langium-cli run so a single combined reflection covers them. If instead ' +
594
637
  'these are rules your generator legitimately folded away, this warning is expected.';
595
638
  if (logger) {
596
639
  logger.warn(message);
@@ -13,7 +13,7 @@ import { type CancellationToken, type Disposable } from 'vscode-languageserver';
13
13
  import { type LogNameOptions } from '../diagnostics/logger.js';
14
14
  import { type ServerSharedServices } from '../module.js';
15
15
  import { Registry } from '../../util/registry.js';
16
- import { type BuildPhasePass, type BuildPhasePassRegistry } from './build-phase-pass.js';
16
+ import { type BuildPhasePass, type BuildPhasePassRegistry, BuildPassPhase } from './build-phase-pass.js';
17
17
 
18
18
  /**
19
19
  * Public contract for the shared build-phase-pass runner. Extends the
@@ -27,11 +27,11 @@ import { type BuildPhasePass, type BuildPhasePassRegistry } from './build-phase-
27
27
  * per-language work (integrity) fans out by language *inside* its pass. This
28
28
  * also keeps one priority space per phase across framework and adopter passes,
29
29
  * which is the point — `runPasses` orders the framework's integrity and
30
- * profiler-flush passes against adopter passes deterministically.
30
+ * CST-residency passes against adopter passes deterministically.
31
31
  */
32
32
  export interface BuildPhasePassService extends BuildPhasePassRegistry {
33
33
  /**
34
- * Run every pass declaring `phase` as its state, in priority order,
34
+ * Run every pass declaring `phase`, in priority order,
35
35
  * sequentially — each pass is awaited before the next begins. The cancel
36
36
  * token is checked before each pass so a preempted build stops cleanly.
37
37
  * No-ops when no pass targets the phase. Called by
@@ -52,8 +52,8 @@ export type BuildPhasePassServiceOptions = LogNameOptions;
52
52
  * `BuildPipelineIntegration`,
53
53
  * which calls {@link runPasses} from its `onBuildPhase` listeners.
54
54
  *
55
- * **Performance:** {@link runPasses} shares the bucket-by-state cache pattern
56
- * with the AST-extension service — the per-state pass list is rebuilt lazily
55
+ * **Performance:** {@link runPasses} shares the bucket-by-phase cache pattern
56
+ * with the AST-extension service — the per-phase pass list is rebuilt lazily
57
57
  * only after a register / unregister, so steady-state dispatch allocates
58
58
  * nothing and early-outs when no pass targets the phase.
59
59
  *
@@ -64,9 +64,9 @@ export type BuildPhasePassServiceOptions = LogNameOptions;
64
64
  */
65
65
  export class DefaultBuildPhasePassService implements BuildPhasePassService {
66
66
  protected readonly passes = new Registry<BuildPhasePass>();
67
- /** Per-state bucket of passes targeting each state, rebuilt lazily on the first run after a registry mutation. */
68
- protected stateBuckets = new Map<DocumentState, readonly BuildPhasePass[]>();
69
- protected stateBucketsFor: readonly BuildPhasePass[] | undefined;
67
+ /** Per-phase bucket of passes targeting each phase, rebuilt lazily on the first run after a registry mutation. */
68
+ protected phaseBuckets = new Map<DocumentState, readonly BuildPhasePass[]>();
69
+ protected phaseBucketsFor: readonly BuildPhasePass[] | undefined;
70
70
 
71
71
  protected readonly tracer: Tracer;
72
72
 
@@ -84,11 +84,21 @@ export class DefaultBuildPhasePassService implements BuildPhasePassService {
84
84
  }
85
85
 
86
86
  register(pass: BuildPhasePass): Disposable {
87
+ // A phase outside the wired set type-checks only past a cast, and a pass
88
+ // there is accepted and never fires.
89
+ if (!BuildPassPhase.all().includes(pass.phase)) {
90
+ throw new Error(
91
+ `Build-phase pass '${pass.id}' registered at phase ${DocumentState[pass.phase]} would never fire. ` +
92
+ `Allowed phases are ${BuildPassPhase.all()
93
+ .map(phase => DocumentState[phase])
94
+ .join(', ')}.`
95
+ );
96
+ }
87
97
  return this.passes.register(pass);
88
98
  }
89
99
 
90
100
  async runPasses(documents: readonly LangiumDocument[], phase: DocumentState, cancelToken: CancellationToken): Promise<void> {
91
- const bucket = this.getStateBucket(phase);
101
+ const bucket = this.getPhaseBucket(phase);
92
102
  if (bucket.length === 0) {
93
103
  return;
94
104
  }
@@ -114,28 +124,28 @@ export class DefaultBuildPhasePassService implements BuildPhasePassService {
114
124
  }
115
125
 
116
126
  /**
117
- * Bucket-by-state view of {@link passes}, rebuilt lazily when the registry's
127
+ * Bucket-by-phase view of {@link passes}, rebuilt lazily when the registry's
118
128
  * cached `all()` reference changes. Each bucket preserves the registry's
119
129
  * priority order (`Registry.all()` is already priority-sorted).
120
130
  */
121
- protected getStateBucket(phase: DocumentState): readonly BuildPhasePass[] {
131
+ protected getPhaseBucket(phase: DocumentState): readonly BuildPhasePass[] {
122
132
  const current = this.passes.all();
123
- if (this.stateBucketsFor !== current) {
133
+ if (this.phaseBucketsFor !== current) {
124
134
  const next = new Map<DocumentState, BuildPhasePass[]>();
125
135
  for (const pass of current) {
126
- let bucket = next.get(pass.state);
136
+ let bucket = next.get(pass.phase);
127
137
  if (!bucket) {
128
138
  bucket = [];
129
- next.set(pass.state, bucket);
139
+ next.set(pass.phase, bucket);
130
140
  }
131
141
  bucket.push(pass);
132
142
  }
133
- this.stateBuckets = next;
134
- this.stateBucketsFor = current;
143
+ this.phaseBuckets = next;
144
+ this.phaseBucketsFor = current;
135
145
  }
136
- return this.stateBuckets.get(phase) ?? EMPTY_STATE_BUCKET;
146
+ return this.phaseBuckets.get(phase) ?? EMPTY_PHASE_BUCKET;
137
147
  }
138
148
  }
139
149
 
140
- /** Shared empty result so `getStateBucket` doesn't allocate per call on the cold path. */
141
- const EMPTY_STATE_BUCKET: readonly BuildPhasePass[] = Object.freeze([]);
150
+ /** Shared empty result so `getPhaseBucket` doesn't allocate per call on the cold path. */
151
+ const EMPTY_PHASE_BUCKET: readonly BuildPhasePass[] = Object.freeze([]);
@@ -7,10 +7,43 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { type DocumentState, type LangiumCoreServices, type LangiumDocument, type URI } from '@hydranium/langium';
10
+ import { DocumentState, type LangiumCoreServices, type LangiumDocument, type URI } from '@hydranium/langium';
11
11
  import { type CancellationToken, type Disposable } from 'vscode-languageserver';
12
12
  import { type RegistryItem } from '../../util/registry.js';
13
13
 
14
+ /**
15
+ * The build phases a {@link BuildPhasePass} may fire at: every phase after
16
+ * `Changed`, which has no AST yet. `IndexedContent` is one, unlike for an
17
+ * `AstExtension`: per document it carries nothing `Parsed` does, but per
18
+ * batch it is the only phase meaning the global index is whole again, which
19
+ * batch work keyed on a complete index has nowhere else to run.
20
+ */
21
+ export type BuildPassPhase =
22
+ | DocumentState.Parsed
23
+ | DocumentState.IndexedContent
24
+ | DocumentState.ComputedScopes
25
+ | DocumentState.Linked
26
+ | DocumentState.IndexedReferences
27
+ | DocumentState.Validated;
28
+
29
+ export namespace BuildPassPhase {
30
+ /**
31
+ * Every {@link BuildPassPhase}, in build order. `BuildPipelineIntegration`
32
+ * wires one `onBuildPhase` listener per entry and `register` refuses a phase
33
+ * outside it, so the two cannot drift apart. A fresh array each call.
34
+ */
35
+ export function all(): readonly BuildPassPhase[] {
36
+ return [
37
+ DocumentState.Parsed,
38
+ DocumentState.IndexedContent,
39
+ DocumentState.ComputedScopes,
40
+ DocumentState.Linked,
41
+ DocumentState.IndexedReferences,
42
+ DocumentState.Validated
43
+ ];
44
+ }
45
+ }
46
+
14
47
  /**
15
48
  * A unit of whole-batch work run once per build when the batch reaches a
16
49
  * declared build phase, ordered by {@link RegistryItem.priority}.
@@ -46,12 +79,8 @@ import { type RegistryItem } from '../../util/registry.js';
46
79
  * rather than running the remaining passes against a doomed build.
47
80
  */
48
81
  export interface BuildPhasePass extends RegistryItem {
49
- /**
50
- * The single build phase whose `onBuildPhase` fires this pass. The framework
51
- * wires a listener for the same phase set as AST extension; a pass declaring
52
- * any other state type-checks but never fires.
53
- */
54
- state: DocumentState;
82
+ /** The single build phase whose `onBuildPhase` fires this pass. */
83
+ phase: BuildPassPhase;
55
84
  /**
56
85
  * Run this pass against the whole built batch. May mutate and reparse
57
86
  * documents — the framework's integrity pass does — or derive cross-document
@@ -102,7 +131,7 @@ export function groupDocumentsByLanguage<TLanguage extends LangiumCoreServices>(
102
131
  * Registry handed to a {@link BuildPhasePassContribution}. Implemented by the
103
132
  * `BuildPhasePassService`; doubles
104
133
  * as the low-level imperative API the framework uses to self-register its own
105
- * passes (integrity, the Langium profiler flush).
134
+ * passes (integrity, CST residency).
106
135
  */
107
136
  export interface BuildPhasePassRegistry {
108
137
  register(pass: BuildPhasePass): Disposable;
@@ -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 { AbstractAstReflection, type AstMetaData, type AstReflection, type PropertyMetaData, type TypeMetaData } from '@hydranium/langium';
11
+ import { assertSingleLangiumCopy } from './single-langium-copy.js';
12
+
13
+ /**
14
+ * One `AstReflection` over the reflections of separately generated language
15
+ * packages. The shared `AstReflection` slot holds a single reflection, so
16
+ * binding each package's generated shared module keeps only the last one's
17
+ * types; bind this over all of them instead.
18
+ *
19
+ * A name several reflections share is taken to be one type, reached through a
20
+ * shared imported grammar, and keeps every super type any of them gives it:
21
+ * each grammar may declare its own union over the type. Only properties that
22
+ * differ in name, reference type or default value throw; two unrelated unions,
23
+ * or same-shaped interfaces, that share a name merge silently, so keep other
24
+ * type names distinct across packages.
25
+ *
26
+ * Only each reflection's `types` is read, so behaviour a reflection overrides
27
+ * is lost. Each package's generated `isX` guards keep using that package's own
28
+ * reflection and answer false for subtypes only another package declares.
29
+ *
30
+ * Each reflection is checked with {@link assertSingleLangiumCopy}, because the
31
+ * composite itself extends the framework copy's base whichever copy they use.
32
+ *
33
+ * The protected merge methods run from the constructor, so an override cannot
34
+ * read its own class's fields.
35
+ */
36
+ export class CompositeAstReflection extends AbstractAstReflection {
37
+ override readonly types: AstMetaData = {};
38
+
39
+ constructor(reflections: readonly AstReflection[]) {
40
+ super();
41
+ const firstDefinedAt = new Map<string, number>();
42
+ reflections.forEach((reflection, index) => {
43
+ assertSingleLangiumCopy(reflection, () => this.formatReflection(reflections, index));
44
+ for (const [type, metaData] of Object.entries(reflection.types)) {
45
+ const ownerIndex = firstDefinedAt.get(type);
46
+ if (ownerIndex === undefined) {
47
+ this.types[type] = metaData;
48
+ firstDefinedAt.set(type, index);
49
+ } else {
50
+ this.types[type] = this.mergeTypeMetaData(
51
+ this.types[type],
52
+ metaData,
53
+ this.formatReflection(reflections, ownerIndex),
54
+ this.formatReflection(reflections, index)
55
+ );
56
+ }
57
+ }
58
+ });
59
+ }
60
+
61
+ protected mergeTypeMetaData(known: TypeMetaData, added: TypeMetaData, knownFrom: string, addedFrom: string): TypeMetaData {
62
+ const properties: TypeMetaData['properties'] = {};
63
+ const propertyNames = new Set([...Object.keys(known.properties), ...Object.keys(added.properties)]);
64
+ for (const property of propertyNames) {
65
+ const knownProperty = known.properties[property];
66
+ const addedProperty = added.properties[property];
67
+ if (!knownProperty || !addedProperty || !this.sameProperty(knownProperty, addedProperty)) {
68
+ throw new Error(
69
+ `[hydranium] ${knownFrom} and ${addedFrom} define the type ` +
70
+ `'${known.name}' differently (property '${property}'). A name the composed reflections share must ` +
71
+ 'denote one type, so rename one of them, or have every grammar take the type unchanged from one ' +
72
+ 'shared imported grammar.'
73
+ );
74
+ }
75
+ properties[property] = addedProperty.optional && !knownProperty.optional ? addedProperty : knownProperty;
76
+ }
77
+ // `Required` so a field Langium adds fails compilation until this merge decides on it.
78
+ const merged: Required<TypeMetaData> = {
79
+ name: known.name,
80
+ properties,
81
+ superTypes: [...new Set([...known.superTypes, ...added.superTypes])]
82
+ };
83
+ return merged;
84
+ }
85
+
86
+ protected sameProperty(left: PropertyMetaData, right: PropertyMetaData): boolean {
87
+ return COMPARED_PROPERTY_FIELDS.every(field => JSON.stringify(left[field]) === JSON.stringify(right[field]));
88
+ }
89
+
90
+ /**
91
+ * Names `reflections[index]` for the composite's errors: its position and
92
+ * class name. The position is needed because minified bundles and scaffolds
93
+ * sharing a project name leave class names that do not tell reflections
94
+ * apart. An override can name the package each reflection came from.
95
+ */
96
+ protected formatReflection(reflections: readonly AstReflection[], index: number): string {
97
+ return `reflections[${index}] (${reflections[index].constructor?.name ?? 'no constructor'})`;
98
+ }
99
+ }
100
+
101
+ /** How the merge treats each property field; a field Langium adds fails compilation here until decided. */
102
+ const PROPERTY_FIELDS = {
103
+ name: 'compared',
104
+ referenceType: 'compared',
105
+ defaultValue: 'compared',
106
+ // Older generators emit no `optional`, so its absence proves nothing.
107
+ optional: 'merged'
108
+ } as const satisfies Record<keyof PropertyMetaData, 'compared' | 'merged'>;
109
+
110
+ const COMPARED_PROPERTY_FIELDS = (Object.keys(PROPERTY_FIELDS) as Array<keyof PropertyMetaData>).filter(
111
+ field => PROPERTY_FIELDS[field] === 'compared'
112
+ );