@hydranium/core 1.0.0-next.36 → 1.0.0-next.360

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 (794) 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 +266 -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 +141 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  116. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  117. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  118. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  119. package/lib/langium/diagnostics/log-preamble.js +1 -1
  120. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  121. package/lib/langium/diagnostics/logger.d.ts +25 -6
  122. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  123. package/lib/langium/diagnostics/logger.js +49 -17
  124. package/lib/langium/diagnostics/logger.js.map +1 -1
  125. package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
  126. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/lsp-logger.js +81 -46
  128. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  129. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  130. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  131. package/lib/langium/document-builder/build-pipeline-integration.d.ts +34 -2
  132. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  133. package/lib/langium/document-builder/build-pipeline-integration.js +44 -31
  134. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  135. package/lib/langium/document-builder/build-session.d.ts +6 -5
  136. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-session.js +5 -5
  138. package/lib/langium/document-builder/build-session.js.map +1 -1
  139. package/lib/langium/document-builder/document-builder.d.ts +310 -41
  140. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  141. package/lib/langium/document-builder/document-builder.js +490 -79
  142. package/lib/langium/document-builder/document-builder.js.map +1 -1
  143. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  144. package/lib/langium/documentation/comment-provider.js.map +1 -1
  145. package/lib/langium/integration-services.d.ts +40 -24
  146. package/lib/langium/integration-services.d.ts.map +1 -1
  147. package/lib/langium/integration-services.js +7 -4
  148. package/lib/langium/integration-services.js.map +1 -1
  149. package/lib/langium/integrity/integrity-rule.d.ts +17 -8
  150. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  151. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  152. package/lib/langium/integrity/integrity-service.d.ts +95 -27
  153. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  154. package/lib/langium/integrity/integrity-service.js +303 -63
  155. package/lib/langium/integrity/integrity-service.js.map +1 -1
  156. package/lib/langium/keys/containment.d.ts +3 -2
  157. package/lib/langium/keys/containment.d.ts.map +1 -1
  158. package/lib/langium/keys/containment.js.map +1 -1
  159. package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js +24 -12
  162. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  164. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  165. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  166. package/lib/langium/labeling/label-provider.js.map +1 -1
  167. package/lib/langium/language-module.d.ts +30 -5
  168. package/lib/langium/language-module.d.ts.map +1 -1
  169. package/lib/langium/language-module.js +21 -5
  170. package/lib/langium/language-module.js.map +1 -1
  171. package/lib/langium/model-service/client-session.d.ts +383 -0
  172. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  173. package/lib/langium/model-service/client-session.js +455 -0
  174. package/lib/langium/model-service/client-session.js.map +1 -0
  175. package/lib/langium/model-service/index.d.ts +2 -0
  176. package/lib/langium/model-service/index.d.ts.map +1 -1
  177. package/lib/langium/model-service/index.js +2 -0
  178. package/lib/langium/model-service/index.js.map +1 -1
  179. package/lib/langium/model-service/model-events.d.ts +66 -0
  180. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  181. package/lib/langium/model-service/model-events.js +10 -0
  182. package/lib/langium/model-service/model-events.js.map +1 -0
  183. package/lib/langium/model-service/model-service.d.ts +476 -300
  184. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  185. package/lib/langium/model-service/model-service.js +602 -466
  186. package/lib/langium/model-service/model-service.js.map +1 -1
  187. package/lib/langium/module.d.ts +141 -40
  188. package/lib/langium/module.d.ts.map +1 -1
  189. package/lib/langium/module.js +52 -40
  190. package/lib/langium/module.js.map +1 -1
  191. package/lib/langium/naming/name-provider.d.ts +32 -7
  192. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  193. package/lib/langium/naming/name-provider.js +10 -4
  194. package/lib/langium/naming/name-provider.js.map +1 -1
  195. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  197. package/lib/langium/project/abstract-project-manager.js +13 -6
  198. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  199. package/lib/langium/project/project-change-event.d.ts +2 -2
  200. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  201. package/lib/langium/project/single-project-manager.js.map +1 -1
  202. package/lib/langium/residency/cst-residency-service.d.ts +40 -14
  203. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  204. package/lib/langium/residency/cst-residency-service.js +27 -58
  205. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  206. package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
  207. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  208. package/lib/langium/scope/ast-node-description-provider.js +88 -15
  209. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  210. package/lib/langium/scope/built-local-symbols.d.ts +12 -0
  211. package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
  212. package/lib/langium/scope/built-local-symbols.js +11 -0
  213. package/lib/langium/scope/built-local-symbols.js.map +1 -0
  214. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  215. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  216. package/lib/langium/scope/fallback-scope.js +35 -0
  217. package/lib/langium/scope/fallback-scope.js.map +1 -0
  218. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  219. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  220. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  221. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  222. package/lib/langium/scope/hydranium-scope-provider.d.ts +122 -32
  223. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  224. package/lib/langium/scope/hydranium-scope-provider.js +217 -39
  225. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  226. package/lib/langium/scope/index.d.ts +1 -0
  227. package/lib/langium/scope/index.d.ts.map +1 -1
  228. package/lib/langium/scope/index.js +1 -0
  229. package/lib/langium/scope/index.js.map +1 -1
  230. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  231. package/lib/langium/scope/reference-builder.js.map +1 -1
  232. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  233. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  234. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  235. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  236. package/lib/langium/scope/scope-extension-service.d.ts +69 -37
  237. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  238. package/lib/langium/scope/scope-extension-service.js +102 -29
  239. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  240. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  241. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  242. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  243. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  244. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  245. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  246. package/lib/langium/serialization/abstract-serializer.js +54 -30
  247. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  248. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  249. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  250. package/lib/langium/serialization/json-serializer.js +13 -3
  251. package/lib/langium/serialization/json-serializer.js.map +1 -1
  252. package/lib/langium/serialization/serializer.d.ts +1 -1
  253. package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
  254. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  255. package/lib/langium/serialization/yaml-serializer.js +24 -4
  256. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  257. package/lib/langium/service-registry.d.ts +29 -1
  258. package/lib/langium/service-registry.d.ts.map +1 -1
  259. package/lib/langium/service-registry.js +37 -0
  260. package/lib/langium/service-registry.js.map +1 -1
  261. package/lib/langium/shared-services.d.ts +13 -7
  262. package/lib/langium/shared-services.d.ts.map +1 -1
  263. package/lib/langium/shared-services.js.map +1 -1
  264. package/lib/langium/single-langium-copy.d.ts +22 -0
  265. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  266. package/lib/langium/single-langium-copy.js +36 -0
  267. package/lib/langium/single-langium-copy.js.map +1 -0
  268. package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
  269. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  270. package/lib/langium/transfer/transfer-encoder.js +36 -25
  271. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  272. package/lib/langium/trivia/comment-preserver.d.ts +543 -0
  273. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  274. package/lib/langium/trivia/comment-preserver.js +1164 -0
  275. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  276. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  277. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  278. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  279. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  280. package/lib/langium/trivia/index.d.ts +14 -0
  281. package/lib/langium/trivia/index.d.ts.map +1 -0
  282. package/lib/langium/trivia/index.js +14 -0
  283. package/lib/langium/trivia/index.js.map +1 -0
  284. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  285. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  286. package/lib/langium/trivia/trivia-contribution.js +10 -0
  287. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  288. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  289. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  290. package/lib/langium/trivia/trivia-preserver.js +10 -0
  291. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  292. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  293. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  294. package/lib/langium/trivia/trivia-service.js +56 -0
  295. package/lib/langium/trivia/trivia-service.js.map +1 -0
  296. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  297. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  298. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  299. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  300. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  301. package/lib/langium/validation/document-validator.d.ts +168 -23
  302. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  303. package/lib/langium/validation/document-validator.js +264 -26
  304. package/lib/langium/validation/document-validator.js.map +1 -1
  305. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  306. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  307. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  308. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  309. package/lib/langium/workspace/ast-node-locator.d.ts +24 -0
  310. package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
  311. package/lib/langium/workspace/ast-node-locator.js +32 -0
  312. package/lib/langium/workspace/ast-node-locator.js.map +1 -0
  313. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  314. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  315. package/lib/langium/workspace/document-uri-policy.js +22 -13
  316. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  317. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  318. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  319. package/lib/langium/workspace/file-not-found.js +31 -0
  320. package/lib/langium/workspace/file-not-found.js.map +1 -0
  321. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  322. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  323. package/lib/langium/workspace/file-system-provider.js +115 -13
  324. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  325. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  326. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  327. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  328. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  329. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  330. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  331. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  332. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  333. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
  334. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  335. package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
  336. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  337. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  338. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  339. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  340. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  341. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  342. package/lib/langium/workspace/index-manager.js.map +1 -1
  343. package/lib/langium/workspace/index.d.ts +2 -0
  344. package/lib/langium/workspace/index.d.ts.map +1 -1
  345. package/lib/langium/workspace/index.js +2 -0
  346. package/lib/langium/workspace/index.js.map +1 -1
  347. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  348. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  349. package/lib/langium/workspace/initialize-workspace.js +68 -3
  350. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  351. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  352. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  353. package/lib/langium/workspace/langium-documents.js +18 -1
  354. package/lib/langium/workspace/langium-documents.js.map +1 -1
  355. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  356. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  357. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  358. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  359. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  360. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  361. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  362. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  363. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  364. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  365. package/lib/langium/workspace/virtual-document.js +87 -24
  366. package/lib/langium/workspace/virtual-document.js.map +1 -1
  367. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  368. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  369. package/lib/langium/workspace/write-lock-scope.js +15 -5
  370. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  371. package/lib/launcher/integrated-server.d.ts +3 -1
  372. package/lib/launcher/integrated-server.d.ts.map +1 -1
  373. package/lib/locale/server-locale.d.ts +19 -5
  374. package/lib/locale/server-locale.d.ts.map +1 -1
  375. package/lib/locale/server-locale.js +1 -1
  376. package/lib/locale/server-locale.js.map +1 -1
  377. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  378. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  379. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  380. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  381. package/lib/lsp/connection-features.d.ts +23 -0
  382. package/lib/lsp/connection-features.d.ts.map +1 -0
  383. package/lib/lsp/connection-features.js +60 -0
  384. package/lib/lsp/connection-features.js.map +1 -0
  385. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  386. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  387. package/lib/lsp/diagnostics-connection.js +53 -0
  388. package/lib/lsp/diagnostics-connection.js.map +1 -0
  389. package/lib/lsp/edit-requests-guard.d.ts +31 -0
  390. package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
  391. package/lib/lsp/edit-requests-guard.js +125 -0
  392. package/lib/lsp/edit-requests-guard.js.map +1 -0
  393. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  394. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  395. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  396. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  397. package/lib/lsp/index.d.ts +6 -2
  398. package/lib/lsp/index.d.ts.map +1 -1
  399. package/lib/lsp/index.js +6 -2
  400. package/lib/lsp/index.js.map +1 -1
  401. package/lib/lsp/lsp-latency.d.ts +39 -0
  402. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  403. package/lib/lsp/lsp-latency.js +58 -0
  404. package/lib/lsp/lsp-latency.js.map +1 -0
  405. package/lib/lsp/save-text-document.d.ts +31 -0
  406. package/lib/lsp/save-text-document.d.ts.map +1 -0
  407. package/lib/lsp/save-text-document.js +52 -0
  408. package/lib/lsp/save-text-document.js.map +1 -0
  409. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  410. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  411. package/lib/lsp/semantic-token-provider.js +98 -9
  412. package/lib/lsp/semantic-token-provider.js.map +1 -1
  413. package/lib/lsp/shared-module.d.ts +4 -8
  414. package/lib/lsp/shared-module.d.ts.map +1 -1
  415. package/lib/lsp/shared-module.js.map +1 -1
  416. package/lib/lsp/start-language-server.d.ts +12 -7
  417. package/lib/lsp/start-language-server.d.ts.map +1 -1
  418. package/lib/lsp/start-language-server.js +21 -7
  419. package/lib/lsp/start-language-server.js.map +1 -1
  420. package/lib/messages/carriers.d.ts +4 -6
  421. package/lib/messages/carriers.d.ts.map +1 -1
  422. package/lib/messages/carriers.js +4 -6
  423. package/lib/messages/carriers.js.map +1 -1
  424. package/lib/messages/index.d.ts +2 -2
  425. package/lib/messages/index.d.ts.map +1 -1
  426. package/lib/messages/index.js +2 -2
  427. package/lib/messages/index.js.map +1 -1
  428. package/lib/messages/renderer.d.ts +32 -7
  429. package/lib/messages/renderer.d.ts.map +1 -1
  430. package/lib/messages/renderer.js +7 -1
  431. package/lib/messages/renderer.js.map +1 -1
  432. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  433. package/lib/node/event-loop-monitor.js +2 -1
  434. package/lib/node/event-loop-monitor.js.map +1 -1
  435. package/lib/node/heap-ceiling.d.ts +61 -0
  436. package/lib/node/heap-ceiling.d.ts.map +1 -0
  437. package/lib/node/heap-ceiling.js +72 -0
  438. package/lib/node/heap-ceiling.js.map +1 -0
  439. package/lib/node/index.d.ts +1 -1
  440. package/lib/node/index.d.ts.map +1 -1
  441. package/lib/node/index.js +5 -1
  442. package/lib/node/index.js.map +1 -1
  443. package/lib/node/latency-from-env.d.ts +1 -1
  444. package/lib/node/latency-from-env.js +1 -1
  445. package/lib/node/lint-grammar.js.map +1 -1
  446. package/lib/node/log-file-sink.d.ts +3 -2
  447. package/lib/node/log-file-sink.d.ts.map +1 -1
  448. package/lib/node/log-file-sink.js +6 -2
  449. package/lib/node/log-file-sink.js.map +1 -1
  450. package/lib/node/log-preamble-node.d.ts +5 -3
  451. package/lib/node/log-preamble-node.d.ts.map +1 -1
  452. package/lib/node/log-preamble-node.js +13 -10
  453. package/lib/node/log-preamble-node.js.map +1 -1
  454. package/lib/node/measure-memory.d.ts.map +1 -1
  455. package/lib/node/measure-memory.js +5 -4
  456. package/lib/node/measure-memory.js.map +1 -1
  457. package/lib/node/memory-monitor.d.ts +2 -2
  458. package/lib/node/memory-monitor.d.ts.map +1 -1
  459. package/lib/node/memory-monitor.js +9 -10
  460. package/lib/node/memory-monitor.js.map +1 -1
  461. package/lib/node/node-file-system-provider.d.ts +67 -9
  462. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  463. package/lib/node/node-file-system-provider.js +198 -53
  464. package/lib/node/node-file-system-provider.js.map +1 -1
  465. package/lib/node/profile-capture.d.ts +12 -4
  466. package/lib/node/profile-capture.d.ts.map +1 -1
  467. package/lib/node/profile-capture.js +8 -6
  468. package/lib/node/profile-capture.js.map +1 -1
  469. package/lib/node/profile-digest.js.map +1 -1
  470. package/lib/node/profiling-run.d.ts +13 -3
  471. package/lib/node/profiling-run.d.ts.map +1 -1
  472. package/lib/node/profiling-run.js +17 -8
  473. package/lib/node/profiling-run.js.map +1 -1
  474. package/lib/node/rename-over-open-readers.d.ts +61 -0
  475. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  476. package/lib/node/rename-over-open-readers.js +80 -0
  477. package/lib/node/rename-over-open-readers.js.map +1 -0
  478. package/lib/node/server-diagnostics.js +1 -1
  479. package/lib/node/server-diagnostics.js.map +1 -1
  480. package/lib/node/server-state-snapshot.js +4 -4
  481. package/lib/node/server-state-snapshot.js.map +1 -1
  482. package/lib/node/socket-launcher.d.ts +43 -7
  483. package/lib/node/socket-launcher.d.ts.map +1 -1
  484. package/lib/node/socket-launcher.js +42 -7
  485. package/lib/node/socket-launcher.js.map +1 -1
  486. package/lib/node/startup-cpu-profile.d.ts +29 -0
  487. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  488. package/lib/node/startup-cpu-profile.js +91 -0
  489. package/lib/node/startup-cpu-profile.js.map +1 -0
  490. package/lib/node/stdio-launcher.d.ts +13 -13
  491. package/lib/node/stdio-launcher.d.ts.map +1 -1
  492. package/lib/node/stdio-launcher.js +21 -11
  493. package/lib/node/stdio-launcher.js.map +1 -1
  494. package/lib/node/validate-workspace.d.ts +1 -1
  495. package/lib/node/validate-workspace.d.ts.map +1 -1
  496. package/lib/node/validate-workspace.js +5 -1
  497. package/lib/node/validate-workspace.js.map +1 -1
  498. package/lib/testing/document-uri-policy-conformance.js +1 -1
  499. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  500. package/lib/testing/fake-description.js.map +1 -1
  501. package/lib/testing/fake-document.d.ts +2 -1
  502. package/lib/testing/fake-document.d.ts.map +1 -1
  503. package/lib/testing/fake-document.js.map +1 -1
  504. package/lib/testing/index.d.ts +1 -1
  505. package/lib/testing/index.d.ts.map +1 -1
  506. package/lib/testing/index.js +2 -1
  507. package/lib/testing/index.js.map +1 -1
  508. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  509. package/lib/testing/langium-test-helpers.js +1 -0
  510. package/lib/testing/langium-test-helpers.js.map +1 -1
  511. package/lib/testing/make-noop-language-services.js.map +1 -1
  512. package/lib/testing/make-noop-shared-services.d.ts +4 -4
  513. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  514. package/lib/testing/make-noop-shared-services.js +4 -4
  515. package/lib/testing/make-noop-shared-services.js.map +1 -1
  516. package/lib/testing/make-test-services.d.ts +51 -20
  517. package/lib/testing/make-test-services.d.ts.map +1 -1
  518. package/lib/testing/make-test-services.js +29 -13
  519. package/lib/testing/make-test-services.js.map +1 -1
  520. package/lib/testing/make-test-tracer.d.ts +12 -0
  521. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  522. package/lib/testing/make-test-tracer.js +13 -0
  523. package/lib/testing/make-test-tracer.js.map +1 -1
  524. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  525. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  526. package/lib/testing/node/applied-edit-capture.js +117 -0
  527. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  528. package/lib/testing/node/golden-corpus.js.map +1 -1
  529. package/lib/testing/node/index.d.ts +1 -0
  530. package/lib/testing/node/index.d.ts.map +1 -1
  531. package/lib/testing/node/index.js +1 -0
  532. package/lib/testing/node/index.js.map +1 -1
  533. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  534. package/lib/testing/node/lsp-harness.js +2 -0
  535. package/lib/testing/node/lsp-harness.js.map +1 -1
  536. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  537. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  538. package/lib/testing/node/lsp-server-connection.js +49 -106
  539. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  540. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  541. package/lib/testing/node/scratch-workspace.js +10 -5
  542. package/lib/testing/node/scratch-workspace.js.map +1 -1
  543. package/lib/testing/node/spawned-server.d.ts +30 -1
  544. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  545. package/lib/testing/node/spawned-server.js +39 -2
  546. package/lib/testing/node/spawned-server.js.map +1 -1
  547. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  548. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  549. package/lib/testing/node/unhandled-rejections.js +32 -0
  550. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  551. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  552. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  553. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  554. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  555. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  556. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  557. package/lib/testing/playwright/index.d.ts +1 -0
  558. package/lib/testing/playwright/index.d.ts.map +1 -1
  559. package/lib/testing/playwright/index.js +1 -0
  560. package/lib/testing/playwright/index.js.map +1 -1
  561. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  562. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  563. package/lib/testing/playwright/server-log-capture.js +111 -40
  564. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  565. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  566. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  567. package/lib/testing/playwright/server-log-fixture.js +25 -6
  568. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  569. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  570. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  571. package/lib/testing/playwright/server-log-region.js +30 -0
  572. package/lib/testing/playwright/server-log-region.js.map +1 -0
  573. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  574. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  575. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  576. package/lib/testing/run-update-pipeline.d.ts +8 -5
  577. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  578. package/lib/testing/run-update-pipeline.js.map +1 -1
  579. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  580. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  581. package/lib/testing/stub-ast-document-manager.js +31 -62
  582. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  583. package/lib/testing/stub-document-builder.d.ts +33 -11
  584. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  585. package/lib/testing/stub-document-builder.js +103 -5
  586. package/lib/testing/stub-document-builder.js.map +1 -1
  587. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  588. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  589. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  590. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  591. package/lib/testing/stub-index-manager.js.map +1 -1
  592. package/lib/testing/stub-langium-documents.d.ts +3 -2
  593. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  594. package/lib/testing/stub-langium-documents.js.map +1 -1
  595. package/lib/testing/stub-model-service.d.ts +9 -8
  596. package/lib/testing/stub-model-service.d.ts.map +1 -1
  597. package/lib/testing/stub-model-service.js +6 -6
  598. package/lib/testing/stub-model-service.js.map +1 -1
  599. package/lib/testing/stub-project-manager.js.map +1 -1
  600. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  601. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  602. package/lib/testing/stub-service-registry.d.ts +1 -1
  603. package/lib/testing/stub-service-registry.js.map +1 -1
  604. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  605. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  606. package/lib/testing/stub-writable-file-system.js +2 -1
  607. package/lib/testing/stub-writable-file-system.js.map +1 -1
  608. package/lib/util/connection-liveness.d.ts +22 -6
  609. package/lib/util/connection-liveness.d.ts.map +1 -1
  610. package/lib/util/connection-liveness.js +74 -15
  611. package/lib/util/connection-liveness.js.map +1 -1
  612. package/lib/util/environment.d.ts +7 -0
  613. package/lib/util/environment.d.ts.map +1 -1
  614. package/lib/util/environment.js +15 -1
  615. package/lib/util/environment.js.map +1 -1
  616. package/lib/util/registry.d.ts.map +1 -1
  617. package/package.json +41 -60
  618. package/src/browser/host-heads-in-worker.ts +218 -0
  619. package/src/browser/index.ts +17 -0
  620. package/src/browser/indexeddb-file-system-store.ts +192 -0
  621. package/src/browser/start-language-server-in-worker.ts +56 -0
  622. package/src/documents/ast-document-manager.ts +479 -233
  623. package/src/documents/client-ids.ts +5 -22
  624. package/src/documents/client-session-errors.ts +24 -0
  625. package/src/documents/client-session-registry.ts +262 -0
  626. package/src/documents/dirty-state-tracker.ts +167 -0
  627. package/src/documents/document-release-handler.ts +404 -0
  628. package/src/documents/document-release-scheduler.ts +121 -0
  629. package/src/documents/file-system-task-queue.ts +74 -0
  630. package/src/documents/hydranium-text-documents.ts +1029 -595
  631. package/src/documents/index.ts +10 -2
  632. package/src/documents/language-client-shadow.ts +501 -0
  633. package/src/documents/model-ledger.ts +66 -0
  634. package/src/documents/text-ledger.ts +112 -0
  635. package/src/documents/version-sync-service.ts +275 -0
  636. package/src/index.ts +7 -0
  637. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  638. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  639. package/src/langium/bootstrap.ts +87 -51
  640. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  641. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  642. package/src/langium/composite-ast-reflection.ts +112 -0
  643. package/src/langium/config/configuration-provider.ts +119 -0
  644. package/src/langium/config/index.ts +1 -0
  645. package/src/langium/diagnostics/console-tee.ts +150 -0
  646. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  647. package/src/langium/diagnostics/log-preamble.ts +1 -1
  648. package/src/langium/diagnostics/logger.ts +51 -17
  649. package/src/langium/diagnostics/lsp-logger.ts +83 -45
  650. package/src/langium/document-builder/build-pipeline-integration.ts +71 -33
  651. package/src/langium/document-builder/build-session.ts +4 -3
  652. package/src/langium/document-builder/document-builder.ts +615 -79
  653. package/src/langium/integration-services.ts +59 -28
  654. package/src/langium/integrity/integrity-rule.ts +17 -8
  655. package/src/langium/integrity/integrity-service.ts +332 -69
  656. package/src/langium/keys/containment.ts +3 -2
  657. package/src/langium/keys/name-based-key-provider.ts +24 -12
  658. package/src/langium/language-module.ts +52 -9
  659. package/src/langium/model-service/client-session.ts +726 -0
  660. package/src/langium/model-service/index.ts +2 -0
  661. package/src/langium/model-service/model-events.ts +80 -0
  662. package/src/langium/model-service/model-service.ts +929 -493
  663. package/src/langium/module.ts +195 -72
  664. package/src/langium/naming/name-provider.ts +34 -8
  665. package/src/langium/project/abstract-project-manager.ts +13 -5
  666. package/src/langium/project/project-change-event.ts +2 -2
  667. package/src/langium/residency/cst-residency-service.ts +59 -19
  668. package/src/langium/scope/ast-node-description-provider.ts +111 -16
  669. package/src/langium/scope/built-local-symbols.ts +13 -0
  670. package/src/langium/scope/fallback-scope.ts +38 -0
  671. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  672. package/src/langium/scope/hydranium-scope-provider.ts +245 -41
  673. package/src/langium/scope/index.ts +1 -0
  674. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  675. package/src/langium/scope/scope-extension-service.ts +148 -56
  676. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  677. package/src/langium/serialization/abstract-serializer.ts +57 -41
  678. package/src/langium/serialization/json-serializer.ts +14 -3
  679. package/src/langium/serialization/serializer.ts +1 -1
  680. package/src/langium/serialization/yaml-serializer.ts +26 -4
  681. package/src/langium/service-registry.ts +41 -2
  682. package/src/langium/shared-services.ts +16 -7
  683. package/src/langium/single-langium-copy.ts +42 -0
  684. package/src/langium/transfer/transfer-encoder.ts +104 -47
  685. package/src/langium/trivia/comment-preserver.ts +1409 -0
  686. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  687. package/src/langium/trivia/index.ts +14 -0
  688. package/src/langium/trivia/trivia-contribution.ts +39 -0
  689. package/src/langium/trivia/trivia-preserver.ts +56 -0
  690. package/src/langium/trivia/trivia-service.ts +99 -0
  691. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  692. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  693. package/src/langium/validation/document-validator.ts +312 -31
  694. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  695. package/src/langium/workspace/ast-node-locator.ts +33 -0
  696. package/src/langium/workspace/document-uri-policy.ts +32 -18
  697. package/src/langium/workspace/file-not-found.ts +35 -0
  698. package/src/langium/workspace/file-system-provider.ts +258 -16
  699. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  700. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  701. package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
  702. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  703. package/src/langium/workspace/index.ts +2 -0
  704. package/src/langium/workspace/initialize-workspace.ts +96 -4
  705. package/src/langium/workspace/langium-documents.ts +19 -1
  706. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  707. package/src/langium/workspace/self-save-registry.ts +118 -0
  708. package/src/langium/workspace/virtual-document.ts +106 -25
  709. package/src/langium/workspace/write-lock-scope.ts +27 -12
  710. package/src/launcher/integrated-server.ts +3 -1
  711. package/src/locale/server-locale.ts +20 -5
  712. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  713. package/src/lsp/connection-features.ts +67 -0
  714. package/src/lsp/diagnostics-connection.ts +56 -0
  715. package/src/lsp/edit-requests-guard.ts +152 -0
  716. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  717. package/src/lsp/index.ts +6 -2
  718. package/src/lsp/lsp-latency.ts +62 -0
  719. package/src/lsp/save-text-document.ts +63 -0
  720. package/src/lsp/semantic-token-provider.ts +146 -8
  721. package/src/lsp/shared-module.ts +4 -8
  722. package/src/lsp/start-language-server.ts +21 -7
  723. package/src/messages/carriers.ts +4 -6
  724. package/src/messages/index.ts +11 -2
  725. package/src/messages/renderer.ts +34 -6
  726. package/src/node/event-loop-monitor.ts +2 -1
  727. package/src/node/heap-ceiling.ts +108 -0
  728. package/src/node/index.ts +5 -1
  729. package/src/node/latency-from-env.ts +1 -1
  730. package/src/node/log-file-sink.ts +6 -2
  731. package/src/node/log-preamble-node.ts +20 -10
  732. package/src/node/measure-memory.ts +5 -4
  733. package/src/node/memory-monitor.ts +10 -10
  734. package/src/node/node-file-system-provider.ts +214 -57
  735. package/src/node/profile-capture.ts +16 -15
  736. package/src/node/profiling-run.ts +30 -8
  737. package/src/node/rename-over-open-readers.ts +94 -0
  738. package/src/node/server-diagnostics.ts +1 -1
  739. package/src/node/server-state-snapshot.ts +5 -5
  740. package/src/node/socket-launcher.ts +78 -14
  741. package/src/node/startup-cpu-profile.ts +94 -0
  742. package/src/node/stdio-launcher.ts +29 -19
  743. package/src/node/validate-workspace.ts +8 -2
  744. package/src/testing/document-uri-policy-conformance.ts +1 -1
  745. package/src/testing/fake-document.ts +2 -1
  746. package/src/testing/index.ts +2 -1
  747. package/src/testing/langium-test-helpers.ts +1 -0
  748. package/src/testing/make-noop-shared-services.ts +6 -6
  749. package/src/testing/make-test-services.ts +93 -41
  750. package/src/testing/make-test-tracer.ts +26 -0
  751. package/src/testing/node/applied-edit-capture.ts +141 -0
  752. package/src/testing/node/index.ts +1 -0
  753. package/src/testing/node/lsp-harness.ts +2 -0
  754. package/src/testing/node/lsp-server-connection.ts +83 -119
  755. package/src/testing/node/scratch-workspace.ts +10 -5
  756. package/src/testing/node/spawned-server.ts +57 -3
  757. package/src/testing/node/unhandled-rejections.ts +31 -0
  758. package/src/testing/parse-semantic-root.ts +1 -1
  759. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  760. package/src/testing/playwright/index.ts +1 -0
  761. package/src/testing/playwright/server-log-capture.ts +137 -47
  762. package/src/testing/playwright/server-log-fixture.ts +46 -6
  763. package/src/testing/playwright/server-log-region.ts +32 -0
  764. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  765. package/src/testing/run-update-pipeline.ts +8 -5
  766. package/src/testing/stub-ast-document-manager.ts +47 -128
  767. package/src/testing/stub-document-builder.ts +138 -18
  768. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  769. package/src/testing/stub-langium-documents.ts +3 -2
  770. package/src/testing/stub-model-service.ts +11 -10
  771. package/src/testing/stub-self-save-registry.ts +1 -1
  772. package/src/testing/stub-service-registry.ts +1 -1
  773. package/src/testing/stub-writable-file-system.ts +3 -2
  774. package/src/util/connection-liveness.ts +80 -15
  775. package/src/util/environment.ts +24 -2
  776. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  777. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  778. package/lib/documents/language-client-text-shadow.js +0 -156
  779. package/lib/documents/language-client-text-shadow.js.map +0 -1
  780. package/lib/documents/self-save-registry.d.ts +0 -55
  781. package/lib/documents/self-save-registry.d.ts.map +0 -1
  782. package/lib/documents/self-save-registry.js.map +0 -1
  783. package/lib/lsp/instrument-connection.d.ts +0 -36
  784. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  785. package/lib/lsp/instrument-connection.js +0 -62
  786. package/lib/lsp/instrument-connection.js.map +0 -1
  787. package/lib/node/process-memory.d.ts +0 -66
  788. package/lib/node/process-memory.d.ts.map +0 -1
  789. package/lib/node/process-memory.js +0 -252
  790. package/lib/node/process-memory.js.map +0 -1
  791. package/src/documents/language-client-text-shadow.ts +0 -175
  792. package/src/documents/self-save-registry.ts +0 -81
  793. package/src/lsp/instrument-connection.ts +0 -66
  794. 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,16 @@ 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. The reference index's segments, and a
199
+ * description's segments once read, share the CST's `Range` objects, so
200
+ * those stay.
190
201
  *
191
202
  * **Terminology.** *Residency* is the state axis (is the CST in memory? —
192
203
  * `resident` vs `shed`); *shed* is both the act and the policy vocabulary (drop
@@ -227,7 +238,24 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
227
238
  * `NameProvider.getNameNode` chokepoint, the comment provider, and
228
239
  * `HydraniumLangiumDocuments.getOrCreateDocument`.
229
240
  */
230
- export class CstResidencyService {
241
+ export interface CstResidencyService {
242
+ /**
243
+ * Ensure `document` has a CST, re-parsing its retained text if it was shed.
244
+ * A resident document is left exactly as it is, so this is safe to call on
245
+ * a hot path and safe to call twice.
246
+ */
247
+ rehydrate(document: LangiumDocument): void;
248
+
249
+ /**
250
+ * Node-level convenience over {@link rehydrate}, cheap enough for an
251
+ * unconditional call: a node whose `$cstNode` is already set returns
252
+ * without resolving its document, and a node outside any document, such as
253
+ * a detached synthetic node, has nothing to restore and returns too.
254
+ */
255
+ rehydrateNode(node: AstNode): void;
256
+ }
257
+
258
+ export class DefaultCstResidencyService implements CstResidencyService {
231
259
  protected readonly strategy: CstResidencyStrategy;
232
260
  /** Bytes-per-node for the optional reclaim estimate in traces; `0` disables it. */
233
261
  protected readonly estimatedBytesPerShedNode: number;
@@ -257,7 +285,7 @@ export class CstResidencyService {
257
285
  this.langiumDocs = services.workspace.LangiumDocuments;
258
286
  services.workspace.BuildPhasePassService.register({
259
287
  id: 'framework:cst-residency:shed',
260
- state: DocumentState.Validated,
288
+ phase: DocumentState.Validated,
261
289
  priority: options.priority ?? CST_RESIDENCY_PASS_PRIORITY,
262
290
  run: documents => this.onBuild(documents)
263
291
  });
@@ -277,8 +305,8 @@ export class CstResidencyService {
277
305
  * until navigation latency on shed files is actually observed to hurt. This
278
306
  * method is where that hook goes.
279
307
  */
280
- rehydrate(document: LangiumDocument): boolean {
281
- return rehydrateCst(document, this.services.workspace.LangiumDocumentFactory);
308
+ rehydrate(document: LangiumDocument): void {
309
+ rehydrateCst(document, this.services.workspace.LangiumDocumentFactory);
282
310
  }
283
311
 
284
312
  /**
@@ -287,11 +315,14 @@ export class CstResidencyService {
287
315
  * `true` without even resolving the document, so hot read paths
288
316
  * (`getNameNode`, comment lookup) call this unconditionally.
289
317
  */
290
- rehydrateNode(node: AstNode): boolean {
318
+ rehydrateNode(node: AstNode): void {
291
319
  if (node.$cstNode !== undefined) {
292
- return true;
320
+ return;
321
+ }
322
+ const document = AstUtils.findRootNode(node).$document;
323
+ if (document) {
324
+ this.rehydrate(document);
293
325
  }
294
- return this.rehydrate(AstUtils.getDocument(node));
295
326
  }
296
327
 
297
328
  /**
@@ -353,8 +384,8 @@ export class CstResidencyService {
353
384
  this.shedTotal += this.shed(document);
354
385
  }
355
386
 
356
- /** Cancel and drop every idle timer — for clean shutdown and deterministic tests. */
357
- dispose(): void {
387
+ /** Cancel every armed shed, so a document that has gone idle keeps its CST. */
388
+ cancelPendingShed(): void {
358
389
  for (const timer of this.idleTimers.values()) {
359
390
  timer.dispose();
360
391
  }
@@ -383,6 +414,15 @@ export class CstResidencyService {
383
414
  if (root === undefined || root.$cstNode === undefined) {
384
415
  return 0;
385
416
  }
417
+ // Readers of the parsed text, the `'text-diagnostics'` fingerprint among
418
+ // them, otherwise see none once the CST is gone. Recorded in the ledger
419
+ // directly: no root is produced, and reconciling it with the store would
420
+ // step a closed document's sequence for a root behind its text.
421
+ const ledger = this.services.workspace.ModelLedger;
422
+ const version = ledger.versionOf(root);
423
+ if (version !== UNRECORDED_VERSION) {
424
+ ledger.record(root, version, ledger.textOf(root));
425
+ }
386
426
  let cleared = 0;
387
427
  for (const node of AstUtils.streamAst(root)) {
388
428
  if (node.$cstNode) {
@@ -8,7 +8,15 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { type Tracer } from '@hydranium/protocol';
11
- import { type AstNode, type AstNodeDescription, DefaultAstNodeDescriptionProvider, type LangiumDocument } from '@hydranium/langium';
11
+ import {
12
+ type AstNode,
13
+ AstUtils,
14
+ CstUtils,
15
+ DefaultAstNodeDescriptionProvider,
16
+ type DocumentSegment,
17
+ type LangiumDocument,
18
+ type URI
19
+ } from '@hydranium/langium';
12
20
  import type { LogNameOptions } from '../diagnostics/logger.js';
13
21
  import type { HydraniumLanguageServices } from '../language-module.js';
14
22
  import { type DescriptionTier, type TieredAstNodeDescription } from './scoped-ast-node-description.js';
@@ -32,9 +40,11 @@ import { type DescriptionTier, type TieredAstNodeDescription } from './scoped-as
32
40
  */
33
41
  export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescriptionProvider {
34
42
  protected readonly tracer: Tracer;
43
+ protected readonly services: HydraniumLanguageServices;
35
44
 
36
45
  constructor(services: HydraniumLanguageServices, options: LogNameOptions = {}) {
37
46
  super(services);
47
+ this.services = services;
38
48
  this.tracer = services.shared.Tracer.for(options.logName ?? 'AstNodeDescriptionProvider').trace('instantiated');
39
49
  }
40
50
 
@@ -44,12 +54,11 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
44
54
  * filter pipeline. Callers that need a different tier must use
45
55
  * {@link createProject}, {@link createPublic}, or {@link createUniversal}.
46
56
  *
47
- * The named factory methods bypass this override by calling
48
- * `super.createDescription` to get a plain base before stamping the
49
- * correct tier — so there is no create-then-overwrite cost.
57
+ * Langium's own `createDescription` is not called: every factory builds
58
+ * through {@link createTiered}.
50
59
  */
51
- override createDescription(node: AstNode, name: string, document: LangiumDocument): TieredAstNodeDescription {
52
- return this.toTiered(super.createDescription(node, name, document), 'local');
60
+ override createDescription(node: AstNode, name: string | undefined, document?: LangiumDocument): TieredAstNodeDescription {
61
+ return this.createTiered(node, name, document, 'local');
53
62
  }
54
63
 
55
64
  /**
@@ -62,7 +71,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
62
71
  * never sees them, so a project tag would be unused.
63
72
  */
64
73
  createLocal(options: { readonly node: AstNode; readonly name: string; readonly document: LangiumDocument }): TieredAstNodeDescription {
65
- return this.toTiered(super.createDescription(options.node, options.name, options.document), 'local');
74
+ return this.createTiered(options.node, options.name, options.document, 'local');
66
75
  }
67
76
 
68
77
  /**
@@ -84,7 +93,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
84
93
  readonly document: LangiumDocument;
85
94
  readonly projectId: string;
86
95
  }): TieredAstNodeDescription {
87
- return this.toTiered(super.createDescription(options.node, options.name, options.document), 'project', options.projectId);
96
+ return this.createTiered(options.node, options.name, options.document, 'project', options.projectId);
88
97
  }
89
98
 
90
99
  /**
@@ -108,7 +117,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
108
117
  readonly document: LangiumDocument;
109
118
  readonly projectId: string;
110
119
  }): TieredAstNodeDescription {
111
- return this.toTiered(super.createDescription(options.node, options.name, options.document), 'public', options.projectId);
120
+ return this.createTiered(options.node, options.name, options.document, 'public', options.projectId);
112
121
  }
113
122
 
114
123
  /**
@@ -126,16 +135,102 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
126
135
  readonly name: string;
127
136
  readonly document: LangiumDocument;
128
137
  }): TieredAstNodeDescription {
129
- return this.toTiered(super.createDescription(options.node, options.name, options.document), 'universal');
138
+ return this.createTiered(options.node, options.name, options.document, 'universal');
130
139
  }
131
140
 
132
141
  /**
133
- * Attach `tier` + `projectId` fields to a plain {@link AstNodeDescription}
134
- * in place, narrowing the static type to {@link TieredAstNodeDescription}.
135
- * Mutates `base` rather than copying — the input is treated as
136
- * just-constructed and not aliased elsewhere.
142
+ * Resolve the fields of the description every factory returns and build it
143
+ * through {@link newDescription}. Mirrors Langium's `createDescription`:
144
+ * the name defaults to the name provider's, and a node without one throws.
137
145
  */
138
- protected toTiered(base: AstNodeDescription, tier: DescriptionTier, projectId?: string): TieredAstNodeDescription {
139
- return Object.assign(base, { tier, projectId }) as TieredAstNodeDescription;
146
+ protected createTiered(
147
+ node: AstNode,
148
+ name: string | undefined,
149
+ document: LangiumDocument | undefined,
150
+ tier: DescriptionTier,
151
+ projectId?: string
152
+ ): TieredAstNodeDescription {
153
+ const path = this.astNodeLocator.getAstNodePath(node);
154
+ const resolvedName = name ?? this.nameProvider.getName(node);
155
+ if (!resolvedName) {
156
+ throw new Error(`Node at path ${path} has no name.`);
157
+ }
158
+ const documentUri = (document ?? AstUtils.getDocument(node)).uri;
159
+ return this.newDescription(node, resolvedName, documentUri, path, tier, projectId);
160
+ }
161
+
162
+ /** Construct the description from resolved fields; override to build a subclass of {@link DefaultTieredAstNodeDescription}. */
163
+ protected newDescription(
164
+ node: AstNode,
165
+ name: string,
166
+ documentUri: URI,
167
+ path: string,
168
+ tier: DescriptionTier,
169
+ projectId: string | undefined
170
+ ): TieredAstNodeDescription {
171
+ return new DefaultTieredAstNodeDescription(this, node, name, documentUri, path, tier, projectId);
172
+ }
173
+
174
+ /**
175
+ * The segment of `node`'s name, or of the whole node when the name
176
+ * provider finds no name node, restoring a shed CST first: a name provider
177
+ * need not restore it, and an absent segment is not computed again.
178
+ */
179
+ nameSegmentOf(node: AstNode): DocumentSegment | undefined {
180
+ this.services.shared.workspace.CstResidencyService.rehydrateNode(node);
181
+ return CstUtils.toDocumentSegment(this.nameProvider.getNameNode(node) ?? node.$cstNode);
182
+ }
183
+
184
+ /** The segment of the whole node, restoring a shed CST first. */
185
+ selectionSegmentOf(node: AstNode): DocumentSegment | undefined {
186
+ this.services.shared.workspace.CstResidencyService.rehydrateNode(node);
187
+ return CstUtils.toDocumentSegment(node.$cstNode);
188
+ }
189
+ }
190
+
191
+ /**
192
+ * The description {@link HydraniumAstNodeDescriptionProvider} builds. Every
193
+ * field is set in the constructor, so all descriptions share one V8 hidden
194
+ * class; Langium's object literal with a `nameSegment` accessor is kept in
195
+ * dictionary mode and carries two closures, several times the bytes.
196
+ *
197
+ * `nameSegment` and `selectionSegment` are prototype getters, not own
198
+ * properties: a spread, `Object.keys`, a JSON round trip or `structuredClone`
199
+ * of a description drops them. Each is computed on its first read, from the
200
+ * node the description was built for, restoring a shed CST first; an eager
201
+ * `selectionSegment` would keep a segment per description that nothing reads.
202
+ */
203
+ export class DefaultTieredAstNodeDescription implements TieredAstNodeDescription {
204
+ readonly type: string;
205
+ // `null` records a segment computed while the node had no CST. It is
206
+ // recomputed only once the node has one again: retrying without one would
207
+ // attempt a restore, a re-parse, on every read.
208
+ protected nameSegmentCache: DocumentSegment | null | undefined;
209
+ protected selectionSegmentCache: DocumentSegment | null | undefined;
210
+
211
+ constructor(
212
+ protected readonly provider: HydraniumAstNodeDescriptionProvider,
213
+ readonly node: AstNode,
214
+ readonly name: string,
215
+ readonly documentUri: URI,
216
+ readonly path: string,
217
+ readonly tier: DescriptionTier,
218
+ readonly projectId: string | undefined
219
+ ) {
220
+ this.type = node.$type;
221
+ }
222
+
223
+ get nameSegment(): DocumentSegment | undefined {
224
+ if (this.nameSegmentCache === undefined || (this.nameSegmentCache === null && this.node.$cstNode !== undefined)) {
225
+ this.nameSegmentCache = this.provider.nameSegmentOf(this.node) ?? null;
226
+ }
227
+ return this.nameSegmentCache ?? undefined;
228
+ }
229
+
230
+ get selectionSegment(): DocumentSegment | undefined {
231
+ if (this.selectionSegmentCache === undefined || (this.selectionSegmentCache === null && this.node.$cstNode !== undefined)) {
232
+ this.selectionSegmentCache = this.provider.selectionSegmentOf(this.node) ?? null;
233
+ }
234
+ return this.selectionSegmentCache ?? undefined;
140
235
  }
141
236
  }
@@ -0,0 +1,13 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import type { AstNode, LocalSymbols } from '@hydranium/langium';
11
+
12
+ /** The local symbols each build computed, by the root it computed them for. */
13
+ export const builtLocalSymbols = new WeakMap<AstNode, LocalSymbols>();
@@ -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
  }