@hydranium/core 1.0.0-next.34 → 1.0.0-next.341

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 (779) hide show
  1. package/README.md +78 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +77 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +169 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +32 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +40 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +256 -124
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +293 -132
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +445 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +903 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +4 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +7 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +83 -44
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +142 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
  116. package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
  117. package/lib/langium/diagnostics/format-log-arg.js +36 -0
  118. package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
  119. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  120. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  121. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  122. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  123. package/lib/langium/diagnostics/log-preamble.js +1 -1
  124. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  125. package/lib/langium/diagnostics/logger.d.ts +25 -6
  126. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/logger.js +49 -17
  128. package/lib/langium/diagnostics/logger.js.map +1 -1
  129. package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
  130. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  131. package/lib/langium/diagnostics/lsp-logger.js +81 -45
  132. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  133. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  134. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  135. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  136. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  138. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  139. package/lib/langium/document-builder/build-session.d.ts +6 -5
  140. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  141. package/lib/langium/document-builder/build-session.js +5 -5
  142. package/lib/langium/document-builder/build-session.js.map +1 -1
  143. package/lib/langium/document-builder/document-builder.d.ts +283 -41
  144. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  145. package/lib/langium/document-builder/document-builder.js +449 -79
  146. package/lib/langium/document-builder/document-builder.js.map +1 -1
  147. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  148. package/lib/langium/documentation/comment-provider.js.map +1 -1
  149. package/lib/langium/integration-services.d.ts +40 -24
  150. package/lib/langium/integration-services.d.ts.map +1 -1
  151. package/lib/langium/integration-services.js +7 -4
  152. package/lib/langium/integration-services.js.map +1 -1
  153. package/lib/langium/integrity/integrity-rule.d.ts +17 -8
  154. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  155. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  156. package/lib/langium/integrity/integrity-service.d.ts +95 -27
  157. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  158. package/lib/langium/integrity/integrity-service.js +303 -63
  159. package/lib/langium/integrity/integrity-service.js.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  162. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  164. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  165. package/lib/langium/labeling/label-provider.js.map +1 -1
  166. package/lib/langium/language-module.d.ts +30 -5
  167. package/lib/langium/language-module.d.ts.map +1 -1
  168. package/lib/langium/language-module.js +18 -4
  169. package/lib/langium/language-module.js.map +1 -1
  170. package/lib/langium/model-service/client-session.d.ts +383 -0
  171. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  172. package/lib/langium/model-service/client-session.js +455 -0
  173. package/lib/langium/model-service/client-session.js.map +1 -0
  174. package/lib/langium/model-service/index.d.ts +2 -0
  175. package/lib/langium/model-service/index.d.ts.map +1 -1
  176. package/lib/langium/model-service/index.js +2 -0
  177. package/lib/langium/model-service/index.js.map +1 -1
  178. package/lib/langium/model-service/model-events.d.ts +66 -0
  179. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  180. package/lib/langium/model-service/model-events.js +10 -0
  181. package/lib/langium/model-service/model-events.js.map +1 -0
  182. package/lib/langium/model-service/model-service.d.ts +456 -300
  183. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  184. package/lib/langium/model-service/model-service.js +571 -466
  185. package/lib/langium/model-service/model-service.js.map +1 -1
  186. package/lib/langium/module.d.ts +141 -40
  187. package/lib/langium/module.d.ts.map +1 -1
  188. package/lib/langium/module.js +52 -40
  189. package/lib/langium/module.js.map +1 -1
  190. package/lib/langium/naming/name-provider.d.ts +32 -7
  191. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  192. package/lib/langium/naming/name-provider.js +10 -4
  193. package/lib/langium/naming/name-provider.js.map +1 -1
  194. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  195. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.js +13 -6
  197. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  198. package/lib/langium/project/project-change-event.d.ts +2 -2
  199. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  200. package/lib/langium/project/single-project-manager.js.map +1 -1
  201. package/lib/langium/residency/cst-residency-service.d.ts +38 -14
  202. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  203. package/lib/langium/residency/cst-residency-service.js +24 -58
  204. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  205. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  206. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  207. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  208. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  209. package/lib/langium/scope/fallback-scope.js +35 -0
  210. package/lib/langium/scope/fallback-scope.js.map +1 -0
  211. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  212. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  213. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  214. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  215. package/lib/langium/scope/hydranium-scope-provider.d.ts +66 -26
  216. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  217. package/lib/langium/scope/hydranium-scope-provider.js +114 -33
  218. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  219. package/lib/langium/scope/index.d.ts +1 -0
  220. package/lib/langium/scope/index.d.ts.map +1 -1
  221. package/lib/langium/scope/index.js +1 -0
  222. package/lib/langium/scope/index.js.map +1 -1
  223. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  224. package/lib/langium/scope/reference-builder.js.map +1 -1
  225. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  226. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  227. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  228. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  229. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  230. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  231. package/lib/langium/scope/scope-extension-service.js +57 -29
  232. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  233. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  234. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  235. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  236. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  237. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  238. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  239. package/lib/langium/serialization/abstract-serializer.js +54 -30
  240. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  241. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  242. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  243. package/lib/langium/serialization/json-serializer.js +13 -3
  244. package/lib/langium/serialization/json-serializer.js.map +1 -1
  245. package/lib/langium/serialization/serializer.d.ts +1 -1
  246. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  247. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/yaml-serializer.js +4 -0
  249. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  250. package/lib/langium/service-registry.d.ts +29 -1
  251. package/lib/langium/service-registry.d.ts.map +1 -1
  252. package/lib/langium/service-registry.js +37 -0
  253. package/lib/langium/service-registry.js.map +1 -1
  254. package/lib/langium/shared-services.d.ts +13 -7
  255. package/lib/langium/shared-services.d.ts.map +1 -1
  256. package/lib/langium/shared-services.js.map +1 -1
  257. package/lib/langium/single-langium-copy.d.ts +22 -0
  258. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  259. package/lib/langium/single-langium-copy.js +36 -0
  260. package/lib/langium/single-langium-copy.js.map +1 -0
  261. package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
  262. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  263. package/lib/langium/transfer/transfer-encoder.js +36 -25
  264. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  265. package/lib/langium/trivia/comment-preserver.d.ts +543 -0
  266. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  267. package/lib/langium/trivia/comment-preserver.js +1164 -0
  268. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  269. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  270. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  271. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  272. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  273. package/lib/langium/trivia/index.d.ts +14 -0
  274. package/lib/langium/trivia/index.d.ts.map +1 -0
  275. package/lib/langium/trivia/index.js +14 -0
  276. package/lib/langium/trivia/index.js.map +1 -0
  277. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  278. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  279. package/lib/langium/trivia/trivia-contribution.js +10 -0
  280. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  281. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  282. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  283. package/lib/langium/trivia/trivia-preserver.js +10 -0
  284. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  285. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  286. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  287. package/lib/langium/trivia/trivia-service.js +56 -0
  288. package/lib/langium/trivia/trivia-service.js.map +1 -0
  289. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  290. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  291. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  292. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  293. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  294. package/lib/langium/validation/document-validator.d.ts +168 -23
  295. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  296. package/lib/langium/validation/document-validator.js +264 -26
  297. package/lib/langium/validation/document-validator.js.map +1 -1
  298. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  299. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  300. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  301. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  302. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  303. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  304. package/lib/langium/workspace/document-uri-policy.js +22 -13
  305. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  306. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  307. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  308. package/lib/langium/workspace/file-not-found.js +31 -0
  309. package/lib/langium/workspace/file-not-found.js.map +1 -0
  310. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  311. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  312. package/lib/langium/workspace/file-system-provider.js +115 -13
  313. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  314. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  315. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  316. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  317. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  318. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  319. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  320. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  321. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  322. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
  323. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  324. package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
  325. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  326. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  327. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  328. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  329. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  330. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  331. package/lib/langium/workspace/index-manager.js.map +1 -1
  332. package/lib/langium/workspace/index.d.ts +1 -0
  333. package/lib/langium/workspace/index.d.ts.map +1 -1
  334. package/lib/langium/workspace/index.js +1 -0
  335. package/lib/langium/workspace/index.js.map +1 -1
  336. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  337. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  338. package/lib/langium/workspace/initialize-workspace.js +68 -3
  339. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  340. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  341. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  342. package/lib/langium/workspace/langium-documents.js +18 -1
  343. package/lib/langium/workspace/langium-documents.js.map +1 -1
  344. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  345. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  346. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  347. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  348. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  349. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  350. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  351. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  352. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  353. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  354. package/lib/langium/workspace/virtual-document.js +87 -24
  355. package/lib/langium/workspace/virtual-document.js.map +1 -1
  356. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  357. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  358. package/lib/langium/workspace/write-lock-scope.js +15 -5
  359. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  360. package/lib/launcher/integrated-server.d.ts +3 -1
  361. package/lib/launcher/integrated-server.d.ts.map +1 -1
  362. package/lib/locale/server-locale.d.ts +19 -5
  363. package/lib/locale/server-locale.d.ts.map +1 -1
  364. package/lib/locale/server-locale.js +1 -1
  365. package/lib/locale/server-locale.js.map +1 -1
  366. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  367. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  368. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  369. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  370. package/lib/lsp/connection-features.d.ts +23 -0
  371. package/lib/lsp/connection-features.d.ts.map +1 -0
  372. package/lib/lsp/connection-features.js +60 -0
  373. package/lib/lsp/connection-features.js.map +1 -0
  374. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  375. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  376. package/lib/lsp/diagnostics-connection.js +53 -0
  377. package/lib/lsp/diagnostics-connection.js.map +1 -0
  378. package/lib/lsp/edit-requests-guard.d.ts +31 -0
  379. package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
  380. package/lib/lsp/edit-requests-guard.js +125 -0
  381. package/lib/lsp/edit-requests-guard.js.map +1 -0
  382. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  383. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  384. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  385. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  386. package/lib/lsp/index.d.ts +6 -2
  387. package/lib/lsp/index.d.ts.map +1 -1
  388. package/lib/lsp/index.js +6 -2
  389. package/lib/lsp/index.js.map +1 -1
  390. package/lib/lsp/lsp-latency.d.ts +39 -0
  391. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  392. package/lib/lsp/lsp-latency.js +58 -0
  393. package/lib/lsp/lsp-latency.js.map +1 -0
  394. package/lib/lsp/save-text-document.d.ts +31 -0
  395. package/lib/lsp/save-text-document.d.ts.map +1 -0
  396. package/lib/lsp/save-text-document.js +52 -0
  397. package/lib/lsp/save-text-document.js.map +1 -0
  398. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  399. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  400. package/lib/lsp/semantic-token-provider.js +98 -9
  401. package/lib/lsp/semantic-token-provider.js.map +1 -1
  402. package/lib/lsp/shared-module.d.ts +4 -8
  403. package/lib/lsp/shared-module.d.ts.map +1 -1
  404. package/lib/lsp/shared-module.js.map +1 -1
  405. package/lib/lsp/start-language-server.d.ts +12 -7
  406. package/lib/lsp/start-language-server.d.ts.map +1 -1
  407. package/lib/lsp/start-language-server.js +21 -7
  408. package/lib/lsp/start-language-server.js.map +1 -1
  409. package/lib/messages/carriers.d.ts +4 -6
  410. package/lib/messages/carriers.d.ts.map +1 -1
  411. package/lib/messages/carriers.js +4 -6
  412. package/lib/messages/carriers.js.map +1 -1
  413. package/lib/messages/index.d.ts +2 -2
  414. package/lib/messages/index.d.ts.map +1 -1
  415. package/lib/messages/index.js +2 -2
  416. package/lib/messages/index.js.map +1 -1
  417. package/lib/messages/renderer.d.ts +32 -7
  418. package/lib/messages/renderer.d.ts.map +1 -1
  419. package/lib/messages/renderer.js +7 -1
  420. package/lib/messages/renderer.js.map +1 -1
  421. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  422. package/lib/node/event-loop-monitor.js +2 -1
  423. package/lib/node/event-loop-monitor.js.map +1 -1
  424. package/lib/node/heap-ceiling.d.ts +61 -0
  425. package/lib/node/heap-ceiling.d.ts.map +1 -0
  426. package/lib/node/heap-ceiling.js +72 -0
  427. package/lib/node/heap-ceiling.js.map +1 -0
  428. package/lib/node/index.d.ts +1 -1
  429. package/lib/node/index.d.ts.map +1 -1
  430. package/lib/node/index.js +5 -1
  431. package/lib/node/index.js.map +1 -1
  432. package/lib/node/latency-from-env.d.ts +1 -1
  433. package/lib/node/latency-from-env.js +1 -1
  434. package/lib/node/lint-grammar.js.map +1 -1
  435. package/lib/node/log-file-sink.d.ts +3 -2
  436. package/lib/node/log-file-sink.d.ts.map +1 -1
  437. package/lib/node/log-file-sink.js +6 -2
  438. package/lib/node/log-file-sink.js.map +1 -1
  439. package/lib/node/log-preamble-node.d.ts +5 -3
  440. package/lib/node/log-preamble-node.d.ts.map +1 -1
  441. package/lib/node/log-preamble-node.js +13 -10
  442. package/lib/node/log-preamble-node.js.map +1 -1
  443. package/lib/node/measure-memory.d.ts.map +1 -1
  444. package/lib/node/measure-memory.js +5 -4
  445. package/lib/node/measure-memory.js.map +1 -1
  446. package/lib/node/memory-monitor.d.ts +2 -2
  447. package/lib/node/memory-monitor.d.ts.map +1 -1
  448. package/lib/node/memory-monitor.js +9 -10
  449. package/lib/node/memory-monitor.js.map +1 -1
  450. package/lib/node/node-file-system-provider.d.ts +67 -9
  451. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  452. package/lib/node/node-file-system-provider.js +198 -53
  453. package/lib/node/node-file-system-provider.js.map +1 -1
  454. package/lib/node/profile-capture.d.ts +12 -4
  455. package/lib/node/profile-capture.d.ts.map +1 -1
  456. package/lib/node/profile-capture.js +8 -6
  457. package/lib/node/profile-capture.js.map +1 -1
  458. package/lib/node/profile-digest.js.map +1 -1
  459. package/lib/node/profiling-run.d.ts +13 -3
  460. package/lib/node/profiling-run.d.ts.map +1 -1
  461. package/lib/node/profiling-run.js +17 -8
  462. package/lib/node/profiling-run.js.map +1 -1
  463. package/lib/node/rename-over-open-readers.d.ts +61 -0
  464. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  465. package/lib/node/rename-over-open-readers.js +80 -0
  466. package/lib/node/rename-over-open-readers.js.map +1 -0
  467. package/lib/node/server-diagnostics.js +1 -1
  468. package/lib/node/server-diagnostics.js.map +1 -1
  469. package/lib/node/server-state-snapshot.js +4 -4
  470. package/lib/node/server-state-snapshot.js.map +1 -1
  471. package/lib/node/socket-launcher.d.ts +43 -7
  472. package/lib/node/socket-launcher.d.ts.map +1 -1
  473. package/lib/node/socket-launcher.js +42 -7
  474. package/lib/node/socket-launcher.js.map +1 -1
  475. package/lib/node/startup-cpu-profile.d.ts +29 -0
  476. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  477. package/lib/node/startup-cpu-profile.js +91 -0
  478. package/lib/node/startup-cpu-profile.js.map +1 -0
  479. package/lib/node/stdio-launcher.d.ts +13 -13
  480. package/lib/node/stdio-launcher.d.ts.map +1 -1
  481. package/lib/node/stdio-launcher.js +21 -11
  482. package/lib/node/stdio-launcher.js.map +1 -1
  483. package/lib/node/validate-workspace.d.ts +1 -1
  484. package/lib/node/validate-workspace.d.ts.map +1 -1
  485. package/lib/node/validate-workspace.js +5 -1
  486. package/lib/node/validate-workspace.js.map +1 -1
  487. package/lib/testing/document-uri-policy-conformance.js +1 -1
  488. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  489. package/lib/testing/fake-description.js.map +1 -1
  490. package/lib/testing/fake-document.d.ts +2 -1
  491. package/lib/testing/fake-document.d.ts.map +1 -1
  492. package/lib/testing/fake-document.js.map +1 -1
  493. package/lib/testing/index.d.ts +1 -1
  494. package/lib/testing/index.d.ts.map +1 -1
  495. package/lib/testing/index.js +2 -1
  496. package/lib/testing/index.js.map +1 -1
  497. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  498. package/lib/testing/langium-test-helpers.js +1 -0
  499. package/lib/testing/langium-test-helpers.js.map +1 -1
  500. package/lib/testing/make-noop-language-services.js.map +1 -1
  501. package/lib/testing/make-noop-shared-services.d.ts +4 -4
  502. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  503. package/lib/testing/make-noop-shared-services.js +4 -4
  504. package/lib/testing/make-noop-shared-services.js.map +1 -1
  505. package/lib/testing/make-test-services.d.ts +51 -20
  506. package/lib/testing/make-test-services.d.ts.map +1 -1
  507. package/lib/testing/make-test-services.js +29 -13
  508. package/lib/testing/make-test-services.js.map +1 -1
  509. package/lib/testing/make-test-tracer.d.ts +12 -0
  510. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  511. package/lib/testing/make-test-tracer.js +13 -0
  512. package/lib/testing/make-test-tracer.js.map +1 -1
  513. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  514. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  515. package/lib/testing/node/applied-edit-capture.js +117 -0
  516. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  517. package/lib/testing/node/golden-corpus.js.map +1 -1
  518. package/lib/testing/node/index.d.ts +1 -0
  519. package/lib/testing/node/index.d.ts.map +1 -1
  520. package/lib/testing/node/index.js +1 -0
  521. package/lib/testing/node/index.js.map +1 -1
  522. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  523. package/lib/testing/node/lsp-harness.js +2 -0
  524. package/lib/testing/node/lsp-harness.js.map +1 -1
  525. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  526. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  527. package/lib/testing/node/lsp-server-connection.js +49 -106
  528. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  529. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  530. package/lib/testing/node/scratch-workspace.js +10 -5
  531. package/lib/testing/node/scratch-workspace.js.map +1 -1
  532. package/lib/testing/node/spawned-server.d.ts +30 -1
  533. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  534. package/lib/testing/node/spawned-server.js +39 -2
  535. package/lib/testing/node/spawned-server.js.map +1 -1
  536. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  537. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  538. package/lib/testing/node/unhandled-rejections.js +32 -0
  539. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  540. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  541. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  542. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  543. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  544. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  545. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  546. package/lib/testing/playwright/index.d.ts +1 -0
  547. package/lib/testing/playwright/index.d.ts.map +1 -1
  548. package/lib/testing/playwright/index.js +1 -0
  549. package/lib/testing/playwright/index.js.map +1 -1
  550. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  551. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  552. package/lib/testing/playwright/server-log-capture.js +111 -40
  553. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  554. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  555. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  556. package/lib/testing/playwright/server-log-fixture.js +25 -6
  557. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  558. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  559. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  560. package/lib/testing/playwright/server-log-region.js +30 -0
  561. package/lib/testing/playwright/server-log-region.js.map +1 -0
  562. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  563. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  564. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  565. package/lib/testing/run-update-pipeline.d.ts +8 -5
  566. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  567. package/lib/testing/run-update-pipeline.js.map +1 -1
  568. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  569. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  570. package/lib/testing/stub-ast-document-manager.js +31 -62
  571. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  572. package/lib/testing/stub-document-builder.d.ts +33 -11
  573. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  574. package/lib/testing/stub-document-builder.js +103 -5
  575. package/lib/testing/stub-document-builder.js.map +1 -1
  576. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  577. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  578. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  579. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  580. package/lib/testing/stub-index-manager.js.map +1 -1
  581. package/lib/testing/stub-langium-documents.d.ts +3 -2
  582. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  583. package/lib/testing/stub-langium-documents.js.map +1 -1
  584. package/lib/testing/stub-model-service.d.ts +9 -8
  585. package/lib/testing/stub-model-service.d.ts.map +1 -1
  586. package/lib/testing/stub-model-service.js +6 -6
  587. package/lib/testing/stub-model-service.js.map +1 -1
  588. package/lib/testing/stub-project-manager.js.map +1 -1
  589. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  590. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  591. package/lib/testing/stub-service-registry.d.ts +1 -1
  592. package/lib/testing/stub-service-registry.js.map +1 -1
  593. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  594. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  595. package/lib/testing/stub-writable-file-system.js +2 -1
  596. package/lib/testing/stub-writable-file-system.js.map +1 -1
  597. package/lib/util/connection-liveness.d.ts +22 -6
  598. package/lib/util/connection-liveness.d.ts.map +1 -1
  599. package/lib/util/connection-liveness.js +74 -15
  600. package/lib/util/connection-liveness.js.map +1 -1
  601. package/lib/util/environment.d.ts +7 -0
  602. package/lib/util/environment.d.ts.map +1 -1
  603. package/lib/util/environment.js +15 -1
  604. package/lib/util/environment.js.map +1 -1
  605. package/lib/util/registry.d.ts.map +1 -1
  606. package/package.json +41 -60
  607. package/src/browser/host-heads-in-worker.ts +218 -0
  608. package/src/browser/index.ts +17 -0
  609. package/src/browser/indexeddb-file-system-store.ts +192 -0
  610. package/src/browser/start-language-server-in-worker.ts +56 -0
  611. package/src/documents/ast-document-manager.ts +467 -233
  612. package/src/documents/client-ids.ts +5 -22
  613. package/src/documents/client-session-errors.ts +24 -0
  614. package/src/documents/client-session-registry.ts +262 -0
  615. package/src/documents/dirty-state-tracker.ts +167 -0
  616. package/src/documents/document-release-handler.ts +404 -0
  617. package/src/documents/document-release-scheduler.ts +121 -0
  618. package/src/documents/file-system-task-queue.ts +74 -0
  619. package/src/documents/hydranium-text-documents.ts +1029 -595
  620. package/src/documents/index.ts +10 -2
  621. package/src/documents/language-client-shadow.ts +501 -0
  622. package/src/documents/model-ledger.ts +66 -0
  623. package/src/documents/text-ledger.ts +112 -0
  624. package/src/documents/version-sync-service.ts +275 -0
  625. package/src/index.ts +7 -0
  626. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  627. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  628. package/src/langium/bootstrap.ts +87 -51
  629. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  630. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  631. package/src/langium/composite-ast-reflection.ts +112 -0
  632. package/src/langium/config/configuration-provider.ts +119 -0
  633. package/src/langium/config/index.ts +1 -0
  634. package/src/langium/diagnostics/console-tee.ts +151 -0
  635. package/src/langium/diagnostics/format-log-arg.ts +36 -0
  636. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  637. package/src/langium/diagnostics/log-preamble.ts +1 -1
  638. package/src/langium/diagnostics/logger.ts +51 -17
  639. package/src/langium/diagnostics/lsp-logger.ts +83 -44
  640. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  641. package/src/langium/document-builder/build-session.ts +4 -3
  642. package/src/langium/document-builder/document-builder.ts +554 -79
  643. package/src/langium/integration-services.ts +59 -28
  644. package/src/langium/integrity/integrity-rule.ts +17 -8
  645. package/src/langium/integrity/integrity-service.ts +332 -69
  646. package/src/langium/language-module.ts +49 -8
  647. package/src/langium/model-service/client-session.ts +718 -0
  648. package/src/langium/model-service/index.ts +2 -0
  649. package/src/langium/model-service/model-events.ts +80 -0
  650. package/src/langium/model-service/model-service.ts +878 -494
  651. package/src/langium/module.ts +195 -72
  652. package/src/langium/naming/name-provider.ts +34 -8
  653. package/src/langium/project/abstract-project-manager.ts +13 -5
  654. package/src/langium/project/project-change-event.ts +2 -2
  655. package/src/langium/residency/cst-residency-service.ts +54 -19
  656. package/src/langium/scope/fallback-scope.ts +38 -0
  657. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  658. package/src/langium/scope/hydranium-scope-provider.ts +132 -33
  659. package/src/langium/scope/index.ts +1 -0
  660. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  661. package/src/langium/scope/scope-extension-service.ts +74 -59
  662. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  663. package/src/langium/serialization/abstract-serializer.ts +57 -41
  664. package/src/langium/serialization/json-serializer.ts +14 -3
  665. package/src/langium/serialization/serializer.ts +1 -1
  666. package/src/langium/serialization/yaml-serializer.ts +4 -0
  667. package/src/langium/service-registry.ts +41 -2
  668. package/src/langium/shared-services.ts +16 -7
  669. package/src/langium/single-langium-copy.ts +42 -0
  670. package/src/langium/transfer/transfer-encoder.ts +104 -47
  671. package/src/langium/trivia/comment-preserver.ts +1409 -0
  672. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  673. package/src/langium/trivia/index.ts +14 -0
  674. package/src/langium/trivia/trivia-contribution.ts +39 -0
  675. package/src/langium/trivia/trivia-preserver.ts +56 -0
  676. package/src/langium/trivia/trivia-service.ts +99 -0
  677. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  678. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  679. package/src/langium/validation/document-validator.ts +312 -31
  680. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  681. package/src/langium/workspace/document-uri-policy.ts +32 -18
  682. package/src/langium/workspace/file-not-found.ts +35 -0
  683. package/src/langium/workspace/file-system-provider.ts +258 -16
  684. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  685. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  686. package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
  687. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  688. package/src/langium/workspace/index.ts +1 -0
  689. package/src/langium/workspace/initialize-workspace.ts +96 -4
  690. package/src/langium/workspace/langium-documents.ts +19 -1
  691. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  692. package/src/langium/workspace/self-save-registry.ts +118 -0
  693. package/src/langium/workspace/virtual-document.ts +106 -25
  694. package/src/langium/workspace/write-lock-scope.ts +27 -12
  695. package/src/launcher/integrated-server.ts +3 -1
  696. package/src/locale/server-locale.ts +20 -5
  697. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  698. package/src/lsp/connection-features.ts +67 -0
  699. package/src/lsp/diagnostics-connection.ts +56 -0
  700. package/src/lsp/edit-requests-guard.ts +152 -0
  701. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  702. package/src/lsp/index.ts +6 -2
  703. package/src/lsp/lsp-latency.ts +62 -0
  704. package/src/lsp/save-text-document.ts +63 -0
  705. package/src/lsp/semantic-token-provider.ts +146 -8
  706. package/src/lsp/shared-module.ts +4 -8
  707. package/src/lsp/start-language-server.ts +21 -7
  708. package/src/messages/carriers.ts +4 -6
  709. package/src/messages/index.ts +11 -2
  710. package/src/messages/renderer.ts +34 -6
  711. package/src/node/event-loop-monitor.ts +2 -1
  712. package/src/node/heap-ceiling.ts +108 -0
  713. package/src/node/index.ts +5 -1
  714. package/src/node/latency-from-env.ts +1 -1
  715. package/src/node/log-file-sink.ts +6 -2
  716. package/src/node/log-preamble-node.ts +20 -10
  717. package/src/node/measure-memory.ts +5 -4
  718. package/src/node/memory-monitor.ts +10 -10
  719. package/src/node/node-file-system-provider.ts +214 -57
  720. package/src/node/profile-capture.ts +16 -15
  721. package/src/node/profiling-run.ts +30 -8
  722. package/src/node/rename-over-open-readers.ts +94 -0
  723. package/src/node/server-diagnostics.ts +1 -1
  724. package/src/node/server-state-snapshot.ts +5 -5
  725. package/src/node/socket-launcher.ts +78 -14
  726. package/src/node/startup-cpu-profile.ts +94 -0
  727. package/src/node/stdio-launcher.ts +29 -19
  728. package/src/node/validate-workspace.ts +8 -2
  729. package/src/testing/document-uri-policy-conformance.ts +1 -1
  730. package/src/testing/fake-document.ts +2 -1
  731. package/src/testing/index.ts +2 -1
  732. package/src/testing/langium-test-helpers.ts +1 -0
  733. package/src/testing/make-noop-shared-services.ts +6 -6
  734. package/src/testing/make-test-services.ts +93 -41
  735. package/src/testing/make-test-tracer.ts +26 -0
  736. package/src/testing/node/applied-edit-capture.ts +141 -0
  737. package/src/testing/node/index.ts +1 -0
  738. package/src/testing/node/lsp-harness.ts +2 -0
  739. package/src/testing/node/lsp-server-connection.ts +83 -119
  740. package/src/testing/node/scratch-workspace.ts +10 -5
  741. package/src/testing/node/spawned-server.ts +57 -3
  742. package/src/testing/node/unhandled-rejections.ts +31 -0
  743. package/src/testing/parse-semantic-root.ts +1 -1
  744. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  745. package/src/testing/playwright/index.ts +1 -0
  746. package/src/testing/playwright/server-log-capture.ts +137 -47
  747. package/src/testing/playwright/server-log-fixture.ts +46 -6
  748. package/src/testing/playwright/server-log-region.ts +32 -0
  749. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  750. package/src/testing/run-update-pipeline.ts +8 -5
  751. package/src/testing/stub-ast-document-manager.ts +47 -128
  752. package/src/testing/stub-document-builder.ts +133 -18
  753. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  754. package/src/testing/stub-langium-documents.ts +3 -2
  755. package/src/testing/stub-model-service.ts +11 -10
  756. package/src/testing/stub-self-save-registry.ts +1 -1
  757. package/src/testing/stub-service-registry.ts +1 -1
  758. package/src/testing/stub-writable-file-system.ts +3 -2
  759. package/src/util/connection-liveness.ts +80 -15
  760. package/src/util/environment.ts +24 -2
  761. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  762. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  763. package/lib/documents/language-client-text-shadow.js +0 -156
  764. package/lib/documents/language-client-text-shadow.js.map +0 -1
  765. package/lib/documents/self-save-registry.d.ts +0 -55
  766. package/lib/documents/self-save-registry.d.ts.map +0 -1
  767. package/lib/documents/self-save-registry.js.map +0 -1
  768. package/lib/lsp/instrument-connection.d.ts +0 -36
  769. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  770. package/lib/lsp/instrument-connection.js +0 -62
  771. package/lib/lsp/instrument-connection.js.map +0 -1
  772. package/lib/node/process-memory.d.ts +0 -66
  773. package/lib/node/process-memory.d.ts.map +0 -1
  774. package/lib/node/process-memory.js +0 -252
  775. package/lib/node/process-memory.js.map +0 -1
  776. package/src/documents/language-client-text-shadow.ts +0 -175
  777. package/src/documents/self-save-registry.ts +0 -81
  778. package/src/lsp/instrument-connection.ts +0 -66
  779. 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,12 +188,15 @@ 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
- * `$refNode` are nulled, and the CST root, `Range`s and `Position`s become
189
- * unreachable and are collected.
197
+ * `$refNode` are nulled, and the CST becomes unreachable with the `Range`s
198
+ * and `Position`s only it holds. A description's segments and the reference
199
+ * index's segments share the CST's `Range` objects, so those stay.
190
200
  *
191
201
  * **Terminology.** *Residency* is the state axis (is the CST in memory? —
192
202
  * `resident` vs `shed`); *shed* is both the act and the policy vocabulary (drop
@@ -227,7 +237,23 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
227
237
  * `NameProvider.getNameNode` chokepoint, the comment provider, and
228
238
  * `HydraniumLangiumDocuments.getOrCreateDocument`.
229
239
  */
230
- export class CstResidencyService {
240
+ export interface CstResidencyService {
241
+ /**
242
+ * Ensure `document` has a CST, re-parsing its retained text if it was shed.
243
+ * A resident document is left exactly as it is, so this is safe to call on
244
+ * a hot path and safe to call twice.
245
+ */
246
+ rehydrate(document: LangiumDocument): void;
247
+
248
+ /**
249
+ * Node-level convenience over {@link rehydrate}, cheap enough for an
250
+ * unconditional call: a node whose `$cstNode` is already set returns
251
+ * without resolving its document.
252
+ */
253
+ rehydrateNode(node: AstNode): void;
254
+ }
255
+
256
+ export class DefaultCstResidencyService implements CstResidencyService {
231
257
  protected readonly strategy: CstResidencyStrategy;
232
258
  /** Bytes-per-node for the optional reclaim estimate in traces; `0` disables it. */
233
259
  protected readonly estimatedBytesPerShedNode: number;
@@ -257,7 +283,7 @@ export class CstResidencyService {
257
283
  this.langiumDocs = services.workspace.LangiumDocuments;
258
284
  services.workspace.BuildPhasePassService.register({
259
285
  id: 'framework:cst-residency:shed',
260
- state: DocumentState.Validated,
286
+ phase: DocumentState.Validated,
261
287
  priority: options.priority ?? CST_RESIDENCY_PASS_PRIORITY,
262
288
  run: documents => this.onBuild(documents)
263
289
  });
@@ -277,8 +303,8 @@ export class CstResidencyService {
277
303
  * until navigation latency on shed files is actually observed to hurt. This
278
304
  * method is where that hook goes.
279
305
  */
280
- rehydrate(document: LangiumDocument): boolean {
281
- return rehydrateCst(document, this.services.workspace.LangiumDocumentFactory);
306
+ rehydrate(document: LangiumDocument): void {
307
+ rehydrateCst(document, this.services.workspace.LangiumDocumentFactory);
282
308
  }
283
309
 
284
310
  /**
@@ -287,11 +313,11 @@ export class CstResidencyService {
287
313
  * `true` without even resolving the document, so hot read paths
288
314
  * (`getNameNode`, comment lookup) call this unconditionally.
289
315
  */
290
- rehydrateNode(node: AstNode): boolean {
316
+ rehydrateNode(node: AstNode): void {
291
317
  if (node.$cstNode !== undefined) {
292
- return true;
318
+ return;
293
319
  }
294
- return this.rehydrate(AstUtils.getDocument(node));
320
+ this.rehydrate(AstUtils.getDocument(node));
295
321
  }
296
322
 
297
323
  /**
@@ -353,8 +379,8 @@ export class CstResidencyService {
353
379
  this.shedTotal += this.shed(document);
354
380
  }
355
381
 
356
- /** Cancel and drop every idle timer — for clean shutdown and deterministic tests. */
357
- dispose(): void {
382
+ /** Cancel every armed shed, so a document that has gone idle keeps its CST. */
383
+ cancelPendingShed(): void {
358
384
  for (const timer of this.idleTimers.values()) {
359
385
  timer.dispose();
360
386
  }
@@ -383,6 +409,15 @@ export class CstResidencyService {
383
409
  if (root === undefined || root.$cstNode === undefined) {
384
410
  return 0;
385
411
  }
412
+ // Readers of the parsed text, the `'text-diagnostics'` fingerprint among
413
+ // them, otherwise see none once the CST is gone. Recorded in the ledger
414
+ // directly: no root is produced, and reconciling it with the store would
415
+ // step a closed document's sequence for a root behind its text.
416
+ const ledger = this.services.workspace.ModelLedger;
417
+ const version = ledger.versionOf(root);
418
+ if (version !== UNRECORDED_VERSION) {
419
+ ledger.record(root, version, ledger.textOf(root));
420
+ }
386
421
  let cleared = 0;
387
422
  for (const node of AstUtils.streamAst(root)) {
388
423
  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
  }
@@ -24,7 +24,9 @@ import {
24
24
  type AstNodeLocator,
25
25
  AstUtils,
26
26
  DefaultScopeProvider,
27
+ type LocalSymbols,
27
28
  MapScope,
29
+ MultiMapScope,
28
30
  type ReferenceInfo,
29
31
  type Scope,
30
32
  type ScopeOptions,
@@ -39,8 +41,9 @@ import { type LogNameOptions } from '../diagnostics/logger.js';
39
41
  import { type HydraniumLanguageServices } from '../language-module.js';
40
42
  import { type NameProvider } from '../naming/name-provider.js';
41
43
  import { type HydraniumDocumentRegistry } from '../workspace/langium-documents.js';
44
+ import { FallbackScope } from './fallback-scope.js';
42
45
  import { type ScopeExtensionService } from './scope-extension-service.js';
43
- import { isTieredDescription } from './scoped-ast-node-description.js';
46
+ import { type TieredAstNodeDescription, isTieredDescription } from './scoped-ast-node-description.js';
44
47
 
45
48
  /**
46
49
  * Construction-time options for {@link HydraniumScopeProvider}. Extends
@@ -103,16 +106,16 @@ export interface ScopeContext {
103
106
  * ## Scope chain (high → low, inner shadows outer)
104
107
  *
105
108
  * ```
106
- * document-local (Langium precomputed) [DefaultScopeProvider.getScope]
109
+ * document-local (Langium precomputed) [getScope, CACHED per build in localScope]
107
110
  * extension:local [layerLocalExtension, per-context]
108
111
  * own-project → dependency → universal-index [createGlobalScope default, CACHED per ${project}::${refType}]
109
112
  * extension:universal [layerUniversalExtension, per-context, outermost]
110
113
  * ```
111
114
  *
112
- * Implementation: Langium's `getScope` layers document-local on top of
113
- * whatever `getGlobalScope` returns. The framework owns `getGlobalScope`
114
- * and uses it to assemble everything *below* document-local, with the
115
- * adopter-overridable {@link createGlobalScope} in the middle.
115
+ * Implementation: {@link getScope} layers document-local on top of
116
+ * whatever `getGlobalScope` returns, as Langium's does. The framework owns
117
+ * `getGlobalScope` and uses it to assemble everything *below* document-local,
118
+ * with the adopter-overridable {@link createGlobalScope} in the middle.
116
119
  *
117
120
  * ## Adopter override surface
118
121
  *
@@ -161,6 +164,12 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
161
164
  * the workspace-global `DocumentBuilder.onUpdate`.
162
165
  */
163
166
  protected readonly scopeCache: WorkspaceCache<string, Scope>;
167
+ /**
168
+ * Each container's local scope per reference type, keyed by the local
169
+ * symbols it was built from. A build replaces a document's local symbols
170
+ * when it recomputes them, so a rebuilt document never reads a stale entry.
171
+ */
172
+ protected readonly localScopes = new WeakMap<LocalSymbols, Map<AstNode, Map<string, Scope>>>();
164
173
  protected readonly tracer: Tracer;
165
174
  /**
166
175
  * Narrows the inherited Langium {@link NameProvider} field to the framework's
@@ -183,19 +192,98 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
183
192
  this.tracer = services.shared.Tracer.for(options.logName ?? 'ScopeProvider').trace('instantiated');
184
193
  }
185
194
 
195
+ /**
196
+ * Drop every cached scope — the framework's project-tier chain and the
197
+ * inherited global scope it is filtered from.
198
+ *
199
+ * **Called from outside the class**, by the build pipeline once the batch is
200
+ * re-indexed. The caches' own eviction does not cover this:
201
+ * `DocumentBuilder.onUpdate` fires after the build has taken every changed
202
+ * document's symbols out of the index and before it puts them back, so a
203
+ * scope built in that gap denies those symbols exist and every document the
204
+ * same build links afterwards resolves against it.
205
+ *
206
+ * Both go together because the second is derived from the first: clearing
207
+ * only {@link scopeCache} refills it from a stale `globalScopeCache`, and
208
+ * clearing only `globalScopeCache` leaves the filtered copy standing.
209
+ */
210
+ clearScopeCaches(): void {
211
+ this.scopeCache.clear();
212
+ this.globalScopeCache.clear();
213
+ }
214
+
215
+ /**
216
+ * Langium's, with each container's local scope built once per build through
217
+ * {@link localScope} rather than once per reference. Linking a document then
218
+ * costs its references plus its declarations, not their product.
219
+ */
220
+ override getScope(context: ReferenceInfo): Scope {
221
+ const referenceType = this.reflection.getReferenceType(context);
222
+ const localSymbols = AstUtils.getDocument(context.container).localSymbols;
223
+ let result = this.getGlobalScope(referenceType, context);
224
+ if (localSymbols === undefined) {
225
+ return result;
226
+ }
227
+ const containers: AstNode[] = [];
228
+ for (let container: AstNode | undefined = context.container; container; container = container.$container) {
229
+ if (localSymbols.has(container)) {
230
+ containers.push(container);
231
+ }
232
+ }
233
+ // Outermost first, so the innermost container's symbols shadow the rest.
234
+ for (let i = containers.length - 1; i >= 0; i--) {
235
+ result = new FallbackScope(this.localScope(localSymbols, containers[i], referenceType), result);
236
+ }
237
+ return result;
238
+ }
239
+
240
+ /**
241
+ * The symbols `container` declares that a `referenceType` reference can
242
+ * reach, through {@link createScope}, built once per `localSymbols`.
243
+ */
244
+ protected localScope(localSymbols: LocalSymbols, container: AstNode, referenceType: string): Scope {
245
+ let byContainer = this.localScopes.get(localSymbols);
246
+ if (byContainer === undefined) {
247
+ byContainer = new Map();
248
+ this.localScopes.set(localSymbols, byContainer);
249
+ }
250
+ let byType = byContainer.get(container);
251
+ if (byType === undefined) {
252
+ byType = new Map();
253
+ byContainer.set(container, byType);
254
+ }
255
+ let scope = byType.get(referenceType);
256
+ if (scope === undefined) {
257
+ scope = this.createScope(
258
+ localSymbols.getStream(container).filter(description => this.reflection.isSubtype(description.type, referenceType))
259
+ );
260
+ byType.set(referenceType, scope);
261
+ }
262
+ return scope;
263
+ }
264
+
265
+ /**
266
+ * Keyed by name, where Langium's walks every element on each lookup. Every
267
+ * description of a name is kept and the first answers, as in Langium's;
268
+ * `getAllElements` lists them grouped by name.
269
+ */
270
+ protected override createScope(elements: Iterable<AstNodeDescription>, outerScope?: Scope, options?: ScopeOptions): Scope {
271
+ return new MultiMapScope(elements, outerScope, options);
272
+ }
273
+
186
274
  /**
187
275
  * Framework-owned assembly seam. **Adopters do NOT override this** —
188
276
  * override {@link createGlobalScope} instead. This method layers the
189
277
  * scope-extension tiers around the adopter-overridable global scope.
190
278
  *
191
- * Langium's `DefaultScopeProvider.getScope` then layers document-local
192
- * on top of this result, yielding the full chain documented on the
193
- * class.
279
+ * {@link getScope} then layers document-local on top of this result,
280
+ * yielding the full chain documented on the class.
194
281
  */
195
282
  protected override getGlobalScope(referenceType: string, context: ReferenceInfo): Scope {
196
283
  const projectChain = this.createGlobalScope(referenceType, context);
197
- const withUniversal = this.layerUniversalExtension(referenceType, context, projectChain);
198
- return this.layerLocalExtension(referenceType, context, withUniversal);
284
+ const extensions = this.scopeExtensionService.getDescriptions(referenceType, context.container);
285
+ const withUniversal = this.layerUniversalExtension(extensions.universal, projectChain, referenceType, context);
286
+ return this.layerLocalExtension(extensions.local, withUniversal, referenceType, context);
199
287
  }
200
288
 
201
289
  /**
@@ -230,22 +318,32 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
230
318
  }
231
319
 
232
320
  /**
233
- * Layer scope-extension `local`-tier descriptions on top of `inner`.
234
- * Returns `inner` unchanged when no extension contributes for the
235
- * reference type (zero-cost common path).
321
+ * Layer the scope extensions' `local`-tier `descriptions` on top of
322
+ * `inner`, through {@link createScope}. Returns `inner` unchanged when there
323
+ * are none.
236
324
  */
237
- protected layerLocalExtension(referenceType: string, context: ReferenceInfo, inner: Scope): Scope {
238
- return this.scopeExtensionService.getLocalExtensionScope(referenceType, context.container, inner);
325
+ protected layerLocalExtension(
326
+ descriptions: readonly TieredAstNodeDescription[],
327
+ inner: Scope,
328
+ _referenceType: string,
329
+ _context: ReferenceInfo
330
+ ): Scope {
331
+ return descriptions.length === 0 ? inner : this.createScope(descriptions, inner);
239
332
  }
240
333
 
241
334
  /**
242
- * Layer scope-extension `universal`-tier descriptions BELOW `inner`
243
- * (extensions appear last in the chain, shadowed by inner). Returns
244
- * `inner` unchanged when no extension contributes for the reference
245
- * type.
335
+ * Layer the scope extensions' `universal`-tier `descriptions` below
336
+ * `inner`, which shadows them, through {@link createScope} and a
337
+ * {@link FallbackScope}, so `inner` keeps its own lookup. Returns `inner`
338
+ * unchanged when there are none.
246
339
  */
247
- protected layerUniversalExtension(referenceType: string, context: ReferenceInfo, inner: Scope): Scope {
248
- return this.scopeExtensionService.getUniversalExtensionScope(referenceType, context.container, inner);
340
+ protected layerUniversalExtension(
341
+ descriptions: readonly TieredAstNodeDescription[],
342
+ inner: Scope,
343
+ _referenceType: string,
344
+ _context: ReferenceInfo
345
+ ): Scope {
346
+ return descriptions.length === 0 ? inner : new FallbackScope(inner, this.createScope(descriptions));
249
347
  }
250
348
 
251
349
  /**
@@ -286,7 +384,7 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
286
384
  * closure).
287
385
  *
288
386
  * Contrast {@link getGlobalScope}, which applies the framework's
289
- * tier filter to this set, and `getScope` (Langium default), which
387
+ * tier filter to this set, and {@link getScope}, which
290
388
  * additionally merges in the local scope.
291
389
  */
292
390
  protected getAllElementsGlobalScope(referenceType: string, context: ReferenceInfo): Scope {
@@ -344,11 +442,11 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
344
442
  * Includes own-project `'public'`-tier descriptions when
345
443
  * {@link HydraniumScopeProviderOptions.includeOwnProjectPublic} is set
346
444
  * (routed to the own-project bucket by {@link bucketFor}). Returns a
347
- * {@link StreamScope} (not {@link MapScope}) so same-name siblings are
445
+ * {@link MultiMapScope} (not {@link MapScope}) so same-name siblings are
348
446
  * preserved rather than collapsed.
349
447
  */
350
448
  protected createOwnProjectScope(context: ScopeContext): Scope {
351
- return new StreamScope(stream(context.ownProjectEntries));
449
+ return new MultiMapScope(context.ownProjectEntries);
352
450
  }
353
451
 
354
452
  /**
@@ -357,7 +455,7 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
357
455
  * (own-project canonical filter applied by {@link bucketFor}).
358
456
  */
359
457
  protected createDependencyScope(context: ScopeContext): Scope {
360
- return new StreamScope(stream(context.dependencyEntries));
458
+ return new MultiMapScope(context.dependencyEntries);
361
459
  }
362
460
 
363
461
  /**
@@ -369,13 +467,13 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
369
467
  }
370
468
 
371
469
  /**
372
- * Chain three tier sub-scopes inner-first. The `outerScope` argument
373
- * of {@link StreamScope} is consulted only when the inner stream has
374
- * no match, so a more specific tier shadows a less specific one of
375
- * the same name.
470
+ * Chain three tier sub-scopes inner-first through {@link FallbackScope},
471
+ * which consults an outer tier only when the inner one has no match, so a
472
+ * more specific tier shadows a less specific one of the same name, and each
473
+ * tier keeps its own lookup.
376
474
  */
377
475
  protected chainScopes(ownScope: Scope, dependencyScope: Scope, universalScope: Scope): Scope {
378
- return new StreamScope(ownScope.getAllElements(), new StreamScope(dependencyScope.getAllElements(), universalScope));
476
+ return new FallbackScope(ownScope, new FallbackScope(dependencyScope, universalScope));
379
477
  }
380
478
 
381
479
  /**
@@ -443,8 +541,9 @@ export class HydraniumScopeProvider extends DefaultScopeProvider {
443
541
 
444
542
  /**
445
543
  * Keys the scope by {@link NameProvider.getOwnName} instead of Langium's
446
- * `getName`. Same correction `HydraniumScopeComputation.addLocalSymbol`
447
- * makes to the local-symbols pass, for the same reason: `getName` defaults
544
+ * `getName`. Same correction
545
+ * `HydraniumScopeComputation.addLocalSymbolByOwnName` makes to the
546
+ * local-symbols pass, for the same reason: `getName` defaults
448
547
  * to the project-qualified form here, so the base would key a member scope
449
548
  * by the fully qualified `Container.member` while the reference text after
450
549
  * the dot is the bare `member` — and nothing reports the mismatch, because
@@ -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';