@hydranium/core 1.0.0-next.39 → 1.0.0-next.391

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (805) hide show
  1. package/README.md +78 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +77 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +169 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +32 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +40 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +254 -140
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +311 -128
  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 +40 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +453 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +918 -504
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +153 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +186 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +3 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +3 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +75 -36
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +141 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  116. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  117. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  118. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  119. package/lib/langium/diagnostics/log-preamble.js +1 -1
  120. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  121. package/lib/langium/diagnostics/logger.d.ts +25 -6
  122. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  123. package/lib/langium/diagnostics/logger.js +49 -17
  124. package/lib/langium/diagnostics/logger.js.map +1 -1
  125. package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
  126. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/lsp-logger.js +81 -46
  128. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  129. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  130. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  131. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  132. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  133. package/lib/langium/document-builder/build-pipeline-integration.js +43 -30
  134. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  135. package/lib/langium/document-builder/build-session.d.ts +6 -5
  136. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-session.js +5 -5
  138. package/lib/langium/document-builder/build-session.js.map +1 -1
  139. package/lib/langium/document-builder/document-builder.d.ts +390 -40
  140. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  141. package/lib/langium/document-builder/document-builder.js +635 -102
  142. package/lib/langium/document-builder/document-builder.js.map +1 -1
  143. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  144. package/lib/langium/documentation/comment-provider.js.map +1 -1
  145. package/lib/langium/integration-services.d.ts +20 -23
  146. package/lib/langium/integration-services.d.ts.map +1 -1
  147. package/lib/langium/integration-services.js.map +1 -1
  148. package/lib/langium/integrity/integrity-rule.d.ts +22 -8
  149. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  150. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  151. package/lib/langium/integrity/integrity-service.d.ts +217 -29
  152. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  153. package/lib/langium/integrity/integrity-service.js +588 -84
  154. package/lib/langium/integrity/integrity-service.js.map +1 -1
  155. package/lib/langium/keys/containment.d.ts +3 -2
  156. package/lib/langium/keys/containment.d.ts.map +1 -1
  157. package/lib/langium/keys/containment.js.map +1 -1
  158. package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
  159. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.js +24 -12
  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 +21 -5
  169. package/lib/langium/language-module.js.map +1 -1
  170. package/lib/langium/model-service/client-session.d.ts +405 -0
  171. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  172. package/lib/langium/model-service/client-session.js +479 -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 +68 -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 +441 -323
  183. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  184. package/lib/langium/model-service/model-service.js +602 -407
  185. package/lib/langium/model-service/model-service.js.map +1 -1
  186. package/lib/langium/module.d.ts +96 -37
  187. package/lib/langium/module.d.ts.map +1 -1
  188. package/lib/langium/module.js +41 -29
  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 +184 -13
  196. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  197. package/lib/langium/project/abstract-project-manager.js +336 -16
  198. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  199. package/lib/langium/project/project-change-event.d.ts +22 -3
  200. package/lib/langium/project/project-change-event.d.ts.map +1 -1
  201. package/lib/langium/project/project-manager.d.ts +28 -2
  202. package/lib/langium/project/project-manager.d.ts.map +1 -1
  203. package/lib/langium/project/single-project-manager.d.ts +7 -1
  204. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  205. package/lib/langium/project/single-project-manager.js +12 -0
  206. package/lib/langium/project/single-project-manager.js.map +1 -1
  207. package/lib/langium/residency/cst-residency-service.d.ts +92 -52
  208. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  209. package/lib/langium/residency/cst-residency-service.js +154 -58
  210. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  211. package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
  212. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  213. package/lib/langium/scope/ast-node-description-provider.js +88 -15
  214. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  215. package/lib/langium/scope/built-local-symbols.d.ts +12 -0
  216. package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
  217. package/lib/langium/scope/built-local-symbols.js +11 -0
  218. package/lib/langium/scope/built-local-symbols.js.map +1 -0
  219. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  220. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  221. package/lib/langium/scope/fallback-scope.js +35 -0
  222. package/lib/langium/scope/fallback-scope.js.map +1 -0
  223. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  224. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  225. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  226. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  227. package/lib/langium/scope/hydranium-scope-provider.d.ts +122 -32
  228. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  229. package/lib/langium/scope/hydranium-scope-provider.js +217 -39
  230. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  231. package/lib/langium/scope/index.d.ts +1 -0
  232. package/lib/langium/scope/index.d.ts.map +1 -1
  233. package/lib/langium/scope/index.js +1 -0
  234. package/lib/langium/scope/index.js.map +1 -1
  235. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  236. package/lib/langium/scope/reference-builder.js.map +1 -1
  237. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  238. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  239. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  240. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  241. package/lib/langium/scope/scope-extension-service.d.ts +69 -37
  242. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  243. package/lib/langium/scope/scope-extension-service.js +102 -29
  244. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  245. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  246. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  247. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  248. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  249. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  250. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  251. package/lib/langium/serialization/abstract-serializer.js +54 -30
  252. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  253. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  254. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  255. package/lib/langium/serialization/json-serializer.js +13 -3
  256. package/lib/langium/serialization/json-serializer.js.map +1 -1
  257. package/lib/langium/serialization/serializer.d.ts +1 -1
  258. package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
  259. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  260. package/lib/langium/serialization/yaml-serializer.js +24 -4
  261. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  262. package/lib/langium/service-registry.d.ts +29 -1
  263. package/lib/langium/service-registry.d.ts.map +1 -1
  264. package/lib/langium/service-registry.js +37 -0
  265. package/lib/langium/service-registry.js.map +1 -1
  266. package/lib/langium/shared-services.d.ts +10 -4
  267. package/lib/langium/shared-services.d.ts.map +1 -1
  268. package/lib/langium/shared-services.js.map +1 -1
  269. package/lib/langium/single-langium-copy.d.ts +22 -0
  270. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  271. package/lib/langium/single-langium-copy.js +36 -0
  272. package/lib/langium/single-langium-copy.js.map +1 -0
  273. package/lib/langium/transfer/transfer-encoder.d.ts +60 -39
  274. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  275. package/lib/langium/transfer/transfer-encoder.js +35 -24
  276. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  277. package/lib/langium/trivia/comment-preserver.d.ts +543 -0
  278. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  279. package/lib/langium/trivia/comment-preserver.js +1165 -0
  280. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  281. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  282. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  283. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  284. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  285. package/lib/langium/trivia/index.d.ts +14 -0
  286. package/lib/langium/trivia/index.d.ts.map +1 -0
  287. package/lib/langium/trivia/index.js +14 -0
  288. package/lib/langium/trivia/index.js.map +1 -0
  289. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  290. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  291. package/lib/langium/trivia/trivia-contribution.js +10 -0
  292. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  293. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  294. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  295. package/lib/langium/trivia/trivia-preserver.js +10 -0
  296. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  297. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  298. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  299. package/lib/langium/trivia/trivia-service.js +56 -0
  300. package/lib/langium/trivia/trivia-service.js.map +1 -0
  301. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  302. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  303. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  304. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  305. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  306. package/lib/langium/validation/document-validator.d.ts +168 -23
  307. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  308. package/lib/langium/validation/document-validator.js +264 -26
  309. package/lib/langium/validation/document-validator.js.map +1 -1
  310. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  311. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  312. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  313. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  314. package/lib/langium/workspace/ast-node-locator.d.ts +24 -0
  315. package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
  316. package/lib/langium/workspace/ast-node-locator.js +32 -0
  317. package/lib/langium/workspace/ast-node-locator.js.map +1 -0
  318. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  319. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  320. package/lib/langium/workspace/document-uri-policy.js +22 -13
  321. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  322. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  323. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  324. package/lib/langium/workspace/file-not-found.js +31 -0
  325. package/lib/langium/workspace/file-not-found.js.map +1 -0
  326. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  327. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  328. package/lib/langium/workspace/file-system-provider.js +115 -13
  329. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  330. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +78 -4
  331. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  332. package/lib/langium/workspace/hydranium-langium-document-factory.js +188 -5
  333. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  334. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +50 -1
  335. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  336. package/lib/langium/workspace/hydranium-workspace-lock.js +73 -1
  337. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  338. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +105 -21
  339. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  340. package/lib/langium/workspace/hydranium-workspace-manager.js +186 -31
  341. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  342. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  343. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  344. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  345. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  346. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  347. package/lib/langium/workspace/index-manager.js.map +1 -1
  348. package/lib/langium/workspace/index.d.ts +3 -0
  349. package/lib/langium/workspace/index.d.ts.map +1 -1
  350. package/lib/langium/workspace/index.js +3 -0
  351. package/lib/langium/workspace/index.js.map +1 -1
  352. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  353. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  354. package/lib/langium/workspace/initialize-workspace.js +68 -3
  355. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  356. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  357. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  358. package/lib/langium/workspace/langium-documents.js +18 -1
  359. package/lib/langium/workspace/langium-documents.js.map +1 -1
  360. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  361. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  362. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  363. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  364. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +7 -9
  365. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  366. package/lib/{documents → langium/workspace}/self-save-registry.js +9 -11
  367. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  368. package/lib/langium/workspace/syntax-errors.d.ts +23 -0
  369. package/lib/langium/workspace/syntax-errors.d.ts.map +1 -0
  370. package/lib/langium/workspace/syntax-errors.js +29 -0
  371. package/lib/langium/workspace/syntax-errors.js.map +1 -0
  372. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  373. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  374. package/lib/langium/workspace/virtual-document.js +87 -24
  375. package/lib/langium/workspace/virtual-document.js.map +1 -1
  376. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  377. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  378. package/lib/langium/workspace/write-lock-scope.js +15 -5
  379. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  380. package/lib/launcher/integrated-server.d.ts +3 -1
  381. package/lib/launcher/integrated-server.d.ts.map +1 -1
  382. package/lib/locale/server-locale.d.ts +6 -6
  383. package/lib/locale/server-locale.d.ts.map +1 -1
  384. package/lib/locale/server-locale.js.map +1 -1
  385. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  386. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  387. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  388. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  389. package/lib/lsp/connection-features.d.ts +23 -0
  390. package/lib/lsp/connection-features.d.ts.map +1 -0
  391. package/lib/lsp/connection-features.js +60 -0
  392. package/lib/lsp/connection-features.js.map +1 -0
  393. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  394. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  395. package/lib/lsp/diagnostics-connection.js +53 -0
  396. package/lib/lsp/diagnostics-connection.js.map +1 -0
  397. package/lib/lsp/edit-requests-guard.d.ts +31 -0
  398. package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
  399. package/lib/lsp/edit-requests-guard.js +125 -0
  400. package/lib/lsp/edit-requests-guard.js.map +1 -0
  401. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  402. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  403. package/lib/lsp/hydranium-document-update-handler.js +234 -101
  404. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  405. package/lib/lsp/index.d.ts +6 -2
  406. package/lib/lsp/index.d.ts.map +1 -1
  407. package/lib/lsp/index.js +6 -2
  408. package/lib/lsp/index.js.map +1 -1
  409. package/lib/lsp/lsp-latency.d.ts +39 -0
  410. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  411. package/lib/lsp/lsp-latency.js +58 -0
  412. package/lib/lsp/lsp-latency.js.map +1 -0
  413. package/lib/lsp/save-text-document.d.ts +31 -0
  414. package/lib/lsp/save-text-document.d.ts.map +1 -0
  415. package/lib/lsp/save-text-document.js +52 -0
  416. package/lib/lsp/save-text-document.js.map +1 -0
  417. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  418. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  419. package/lib/lsp/semantic-token-provider.js +98 -9
  420. package/lib/lsp/semantic-token-provider.js.map +1 -1
  421. package/lib/lsp/shared-module.d.ts +4 -8
  422. package/lib/lsp/shared-module.d.ts.map +1 -1
  423. package/lib/lsp/shared-module.js.map +1 -1
  424. package/lib/lsp/start-language-server.d.ts +12 -7
  425. package/lib/lsp/start-language-server.d.ts.map +1 -1
  426. package/lib/lsp/start-language-server.js +21 -7
  427. package/lib/lsp/start-language-server.js.map +1 -1
  428. package/lib/messages/carriers.d.ts +4 -6
  429. package/lib/messages/carriers.d.ts.map +1 -1
  430. package/lib/messages/carriers.js +4 -6
  431. package/lib/messages/carriers.js.map +1 -1
  432. package/lib/messages/index.d.ts +2 -2
  433. package/lib/messages/index.d.ts.map +1 -1
  434. package/lib/messages/index.js +2 -2
  435. package/lib/messages/index.js.map +1 -1
  436. package/lib/messages/renderer.d.ts +10 -4
  437. package/lib/messages/renderer.d.ts.map +1 -1
  438. package/lib/messages/renderer.js +6 -0
  439. package/lib/messages/renderer.js.map +1 -1
  440. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  441. package/lib/node/event-loop-monitor.js +3 -2
  442. package/lib/node/event-loop-monitor.js.map +1 -1
  443. package/lib/node/heap-ceiling.d.ts +61 -0
  444. package/lib/node/heap-ceiling.d.ts.map +1 -0
  445. package/lib/node/heap-ceiling.js +72 -0
  446. package/lib/node/heap-ceiling.js.map +1 -0
  447. package/lib/node/index.d.ts +1 -1
  448. package/lib/node/index.d.ts.map +1 -1
  449. package/lib/node/index.js +5 -1
  450. package/lib/node/index.js.map +1 -1
  451. package/lib/node/latency-from-env.d.ts +1 -1
  452. package/lib/node/latency-from-env.js +1 -1
  453. package/lib/node/lint-grammar.js.map +1 -1
  454. package/lib/node/log-file-sink.d.ts +3 -2
  455. package/lib/node/log-file-sink.d.ts.map +1 -1
  456. package/lib/node/log-file-sink.js +6 -2
  457. package/lib/node/log-file-sink.js.map +1 -1
  458. package/lib/node/log-preamble-node.d.ts +5 -3
  459. package/lib/node/log-preamble-node.d.ts.map +1 -1
  460. package/lib/node/log-preamble-node.js +13 -10
  461. package/lib/node/log-preamble-node.js.map +1 -1
  462. package/lib/node/measure-memory.d.ts.map +1 -1
  463. package/lib/node/measure-memory.js +5 -4
  464. package/lib/node/measure-memory.js.map +1 -1
  465. package/lib/node/memory-monitor.d.ts +2 -2
  466. package/lib/node/memory-monitor.d.ts.map +1 -1
  467. package/lib/node/memory-monitor.js +9 -10
  468. package/lib/node/memory-monitor.js.map +1 -1
  469. package/lib/node/node-file-system-provider.d.ts +67 -9
  470. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  471. package/lib/node/node-file-system-provider.js +198 -53
  472. package/lib/node/node-file-system-provider.js.map +1 -1
  473. package/lib/node/profile-capture.d.ts +12 -4
  474. package/lib/node/profile-capture.d.ts.map +1 -1
  475. package/lib/node/profile-capture.js +8 -6
  476. package/lib/node/profile-capture.js.map +1 -1
  477. package/lib/node/profile-digest.js.map +1 -1
  478. package/lib/node/profiling-run.d.ts +13 -3
  479. package/lib/node/profiling-run.d.ts.map +1 -1
  480. package/lib/node/profiling-run.js +17 -8
  481. package/lib/node/profiling-run.js.map +1 -1
  482. package/lib/node/rename-over-open-readers.d.ts +61 -0
  483. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  484. package/lib/node/rename-over-open-readers.js +80 -0
  485. package/lib/node/rename-over-open-readers.js.map +1 -0
  486. package/lib/node/server-diagnostics.js +1 -1
  487. package/lib/node/server-diagnostics.js.map +1 -1
  488. package/lib/node/server-state-snapshot.d.ts +6 -5
  489. package/lib/node/server-state-snapshot.d.ts.map +1 -1
  490. package/lib/node/server-state-snapshot.js +20 -17
  491. package/lib/node/server-state-snapshot.js.map +1 -1
  492. package/lib/node/socket-launcher.d.ts +43 -7
  493. package/lib/node/socket-launcher.d.ts.map +1 -1
  494. package/lib/node/socket-launcher.js +42 -7
  495. package/lib/node/socket-launcher.js.map +1 -1
  496. package/lib/node/startup-cpu-profile.d.ts +29 -0
  497. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  498. package/lib/node/startup-cpu-profile.js +91 -0
  499. package/lib/node/startup-cpu-profile.js.map +1 -0
  500. package/lib/node/stdio-launcher.d.ts +13 -13
  501. package/lib/node/stdio-launcher.d.ts.map +1 -1
  502. package/lib/node/stdio-launcher.js +21 -11
  503. package/lib/node/stdio-launcher.js.map +1 -1
  504. package/lib/node/validate-workspace.d.ts +1 -1
  505. package/lib/node/validate-workspace.d.ts.map +1 -1
  506. package/lib/node/validate-workspace.js +5 -1
  507. package/lib/node/validate-workspace.js.map +1 -1
  508. package/lib/testing/document-uri-policy-conformance.js +1 -1
  509. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  510. package/lib/testing/fake-description.js.map +1 -1
  511. package/lib/testing/fake-document.d.ts +2 -1
  512. package/lib/testing/fake-document.d.ts.map +1 -1
  513. package/lib/testing/fake-document.js.map +1 -1
  514. package/lib/testing/index.d.ts +1 -1
  515. package/lib/testing/index.d.ts.map +1 -1
  516. package/lib/testing/index.js +2 -1
  517. package/lib/testing/index.js.map +1 -1
  518. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  519. package/lib/testing/langium-test-helpers.js +1 -0
  520. package/lib/testing/langium-test-helpers.js.map +1 -1
  521. package/lib/testing/make-noop-language-services.js.map +1 -1
  522. package/lib/testing/make-noop-shared-services.js.map +1 -1
  523. package/lib/testing/make-test-services.d.ts +45 -14
  524. package/lib/testing/make-test-services.d.ts.map +1 -1
  525. package/lib/testing/make-test-services.js +23 -7
  526. package/lib/testing/make-test-services.js.map +1 -1
  527. package/lib/testing/make-test-tracer.d.ts +12 -0
  528. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  529. package/lib/testing/make-test-tracer.js +13 -0
  530. package/lib/testing/make-test-tracer.js.map +1 -1
  531. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  532. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  533. package/lib/testing/node/applied-edit-capture.js +117 -0
  534. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  535. package/lib/testing/node/golden-corpus.js.map +1 -1
  536. package/lib/testing/node/index.d.ts +4 -1
  537. package/lib/testing/node/index.d.ts.map +1 -1
  538. package/lib/testing/node/index.js +4 -1
  539. package/lib/testing/node/index.js.map +1 -1
  540. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  541. package/lib/testing/node/lsp-harness.js +2 -0
  542. package/lib/testing/node/lsp-harness.js.map +1 -1
  543. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  544. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  545. package/lib/testing/node/lsp-server-connection.js +49 -106
  546. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  547. package/lib/testing/node/scratch-workspace.d.ts +2 -1
  548. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  549. package/lib/testing/node/scratch-workspace.js +12 -6
  550. package/lib/testing/node/scratch-workspace.js.map +1 -1
  551. package/lib/testing/node/settle-server.d.ts +33 -0
  552. package/lib/testing/node/settle-server.d.ts.map +1 -0
  553. package/lib/testing/node/settle-server.js +84 -0
  554. package/lib/testing/node/settle-server.js.map +1 -0
  555. package/lib/testing/node/spawned-server.d.ts +30 -1
  556. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  557. package/lib/testing/node/spawned-server.js +39 -2
  558. package/lib/testing/node/spawned-server.js.map +1 -1
  559. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  560. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  561. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  562. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  563. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  564. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  565. package/lib/testing/playwright/index.d.ts +1 -0
  566. package/lib/testing/playwright/index.d.ts.map +1 -1
  567. package/lib/testing/playwright/index.js +1 -0
  568. package/lib/testing/playwright/index.js.map +1 -1
  569. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  570. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  571. package/lib/testing/playwright/server-log-capture.js +111 -40
  572. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  573. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  574. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  575. package/lib/testing/playwright/server-log-fixture.js +25 -6
  576. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  577. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  578. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  579. package/lib/testing/playwright/server-log-region.js +30 -0
  580. package/lib/testing/playwright/server-log-region.js.map +1 -0
  581. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  582. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  583. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  584. package/lib/testing/run-update-pipeline.d.ts +8 -5
  585. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  586. package/lib/testing/run-update-pipeline.js.map +1 -1
  587. package/lib/testing/stub-ast-document-manager.d.ts +11 -51
  588. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  589. package/lib/testing/stub-ast-document-manager.js +31 -59
  590. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  591. package/lib/testing/stub-document-builder.d.ts +25 -11
  592. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  593. package/lib/testing/stub-document-builder.js +91 -2
  594. package/lib/testing/stub-document-builder.js.map +1 -1
  595. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  596. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  597. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  598. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  599. package/lib/testing/stub-index-manager.js.map +1 -1
  600. package/lib/testing/stub-langium-documents.d.ts +3 -2
  601. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  602. package/lib/testing/stub-langium-documents.js.map +1 -1
  603. package/lib/testing/stub-model-service.d.ts +8 -7
  604. package/lib/testing/stub-model-service.d.ts.map +1 -1
  605. package/lib/testing/stub-model-service.js +4 -4
  606. package/lib/testing/stub-model-service.js.map +1 -1
  607. package/lib/testing/stub-project-manager.d.ts.map +1 -1
  608. package/lib/testing/stub-project-manager.js +10 -0
  609. package/lib/testing/stub-project-manager.js.map +1 -1
  610. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  611. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  612. package/lib/testing/stub-service-registry.d.ts +1 -1
  613. package/lib/testing/stub-service-registry.js.map +1 -1
  614. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  615. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  616. package/lib/testing/stub-writable-file-system.js +2 -1
  617. package/lib/testing/stub-writable-file-system.js.map +1 -1
  618. package/lib/util/connection-liveness.d.ts +22 -6
  619. package/lib/util/connection-liveness.d.ts.map +1 -1
  620. package/lib/util/connection-liveness.js +75 -15
  621. package/lib/util/connection-liveness.js.map +1 -1
  622. package/lib/util/environment.d.ts +7 -0
  623. package/lib/util/environment.d.ts.map +1 -1
  624. package/lib/util/environment.js +15 -1
  625. package/lib/util/environment.js.map +1 -1
  626. package/lib/util/registry.d.ts.map +1 -1
  627. package/package.json +41 -60
  628. package/src/browser/host-heads-in-worker.ts +218 -0
  629. package/src/browser/index.ts +17 -0
  630. package/src/browser/indexeddb-file-system-store.ts +192 -0
  631. package/src/browser/start-language-server-in-worker.ts +56 -0
  632. package/src/documents/ast-document-manager.ts +477 -250
  633. package/src/documents/client-ids.ts +5 -22
  634. package/src/documents/client-session-errors.ts +26 -0
  635. package/src/documents/client-session-registry.ts +262 -0
  636. package/src/documents/dirty-state-tracker.ts +167 -0
  637. package/src/documents/document-release-handler.ts +404 -0
  638. package/src/documents/document-release-scheduler.ts +121 -0
  639. package/src/documents/file-system-task-queue.ts +77 -0
  640. package/src/documents/hydranium-text-documents.ts +1044 -615
  641. package/src/documents/index.ts +10 -2
  642. package/src/documents/language-client-shadow.ts +501 -0
  643. package/src/documents/model-ledger.ts +66 -0
  644. package/src/documents/text-ledger.ts +112 -0
  645. package/src/documents/version-sync-service.ts +304 -0
  646. package/src/index.ts +3 -0
  647. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  648. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  649. package/src/langium/bootstrap.ts +79 -43
  650. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  651. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  652. package/src/langium/composite-ast-reflection.ts +112 -0
  653. package/src/langium/config/configuration-provider.ts +119 -0
  654. package/src/langium/config/index.ts +1 -0
  655. package/src/langium/diagnostics/console-tee.ts +150 -0
  656. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  657. package/src/langium/diagnostics/log-preamble.ts +1 -1
  658. package/src/langium/diagnostics/logger.ts +51 -17
  659. package/src/langium/diagnostics/lsp-logger.ts +83 -45
  660. package/src/langium/document-builder/build-pipeline-integration.ts +57 -32
  661. package/src/langium/document-builder/build-session.ts +4 -3
  662. package/src/langium/document-builder/document-builder.ts +773 -106
  663. package/src/langium/integration-services.ts +20 -23
  664. package/src/langium/integrity/integrity-rule.ts +22 -8
  665. package/src/langium/integrity/integrity-service.ts +656 -90
  666. package/src/langium/keys/containment.ts +3 -2
  667. package/src/langium/keys/name-based-key-provider.ts +24 -12
  668. package/src/langium/language-module.ts +52 -9
  669. package/src/langium/model-service/client-session.ts +769 -0
  670. package/src/langium/model-service/index.ts +2 -0
  671. package/src/langium/model-service/model-events.ts +82 -0
  672. package/src/langium/model-service/model-service.ts +885 -532
  673. package/src/langium/module.ts +141 -65
  674. package/src/langium/naming/name-provider.ts +34 -8
  675. package/src/langium/project/abstract-project-manager.ts +409 -20
  676. package/src/langium/project/project-change-event.ts +25 -3
  677. package/src/langium/project/project-manager.ts +31 -2
  678. package/src/langium/project/single-project-manager.ts +16 -1
  679. package/src/langium/residency/cst-residency-service.ts +210 -87
  680. package/src/langium/scope/ast-node-description-provider.ts +111 -16
  681. package/src/langium/scope/built-local-symbols.ts +13 -0
  682. package/src/langium/scope/fallback-scope.ts +38 -0
  683. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  684. package/src/langium/scope/hydranium-scope-provider.ts +245 -41
  685. package/src/langium/scope/index.ts +1 -0
  686. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  687. package/src/langium/scope/scope-extension-service.ts +148 -56
  688. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  689. package/src/langium/serialization/abstract-serializer.ts +57 -41
  690. package/src/langium/serialization/json-serializer.ts +14 -3
  691. package/src/langium/serialization/serializer.ts +1 -1
  692. package/src/langium/serialization/yaml-serializer.ts +26 -4
  693. package/src/langium/service-registry.ts +41 -2
  694. package/src/langium/shared-services.ts +13 -4
  695. package/src/langium/single-langium-copy.ts +42 -0
  696. package/src/langium/transfer/transfer-encoder.ts +76 -50
  697. package/src/langium/trivia/comment-preserver.ts +1410 -0
  698. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  699. package/src/langium/trivia/index.ts +14 -0
  700. package/src/langium/trivia/trivia-contribution.ts +39 -0
  701. package/src/langium/trivia/trivia-preserver.ts +56 -0
  702. package/src/langium/trivia/trivia-service.ts +99 -0
  703. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  704. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  705. package/src/langium/validation/document-validator.ts +312 -31
  706. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  707. package/src/langium/workspace/ast-node-locator.ts +33 -0
  708. package/src/langium/workspace/document-uri-policy.ts +32 -18
  709. package/src/langium/workspace/file-not-found.ts +35 -0
  710. package/src/langium/workspace/file-system-provider.ts +258 -16
  711. package/src/langium/workspace/hydranium-langium-document-factory.ts +239 -4
  712. package/src/langium/workspace/hydranium-workspace-lock.ts +101 -2
  713. package/src/langium/workspace/hydranium-workspace-manager.ts +214 -35
  714. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  715. package/src/langium/workspace/index.ts +3 -0
  716. package/src/langium/workspace/initialize-workspace.ts +96 -4
  717. package/src/langium/workspace/langium-documents.ts +19 -1
  718. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  719. package/src/{documents → langium/workspace}/self-save-registry.ts +12 -14
  720. package/src/langium/workspace/syntax-errors.ts +34 -0
  721. package/src/langium/workspace/virtual-document.ts +106 -25
  722. package/src/langium/workspace/write-lock-scope.ts +27 -12
  723. package/src/launcher/integrated-server.ts +3 -1
  724. package/src/locale/server-locale.ts +6 -6
  725. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  726. package/src/lsp/connection-features.ts +67 -0
  727. package/src/lsp/diagnostics-connection.ts +56 -0
  728. package/src/lsp/edit-requests-guard.ts +152 -0
  729. package/src/lsp/hydranium-document-update-handler.ts +284 -110
  730. package/src/lsp/index.ts +6 -2
  731. package/src/lsp/lsp-latency.ts +62 -0
  732. package/src/lsp/save-text-document.ts +63 -0
  733. package/src/lsp/semantic-token-provider.ts +146 -8
  734. package/src/lsp/shared-module.ts +4 -8
  735. package/src/lsp/start-language-server.ts +21 -7
  736. package/src/messages/carriers.ts +4 -6
  737. package/src/messages/index.ts +11 -2
  738. package/src/messages/renderer.ts +11 -3
  739. package/src/node/event-loop-monitor.ts +3 -4
  740. package/src/node/heap-ceiling.ts +108 -0
  741. package/src/node/index.ts +5 -1
  742. package/src/node/latency-from-env.ts +1 -1
  743. package/src/node/log-file-sink.ts +6 -2
  744. package/src/node/log-preamble-node.ts +20 -10
  745. package/src/node/measure-memory.ts +5 -4
  746. package/src/node/memory-monitor.ts +10 -10
  747. package/src/node/node-file-system-provider.ts +214 -57
  748. package/src/node/profile-capture.ts +16 -15
  749. package/src/node/profiling-run.ts +30 -8
  750. package/src/node/rename-over-open-readers.ts +94 -0
  751. package/src/node/server-diagnostics.ts +1 -1
  752. package/src/node/server-state-snapshot.ts +28 -20
  753. package/src/node/socket-launcher.ts +78 -14
  754. package/src/node/startup-cpu-profile.ts +94 -0
  755. package/src/node/stdio-launcher.ts +29 -19
  756. package/src/node/validate-workspace.ts +8 -2
  757. package/src/testing/document-uri-policy-conformance.ts +1 -1
  758. package/src/testing/fake-document.ts +2 -1
  759. package/src/testing/index.ts +2 -1
  760. package/src/testing/langium-test-helpers.ts +1 -0
  761. package/src/testing/make-test-services.ts +83 -31
  762. package/src/testing/make-test-tracer.ts +26 -0
  763. package/src/testing/node/applied-edit-capture.ts +141 -0
  764. package/src/testing/node/index.ts +4 -1
  765. package/src/testing/node/lsp-harness.ts +2 -0
  766. package/src/testing/node/lsp-server-connection.ts +83 -119
  767. package/src/testing/node/scratch-workspace.ts +12 -6
  768. package/src/testing/node/settle-server.ts +89 -0
  769. package/src/testing/node/spawned-server.ts +57 -3
  770. package/src/testing/parse-semantic-root.ts +1 -1
  771. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  772. package/src/testing/playwright/index.ts +1 -0
  773. package/src/testing/playwright/server-log-capture.ts +137 -47
  774. package/src/testing/playwright/server-log-fixture.ts +46 -6
  775. package/src/testing/playwright/server-log-region.ts +32 -0
  776. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  777. package/src/testing/run-update-pipeline.ts +8 -5
  778. package/src/testing/stub-ast-document-manager.ts +47 -123
  779. package/src/testing/stub-document-builder.ts +128 -15
  780. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  781. package/src/testing/stub-langium-documents.ts +3 -2
  782. package/src/testing/stub-model-service.ts +9 -8
  783. package/src/testing/stub-project-manager.ts +10 -0
  784. package/src/testing/stub-self-save-registry.ts +1 -1
  785. package/src/testing/stub-service-registry.ts +1 -1
  786. package/src/testing/stub-writable-file-system.ts +3 -2
  787. package/src/util/connection-liveness.ts +81 -15
  788. package/src/util/environment.ts +24 -2
  789. package/lib/documents/language-client-text-shadow.d.ts +0 -124
  790. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  791. package/lib/documents/language-client-text-shadow.js +0 -190
  792. package/lib/documents/language-client-text-shadow.js.map +0 -1
  793. package/lib/documents/self-save-registry.d.ts.map +0 -1
  794. package/lib/documents/self-save-registry.js.map +0 -1
  795. package/lib/lsp/instrument-connection.d.ts +0 -36
  796. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  797. package/lib/lsp/instrument-connection.js +0 -62
  798. package/lib/lsp/instrument-connection.js.map +0 -1
  799. package/lib/node/process-memory.d.ts +0 -66
  800. package/lib/node/process-memory.d.ts.map +0 -1
  801. package/lib/node/process-memory.js +0 -252
  802. package/lib/node/process-memory.js.map +0 -1
  803. package/src/documents/language-client-text-shadow.ts +0 -211
  804. package/src/lsp/instrument-connection.ts +0 -66
  805. package/src/node/process-memory.ts +0 -299
@@ -7,10 +7,31 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
+ import { type Clock, type Tracer } from '@hydranium/protocol';
10
11
  import { DefaultWorkspaceLock, type MaybePromise } from '@hydranium/langium';
11
- import { type CancellationToken } from 'vscode-languageserver-protocol';
12
+ import { type CancellationToken, type Disposable } from 'vscode-languageserver-protocol';
13
+ import { type LogNameOptions } from '../diagnostics/logger.js';
14
+ import { type ServerSharedServicesMinimal } from '../shared-services.js';
12
15
  import { runInWriteLockScope } from './write-lock-scope.js';
13
16
 
17
+ /** Constructor options for {@link HydraniumWorkspaceLock}. */
18
+ export interface HydraniumWorkspaceLockOptions extends LogNameOptions {
19
+ /**
20
+ * How long a write may keep running after a later write cancelled it before
21
+ * the lock logs a warning. Every write and read waits behind it meanwhile, so
22
+ * one that never ends stops the server. Defaults to 10 s; `0` turns the
23
+ * check off.
24
+ */
25
+ readonly stalledWriteWarnMs?: number;
26
+ }
27
+
28
+ const DEFAULT_STALLED_WRITE_WARN_MS = 10_000;
29
+
30
+ /** The write action a {@link HydraniumWorkspaceLock} is running, with the timer its cancellation started. */
31
+ export interface RunningWrite {
32
+ stallTimer?: Disposable;
33
+ }
34
+
14
35
  /**
15
36
  * Langium's {@link DefaultWorkspaceLock} with the write action marked as a
16
37
  * write-lock scope, so anything it reaches can be asked whether the lock is
@@ -29,7 +50,85 @@ import { runInWriteLockScope } from './write-lock-scope.js';
29
50
  * would turn ordinary read-then-write sequences into false positives.
30
51
  */
31
52
  export class HydraniumWorkspaceLock extends DefaultWorkspaceLock {
53
+ /** Backs {@link writeCancellations}. */
54
+ protected cancelledWriteCount = 0;
55
+ protected readonly clock: Clock;
56
+ protected readonly tracer: Tracer;
57
+ protected readonly stalledWriteWarnMs: number;
58
+ protected runningWrite?: RunningWrite;
59
+ /** Writes queued and not yet started. */
60
+ protected queuedWrites = 0;
61
+
62
+ constructor(services: Pick<ServerSharedServicesMinimal, 'Clock' | 'Tracer'>, options: HydraniumWorkspaceLockOptions = {}) {
63
+ super();
64
+ this.clock = services.Clock;
65
+ this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceLock');
66
+ this.stalledWriteWarnMs = options.stalledWriteWarnMs ?? DEFAULT_STALLED_WRITE_WARN_MS;
67
+ }
68
+
69
+ /**
70
+ * How many calls to `write` or `cancelWrite` came while a write was still
71
+ * queued or running. A caller that reads this right after queuing a
72
+ * write, and reads the same number later, holds a write nothing has
73
+ * cancelled, whether it is still queued or already running. Its token
74
+ * answers that only once the write runs, since a queued write has not been
75
+ * handed it yet. A different number read after the caller's write ended
76
+ * does not prove that write was cancelled, since a later write that
77
+ * cancels another queued or running write counts too. A caller that
78
+ * retries on it builds once more than it needs to.
79
+ */
80
+ get writeCancellations(): number {
81
+ return this.cancelledWriteCount;
82
+ }
83
+
32
84
  override write(action: (token: CancellationToken) => MaybePromise<void>): Promise<void> {
33
- return super.write(token => runInWriteLockScope(() => action(token)));
85
+ const queued = super.write(token => {
86
+ this.queuedWrites--;
87
+ return runInWriteLockScope(() => this.runWrite(action, token));
88
+ });
89
+ // Counted after Langium's `write` has cancelled the write before it, so the new write does not count itself.
90
+ this.queuedWrites++;
91
+ return queued;
92
+ }
93
+
94
+ /** Run `action` as {@link runningWrite}, so a cancellation while it runs can time it. */
95
+ protected async runWrite(action: (token: CancellationToken) => MaybePromise<void>, token: CancellationToken): Promise<void> {
96
+ const running: RunningWrite = {};
97
+ this.runningWrite = running;
98
+ try {
99
+ await action(token);
100
+ } finally {
101
+ running.stallTimer?.dispose();
102
+ if (this.runningWrite === running) {
103
+ this.runningWrite = undefined;
104
+ }
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Counted here rather than in {@link write}, because Langium's `write` cancels
110
+ * through this method too. A write that has ended is not counted, so the
111
+ * next write does not count as cancelling it. A write running when this is
112
+ * called has been cancelled, by this call or an earlier one, so its timer
113
+ * starts here.
114
+ */
115
+ override cancelWrite(): void {
116
+ if (this.queuedWrites > 0 || this.runningWrite !== undefined) {
117
+ this.cancelledWriteCount++;
118
+ }
119
+ const running = this.runningWrite;
120
+ if (running && !running.stallTimer && this.stalledWriteWarnMs > 0) {
121
+ running.stallTimer = this.clock.setTimer(() => this.reportStalledWrite(), this.stalledWriteWarnMs);
122
+ }
123
+ super.cancelWrite();
124
+ }
125
+
126
+ protected reportStalledWrite(): void {
127
+ this.tracer.warn(
128
+ `A write is still running ${this.stalledWriteWarnMs} ms after it was cancelled, and every write and read waits behind it. ` +
129
+ 'Likely causes: a model-service write or rebuild from inside a build in a host with no write-lock scope tracker, ' +
130
+ 'which waits for the build it runs in, or a write action that ignores its cancellation token. ' +
131
+ 'See https://github.com/eclipse-emfcloud/hydranium/issues/245.'
132
+ );
34
133
  }
35
134
  }
@@ -7,19 +7,29 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Deferred, type Logger, type Tracer } from '@hydranium/protocol';
11
- import { DefaultWorkspaceManager, DocumentState, type LangiumDocument, UriUtils, type URI } from '@hydranium/langium';
12
- import { type CancellationToken, type InitializeParams } from 'vscode-languageserver';
10
+ import { Deferred, type Logger, type Tracer, describeError, describeErrorWithStack } from '@hydranium/protocol';
11
+ import {
12
+ DefaultWorkspaceManager,
13
+ DocumentState,
14
+ interruptAndCheck,
15
+ isOperationCancelled,
16
+ type LangiumDocument,
17
+ type Stream,
18
+ UriUtils,
19
+ type URI
20
+ } from '@hydranium/langium';
21
+ import { type CancellationToken, CancellationTokenSource, type InitializeParams } from 'vscode-languageserver';
13
22
  import type { WorkspaceFolder } from 'vscode-languageserver-types';
14
23
  import { type LogNameOptions, resolveLogFilePlaceholder, toLogFileWorkspaceToken } from '../diagnostics/logger.js';
15
24
  import type { ServerLocale } from '../../locale/server-locale.js';
16
25
  import type { ProjectChangeEvent } from '../project/project-change-event.js';
17
26
  import type { ProjectManager } from '../project/project-manager.js';
18
27
  import type { ServerSharedServicesMinimal } from '../shared-services.js';
19
- import type { WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
28
+ import type { WritableFileSystemProvider } from './file-system-provider.js';
20
29
  import { type DocumentUriPolicy, findRealpathDivergence } from './document-uri-policy.js';
21
30
  import { type AdditionalDocumentContribution, collectAdditionalDocuments } from './additional-document-contribution.js';
22
31
  import { onProcessEvent } from '../../util/environment.js';
32
+ import { isConnectionGoneError } from '../../util/connection-liveness.js';
23
33
 
24
34
  /**
25
35
  * Module-level guard so repeated workspace-manager construction (e.g.
@@ -37,6 +47,13 @@ let operationCancelledSuppressionInstalled = false;
37
47
  */
38
48
  let operationCancelledSuppressionLogger: Logger | undefined;
39
49
 
50
+ /**
51
+ * Never cancelled: `interruptAndCheck` yields only for a token other than
52
+ * `CancellationToken.None`, and the load must not stop part-way, since Langium
53
+ * checks for cancellation once every document exists.
54
+ */
55
+ const LOAD_YIELD_TOKEN = new CancellationTokenSource().token;
56
+
40
57
  /**
41
58
  * Decide what to do with a process-level unhandled promise rejection.
42
59
  *
@@ -60,7 +77,7 @@ export function handleProcessUnhandledRejection(reason: unknown, logger: Logger)
60
77
  if (typeof reason === 'symbol' && String(reason) === 'Symbol(OperationCancelled)') {
61
78
  return;
62
79
  }
63
- logger.error('Unhandled promise rejection: ' + (reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)));
80
+ logger.error('Unhandled promise rejection: ' + describeErrorWithStack(reason));
64
81
  }
65
82
 
66
83
  /**
@@ -93,6 +110,18 @@ export function installOperationCancelledSuppression(logger: Logger): void {
93
110
  });
94
111
  }
95
112
 
113
+ /** Options for {@link HydraniumWorkspaceManager}. */
114
+ export interface HydraniumWorkspaceManagerOptions extends LogNameOptions {
115
+ /**
116
+ * Whether startup warns about seeded documents the bound
117
+ * `FileSystemProvider` cannot serve (see
118
+ * {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved}). Defaults to
119
+ * `true`; turn it off for a host that drops such documents at their last
120
+ * close on purpose.
121
+ */
122
+ warnUnservedDocuments?: boolean;
123
+ }
124
+
96
125
  /**
97
126
  * Framework {@link DefaultWorkspaceManager} subclass that integrates the
98
127
  * project tier with Langium's workspace startup.
@@ -125,8 +154,9 @@ export function installOperationCancelledSuppression(logger: Logger): void {
125
154
  * URIs (its own members plus any transitive dependents per the
126
155
  * `getAffectedProjects` hook). This manager re-runs
127
156
  * `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
128
- * affected document so the next build cycle re-links them with the new
129
- * visibility scope.
157
+ * affected document so the build of the update that changed the descriptor
158
+ * re-links them with the new visibility scope. A project manager that defers
159
+ * the relink emits them from a follow-up build of its own instead.
130
160
  *
131
161
  * Descriptor URIs that triggered the cycle are intentionally excluded
132
162
  * from the affected set by `AbstractProjectManager.onBuildUpdate` —
@@ -163,8 +193,14 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
163
193
  protected readonly additionalDocuments: Record<string, AdditionalDocumentContribution>;
164
194
  /** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
165
195
  protected readonly languageRegistry: ServerSharedServicesMinimal['ServiceRegistry'];
196
+ /** Whether startup runs {@link warnIfDocumentsUnserved}. */
197
+ protected readonly warnUnservedDocuments: boolean;
198
+ /** URIs of the documents the running startup's file traversal loaded; see {@link loadWorkspaceDocuments}. */
199
+ protected readonly traversedUris = new Set<string>();
200
+ /** How many documents {@link loadWorkspaceDocuments} reads and parses before it may yield; below 1 counts as 1. */
201
+ protected readonly loadChunkSize: number = 10;
166
202
 
167
- constructor(services: ServerSharedServicesMinimal, options: LogNameOptions = {}) {
203
+ constructor(services: ServerSharedServicesMinimal, options: HydraniumWorkspaceManagerOptions = {}) {
168
204
  super(services);
169
205
  this.projectManager = services.workspace.ProjectManager;
170
206
  this.projectManager.onProjectsChanged(event => this.onProjectsChanged(event));
@@ -173,6 +209,7 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
173
209
  this.writableFileSystemProvider = services.workspace.FileSystemProvider;
174
210
  this.additionalDocuments = services.additionalDocuments;
175
211
  this.languageRegistry = services.ServiceRegistry;
212
+ this.warnUnservedDocuments = options.warnUnservedDocuments ?? true;
176
213
  this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceManager').trace('instantiated');
177
214
  installOperationCancelledSuppression(this.tracer);
178
215
  }
@@ -201,16 +238,16 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
201
238
  // seeded. `tags` is read at the done-emit, so the document count pushed
202
239
  // inside the callback appears in the log line.
203
240
  const tags: string[] = [`${contributions.length} contributions`];
204
- let documentCount = 0;
241
+ const seeded: LangiumDocument[] = [];
205
242
  await this.tracer.time(
206
243
  'Load additional documents',
207
244
  async () => {
208
245
  await collectAdditionalDocuments(this.additionalDocuments, folders, document => {
209
- documentCount++;
246
+ seeded.push(document);
210
247
  this.warnIfUnroutable(document);
211
248
  collector(document);
212
249
  });
213
- tags.push(`${documentCount} documents`);
250
+ tags.push(`${seeded.length} documents`);
214
251
  },
215
252
  'info',
216
253
  { logAfterMs: 0, tags }
@@ -221,17 +258,18 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
221
258
  * Warn when a seeded additional document's URI matches no registered
222
259
  * language.
223
260
  *
224
- * Such a document is added to the workspace and indexed, but every
225
- * per-language service is resolved per URI — so scope computation, naming,
226
- * validation and serialisation all fail to route to it, and it contributes
227
- * nothing to the scopes it was written to populate. Nothing else reports
228
- * this: the document exists, so no lookup errors, it is simply inert.
261
+ * Every per-language service is resolved per URI, so the workspace cannot
262
+ * load such a document: adding it throws, and the startup build fails
263
+ * with an error naming only the extension, not the document. This
264
+ * line names the document and the fix first.
229
265
  *
230
- * The usual cause is a `virtualUri` with no file extension:
231
- * `virtualUri(contributor)` yields `virtual:<contributor>`, and routing has
232
- * nothing to match on — there is no extension, and a virtual document is
233
- * never open in `TextDocuments`, so the declared-languageId rung cannot
234
- * serve it either. The convention is to end the URI with a registered
266
+ * The usual cause is a `fromModel` or `fromStringInLanguage` document
267
+ * under a `virtualUri` with no file extension: `virtualUri(contributor)`
268
+ * yields `virtual:<contributor>`, and routing has nothing to match on —
269
+ * there is no extension, and a virtual document is never open in
270
+ * `TextDocuments`, so the declared-languageId rung cannot serve it either.
271
+ * A `fromString` document under such a URI never gets here: its parse
272
+ * throws first. The convention is to end the URI with a registered
235
273
  * extension by passing it as the last segment,
236
274
  * `virtualUri(contributor, 'name.<ext>')`.
237
275
  */
@@ -241,17 +279,16 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
241
279
  }
242
280
  const extensions = this.languageRegistry.all.flatMap(language => language.LanguageMetaData.fileExtensions);
243
281
  this.tracer.warn(
244
- `Additional document '${document.uri.toString()}' matches no registered language, so every per-language ` +
245
- 'service (scope computation, naming, validation, serialization) will fail to route to it and it will ' +
246
- `contribute nothing to scopes. End its URI with a registered file extension (${extensions.join(', ')}); ` +
282
+ `Additional document '${document.uri.toString()}' matches no registered language, so the workspace ` +
283
+ `cannot load it and the startup build fails. End its URI with a registered file extension (${extensions.join(', ')}); ` +
247
284
  'for a virtual document that means passing it as the last segment, `virtualUri(contributor, "name.<ext>")`.'
248
285
  );
249
286
  }
250
287
 
251
288
  protected override async performStartup(folders: WorkspaceFolder[]): Promise<LangiumDocument[]> {
252
- // Resolve the `{workspace}` file-tee placeholder (if configured) as early
253
- // as possible — before any build logging — so per-workspace log capture
254
- // names its file correctly and the buffered startup lines flush.
289
+ // Supply the `{workspace}` placeholder as early as possible — before any
290
+ // build logging — so per-workspace log capture names its file correctly
291
+ // and the buffered startup lines flush; the CPU profile reads it too.
255
292
  this.resolveWorkspaceLogTarget(folders);
256
293
  // Snapshot the document set around discovery so the descriptor documents
257
294
  // it creates can be identified afterwards. Plain iteration rather than
@@ -272,11 +309,136 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
272
309
  discovered.push(document);
273
310
  }
274
311
  }
275
- const documents = await super.performStartup(folders);
312
+ this.traversedUris.clear();
313
+ let documents: LangiumDocument[];
314
+ try {
315
+ documents = await super.performStartup(folders);
316
+ if (this.warnUnservedDocuments) {
317
+ await this.warnIfDocumentsUnserved(documents.filter(document => !this.traversedUris.has(document.uri.toString())));
318
+ }
319
+ } finally {
320
+ this.traversedUris.clear();
321
+ }
276
322
  this.probePathDivergence(folders);
277
323
  return this.withDiscoveredDescriptors(documents, discovered);
278
324
  }
279
325
 
326
+ /**
327
+ * Load the documents the file traversal found through
328
+ * {@link loadTraversedDocument}, {@link loadChunkSize} at a time, yielding
329
+ * between chunks once Langium's interruption period has passed. Langium's
330
+ * own load starts every read at once and parses each as it returns: over a
331
+ * synchronous provider nothing else runs until the last file has parsed, and
332
+ * over the Node provider incoming messages wait through long runs of parses.
333
+ * The cost: at most a chunk of reads is in flight, and each chunk waits for
334
+ * its slowest read, so slow storage takes a round per chunk, not one burst.
335
+ *
336
+ * Each loaded document is recorded, so startup can tell them from the
337
+ * documents `loadAdditionalDocuments` seeded, through the
338
+ * `additionalDocuments` group or an override of its own.
339
+ *
340
+ * The traversal found each of its documents through the provider, so asking
341
+ * it again whether they exist costs one call per workspace file and cannot
342
+ * come out false. Telling them apart by scheme does not work either: the
343
+ * registry's host answers every scheme no other provider claims, a seeded
344
+ * scheme nobody serves included. An override that loads documents without
345
+ * delegating here leaves them unrecorded, so startup asks the provider
346
+ * about each of them.
347
+ */
348
+ protected override async loadWorkspaceDocuments(uris: Stream<URI>, collector: (document: LangiumDocument) => void): Promise<void> {
349
+ const pending = uris.toArray();
350
+ const chunkSize = Math.max(1, this.loadChunkSize);
351
+ for (let i = 0; i < pending.length; i += chunkSize) {
352
+ if (i > 0) {
353
+ await interruptAndCheck(LOAD_YIELD_TOKEN);
354
+ }
355
+ await Promise.all(
356
+ pending.slice(i, i + chunkSize).map(async uri => {
357
+ const document = await this.loadTraversedDocument(uri);
358
+ if (document) {
359
+ this.traversedUris.add(document.uri.toString());
360
+ collector(document);
361
+ }
362
+ })
363
+ );
364
+ }
365
+ }
366
+
367
+ /**
368
+ * Load one document the file traversal found, or answer `undefined` to
369
+ * leave it out of the workspace.
370
+ *
371
+ * A file whose read fails and that the provider's `existsSettled`, or
372
+ * `exists` for a provider without it, reports gone is left out with a debug
373
+ * line, since it went between the scan and the read. A file still there is
374
+ * read once more, since a replacing rename can hide its name for a moment;
375
+ * that read's failure, and cancellation, fail the startup. A check that
376
+ * throws counts the file as there, since it cannot say the file went. The
377
+ * skip is the startup's only: other callers of `getOrCreateDocument` still
378
+ * get the read error.
379
+ */
380
+ protected async loadTraversedDocument(uri: URI): Promise<LangiumDocument | undefined> {
381
+ try {
382
+ return await this.langiumDocuments.getOrCreateDocument(uri);
383
+ } catch (error: unknown) {
384
+ if (isOperationCancelled(error)) {
385
+ throw error;
386
+ }
387
+ const fileSystem = this.writableFileSystemProvider;
388
+ if (!(await (fileSystem.existsSettled?.(uri) ?? fileSystem.exists(uri)).catch(() => true))) {
389
+ this.tracer.debug(`Skipped ${uri.toString()}: it was removed between the workspace scan and its load`);
390
+ return undefined;
391
+ }
392
+ return this.langiumDocuments.getOrCreateDocument(uri);
393
+ }
394
+ }
395
+
396
+ /**
397
+ * Warn once when the bound `FileSystemProvider` cannot serve a seeded
398
+ * document, naming each such document's scheme.
399
+ *
400
+ * The last close keeps a document only if the provider says it `exists`, so
401
+ * each such document leaves the workspace the first time an editor closes
402
+ * it, and whatever resolved against it breaks. The framework's registry
403
+ * serves `virtual:` through the `fileSystemProviders` group and every other
404
+ * scheme through its host, which knows nothing of a scheme an adopter
405
+ * invented for its seeded documents, and nothing else reports the loss. A
406
+ * provider that throws counts as not serving the document, since a startup
407
+ * that failed on a diagnostic would be worse than the loss.
408
+ *
409
+ * Runs over every document startup collected outside the file traversal,
410
+ * which is what `loadAdditionalDocuments` seeded, through the
411
+ * `additionalDocuments` group or an override of that method, once startup
412
+ * has added them to the workspace, unless `warnUnservedDocuments` is
413
+ * `false`.
414
+ */
415
+ protected async warnIfDocumentsUnserved(documents: readonly LangiumDocument[]): Promise<void> {
416
+ const unserved: URI[] = [];
417
+ for (const document of documents) {
418
+ let served = false;
419
+ try {
420
+ served = await this.writableFileSystemProvider.exists(document.uri);
421
+ } catch {
422
+ // Counted as unserved, below.
423
+ }
424
+ if (!served) {
425
+ unserved.push(document.uri);
426
+ }
427
+ }
428
+ if (unserved.length === 0) {
429
+ return;
430
+ }
431
+ const schemes = [...new Set(unserved.map(uri => uri.scheme))];
432
+ const named = unserved.slice(0, 3).map(uri => uri.toString());
433
+ this.tracer.warn(
434
+ `${unserved.length} seeded document(s) under ${schemes.map(scheme => `${scheme}:`).join(', ')} cannot be served by the bound workspace.FileSystemProvider ` +
435
+ `(${named.join(', ')}${unserved.length > 3 ? ', …' : ''}), so each leaves the workspace at its ` +
436
+ `last close. Register a provider under the key ${schemes.map(scheme => `'${scheme}'`).join(', ')} in the shared ` +
437
+ 'fileSystemProviders group, or serve the scheme from the host provider; set warnUnservedDocuments: false ' +
438
+ 'to accept the loss.'
439
+ );
440
+ }
441
+
280
442
  /**
281
443
  * Add back the documents project discovery created that Langium's file
282
444
  * traversal then filtered out.
@@ -351,9 +513,10 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
351
513
  }
352
514
 
353
515
  /**
354
- * Resolve the `{workspace}` file-tee placeholder from the first workspace
355
- * folder. No-op when no folder is known or no `{workspace}`-templated log
356
- * target is configured. See {@link toLogFileWorkspaceToken} for the token
516
+ * Supply the `{workspace}` placeholder from the first workspace folder, which
517
+ * the log file-tee and the CPU profile's file name both read, whether or not
518
+ * a log target is configured. No-op when no folder is known. See
519
+ * {@link toLogFileWorkspaceToken} for the token
357
520
  * derivation — a log-capturing test harness uses the same function so the
358
521
  * server's file name and the harness's correlation key agree.
359
522
  */
@@ -396,22 +559,38 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
396
559
  * and either delegate to `super.initializeWorkspace(...)` (preserving the
397
560
  * default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
398
561
  * themselves after the additional work finishes.
562
+ *
563
+ * A failed setup is logged here, since every framework waiter on
564
+ * {@link workspaceInitialized} discards the rejection; an override that
565
+ * rejects the deferred itself logs its own failure. A failed startup also
566
+ * rejects `ready`, so its waiters fail rather than wait forever; an override
567
+ * that skips `super` and catches a failed startup rejects `_ready` too.
399
568
  */
400
569
  override async initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void> {
401
570
  try {
402
571
  await super.initializeWorkspace(folders, cancelToken);
403
572
  this.workspaceInitializedDeferred.resolve(undefined);
404
- } catch (error) {
573
+ } catch (error: unknown) {
574
+ if (isOperationCancelled(error) || isConnectionGoneError(error)) {
575
+ this.tracer.debug(`Initial workspace build did not complete: ${describeError(error)}`);
576
+ } else {
577
+ this.tracer.error(`Initial workspace build failed: ${describeErrorWithStack(error)}`);
578
+ }
405
579
  this.workspaceInitializedDeferred.reject(error);
580
+ // Langium settles `ready` only after a startup that succeeded. Marked
581
+ // handled, as logged above; a no-op once startup has resolved it.
582
+ this._ready.reject(error);
583
+ this._ready.promise.catch(() => undefined);
406
584
  throw error;
407
585
  }
408
586
  }
409
587
 
410
588
  /**
411
589
  * Default cascade-rebuild handler. Iterates {@link ProjectChangeEvent.affectedDocuments}
412
- * and resets each to {@link DocumentState.Changed} so the next build cycle
413
- * re-runs the pipeline (parse → link → validate) under the new project
414
- * visibility scope.
590
+ * and resets each to {@link DocumentState.Changed} so the build of the update
591
+ * that changed the descriptor re-runs the pipeline (parse → link → validate)
592
+ * under the new project visibility scope. Under the project manager's
593
+ * `deferMemberRelink`, its follow-up build emits the members instead.
415
594
  *
416
595
  * Subclasses can override for additional behaviour (e.g. logging,
417
596
  * telemetry, custom rebuild policies); call `super` to preserve the
@@ -9,21 +9,46 @@
9
9
 
10
10
  import { type FileSystemNode, URI } from '@hydranium/langium';
11
11
  import { defineMessage, type Tracer } from '@hydranium/protocol';
12
- import { type WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
12
+ import { type WritableFileSystemProvider } from './file-system-provider.js';
13
13
  import { type LogNameOptions } from '../diagnostics/logger.js';
14
14
  import { serverSharedFactory, type ServerSharedServicesMinimal } from '../shared-services.js';
15
- import { serveVirtualDocument } from './virtual-document.js';
15
+ import { notFound } from './file-not-found.js';
16
16
 
17
17
  /**
18
- * The browser host's spelling of "the document is not there". Its Node
19
- * counterpart is `NO_LOADABLE_CONTENT`: this provider has no `realpath`, so the
20
- * URI policy cannot answer the existence question ahead of the read and the miss
21
- * surfaces here instead.
18
+ * A provider's spelling of "the document is not there", raised wherever a read
19
+ * finds no content — this filesystem, or a URI naming no location a disk-backed
20
+ * provider can reach. Distinct from `NO_LOADABLE_CONTENT`, which the URI policy
21
+ * raises when it can settle the question AHEAD of the read; a provider with no
22
+ * `realpath` cannot, so the miss surfaces here instead.
22
23
  */
23
24
  export const NO_SUCH_FILE = defineMessage('hydranium/core/no-such-file', 'No such file: {uri}');
24
25
 
26
+ /** The same for a node of any kind, so it also covers a directory. */
25
27
  export const NO_SUCH_PATH = defineMessage('hydranium/core/no-such-path', 'No such file or directory: {uri}');
26
28
 
29
+ /**
30
+ * A write addressed a URI the provider cannot reach on disk.
31
+ *
32
+ * Deliberately not a not-found code: {@link NO_SUCH_FILE} reports something
33
+ * missing, which a caller may reasonably answer by creating it — exactly the
34
+ * wrong reading here. The destination is not missing; the URI names no disk
35
+ * location at all, and no retry makes it one.
36
+ *
37
+ * Declared here rather than beside the Node provider that raises it, so the
38
+ * message catalog stays reachable from the portable `.` entry — the Node
39
+ * module pulls `node:fs` and is server-only.
40
+ */
41
+ export const UNSUPPORTED_WRITE = defineMessage(
42
+ 'hydranium/core/unsupported-write',
43
+ 'Cannot write {uri}: the scheme names no location on disk'
44
+ );
45
+
46
+ /** A delete addressed a URI the provider cannot reach on disk, as {@link UNSUPPORTED_WRITE} a write. */
47
+ export const UNSUPPORTED_DELETE = defineMessage(
48
+ 'hydranium/core/unsupported-delete',
49
+ 'Cannot delete {uri}: the scheme names no location on disk'
50
+ );
51
+
27
52
  /**
28
53
  * File content keyed by path, for seeding an {@link InMemoryFileSystemProvider}.
29
54
  *
@@ -117,41 +142,47 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
117
142
  this.files.set(normalize(uri), content);
118
143
  }
119
144
 
120
- /** Remove the file at `uri`. A no-op when nothing is there. */
121
- deleteFile(uri: URI): void {
122
- this.files.delete(normalize(uri));
145
+ /** Remove the file at `uri`. A no-op when nothing is there; a directory is refused. */
146
+ async deleteFile(uri: URI): Promise<void> {
147
+ const key = normalize(uri);
148
+ if (this.hasChildren(key)) {
149
+ throw new Error(`Cannot delete ${uri.toString()}: it is a directory`);
150
+ }
151
+ this.files.delete(key);
123
152
  }
124
153
 
125
154
  async writeFile(uri: URI, content: string): Promise<void> {
126
155
  this.setFile(uri, content);
127
156
  }
128
157
 
129
- readFile(uri: URI): Promise<string> {
130
- return Promise.resolve(this.readFileSync(uri));
158
+ // `async` on each read whose sync twin can throw, rather than
159
+ // `Promise.resolve(this.<x>Sync(uri))`. That form evaluates the sync call
160
+ // FIRST, so a miss throws before `Promise.resolve` is ever reached — and a
161
+ // synchronous throw escapes the promise chain: `.catch()` never attaches and
162
+ // `Promise.all` dies while its argument array is still being built, so a
163
+ // caller reading several URIs cannot handle the miss it asked about.
164
+ async readFile(uri: URI): Promise<string> {
165
+ return this.readFileSync(uri);
131
166
  }
132
167
 
133
168
  readFileSync(uri: URI): string {
134
- const served = serveVirtualDocument(this.services, uri);
135
- if (served !== undefined) {
136
- return served;
137
- }
138
169
  const content = this.files.get(normalize(uri));
139
170
  if (content === undefined) {
140
- throw new Error(NO_SUCH_FILE.format({ uri: uri.toString() }));
171
+ throw notFound(NO_SUCH_FILE.format({ uri: uri.toString() }), uri);
141
172
  }
142
173
  return content;
143
174
  }
144
175
 
145
- readBinary(uri: URI): Promise<Uint8Array> {
146
- return Promise.resolve(this.readBinarySync(uri));
176
+ async readBinary(uri: URI): Promise<Uint8Array> {
177
+ return this.readBinarySync(uri);
147
178
  }
148
179
 
149
180
  readBinarySync(uri: URI): Uint8Array {
150
181
  return new TextEncoder().encode(this.readFileSync(uri));
151
182
  }
152
183
 
153
- stat(uri: URI): Promise<FileSystemNode> {
154
- return Promise.resolve(this.statSync(uri));
184
+ async stat(uri: URI): Promise<FileSystemNode> {
185
+ return this.statSync(uri);
155
186
  }
156
187
 
157
188
  statSync(uri: URI): FileSystemNode {
@@ -162,7 +193,7 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
162
193
  if (this.hasChildren(path)) {
163
194
  return { isFile: false, isDirectory: true, uri };
164
195
  }
165
- throw new Error(NO_SUCH_PATH.format({ uri: uri.toString() }));
196
+ throw notFound(NO_SUCH_PATH.format({ uri: uri.toString() }), uri);
166
197
  }
167
198
 
168
199
  exists(uri: URI): Promise<boolean> {
@@ -239,8 +270,8 @@ function normalize(uri: URI | string): string {
239
270
  * services context exactly where a Node host spreads `NodeFileSystem`.
240
271
  *
241
272
  * A host that needs to reach the provider afterwards — to seed or mutate it
242
- * mid-test — reads it back off `shared.workspace.FileSystemProvider`, since the
243
- * slot owns construction.
273
+ * mid-test — narrows `shared.workspace.FileSystemProvider.host` to this
274
+ * class, since the slot owns construction.
244
275
  */
245
276
  export function inMemoryFileSystem(options: InMemoryFileSystemOptions = {}): {
246
277
  fileSystemProvider: (services: unknown) => WritableFileSystemProvider;
@@ -7,10 +7,13 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
+ export * from './ast-node-locator.js';
10
11
  export * from './document-uri-policy.js';
11
12
  export * from './file-system-provider.js';
12
13
  export * from './in-memory-file-system-provider.js';
13
14
  export * from './persistent-file-system-provider.js';
15
+ export * from './self-save-registry.js';
16
+ export * from './syntax-errors.js';
14
17
  export * from './index-manager.js';
15
18
  export * from './initialize-workspace.js';
16
19
  export * from './langium-documents.js';