@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
@@ -7,7 +7,7 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { asMutable, type Clock, Debouncer, Format, type Tracer } from '@hydranium/protocol';
10
+ import { asMutable, type Clock, Debouncer, Format, type Tracer, UNRECORDED_VERSION } from '@hydranium/protocol';
11
11
  import {
12
12
  type AstNode,
13
13
  AstUtils,
@@ -24,9 +24,13 @@ import { type ServerSharedServicesMinimal } from '../shared-services.js';
24
24
  /**
25
25
  * Default priority of the CST-residency pass. Deliberately very high so it runs
26
26
  * *last* among `Validated` build-phase passes (the registry iterates priority
27
- * ascending): every other reaction to the build — an adopter's own derived-state
28
- * pass included — settles while the CST is still guaranteed resident, before the
29
- * residency policy arms the shed.
27
+ * ascending).
28
+ *
29
+ * The ordering is defensive, not load-bearing: the pass only arms or cancels an
30
+ * idle timer, so every pass at `Validated` reads a resident CST whichever order
31
+ * they run in, and lowering it changes nothing observable while that holds. It
32
+ * becomes load-bearing the moment the shed stops being deferred — a pass that
33
+ * frees the CST synchronously has to run after every reader of it.
30
34
  */
31
35
  export const CST_RESIDENCY_PASS_PRIORITY = 1_000_000;
32
36
 
@@ -41,8 +45,11 @@ export const CST_RESIDENCY_PASS_PRIORITY = 1_000_000;
41
45
  * "off" toggle.
42
46
  * - `{ kind: 'shed-closed-when-idle', idleMs }`: shed a closed document's CST
43
47
  * once it has been idle (not in any build) for `idleMs`, keeping the AST
44
- * resident. Open documents are always kept. `idleMs: 0` sheds as soon as a
45
- * document is closed (a pure close-triggered threshold of this strategy).
48
+ * resident. Open documents are always kept. The timer starts when a build
49
+ * includes the document, so `idleMs: 0` sheds a closed document on the tick
50
+ * after each such build. A shed document that re-enters a build is re-parsed
51
+ * in full, so a window shorter than the gap between a document's builds
52
+ * re-parses a closed document on every build it rides in.
46
53
  */
47
54
  export type CstResidencyStrategy = { readonly kind: 'always-keep' } | { readonly kind: 'shed-closed-when-idle'; readonly idleMs: number };
48
55
 
@@ -181,8 +188,10 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
181
188
  }
182
189
 
183
190
  /**
184
- * Residency policy that reclaims memory by shedding the concrete syntax tree
185
- * (CST) of closed documents while keeping their AST resident. Each build refreshes
191
+ * Keeps a document's CST available to the readers that need one, shedding it
192
+ * for documents that have gone idle and re-grafting on demand.
193
+ *
194
+ * Each build refreshes
186
195
  * the idle window of the documents in its batch; when a closed, sheddable
187
196
  * document's window elapses, every AST node's `$cstNode` and every reference's
188
197
  * `$refNode` are nulled, and the CST root, `Range`s and `Position`s become
@@ -227,7 +236,23 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
227
236
  * `NameProvider.getNameNode` chokepoint, the comment provider, and
228
237
  * `HydraniumLangiumDocuments.getOrCreateDocument`.
229
238
  */
230
- export class CstResidencyService {
239
+ export interface CstResidencyService {
240
+ /**
241
+ * Ensure `document` has a CST, re-parsing its retained text if it was shed.
242
+ * A resident document is left exactly as it is, so this is safe to call on
243
+ * a hot path and safe to call twice.
244
+ */
245
+ rehydrate(document: LangiumDocument): void;
246
+
247
+ /**
248
+ * Node-level convenience over {@link rehydrate}, cheap enough for an
249
+ * unconditional call: a node whose `$cstNode` is already set returns
250
+ * without resolving its document.
251
+ */
252
+ rehydrateNode(node: AstNode): void;
253
+ }
254
+
255
+ export class DefaultCstResidencyService implements CstResidencyService {
231
256
  protected readonly strategy: CstResidencyStrategy;
232
257
  /** Bytes-per-node for the optional reclaim estimate in traces; `0` disables it. */
233
258
  protected readonly estimatedBytesPerShedNode: number;
@@ -257,7 +282,7 @@ export class CstResidencyService {
257
282
  this.langiumDocs = services.workspace.LangiumDocuments;
258
283
  services.workspace.BuildPhasePassService.register({
259
284
  id: 'framework:cst-residency:shed',
260
- state: DocumentState.Validated,
285
+ phase: DocumentState.Validated,
261
286
  priority: options.priority ?? CST_RESIDENCY_PASS_PRIORITY,
262
287
  run: documents => this.onBuild(documents)
263
288
  });
@@ -277,8 +302,8 @@ export class CstResidencyService {
277
302
  * until navigation latency on shed files is actually observed to hurt. This
278
303
  * method is where that hook goes.
279
304
  */
280
- rehydrate(document: LangiumDocument): boolean {
281
- return rehydrateCst(document, this.services.workspace.LangiumDocumentFactory);
305
+ rehydrate(document: LangiumDocument): void {
306
+ rehydrateCst(document, this.services.workspace.LangiumDocumentFactory);
282
307
  }
283
308
 
284
309
  /**
@@ -287,11 +312,11 @@ export class CstResidencyService {
287
312
  * `true` without even resolving the document, so hot read paths
288
313
  * (`getNameNode`, comment lookup) call this unconditionally.
289
314
  */
290
- rehydrateNode(node: AstNode): boolean {
315
+ rehydrateNode(node: AstNode): void {
291
316
  if (node.$cstNode !== undefined) {
292
- return true;
317
+ return;
293
318
  }
294
- return this.rehydrate(AstUtils.getDocument(node));
319
+ this.rehydrate(AstUtils.getDocument(node));
295
320
  }
296
321
 
297
322
  /**
@@ -353,8 +378,8 @@ export class CstResidencyService {
353
378
  this.shedTotal += this.shed(document);
354
379
  }
355
380
 
356
- /** Cancel and drop every idle timer — for clean shutdown and deterministic tests. */
357
- dispose(): void {
381
+ /** Cancel every armed shed, so a document that has gone idle keeps its CST. */
382
+ cancelPendingShed(): void {
358
383
  for (const timer of this.idleTimers.values()) {
359
384
  timer.dispose();
360
385
  }
@@ -383,6 +408,15 @@ export class CstResidencyService {
383
408
  if (root === undefined || root.$cstNode === undefined) {
384
409
  return 0;
385
410
  }
411
+ // Readers of the parsed text, the `'text-diagnostics'` fingerprint among
412
+ // them, otherwise see none once the CST is gone. Recorded in the ledger
413
+ // directly: no root is produced, and reconciling it with the store would
414
+ // step a closed document's sequence for a root behind its text.
415
+ const ledger = this.services.workspace.ModelLedger;
416
+ const version = ledger.versionOf(root);
417
+ if (version !== UNRECORDED_VERSION) {
418
+ ledger.record(root, version, ledger.textOf(root));
419
+ }
386
420
  let cleared = 0;
387
421
  for (const node of AstUtils.streamAst(root)) {
388
422
  if (node.$cstNode) {
@@ -0,0 +1,38 @@
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 AstNodeDescription, type Scope, type Stream } from '@hydranium/langium';
11
+
12
+ /**
13
+ * A scope that answers from `primary`, and from `fallback` only for a name
14
+ * `primary` does not hold.
15
+ *
16
+ * Langium fixes a scope's outer scope when the scope is built, so a tier cannot
17
+ * be put below a scope that already exists, such as a cached one. Re-wrapping
18
+ * that scope's elements instead would turn its keyed lookup into a scan of
19
+ * every element; chaining keeps each scope's own lookup.
20
+ */
21
+ export class FallbackScope implements Scope {
22
+ constructor(
23
+ protected readonly primary: Scope,
24
+ protected readonly fallback: Scope
25
+ ) {}
26
+
27
+ getElement(name: string): AstNodeDescription | undefined {
28
+ return this.primary.getElement(name) ?? this.fallback.getElement(name);
29
+ }
30
+
31
+ getElements(name: string): Stream<AstNodeDescription> {
32
+ return this.primary.getElements(name).concat(this.fallback.getElements(name));
33
+ }
34
+
35
+ getAllElements(): Stream<AstNodeDescription> {
36
+ return this.primary.getAllElements().concat(this.fallback.getAllElements());
37
+ }
38
+ }
@@ -10,15 +10,13 @@
10
10
  import {
11
11
  type AstNode,
12
12
  type AstNodeDescription,
13
- AstUtils,
14
13
  DefaultScopeComputation,
15
- interruptAndCheck,
16
14
  type LangiumDocument,
17
15
  type LocalSymbols,
18
- MultiMap,
16
+ type MultiMap,
19
17
  UriUtils
20
18
  } from '@hydranium/langium';
21
- import { Logger, type Tracer } from '@hydranium/protocol';
19
+ import { Logger, type ProfileSession, type Tracer } from '@hydranium/protocol';
22
20
  import type { CancellationToken } from 'vscode-languageserver-protocol';
23
21
  import type { LogNameOptions } from '../diagnostics/logger.js';
24
22
  import type { HydraniumLanguageServices } from '../language-module.js';
@@ -35,8 +33,9 @@ import { type HydraniumAstNodeDescriptionProvider } from './ast-node-description
35
33
  * `NameProvider.getName` defaults to the workspace-unique
36
34
  * `getProjectQualifiedName`. Routing the local-symbols pass through
37
35
  * `getName` would put qualified names in the per-document symbol map
38
- * and break within-document bare-name references. {@link addLocalSymbol}
39
- * bypasses the default and calls {@link NameProvider.getOwnName}
36
+ * and break within-document bare-name references.
37
+ * {@link addLocalSymbolByOwnName} bypasses the default and calls
38
+ * {@link NameProvider.getOwnName}
40
39
  * directly so local symbols stay keyed by bare names regardless of
41
40
  * what `getName` returns.
42
41
  *
@@ -55,11 +54,15 @@ import { type HydraniumAstNodeDescriptionProvider } from './ast-node-description
55
54
  *
56
55
  * Performance: piggybacks on the existing single AST walk Langium does
57
56
  * for local-symbol collection — the AST-extension dispatch and the
58
- * own-name read both happen in `addLocalSymbol`, no extra traversal.
57
+ * own-name read both happen in `addLocalSymbolByOwnName`, no extra traversal.
59
58
  * The exported-symbol pass reads both name tiers once per node, no
60
59
  * duplicated walks.
61
60
  */
62
61
  export class HydraniumScopeComputation extends DefaultScopeComputation {
62
+ /** The framework's name provider, which its language module binds to the slot. */
63
+ declare protected readonly nameProvider: NameProvider;
64
+ /** The framework's description provider, which its language module binds to the slot. */
65
+ declare protected readonly descriptions: HydraniumAstNodeDescriptionProvider;
63
66
  protected readonly tracer: Tracer;
64
67
 
65
68
  constructor(
@@ -70,38 +73,30 @@ export class HydraniumScopeComputation extends DefaultScopeComputation {
70
73
  this.tracer = services.shared.Tracer.for(options.logName ?? 'ScopeComputation').trace('instantiated');
71
74
  }
72
75
 
76
+ /** The session {@link addLocalSymbol} records into while a `debug`-level walk runs. */
77
+ protected localSymbolsProfile: ProfileSession | undefined;
78
+
73
79
  /**
74
- * Local-symbol collection with optional per-`$type` self-time profiling.
75
- *
76
- * Langium's default walks the full AST and calls {@link addLocalSymbol} per
77
- * node. At the default `info` level this delegates straight to `super` (zero
78
- * cost). At `debug` it reproduces the same walk under a `ProfileSession`
79
- * so each `$type`'s contribution to the heaviest scope-computation pass is
80
- * aggregated and reported line-based — the walk is gated rather than the
81
- * per-node `scope`, since `ProfileSession.scope` is not itself level-gated.
82
- *
83
- * The instance carries no profiling state: the session is local to the call,
84
- * which is safe because Langium's document builder runs `collectLocalSymbols`
85
- * strictly one document at a time (`runCancelable`'s sequential `for…await`).
80
+ * Langium's local-symbol walk, with per-`$type` self-time profiling at
81
+ * `debug`. The walk is Langium's at every level: a copy run only at `debug`
82
+ * would drift from the one every other level runs. Overlapping builds share
83
+ * the session and blur each other's report.
86
84
  */
87
85
  override async collectLocalSymbols(document: LangiumDocument, cancelToken?: CancellationToken): Promise<LocalSymbols> {
88
86
  if (!Logger.isLevelEnabled('debug')) {
89
87
  return super.collectLocalSymbols(document, cancelToken);
90
88
  }
91
- // Faithfully reproduces Langium's local-symbol walk (root's full-AST stream
92
- // → addLocalSymbol per node) under a session. The MultiMap conforms to
93
- // LocalSymbols. interruptAndCheck only when a token is supplied (the base
94
- // defaults to CancellationToken.None, a no-op token).
95
- const rootNode = document.parseResult.value;
96
- const symbols = new MultiMap<AstNode, AstNodeDescription>();
97
- const session = this.tracer.profile(`scope-local ${UriUtils.basename(document.uri)}`);
98
- for (const node of AstUtils.streamAllContents(rootNode)) {
99
- if (cancelToken) {
100
- await interruptAndCheck(cancelToken);
89
+ const profile = this.tracer.profile(`scope-local ${UriUtils.basename(document.uri)}`);
90
+ this.localSymbolsProfile = profile;
91
+ let symbols: LocalSymbols;
92
+ try {
93
+ symbols = await super.collectLocalSymbols(document, cancelToken);
94
+ } finally {
95
+ if (this.localSymbolsProfile === profile) {
96
+ this.localSymbolsProfile = undefined;
101
97
  }
102
- session.scope(node.$type, () => this.addLocalSymbol(node, document, symbols));
103
98
  }
104
- session.report('debug');
99
+ profile.report('debug');
105
100
  return symbols;
106
101
  }
107
102
 
@@ -164,17 +159,15 @@ export class HydraniumScopeComputation extends DefaultScopeComputation {
164
159
  * workspace-visible rather than being filtered out everywhere.
165
160
  */
166
161
  protected exportProject(node: AstNode, exports: AstNodeDescription[], document: LangiumDocument): void {
167
- const nameProvider = this.nameProvider as NameProvider;
168
- const documentName = nameProvider.getDocumentQualifiedName(node);
162
+ const documentName = this.nameProvider.getDocumentQualifiedName(node);
169
163
  if (!documentName) {
170
164
  return;
171
165
  }
172
166
  const projectId = this.getProjectIdForDocument(document);
173
- const descriptions = this.descriptions as HydraniumAstNodeDescriptionProvider;
174
167
  exports.push(
175
168
  projectId !== undefined
176
- ? descriptions.createProject({ node, name: documentName, document, projectId })
177
- : descriptions.createUniversal({ node, name: documentName, document })
169
+ ? this.descriptions.createProject({ node, name: documentName, document, projectId })
170
+ : this.descriptions.createUniversal({ node, name: documentName, document })
178
171
  );
179
172
  }
180
173
 
@@ -191,16 +184,14 @@ export class HydraniumScopeComputation extends DefaultScopeComputation {
191
184
  * document-qualified name.
192
185
  */
193
186
  protected exportPublic(node: AstNode, exports: AstNodeDescription[], document: LangiumDocument): void {
194
- const nameProvider = this.nameProvider as NameProvider;
195
187
  const projectId = this.getProjectIdForDocument(document);
196
188
  if (projectId === undefined) {
197
189
  return;
198
190
  }
199
- const documentName = nameProvider.getDocumentQualifiedName(node);
200
- const projectName = nameProvider.getProjectQualifiedName(node);
191
+ const documentName = this.nameProvider.getDocumentQualifiedName(node);
192
+ const projectName = this.nameProvider.getProjectQualifiedName(node);
201
193
  if (projectName && projectName !== documentName) {
202
- const descriptions = this.descriptions as HydraniumAstNodeDescriptionProvider;
203
- exports.push(descriptions.createPublic({ node, name: projectName, document, projectId }));
194
+ exports.push(this.descriptions.createPublic({ node, name: projectName, document, projectId }));
204
195
  }
205
196
  }
206
197
 
@@ -218,6 +209,16 @@ export class HydraniumScopeComputation extends DefaultScopeComputation {
218
209
  return this.services.shared.workspace.ProjectManager.getProject(document.uri)?.id;
219
210
  }
220
211
 
212
+ /** {@link addLocalSymbolByOwnName}, timed per `$type` while {@link localSymbolsProfile} is set. */
213
+ protected override addLocalSymbol(node: AstNode, document: LangiumDocument, symbols: MultiMap<AstNode, AstNodeDescription>): void {
214
+ const profile = this.localSymbolsProfile;
215
+ if (profile) {
216
+ profile.scope(node.$type, () => this.addLocalSymbolByOwnName(node, document, symbols));
217
+ } else {
218
+ this.addLocalSymbolByOwnName(node, document, symbols);
219
+ }
220
+ }
221
+
221
222
  /**
222
223
  * Bypasses Langium's `super.addLocalSymbol` (which would key the
223
224
  * local-symbols map by `nameProvider.getName(node)`, qualified by
@@ -233,14 +234,14 @@ export class HydraniumScopeComputation extends DefaultScopeComputation {
233
234
  * extension `compute` callbacks fire after this `addLocalSymbol` pass
234
235
  * completes for the whole document.
235
236
  */
236
- protected override addLocalSymbol(node: AstNode, document: LangiumDocument, symbols: MultiMap<AstNode, AstNodeDescription>): void {
237
+ protected addLocalSymbolByOwnName(node: AstNode, document: LangiumDocument, symbols: MultiMap<AstNode, AstNodeDescription>): void {
237
238
  const container = node.$container;
238
239
  if (!container) {
239
240
  return;
240
241
  }
241
- const name = (this.nameProvider as NameProvider).getOwnName(node);
242
+ const name = this.nameProvider.getOwnName(node);
242
243
  if (name) {
243
- symbols.add(container, (this.descriptions as HydraniumAstNodeDescriptionProvider).createLocal({ node, name, document }));
244
+ symbols.add(container, this.descriptions.createLocal({ node, name, document }));
244
245
  }
245
246
  }
246
247
  }
@@ -34,12 +34,14 @@ import {
34
34
  WorkspaceCache,
35
35
  stream
36
36
  } from '@hydranium/langium';
37
+ import { buildAstNode } from '../ast-extension/ast-node-builder.js';
37
38
  import { type LogNameOptions } from '../diagnostics/logger.js';
38
39
  import { type HydraniumLanguageServices } from '../language-module.js';
39
40
  import { type NameProvider } from '../naming/name-provider.js';
40
41
  import { type HydraniumDocumentRegistry } from '../workspace/langium-documents.js';
42
+ import { FallbackScope } from './fallback-scope.js';
41
43
  import { type ScopeExtensionService } from './scope-extension-service.js';
42
- import { isTieredDescription } from './scoped-ast-node-description.js';
44
+ import { type TieredAstNodeDescription, isTieredDescription } from './scoped-ast-node-description.js';
43
45
 
44
46
  /**
45
47
  * Construction-time options for {@link HydraniumScopeProvider}. Extends
@@ -182,6 +184,26 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
182
184
  this.tracer = services.shared.Tracer.for(options.logName ?? 'ScopeProvider').trace('instantiated');
183
185
  }
184
186
 
187
+ /**
188
+ * Drop every cached scope — the framework's project-tier chain and the
189
+ * inherited global scope it is filtered from.
190
+ *
191
+ * **Called from outside the class**, by the build pipeline once the batch is
192
+ * re-indexed. The caches' own eviction does not cover this:
193
+ * `DocumentBuilder.onUpdate` fires after the build has taken every changed
194
+ * document's symbols out of the index and before it puts them back, so a
195
+ * scope built in that gap denies those symbols exist and every document the
196
+ * same build links afterwards resolves against it.
197
+ *
198
+ * Both go together because the second is derived from the first: clearing
199
+ * only {@link scopeCache} refills it from a stale `globalScopeCache`, and
200
+ * clearing only `globalScopeCache` leaves the filtered copy standing.
201
+ */
202
+ clearScopeCaches(): void {
203
+ this.scopeCache.clear();
204
+ this.globalScopeCache.clear();
205
+ }
206
+
185
207
  /**
186
208
  * Framework-owned assembly seam. **Adopters do NOT override this** —
187
209
  * override {@link createGlobalScope} instead. This method layers the
@@ -193,8 +215,9 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
193
215
  */
194
216
  protected override getGlobalScope(referenceType: string, context: ReferenceInfo): Scope {
195
217
  const projectChain = this.createGlobalScope(referenceType, context);
196
- const withUniversal = this.layerUniversalExtension(referenceType, context, projectChain);
197
- return this.layerLocalExtension(referenceType, context, withUniversal);
218
+ const extensions = this.scopeExtensionService.getDescriptions(referenceType, context.container);
219
+ const withUniversal = this.layerUniversalExtension(extensions.universal, projectChain, referenceType, context);
220
+ return this.layerLocalExtension(extensions.local, withUniversal, referenceType, context);
198
221
  }
199
222
 
200
223
  /**
@@ -229,22 +252,32 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
229
252
  }
230
253
 
231
254
  /**
232
- * Layer scope-extension `local`-tier descriptions on top of `inner`.
233
- * Returns `inner` unchanged when no extension contributes for the
234
- * reference type (zero-cost common path).
255
+ * Layer the scope extensions' `local`-tier `descriptions` on top of
256
+ * `inner`, through {@link createScope}. Returns `inner` unchanged when there
257
+ * are none.
235
258
  */
236
- protected layerLocalExtension(referenceType: string, context: ReferenceInfo, inner: Scope): Scope {
237
- return this.scopeExtensionService.getLocalExtensionScope(referenceType, context.container, inner);
259
+ protected layerLocalExtension(
260
+ descriptions: readonly TieredAstNodeDescription[],
261
+ inner: Scope,
262
+ _referenceType: string,
263
+ _context: ReferenceInfo
264
+ ): Scope {
265
+ return descriptions.length === 0 ? inner : this.createScope(descriptions, inner);
238
266
  }
239
267
 
240
268
  /**
241
- * Layer scope-extension `universal`-tier descriptions BELOW `inner`
242
- * (extensions appear last in the chain, shadowed by inner). Returns
243
- * `inner` unchanged when no extension contributes for the reference
244
- * type.
269
+ * Layer the scope extensions' `universal`-tier `descriptions` below
270
+ * `inner`, which shadows them, through {@link createScope} and a
271
+ * {@link FallbackScope}, so `inner` keeps its own lookup. Returns `inner`
272
+ * unchanged when there are none.
245
273
  */
246
- protected layerUniversalExtension(referenceType: string, context: ReferenceInfo, inner: Scope): Scope {
247
- return this.scopeExtensionService.getUniversalExtensionScope(referenceType, context.container, inner);
274
+ protected layerUniversalExtension(
275
+ descriptions: readonly TieredAstNodeDescription[],
276
+ inner: Scope,
277
+ _referenceType: string,
278
+ _context: ReferenceInfo
279
+ ): Scope {
280
+ return descriptions.length === 0 ? inner : new FallbackScope(inner, this.createScope(descriptions));
248
281
  }
249
282
 
250
283
  /**
@@ -442,8 +475,9 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
442
475
 
443
476
  /**
444
477
  * Keys the scope by {@link NameProvider.getOwnName} instead of Langium's
445
- * `getName`. Same correction `HydraniumScopeComputation.addLocalSymbol`
446
- * makes to the local-symbols pass, for the same reason: `getName` defaults
478
+ * `getName`. Same correction
479
+ * `HydraniumScopeComputation.addLocalSymbolByOwnName` makes to the
480
+ * local-symbols pass, for the same reason: `getName` defaults
447
481
  * to the project-qualified form here, so the base would key a member scope
448
482
  * by the fully qualified `Container.member` while the reference text after
449
483
  * the dot is the bare `member` — and nothing reports the mismatch, because
@@ -469,12 +503,13 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
469
503
  * Convert a protocol-layer {@link ReferenceContext} into a Langium
470
504
  * {@link ReferenceInfo} the rest of the scope/linking machinery accepts.
471
505
  *
472
- * Walks `syntheticPath` by FABRICATING a type-only stub per step, so a
473
- * scope can be queried for an element that does not exist yet — which is
474
- * what synthetic paths are for. The stubs carry no children, so a caller
475
- * that needs to read a collection off the leaf wants
476
- * {@link resolveReferenceSource} instead, which walks the same path into
477
- * the real tree.
506
+ * Walks `syntheticPath` by FABRICATING a stub per step, so a scope can be
507
+ * queried for an element that does not exist yet — which is what synthetic
508
+ * paths are for. A stub carries the grammar's declared defaults and nothing
509
+ * else, so its containment lists are present but EMPTY: a caller that needs
510
+ * to read a populated collection off the leaf wants
511
+ * {@link resolveReferenceSource} instead, which walks the same path into the
512
+ * real tree.
478
513
  *
479
514
  * Throws if the context references an unresolvable source; callers
480
515
  * that prefer a soft failure should catch and fall back to
@@ -486,16 +521,15 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
486
521
  throw new Error('Invalid reference source');
487
522
  }
488
523
  for (const step of ctx.syntheticPath ?? []) {
489
- container = {
524
+ container = buildAstNode(this.services.shared.AstReflection, step.type, {
490
525
  $container: container,
491
526
  $containerProperty: step.containerProperty,
492
527
  // Part of Langium's own container contract, so a stub that omits it
493
528
  // is an under-specified node: anything reading position off the
494
529
  // chain (a key provider, an adopter scope extension) sees
495
530
  // `undefined` where the caller named a slot.
496
- $containerIndex: step.index,
497
- $type: step.type
498
- };
531
+ $containerIndex: step.index
532
+ });
499
533
  }
500
534
  return {
501
535
  reference: { $refText: '', ref: undefined },
@@ -605,13 +639,16 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
605
639
  * `createEmptyDocument`. Overriding is still open to a consumer whose
606
640
  * "container" is an inner element rather than the parse root, or one that
607
641
  * deliberately declines to answer for an absent document.
642
+ *
643
+ * The stub carries the grammar's declared defaults, so an extension reading a
644
+ * containment list off it sees an empty array rather than `undefined`.
608
645
  */
609
646
  protected resolveSyntheticSource(source: SyntheticSource): AstNode | undefined {
610
647
  const uri = UriUtils.toUri(source.uri);
611
648
  const document =
612
649
  this.langiumDocuments.getDocument(uri) ??
613
650
  this.langiumDocuments.createEmptyDocument(uri, this.services.LanguageMetaData.languageId);
614
- return { $type: source.type, $container: document.parseResult.value };
651
+ return buildAstNode(this.services.shared.AstReflection, source.type, { $container: document.parseResult.value });
615
652
  }
616
653
 
617
654
  /**
@@ -8,6 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  export * from './ast-node-description-provider.js';
11
+ export * from './fallback-scope.js';
11
12
  export * from './reference-builder.js';
12
13
  export * from './reference-candidate-provider.js';
13
14
  export * from './hydranium-scope-computation.js';
@@ -102,9 +102,9 @@ export interface ResolvedCandidate {
102
102
  export interface ReferenceCandidateProvider {
103
103
  /**
104
104
  * UI-facing entry point: returns the candidate scope's elements as
105
- * {@link ReferenceCandidate}s.
105
+ * {@link ReferenceCandidate}s. Accepts what {@link getCandidateScope} does.
106
106
  */
107
- find(ctx: ReferenceContext): ReferenceCandidate[];
107
+ find(ctx: ReferenceContext | ReferenceInfo): ReferenceCandidate[];
108
108
 
109
109
  /**
110
110
  * Build a ranked + deduped scope for candidate selection at the
@@ -195,14 +195,15 @@ export class DefaultReferenceCandidateProvider implements ReferenceCandidateProv
195
195
  * and never matches: a self-reference filter silently stops excluding, and
196
196
  * the element offers itself as its own target.
197
197
  *
198
- * The mirror of `ReferenceBuilder.nameProviderFor`, and the same fallback
199
- * reasoning: an unroutable target has no better answer than the source's.
198
+ * The mirror of `DefaultReferenceBuilder.nameProviderFor`, and the same
199
+ * fallback reasoning: an unroutable target has no better answer than the
200
+ * source's.
200
201
  */
201
202
  protected nameProviderFor(target: AstNode): NameProvider {
202
203
  return this.services.shared.ServiceRegistry?.getServicesFor(target)?.references.NameProvider ?? this.nameProvider;
203
204
  }
204
205
 
205
- find(ctx: ReferenceContext): ReferenceCandidate[] {
206
+ find(ctx: ReferenceContext | ReferenceInfo): ReferenceCandidate[] {
206
207
  const scope = this.getCandidateScope(ctx);
207
208
  return scope.elementScope
208
209
  .getAllElements()