@hydranium/core 1.0.0-next.27 → 1.0.0-next.271

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 (735) hide show
  1. package/README.md +64 -82
  2. package/lib/documents/ast-document-manager.d.ts +219 -122
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +242 -130
  5. package/lib/documents/ast-document-manager.js.map +1 -1
  6. package/lib/documents/client-ids.d.ts +5 -19
  7. package/lib/documents/client-ids.d.ts.map +1 -1
  8. package/lib/documents/client-ids.js +5 -19
  9. package/lib/documents/client-ids.js.map +1 -1
  10. package/lib/documents/client-session-errors.d.ts +15 -0
  11. package/lib/documents/client-session-errors.d.ts.map +1 -0
  12. package/lib/documents/client-session-errors.js +15 -0
  13. package/lib/documents/client-session-errors.js.map +1 -0
  14. package/lib/documents/client-session-registry.d.ts +146 -0
  15. package/lib/documents/client-session-registry.d.ts.map +1 -0
  16. package/lib/documents/client-session-registry.js +207 -0
  17. package/lib/documents/client-session-registry.js.map +1 -0
  18. package/lib/documents/dirty-state-tracker.d.ts +86 -0
  19. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  20. package/lib/documents/dirty-state-tracker.js +72 -0
  21. package/lib/documents/dirty-state-tracker.js.map +1 -0
  22. package/lib/documents/document-release-handler.d.ts +204 -0
  23. package/lib/documents/document-release-handler.d.ts.map +1 -0
  24. package/lib/documents/document-release-handler.js +317 -0
  25. package/lib/documents/document-release-handler.js.map +1 -0
  26. package/lib/documents/document-release-scheduler.d.ts +67 -0
  27. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  28. package/lib/documents/document-release-scheduler.js +80 -0
  29. package/lib/documents/document-release-scheduler.js.map +1 -0
  30. package/lib/documents/file-system-task-queue.d.ts +49 -0
  31. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  32. package/lib/documents/file-system-task-queue.js +34 -0
  33. package/lib/documents/file-system-task-queue.js.map +1 -0
  34. package/lib/documents/hydranium-text-documents.d.ts +401 -282
  35. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  36. package/lib/documents/hydranium-text-documents.js +827 -483
  37. package/lib/documents/hydranium-text-documents.js.map +1 -1
  38. package/lib/documents/index.d.ts +10 -2
  39. package/lib/documents/index.d.ts.map +1 -1
  40. package/lib/documents/index.js +10 -2
  41. package/lib/documents/index.js.map +1 -1
  42. package/lib/documents/language-client-shadow.d.ts +218 -0
  43. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  44. package/lib/documents/language-client-shadow.js +284 -0
  45. package/lib/documents/language-client-shadow.js.map +1 -0
  46. package/lib/documents/model-ledger.d.ts +47 -0
  47. package/lib/documents/model-ledger.d.ts.map +1 -0
  48. package/lib/documents/model-ledger.js +30 -0
  49. package/lib/documents/model-ledger.js.map +1 -0
  50. package/lib/documents/text-ledger.d.ts +64 -0
  51. package/lib/documents/text-ledger.d.ts.map +1 -0
  52. package/lib/documents/text-ledger.js +63 -0
  53. package/lib/documents/text-ledger.js.map +1 -0
  54. package/lib/documents/version-sync-service.d.ts +138 -0
  55. package/lib/documents/version-sync-service.d.ts.map +1 -0
  56. package/lib/documents/version-sync-service.js +173 -0
  57. package/lib/documents/version-sync-service.js.map +1 -0
  58. package/lib/index.d.ts +5 -0
  59. package/lib/index.d.ts.map +1 -1
  60. package/lib/index.js +8 -0
  61. package/lib/index.js.map +1 -1
  62. package/lib/langium/ast-extension/ast-extension-service.d.ts +3 -0
  63. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  64. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  65. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  66. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  67. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  68. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  69. package/lib/langium/bootstrap.d.ts +34 -25
  70. package/lib/langium/bootstrap.d.ts.map +1 -1
  71. package/lib/langium/bootstrap.js +77 -37
  72. package/lib/langium/bootstrap.js.map +1 -1
  73. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +1 -1
  74. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  75. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  76. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +1 -1
  77. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  78. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  79. package/lib/langium/composite-ast-reflection.js +97 -0
  80. package/lib/langium/composite-ast-reflection.js.map +1 -0
  81. package/lib/langium/config/configuration-provider.d.ts +81 -0
  82. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  83. package/lib/langium/config/configuration-provider.js +112 -0
  84. package/lib/langium/config/configuration-provider.js.map +1 -0
  85. package/lib/langium/config/index.d.ts +1 -0
  86. package/lib/langium/config/index.d.ts.map +1 -1
  87. package/lib/langium/config/index.js +1 -0
  88. package/lib/langium/config/index.js.map +1 -1
  89. package/lib/langium/config/settings.js.map +1 -1
  90. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  91. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  92. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  93. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  94. package/lib/langium/diagnostics/log-preamble.js +1 -1
  95. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  96. package/lib/langium/diagnostics/logger.d.ts +10 -3
  97. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  98. package/lib/langium/diagnostics/logger.js +12 -5
  99. package/lib/langium/diagnostics/logger.js.map +1 -1
  100. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  101. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  102. package/lib/langium/diagnostics/lsp-logger.js +58 -17
  103. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  104. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  105. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  106. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  107. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  108. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  109. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  110. package/lib/langium/document-builder/build-session.d.ts +6 -5
  111. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  112. package/lib/langium/document-builder/build-session.js +5 -5
  113. package/lib/langium/document-builder/build-session.js.map +1 -1
  114. package/lib/langium/document-builder/document-builder.d.ts +309 -35
  115. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  116. package/lib/langium/document-builder/document-builder.js +511 -75
  117. package/lib/langium/document-builder/document-builder.js.map +1 -1
  118. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  119. package/lib/langium/documentation/comment-provider.js.map +1 -1
  120. package/lib/langium/integration-services.d.ts +61 -19
  121. package/lib/langium/integration-services.d.ts.map +1 -1
  122. package/lib/langium/integration-services.js +10 -5
  123. package/lib/langium/integration-services.js.map +1 -1
  124. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  125. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  126. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  127. package/lib/langium/integrity/integrity-service.d.ts +83 -27
  128. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  129. package/lib/langium/integrity/integrity-service.js +273 -63
  130. package/lib/langium/integrity/integrity-service.js.map +1 -1
  131. package/lib/langium/keys/containment.d.ts +64 -0
  132. package/lib/langium/keys/containment.d.ts.map +1 -0
  133. package/lib/langium/keys/containment.js +53 -0
  134. package/lib/langium/keys/containment.js.map +1 -0
  135. package/lib/langium/keys/index.d.ts +1 -0
  136. package/lib/langium/keys/index.d.ts.map +1 -1
  137. package/lib/langium/keys/index.js +1 -0
  138. package/lib/langium/keys/index.js.map +1 -1
  139. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  140. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  141. package/lib/langium/keys/name-based-key-provider.js +4 -0
  142. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  143. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  144. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  145. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  146. package/lib/langium/labeling/label-provider.js.map +1 -1
  147. package/lib/langium/language-module.d.ts +30 -5
  148. package/lib/langium/language-module.d.ts.map +1 -1
  149. package/lib/langium/language-module.js +18 -4
  150. package/lib/langium/language-module.js.map +1 -1
  151. package/lib/langium/model-service/client-session.d.ts +343 -0
  152. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  153. package/lib/langium/model-service/client-session.js +428 -0
  154. package/lib/langium/model-service/client-session.js.map +1 -0
  155. package/lib/langium/model-service/index.d.ts +2 -0
  156. package/lib/langium/model-service/index.d.ts.map +1 -1
  157. package/lib/langium/model-service/index.js +2 -0
  158. package/lib/langium/model-service/index.js.map +1 -1
  159. package/lib/langium/model-service/model-events.d.ts +61 -0
  160. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  161. package/lib/langium/model-service/model-events.js +10 -0
  162. package/lib/langium/model-service/model-events.js.map +1 -0
  163. package/lib/langium/model-service/model-service.d.ts +433 -282
  164. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  165. package/lib/langium/model-service/model-service.js +537 -441
  166. package/lib/langium/model-service/model-service.js.map +1 -1
  167. package/lib/langium/module.d.ts +151 -36
  168. package/lib/langium/module.d.ts.map +1 -1
  169. package/lib/langium/module.js +48 -36
  170. package/lib/langium/module.js.map +1 -1
  171. package/lib/langium/naming/name-provider.d.ts +27 -6
  172. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  173. package/lib/langium/naming/name-provider.js +4 -3
  174. package/lib/langium/naming/name-provider.js.map +1 -1
  175. package/lib/langium/naming/name-separator-validation.d.ts +23 -1
  176. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  177. package/lib/langium/naming/name-separator-validation.js +22 -0
  178. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  179. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  180. package/lib/langium/project/abstract-project-manager.js +13 -6
  181. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  182. package/lib/langium/project/project-change-event.d.ts +2 -2
  183. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  184. package/lib/langium/project/single-project-manager.js.map +1 -1
  185. package/lib/langium/residency/cst-residency-service.d.ts +35 -12
  186. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  187. package/lib/langium/residency/cst-residency-service.js +23 -57
  188. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  189. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  190. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  191. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  192. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  193. package/lib/langium/scope/fallback-scope.js +35 -0
  194. package/lib/langium/scope/fallback-scope.js.map +1 -0
  195. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  196. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  197. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  198. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  199. package/lib/langium/scope/hydranium-scope-provider.d.ts +61 -24
  200. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  201. package/lib/langium/scope/hydranium-scope-provider.js +74 -35
  202. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  203. package/lib/langium/scope/index.d.ts +1 -0
  204. package/lib/langium/scope/index.d.ts.map +1 -1
  205. package/lib/langium/scope/index.js +1 -0
  206. package/lib/langium/scope/index.js.map +1 -1
  207. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  208. package/lib/langium/scope/reference-builder.js.map +1 -1
  209. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  210. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  211. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  212. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  213. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  214. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  215. package/lib/langium/scope/scope-extension-service.js +57 -29
  216. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  217. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  218. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  219. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  220. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  221. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  222. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  223. package/lib/langium/serialization/abstract-serializer.js +12 -21
  224. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  225. package/lib/langium/serialization/json-serializer.d.ts +1 -1
  226. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  227. package/lib/langium/serialization/json-serializer.js.map +1 -1
  228. package/lib/langium/serialization/serializer.d.ts +1 -1
  229. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  230. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  231. package/lib/langium/service-registry.d.ts +29 -1
  232. package/lib/langium/service-registry.d.ts.map +1 -1
  233. package/lib/langium/service-registry.js +37 -0
  234. package/lib/langium/service-registry.js.map +1 -1
  235. package/lib/langium/shared-services.d.ts +23 -6
  236. package/lib/langium/shared-services.d.ts.map +1 -1
  237. package/lib/langium/shared-services.js.map +1 -1
  238. package/lib/langium/single-langium-copy.d.ts +22 -0
  239. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  240. package/lib/langium/single-langium-copy.js +36 -0
  241. package/lib/langium/single-langium-copy.js.map +1 -0
  242. package/lib/langium/transfer/transfer-encoder.d.ts +88 -36
  243. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  244. package/lib/langium/transfer/transfer-encoder.js +46 -24
  245. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  246. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  247. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  248. package/lib/langium/trivia/comment-preserver.js +906 -0
  249. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  250. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  251. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  252. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  253. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  254. package/lib/langium/trivia/index.d.ts +14 -0
  255. package/lib/langium/trivia/index.d.ts.map +1 -0
  256. package/lib/langium/trivia/index.js +14 -0
  257. package/lib/langium/trivia/index.js.map +1 -0
  258. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  259. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  260. package/lib/langium/trivia/trivia-contribution.js +10 -0
  261. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  262. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  263. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  264. package/lib/langium/trivia/trivia-preserver.js +10 -0
  265. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  266. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  267. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  268. package/lib/langium/trivia/trivia-service.js +56 -0
  269. package/lib/langium/trivia/trivia-service.js.map +1 -0
  270. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  271. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  272. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  273. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  274. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  275. package/lib/langium/validation/document-validator.d.ts +280 -9
  276. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  277. package/lib/langium/validation/document-validator.js +453 -8
  278. package/lib/langium/validation/document-validator.js.map +1 -1
  279. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  280. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  281. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  282. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  283. package/lib/langium/workspace/document-uri-policy.d.ts +15 -10
  284. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  285. package/lib/langium/workspace/document-uri-policy.js +7 -5
  286. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  287. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  288. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  289. package/lib/langium/workspace/file-not-found.js +31 -0
  290. package/lib/langium/workspace/file-not-found.js.map +1 -0
  291. package/lib/langium/workspace/file-system-provider.d.ts +147 -9
  292. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  293. package/lib/langium/workspace/file-system-provider.js +97 -14
  294. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  295. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  296. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  297. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  298. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  299. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  300. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  301. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  302. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  303. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
  304. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  305. package/lib/langium/workspace/hydranium-workspace-manager.js +129 -12
  306. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  307. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +22 -7
  308. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  309. package/lib/langium/workspace/in-memory-file-system-provider.js +36 -19
  310. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  311. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  312. package/lib/langium/workspace/index-manager.js.map +1 -1
  313. package/lib/langium/workspace/index.d.ts +1 -0
  314. package/lib/langium/workspace/index.d.ts.map +1 -1
  315. package/lib/langium/workspace/index.js +1 -0
  316. package/lib/langium/workspace/index.js.map +1 -1
  317. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  318. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  319. package/lib/langium/workspace/initialize-workspace.js +13 -5
  320. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  321. package/lib/langium/workspace/langium-documents.d.ts +37 -4
  322. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  323. package/lib/langium/workspace/langium-documents.js +49 -4
  324. package/lib/langium/workspace/langium-documents.js.map +1 -1
  325. package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
  326. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  327. package/lib/langium/workspace/persistent-file-system-provider.js +2 -8
  328. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  329. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  330. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  331. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  332. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  333. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  334. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  335. package/lib/langium/workspace/virtual-document.js +78 -18
  336. package/lib/langium/workspace/virtual-document.js.map +1 -1
  337. package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
  338. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  339. package/lib/langium/workspace/write-lock-scope.js +12 -4
  340. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  341. package/lib/launcher/integrated-server.d.ts +3 -1
  342. package/lib/launcher/integrated-server.d.ts.map +1 -1
  343. package/lib/locale/index.d.ts +10 -0
  344. package/lib/locale/index.d.ts.map +1 -0
  345. package/lib/locale/index.js +10 -0
  346. package/lib/locale/index.js.map +1 -0
  347. package/lib/locale/server-locale.d.ts +73 -0
  348. package/lib/locale/server-locale.d.ts.map +1 -0
  349. package/lib/locale/server-locale.js +61 -0
  350. package/lib/locale/server-locale.js.map +1 -0
  351. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  352. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  353. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  354. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  355. package/lib/lsp/connection-features.d.ts +23 -0
  356. package/lib/lsp/connection-features.d.ts.map +1 -0
  357. package/lib/lsp/connection-features.js +60 -0
  358. package/lib/lsp/connection-features.js.map +1 -0
  359. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  360. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  361. package/lib/lsp/diagnostics-connection.js +53 -0
  362. package/lib/lsp/diagnostics-connection.js.map +1 -0
  363. package/lib/lsp/hydranium-document-update-handler.d.ts +92 -81
  364. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  365. package/lib/lsp/hydranium-document-update-handler.js +155 -101
  366. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  367. package/lib/lsp/index.d.ts +3 -1
  368. package/lib/lsp/index.d.ts.map +1 -1
  369. package/lib/lsp/index.js +3 -1
  370. package/lib/lsp/index.js.map +1 -1
  371. package/lib/lsp/lsp-latency.d.ts +39 -0
  372. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  373. package/lib/lsp/lsp-latency.js +58 -0
  374. package/lib/lsp/lsp-latency.js.map +1 -0
  375. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  376. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  377. package/lib/lsp/semantic-token-provider.js +55 -8
  378. package/lib/lsp/semantic-token-provider.js.map +1 -1
  379. package/lib/lsp/shared-module.d.ts +4 -8
  380. package/lib/lsp/shared-module.d.ts.map +1 -1
  381. package/lib/lsp/shared-module.js.map +1 -1
  382. package/lib/lsp/start-language-server.d.ts +8 -7
  383. package/lib/lsp/start-language-server.d.ts.map +1 -1
  384. package/lib/lsp/start-language-server.js +13 -7
  385. package/lib/lsp/start-language-server.js.map +1 -1
  386. package/lib/messages/carriers.d.ts +18 -12
  387. package/lib/messages/carriers.d.ts.map +1 -1
  388. package/lib/messages/carriers.js +22 -13
  389. package/lib/messages/carriers.js.map +1 -1
  390. package/lib/messages/index.d.ts +4 -1
  391. package/lib/messages/index.d.ts.map +1 -1
  392. package/lib/messages/index.js +4 -1
  393. package/lib/messages/index.js.map +1 -1
  394. package/lib/messages/renderer.d.ts +142 -0
  395. package/lib/messages/renderer.d.ts.map +1 -0
  396. package/lib/messages/renderer.js +165 -0
  397. package/lib/messages/renderer.js.map +1 -0
  398. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  399. package/lib/node/event-loop-monitor.js +2 -1
  400. package/lib/node/event-loop-monitor.js.map +1 -1
  401. package/lib/node/heap-ceiling.d.ts +61 -0
  402. package/lib/node/heap-ceiling.d.ts.map +1 -0
  403. package/lib/node/heap-ceiling.js +72 -0
  404. package/lib/node/heap-ceiling.js.map +1 -0
  405. package/lib/node/index.d.ts +1 -1
  406. package/lib/node/index.d.ts.map +1 -1
  407. package/lib/node/index.js +1 -1
  408. package/lib/node/index.js.map +1 -1
  409. package/lib/node/latency-from-env.d.ts +1 -1
  410. package/lib/node/latency-from-env.js +1 -1
  411. package/lib/node/lint-grammar.js.map +1 -1
  412. package/lib/node/log-preamble-node.d.ts +5 -3
  413. package/lib/node/log-preamble-node.d.ts.map +1 -1
  414. package/lib/node/log-preamble-node.js +13 -10
  415. package/lib/node/log-preamble-node.js.map +1 -1
  416. package/lib/node/measure-memory.d.ts.map +1 -1
  417. package/lib/node/measure-memory.js +5 -4
  418. package/lib/node/measure-memory.js.map +1 -1
  419. package/lib/node/memory-monitor.d.ts +2 -2
  420. package/lib/node/memory-monitor.d.ts.map +1 -1
  421. package/lib/node/memory-monitor.js +9 -10
  422. package/lib/node/memory-monitor.js.map +1 -1
  423. package/lib/node/node-file-system-provider.d.ts +54 -9
  424. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  425. package/lib/node/node-file-system-provider.js +141 -52
  426. package/lib/node/node-file-system-provider.js.map +1 -1
  427. package/lib/node/profile-capture.d.ts +12 -4
  428. package/lib/node/profile-capture.d.ts.map +1 -1
  429. package/lib/node/profile-capture.js +8 -6
  430. package/lib/node/profile-capture.js.map +1 -1
  431. package/lib/node/profile-digest.js.map +1 -1
  432. package/lib/node/profiling-run.d.ts +13 -3
  433. package/lib/node/profiling-run.d.ts.map +1 -1
  434. package/lib/node/profiling-run.js +17 -8
  435. package/lib/node/profiling-run.js.map +1 -1
  436. package/lib/node/rename-over-open-readers.d.ts +61 -0
  437. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  438. package/lib/node/rename-over-open-readers.js +80 -0
  439. package/lib/node/rename-over-open-readers.js.map +1 -0
  440. package/lib/node/server-diagnostics.js +1 -1
  441. package/lib/node/server-diagnostics.js.map +1 -1
  442. package/lib/node/server-state-snapshot.js +4 -4
  443. package/lib/node/server-state-snapshot.js.map +1 -1
  444. package/lib/node/socket-launcher.d.ts +20 -4
  445. package/lib/node/socket-launcher.d.ts.map +1 -1
  446. package/lib/node/socket-launcher.js +8 -7
  447. package/lib/node/socket-launcher.js.map +1 -1
  448. package/lib/node/stdio-launcher.d.ts +6 -5
  449. package/lib/node/stdio-launcher.d.ts.map +1 -1
  450. package/lib/node/stdio-launcher.js +13 -4
  451. package/lib/node/stdio-launcher.js.map +1 -1
  452. package/lib/testing/document-uri-policy-conformance.js +1 -1
  453. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  454. package/lib/testing/fake-description.js.map +1 -1
  455. package/lib/testing/fake-document.d.ts +16 -4
  456. package/lib/testing/fake-document.d.ts.map +1 -1
  457. package/lib/testing/fake-document.js +18 -3
  458. package/lib/testing/fake-document.js.map +1 -1
  459. package/lib/testing/index.d.ts +1 -1
  460. package/lib/testing/index.d.ts.map +1 -1
  461. package/lib/testing/index.js +2 -1
  462. package/lib/testing/index.js.map +1 -1
  463. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  464. package/lib/testing/langium-test-helpers.js +1 -0
  465. package/lib/testing/langium-test-helpers.js.map +1 -1
  466. package/lib/testing/make-noop-language-services.js.map +1 -1
  467. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  468. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  469. package/lib/testing/make-noop-shared-services.js +28 -2
  470. package/lib/testing/make-noop-shared-services.js.map +1 -1
  471. package/lib/testing/make-test-services.d.ts +72 -14
  472. package/lib/testing/make-test-services.d.ts.map +1 -1
  473. package/lib/testing/make-test-services.js +42 -10
  474. package/lib/testing/make-test-services.js.map +1 -1
  475. package/lib/testing/make-test-tracer.d.ts +12 -0
  476. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  477. package/lib/testing/make-test-tracer.js +13 -0
  478. package/lib/testing/make-test-tracer.js.map +1 -1
  479. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  480. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  481. package/lib/testing/node/applied-edit-capture.js +115 -0
  482. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  483. package/lib/testing/node/golden-corpus.js.map +1 -1
  484. package/lib/testing/node/index.d.ts +1 -0
  485. package/lib/testing/node/index.d.ts.map +1 -1
  486. package/lib/testing/node/index.js +1 -0
  487. package/lib/testing/node/index.js.map +1 -1
  488. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  489. package/lib/testing/node/lsp-harness.js +2 -0
  490. package/lib/testing/node/lsp-harness.js.map +1 -1
  491. package/lib/testing/node/lsp-server-connection.d.ts +12 -4
  492. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  493. package/lib/testing/node/lsp-server-connection.js +45 -106
  494. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  495. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  496. package/lib/testing/node/scratch-workspace.js +10 -5
  497. package/lib/testing/node/scratch-workspace.js.map +1 -1
  498. package/lib/testing/node/spawned-server.d.ts +30 -1
  499. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  500. package/lib/testing/node/spawned-server.js +39 -2
  501. package/lib/testing/node/spawned-server.js.map +1 -1
  502. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  503. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  504. package/lib/testing/node/unhandled-rejections.js +32 -0
  505. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  506. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  507. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  508. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  509. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  510. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  511. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  512. package/lib/testing/playwright/index.d.ts +1 -0
  513. package/lib/testing/playwright/index.d.ts.map +1 -1
  514. package/lib/testing/playwright/index.js +1 -0
  515. package/lib/testing/playwright/index.js.map +1 -1
  516. package/lib/testing/playwright/server-log-capture.d.ts +35 -8
  517. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  518. package/lib/testing/playwright/server-log-capture.js +39 -6
  519. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  520. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  521. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  522. package/lib/testing/playwright/server-log-fixture.js +25 -6
  523. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  524. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  525. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  526. package/lib/testing/playwright/server-log-region.js +30 -0
  527. package/lib/testing/playwright/server-log-region.js.map +1 -0
  528. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  529. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  530. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  531. package/lib/testing/run-update-pipeline.d.ts +6 -5
  532. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  533. package/lib/testing/run-update-pipeline.js.map +1 -1
  534. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  535. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  536. package/lib/testing/stub-ast-document-manager.js +24 -65
  537. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  538. package/lib/testing/stub-document-builder.d.ts +33 -11
  539. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  540. package/lib/testing/stub-document-builder.js +103 -5
  541. package/lib/testing/stub-document-builder.js.map +1 -1
  542. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  543. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  544. package/lib/testing/stub-hydranium-text-documents.js +115 -16
  545. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  546. package/lib/testing/stub-index-manager.js.map +1 -1
  547. package/lib/testing/stub-langium-documents.d.ts +3 -2
  548. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  549. package/lib/testing/stub-langium-documents.js.map +1 -1
  550. package/lib/testing/stub-model-service.d.ts +9 -8
  551. package/lib/testing/stub-model-service.d.ts.map +1 -1
  552. package/lib/testing/stub-model-service.js +6 -6
  553. package/lib/testing/stub-model-service.js.map +1 -1
  554. package/lib/testing/stub-project-manager.js.map +1 -1
  555. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  556. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  557. package/lib/testing/stub-service-registry.d.ts +1 -1
  558. package/lib/testing/stub-service-registry.js.map +1 -1
  559. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  560. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  561. package/lib/testing/stub-writable-file-system.js +2 -1
  562. package/lib/testing/stub-writable-file-system.js.map +1 -1
  563. package/lib/util/connection-liveness.d.ts +19 -6
  564. package/lib/util/connection-liveness.d.ts.map +1 -1
  565. package/lib/util/connection-liveness.js +61 -15
  566. package/lib/util/connection-liveness.js.map +1 -1
  567. package/lib/util/environment.d.ts.map +1 -1
  568. package/lib/util/environment.js.map +1 -1
  569. package/lib/util/registry.d.ts.map +1 -1
  570. package/package.json +29 -53
  571. package/src/documents/ast-document-manager.ts +383 -231
  572. package/src/documents/client-ids.ts +5 -22
  573. package/src/documents/client-session-errors.ts +24 -0
  574. package/src/documents/client-session-registry.ts +262 -0
  575. package/src/documents/dirty-state-tracker.ts +140 -0
  576. package/src/documents/document-release-handler.ts +404 -0
  577. package/src/documents/document-release-scheduler.ts +121 -0
  578. package/src/documents/file-system-task-queue.ts +68 -0
  579. package/src/documents/hydranium-text-documents.ts +944 -595
  580. package/src/documents/index.ts +10 -2
  581. package/src/documents/language-client-shadow.ts +452 -0
  582. package/src/documents/model-ledger.ts +66 -0
  583. package/src/documents/text-ledger.ts +112 -0
  584. package/src/documents/version-sync-service.ts +275 -0
  585. package/src/index.ts +8 -0
  586. package/src/langium/ast-extension/ast-extension-service.ts +3 -0
  587. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  588. package/src/langium/bootstrap.ts +77 -37
  589. package/src/langium/build-phase-pass/build-phase-pass-service.ts +1 -1
  590. package/src/langium/build-phase-pass/build-phase-pass.ts +1 -1
  591. package/src/langium/composite-ast-reflection.ts +112 -0
  592. package/src/langium/config/configuration-provider.ts +119 -0
  593. package/src/langium/config/index.ts +1 -0
  594. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  595. package/src/langium/diagnostics/log-preamble.ts +1 -1
  596. package/src/langium/diagnostics/logger.ts +12 -5
  597. package/src/langium/diagnostics/lsp-logger.ts +61 -16
  598. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  599. package/src/langium/document-builder/build-session.ts +4 -3
  600. package/src/langium/document-builder/document-builder.ts +616 -73
  601. package/src/langium/integration-services.ts +83 -24
  602. package/src/langium/integrity/integrity-rule.ts +16 -8
  603. package/src/langium/integrity/integrity-service.ts +296 -69
  604. package/src/langium/keys/containment.ts +87 -0
  605. package/src/langium/keys/index.ts +1 -0
  606. package/src/langium/keys/name-based-key-provider.ts +4 -0
  607. package/src/langium/language-module.ts +49 -8
  608. package/src/langium/model-service/client-session.ts +661 -0
  609. package/src/langium/model-service/index.ts +2 -0
  610. package/src/langium/model-service/model-events.ts +75 -0
  611. package/src/langium/model-service/model-service.ts +824 -471
  612. package/src/langium/module.ts +201 -66
  613. package/src/langium/naming/name-provider.ts +29 -7
  614. package/src/langium/naming/name-separator-validation.ts +25 -3
  615. package/src/langium/project/abstract-project-manager.ts +13 -5
  616. package/src/langium/project/project-change-event.ts +2 -2
  617. package/src/langium/residency/cst-residency-service.ts +50 -16
  618. package/src/langium/scope/fallback-scope.ts +38 -0
  619. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  620. package/src/langium/scope/hydranium-scope-provider.ts +89 -38
  621. package/src/langium/scope/index.ts +1 -0
  622. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  623. package/src/langium/scope/scope-extension-service.ts +74 -59
  624. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  625. package/src/langium/serialization/abstract-serializer.ts +13 -32
  626. package/src/langium/serialization/serializer.ts +1 -1
  627. package/src/langium/service-registry.ts +41 -2
  628. package/src/langium/shared-services.ts +26 -6
  629. package/src/langium/single-langium-copy.ts +42 -0
  630. package/src/langium/transfer/transfer-encoder.ts +115 -47
  631. package/src/langium/trivia/comment-preserver.ts +1100 -0
  632. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  633. package/src/langium/trivia/index.ts +14 -0
  634. package/src/langium/trivia/trivia-contribution.ts +39 -0
  635. package/src/langium/trivia/trivia-preserver.ts +54 -0
  636. package/src/langium/trivia/trivia-service.ts +99 -0
  637. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  638. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  639. package/src/langium/validation/document-validator.ts +528 -13
  640. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  641. package/src/langium/workspace/document-uri-policy.ts +15 -10
  642. package/src/langium/workspace/file-not-found.ts +35 -0
  643. package/src/langium/workspace/file-system-provider.ts +221 -17
  644. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  645. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  646. package/src/langium/workspace/hydranium-workspace-manager.ts +155 -16
  647. package/src/langium/workspace/in-memory-file-system-provider.ts +41 -20
  648. package/src/langium/workspace/index.ts +1 -0
  649. package/src/langium/workspace/initialize-workspace.ts +43 -5
  650. package/src/langium/workspace/langium-documents.ts +63 -5
  651. package/src/langium/workspace/persistent-file-system-provider.ts +3 -9
  652. package/src/langium/workspace/self-save-registry.ts +118 -0
  653. package/src/langium/workspace/virtual-document.ts +96 -19
  654. package/src/langium/workspace/write-lock-scope.ts +24 -11
  655. package/src/launcher/integrated-server.ts +3 -1
  656. package/src/locale/index.ts +10 -0
  657. package/src/locale/server-locale.ts +86 -0
  658. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  659. package/src/lsp/connection-features.ts +67 -0
  660. package/src/lsp/diagnostics-connection.ts +56 -0
  661. package/src/lsp/hydranium-document-update-handler.ts +197 -110
  662. package/src/lsp/index.ts +3 -1
  663. package/src/lsp/lsp-latency.ts +62 -0
  664. package/src/lsp/semantic-token-provider.ts +74 -7
  665. package/src/lsp/shared-module.ts +4 -8
  666. package/src/lsp/start-language-server.ts +13 -7
  667. package/src/messages/carriers.ts +23 -15
  668. package/src/messages/index.ts +13 -1
  669. package/src/messages/renderer.ts +212 -0
  670. package/src/node/event-loop-monitor.ts +2 -1
  671. package/src/node/heap-ceiling.ts +108 -0
  672. package/src/node/index.ts +1 -1
  673. package/src/node/latency-from-env.ts +1 -1
  674. package/src/node/log-preamble-node.ts +20 -10
  675. package/src/node/measure-memory.ts +5 -4
  676. package/src/node/memory-monitor.ts +10 -10
  677. package/src/node/node-file-system-provider.ts +157 -56
  678. package/src/node/profile-capture.ts +16 -15
  679. package/src/node/profiling-run.ts +30 -8
  680. package/src/node/rename-over-open-readers.ts +94 -0
  681. package/src/node/server-diagnostics.ts +1 -1
  682. package/src/node/server-state-snapshot.ts +5 -5
  683. package/src/node/socket-launcher.ts +27 -11
  684. package/src/node/stdio-launcher.ts +18 -9
  685. package/src/testing/document-uri-policy-conformance.ts +1 -1
  686. package/src/testing/fake-document.ts +24 -5
  687. package/src/testing/index.ts +2 -1
  688. package/src/testing/langium-test-helpers.ts +1 -0
  689. package/src/testing/make-noop-shared-services.ts +50 -2
  690. package/src/testing/make-test-services.ts +125 -31
  691. package/src/testing/make-test-tracer.ts +26 -0
  692. package/src/testing/node/applied-edit-capture.ts +139 -0
  693. package/src/testing/node/index.ts +1 -0
  694. package/src/testing/node/lsp-harness.ts +2 -0
  695. package/src/testing/node/lsp-server-connection.ts +74 -117
  696. package/src/testing/node/scratch-workspace.ts +10 -5
  697. package/src/testing/node/spawned-server.ts +57 -3
  698. package/src/testing/node/unhandled-rejections.ts +31 -0
  699. package/src/testing/parse-semantic-root.ts +1 -1
  700. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  701. package/src/testing/playwright/index.ts +1 -0
  702. package/src/testing/playwright/server-log-capture.ts +63 -11
  703. package/src/testing/playwright/server-log-fixture.ts +46 -6
  704. package/src/testing/playwright/server-log-region.ts +32 -0
  705. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  706. package/src/testing/run-update-pipeline.ts +6 -5
  707. package/src/testing/stub-ast-document-manager.ts +36 -138
  708. package/src/testing/stub-document-builder.ts +133 -18
  709. package/src/testing/stub-hydranium-text-documents.ts +165 -27
  710. package/src/testing/stub-langium-documents.ts +3 -2
  711. package/src/testing/stub-model-service.ts +11 -10
  712. package/src/testing/stub-self-save-registry.ts +1 -1
  713. package/src/testing/stub-service-registry.ts +1 -1
  714. package/src/testing/stub-writable-file-system.ts +3 -2
  715. package/src/util/connection-liveness.ts +67 -15
  716. package/src/util/environment.ts +9 -1
  717. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  718. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  719. package/lib/documents/language-client-text-shadow.js +0 -156
  720. package/lib/documents/language-client-text-shadow.js.map +0 -1
  721. package/lib/documents/self-save-registry.d.ts +0 -55
  722. package/lib/documents/self-save-registry.d.ts.map +0 -1
  723. package/lib/documents/self-save-registry.js.map +0 -1
  724. package/lib/lsp/instrument-connection.d.ts +0 -36
  725. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  726. package/lib/lsp/instrument-connection.js +0 -62
  727. package/lib/lsp/instrument-connection.js.map +0 -1
  728. package/lib/node/process-memory.d.ts +0 -66
  729. package/lib/node/process-memory.d.ts.map +0 -1
  730. package/lib/node/process-memory.js +0 -252
  731. package/lib/node/process-memory.js.map +0 -1
  732. package/src/documents/language-client-text-shadow.ts +0 -175
  733. package/src/documents/self-save-registry.ts +0 -81
  734. package/src/lsp/instrument-connection.ts +0 -66
  735. package/src/node/process-memory.ts +0 -299
@@ -7,18 +7,28 @@
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 } from 'vscode-languageserver';
10
+ import { Deferred, type Logger, type Tracer, describeError, describeErrorWithStack } from '@hydranium/protocol';
11
+ import {
12
+ DefaultWorkspaceManager,
13
+ DocumentState,
14
+ isOperationCancelled,
15
+ type LangiumDocument,
16
+ type Stream,
17
+ UriUtils,
18
+ type URI
19
+ } from '@hydranium/langium';
20
+ import { type CancellationToken, type InitializeParams } from 'vscode-languageserver';
13
21
  import type { WorkspaceFolder } from 'vscode-languageserver-types';
14
22
  import { type LogNameOptions, resolveLogFilePlaceholder, toLogFileWorkspaceToken } from '../diagnostics/logger.js';
23
+ import type { ServerLocale } from '../../locale/server-locale.js';
15
24
  import type { ProjectChangeEvent } from '../project/project-change-event.js';
16
25
  import type { ProjectManager } from '../project/project-manager.js';
17
26
  import type { ServerSharedServicesMinimal } from '../shared-services.js';
18
- import type { WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
27
+ import type { WritableFileSystemProvider } from './file-system-provider.js';
19
28
  import { type DocumentUriPolicy, findRealpathDivergence } from './document-uri-policy.js';
20
29
  import { type AdditionalDocumentContribution, collectAdditionalDocuments } from './additional-document-contribution.js';
21
30
  import { onProcessEvent } from '../../util/environment.js';
31
+ import { isConnectionGoneError } from '../../util/connection-liveness.js';
22
32
 
23
33
  /**
24
34
  * Module-level guard so repeated workspace-manager construction (e.g.
@@ -59,7 +69,7 @@ export function handleProcessUnhandledRejection(reason: unknown, logger: Logger)
59
69
  if (typeof reason === 'symbol' && String(reason) === 'Symbol(OperationCancelled)') {
60
70
  return;
61
71
  }
62
- logger.error('Unhandled promise rejection: ' + (reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)));
72
+ logger.error('Unhandled promise rejection: ' + describeErrorWithStack(reason));
63
73
  }
64
74
 
65
75
  /**
@@ -92,6 +102,18 @@ export function installOperationCancelledSuppression(logger: Logger): void {
92
102
  });
93
103
  }
94
104
 
105
+ /** Options for {@link HydraniumWorkspaceManager}. */
106
+ export interface HydraniumWorkspaceManagerOptions extends LogNameOptions {
107
+ /**
108
+ * Whether startup warns about seeded documents the bound
109
+ * `FileSystemProvider` cannot serve (see
110
+ * {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved}). Defaults to
111
+ * `true`; turn it off for a host that drops such documents at their last
112
+ * close on purpose.
113
+ */
114
+ warnUnservedDocuments?: boolean;
115
+ }
116
+
95
117
  /**
96
118
  * Framework {@link DefaultWorkspaceManager} subclass that integrates the
97
119
  * project tier with Langium's workspace startup.
@@ -124,8 +146,8 @@ export function installOperationCancelledSuppression(logger: Logger): void {
124
146
  * URIs (its own members plus any transitive dependents per the
125
147
  * `getAffectedProjects` hook). This manager re-runs
126
148
  * `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
127
- * affected document so the next build cycle re-links them with the new
128
- * visibility scope.
149
+ * affected document so the build of the update that changed the descriptor
150
+ * re-links them with the new visibility scope.
129
151
  *
130
152
  * Descriptor URIs that triggered the cycle are intentionally excluded
131
153
  * from the affected set by `AbstractProjectManager.onBuildUpdate` —
@@ -156,19 +178,27 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
156
178
  readonly workspaceInitialized: Promise<unknown> = this.workspaceInitializedDeferred.promise;
157
179
 
158
180
  protected readonly uriPolicy: DocumentUriPolicy;
181
+ /** Handed the client's locale at init; read by whoever renders in it. */
182
+ protected readonly serverLocale: ServerLocale;
159
183
  protected readonly writableFileSystemProvider: WritableFileSystemProvider;
160
184
  protected readonly additionalDocuments: Record<string, AdditionalDocumentContribution>;
161
185
  /** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
162
186
  protected readonly languageRegistry: ServerSharedServicesMinimal['ServiceRegistry'];
187
+ /** Whether startup runs {@link warnIfDocumentsUnserved}. */
188
+ protected readonly warnUnservedDocuments: boolean;
189
+ /** URIs of the documents the running startup's file traversal loaded; see {@link loadWorkspaceDocuments}. */
190
+ protected readonly traversedUris = new Set<string>();
163
191
 
164
- constructor(services: ServerSharedServicesMinimal, options: LogNameOptions = {}) {
192
+ constructor(services: ServerSharedServicesMinimal, options: HydraniumWorkspaceManagerOptions = {}) {
165
193
  super(services);
166
194
  this.projectManager = services.workspace.ProjectManager;
167
195
  this.projectManager.onProjectsChanged(event => this.onProjectsChanged(event));
168
196
  this.uriPolicy = services.workspace.DocumentUriPolicy;
197
+ this.serverLocale = services.ServerLocale;
169
198
  this.writableFileSystemProvider = services.workspace.FileSystemProvider;
170
199
  this.additionalDocuments = services.additionalDocuments;
171
200
  this.languageRegistry = services.ServiceRegistry;
201
+ this.warnUnservedDocuments = options.warnUnservedDocuments ?? true;
172
202
  this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceManager').trace('instantiated');
173
203
  installOperationCancelledSuppression(this.tracer);
174
204
  }
@@ -197,16 +227,16 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
197
227
  // seeded. `tags` is read at the done-emit, so the document count pushed
198
228
  // inside the callback appears in the log line.
199
229
  const tags: string[] = [`${contributions.length} contributions`];
200
- let documentCount = 0;
230
+ const seeded: LangiumDocument[] = [];
201
231
  await this.tracer.time(
202
232
  'Load additional documents',
203
233
  async () => {
204
234
  await collectAdditionalDocuments(this.additionalDocuments, folders, document => {
205
- documentCount++;
235
+ seeded.push(document);
206
236
  this.warnIfUnroutable(document);
207
237
  collector(document);
208
238
  });
209
- tags.push(`${documentCount} documents`);
239
+ tags.push(`${seeded.length} documents`);
210
240
  },
211
241
  'info',
212
242
  { logAfterMs: 0, tags }
@@ -268,11 +298,86 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
268
298
  discovered.push(document);
269
299
  }
270
300
  }
271
- const documents = await super.performStartup(folders);
301
+ this.traversedUris.clear();
302
+ let documents: LangiumDocument[];
303
+ try {
304
+ documents = await super.performStartup(folders);
305
+ if (this.warnUnservedDocuments) {
306
+ await this.warnIfDocumentsUnserved(documents.filter(document => !this.traversedUris.has(document.uri.toString())));
307
+ }
308
+ } finally {
309
+ this.traversedUris.clear();
310
+ }
272
311
  this.probePathDivergence(folders);
273
312
  return this.withDiscoveredDescriptors(documents, discovered);
274
313
  }
275
314
 
315
+ /**
316
+ * Record each document the file traversal loads, so startup can tell them
317
+ * from the documents `loadAdditionalDocuments` seeded, through the
318
+ * `additionalDocuments` group or an override of its own.
319
+ *
320
+ * The traversal found each of its documents through the provider, so asking
321
+ * it again whether they exist costs one call per workspace file and cannot
322
+ * come out false. Telling them apart by scheme does not work either: the
323
+ * registry's host answers every scheme no other provider claims, a seeded
324
+ * scheme nobody serves included. An override that loads documents without
325
+ * delegating here leaves them unrecorded, so startup asks the provider
326
+ * about each of them.
327
+ */
328
+ protected override async loadWorkspaceDocuments(uris: Stream<URI>, collector: (document: LangiumDocument) => void): Promise<void> {
329
+ await super.loadWorkspaceDocuments(uris, document => {
330
+ this.traversedUris.add(document.uri.toString());
331
+ collector(document);
332
+ });
333
+ }
334
+
335
+ /**
336
+ * Warn once when the bound `FileSystemProvider` cannot serve a seeded
337
+ * document, naming each such document's scheme.
338
+ *
339
+ * The last close keeps a document only if the provider says it `exists`, so
340
+ * each such document leaves the workspace the first time an editor closes
341
+ * it, and whatever resolved against it breaks. The framework's registry
342
+ * serves `virtual:` through the `fileSystemProviders` group and every other
343
+ * scheme through its host, which knows nothing of a scheme an adopter
344
+ * invented for its seeded documents, and nothing else reports the loss. A
345
+ * provider that throws counts as not serving the document, since a startup
346
+ * that failed on a diagnostic would be worse than the loss.
347
+ *
348
+ * Runs over every document startup collected outside the file traversal,
349
+ * which is what `loadAdditionalDocuments` seeded, through the
350
+ * `additionalDocuments` group or an override of that method, once startup
351
+ * has added them to the workspace, unless `warnUnservedDocuments` is
352
+ * `false`.
353
+ */
354
+ protected async warnIfDocumentsUnserved(documents: readonly LangiumDocument[]): Promise<void> {
355
+ const unserved: URI[] = [];
356
+ for (const document of documents) {
357
+ let served = false;
358
+ try {
359
+ served = await this.writableFileSystemProvider.exists(document.uri);
360
+ } catch {
361
+ // Counted as unserved, below.
362
+ }
363
+ if (!served) {
364
+ unserved.push(document.uri);
365
+ }
366
+ }
367
+ if (unserved.length === 0) {
368
+ return;
369
+ }
370
+ const schemes = [...new Set(unserved.map(uri => uri.scheme))];
371
+ const named = unserved.slice(0, 3).map(uri => uri.toString());
372
+ this.tracer.warn(
373
+ `${unserved.length} seeded document(s) under ${schemes.map(scheme => `${scheme}:`).join(', ')} cannot be served by the bound workspace.FileSystemProvider ` +
374
+ `(${named.join(', ')}${unserved.length > 3 ? ', …' : ''}), so each leaves the workspace at its ` +
375
+ `last close. Register a provider under the key ${schemes.map(scheme => `'${scheme}'`).join(', ')} in the shared ` +
376
+ 'fileSystemProviders group, or serve the scheme from the host provider; set warnUnservedDocuments: false ' +
377
+ 'to accept the loss.'
378
+ );
379
+ }
380
+
276
381
  /**
277
382
  * Add back the documents project discovery created that Langium's file
278
383
  * traversal then filtered out.
@@ -360,6 +465,31 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
360
465
  }
361
466
  }
362
467
 
468
+ /**
469
+ * Forward the locale the client declared, then Langium's own read of the
470
+ * params. `DefaultWorkspaceManager.initialize` reads `workspaceFolders`
471
+ * alone, so `params.locale` would otherwise be discarded — and this is the
472
+ * only place it arrives, which the headless init seams route through too.
473
+ *
474
+ * **The ABSENT case is reported from here rather than from `ServerLocale`,
475
+ * because this is the only end that can see it.** `accept` is not called
476
+ * when no locale was declared — nor should it be, since `''` is a claim
477
+ * about a language rather than the absence of one — so a log written there
478
+ * covers one of the two outcomes and leaves the other looking like a server
479
+ * that never reached init. Both lines are at `info` for the reason `accept`
480
+ * gives: the framework ships no catalogue, so an undeclared locale and an
481
+ * untranslated code produce the same English and the log is what separates
482
+ * them.
483
+ */
484
+ override initialize(params: InitializeParams): void {
485
+ if (params.locale) {
486
+ this.serverLocale.accept(params.locale);
487
+ } else {
488
+ this.tracer.info("no locale declared at init — rendering messages in the framework's English");
489
+ }
490
+ super.initialize(params);
491
+ }
492
+
363
493
  /**
364
494
  * Override of Langium's workspace setup to resolve / reject
365
495
  * {@link workspaceInitializedDeferred} once setup completes. Adopters with
@@ -367,12 +497,21 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
367
497
  * and either delegate to `super.initializeWorkspace(...)` (preserving the
368
498
  * default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
369
499
  * themselves after the additional work finishes.
500
+ *
501
+ * A failed setup is logged here, since every framework waiter on
502
+ * {@link workspaceInitialized} discards the rejection; an override that
503
+ * rejects the deferred itself logs its own failure.
370
504
  */
371
505
  override async initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void> {
372
506
  try {
373
507
  await super.initializeWorkspace(folders, cancelToken);
374
508
  this.workspaceInitializedDeferred.resolve(undefined);
375
- } catch (error) {
509
+ } catch (error: unknown) {
510
+ if (isOperationCancelled(error) || isConnectionGoneError(error)) {
511
+ this.tracer.debug(`Initial workspace build did not complete: ${describeError(error)}`);
512
+ } else {
513
+ this.tracer.error(`Initial workspace build failed: ${describeErrorWithStack(error)}`);
514
+ }
376
515
  this.workspaceInitializedDeferred.reject(error);
377
516
  throw error;
378
517
  }
@@ -380,9 +519,9 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
380
519
 
381
520
  /**
382
521
  * Default cascade-rebuild handler. Iterates {@link ProjectChangeEvent.affectedDocuments}
383
- * and resets each to {@link DocumentState.Changed} so the next build cycle
384
- * re-runs the pipeline (parse → link → validate) under the new project
385
- * visibility scope.
522
+ * and resets each to {@link DocumentState.Changed} so the build of the update
523
+ * that changed the descriptor re-runs the pipeline (parse → link → validate)
524
+ * under the new project visibility scope.
386
525
  *
387
526
  * Subclasses can override for additional behaviour (e.g. logging,
388
527
  * telemetry, custom rebuild policies); call `super` to preserve the
@@ -9,21 +9,40 @@
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
+
27
46
  /**
28
47
  * File content keyed by path, for seeding an {@link InMemoryFileSystemProvider}.
29
48
  *
@@ -126,32 +145,34 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
126
145
  this.setFile(uri, content);
127
146
  }
128
147
 
129
- readFile(uri: URI): Promise<string> {
130
- return Promise.resolve(this.readFileSync(uri));
148
+ // `async` on each read whose sync twin can throw, rather than
149
+ // `Promise.resolve(this.<x>Sync(uri))`. That form evaluates the sync call
150
+ // FIRST, so a miss throws before `Promise.resolve` is ever reached — and a
151
+ // synchronous throw escapes the promise chain: `.catch()` never attaches and
152
+ // `Promise.all` dies while its argument array is still being built, so a
153
+ // caller reading several URIs cannot handle the miss it asked about.
154
+ async readFile(uri: URI): Promise<string> {
155
+ return this.readFileSync(uri);
131
156
  }
132
157
 
133
158
  readFileSync(uri: URI): string {
134
- const served = serveVirtualDocument(this.services, uri);
135
- if (served !== undefined) {
136
- return served;
137
- }
138
159
  const content = this.files.get(normalize(uri));
139
160
  if (content === undefined) {
140
- throw new Error(NO_SUCH_FILE.format({ uri: uri.toString() }));
161
+ throw notFound(NO_SUCH_FILE.format({ uri: uri.toString() }), uri);
141
162
  }
142
163
  return content;
143
164
  }
144
165
 
145
- readBinary(uri: URI): Promise<Uint8Array> {
146
- return Promise.resolve(this.readBinarySync(uri));
166
+ async readBinary(uri: URI): Promise<Uint8Array> {
167
+ return this.readBinarySync(uri);
147
168
  }
148
169
 
149
170
  readBinarySync(uri: URI): Uint8Array {
150
171
  return new TextEncoder().encode(this.readFileSync(uri));
151
172
  }
152
173
 
153
- stat(uri: URI): Promise<FileSystemNode> {
154
- return Promise.resolve(this.statSync(uri));
174
+ async stat(uri: URI): Promise<FileSystemNode> {
175
+ return this.statSync(uri);
155
176
  }
156
177
 
157
178
  statSync(uri: URI): FileSystemNode {
@@ -162,7 +183,7 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
162
183
  if (this.hasChildren(path)) {
163
184
  return { isFile: false, isDirectory: true, uri };
164
185
  }
165
- throw new Error(NO_SUCH_PATH.format({ uri: uri.toString() }));
186
+ throw notFound(NO_SUCH_PATH.format({ uri: uri.toString() }), uri);
166
187
  }
167
188
 
168
189
  exists(uri: URI): Promise<boolean> {
@@ -239,8 +260,8 @@ function normalize(uri: URI | string): string {
239
260
  * services context exactly where a Node host spreads `NodeFileSystem`.
240
261
  *
241
262
  * 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.
263
+ * mid-test — narrows `shared.workspace.FileSystemProvider.host` to this
264
+ * class, since the slot owns construction.
244
265
  */
245
266
  export function inMemoryFileSystem(options: InMemoryFileSystemOptions = {}): {
246
267
  fileSystemProvider: (services: unknown) => WritableFileSystemProvider;
@@ -11,6 +11,7 @@ export * from './document-uri-policy.js';
11
11
  export * from './file-system-provider.js';
12
12
  export * from './in-memory-file-system-provider.js';
13
13
  export * from './persistent-file-system-provider.js';
14
+ export * from './self-save-registry.js';
14
15
  export * from './index-manager.js';
15
16
  export * from './initialize-workspace.js';
16
17
  export * from './langium-documents.js';
@@ -8,6 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { UriUtils, URI } from '@hydranium/langium';
11
+ import type { Locale } from '@hydranium/protocol';
11
12
  // Bare `'path'` (not `node:path`) so a browser bundle can alias it to a POSIX
12
13
  // shim — this is the only filesystem-path use left on the portable `.` entry,
13
14
  // and it's the headless/CLI string-input convenience of `toWorkspaceFolders`.
@@ -18,6 +19,33 @@ import type { ServerSharedServicesMinimal } from '../shared-services.js';
18
19
  /** A workspace folder root accepted by the headless init seams: a filesystem path or a {@link URI}. */
19
20
  export type WorkspaceFolderInput = string | URI;
20
21
 
22
+ /**
23
+ * Options for the headless init seams.
24
+ *
25
+ * **Optional, and the parameter is optional too**, so that no existing caller
26
+ * has to change to gain a field it does not set.
27
+ */
28
+ export interface ProgrammaticInitOptions {
29
+ /**
30
+ * The locale to render user-facing server messages in — the headless
31
+ * equivalent of LSP `initialize`'s `locale`, for a head with no LSP
32
+ * connection (`startStdioServer`, the CLI subcommands, a test harness).
33
+ *
34
+ * Omitted means no locale, which the default renderer resolves as the
35
+ * framework's English. That is the correct answer for a headless tool: it
36
+ * has no reading user to have a language.
37
+ *
38
+ * **An IETF language tag, hyphenated — `de`, `de-CH`, `zh-Hant-TW` — and
39
+ * not the POSIX or Java spelling.** An LSP client is held to that syntax by
40
+ * the protocol, while a headless caller supplies the string itself and the
41
+ * obvious source is an environment variable holding `de_DE` or
42
+ * `en_US.UTF-8`. Neither is a tag, and the string is passed through
43
+ * unchecked, so a renderer that parses it finds nothing to match and every
44
+ * message renders in English.
45
+ */
46
+ readonly locale?: Locale;
47
+ }
48
+
21
49
  /**
22
50
  * Normalize the seam's flexible folder argument to LSP {@link WorkspaceFolder}s.
23
51
  * A `string` is resolved to an absolute filesystem path and wrapped as a
@@ -58,17 +86,25 @@ function toWorkspaceFolders(folders: WorkspaceFolderInput | ReadonlyArray<Worksp
58
86
  *
59
87
  * @param services the shared services tree the workspace manager lives on
60
88
  * @param folders one or more workspace roots (filesystem paths or URIs)
89
+ * @param options the message locale, when the caller has one
61
90
  */
62
91
  export async function initializeWorkspaceProgrammatically(
63
92
  services: ServerSharedServicesMinimal,
64
- folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>
93
+ folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>,
94
+ options: ProgrammaticInitOptions = {}
65
95
  ): Promise<void> {
66
96
  const workspaceFolders = toWorkspaceFolders(folders);
67
97
  const manager = services.workspace.WorkspaceManager;
68
- // `initialize` records the folders (DefaultWorkspaceManager reads only this
98
+ // `locale` goes through the synthesized params rather than a direct
99
+ // `acceptLocale` call, so this seam and a real LSP `initialize` reach the
100
+ // slot by the SAME path — an adopter overriding the capture in
101
+ // `HydraniumWorkspaceManager.initialize` is honoured headlessly too, which a
102
+ // second write site here would silently bypass.
103
+ //
104
+ // `initialize` records the folders (DefaultWorkspaceManager reads only that
69
105
  // field); `initialized` runs `mutex.write(initializeWorkspace)` and resolves
70
106
  // once discovery + the init build settle, so awaiting it is the ready gate.
71
- manager.initialize({ workspaceFolders } as InitializeParams);
107
+ manager.initialize({ workspaceFolders, locale: options.locale } as InitializeParams);
72
108
  await manager.initialized({} as InitializedParams);
73
109
  }
74
110
 
@@ -91,12 +127,14 @@ export async function initializeWorkspaceProgrammatically(
91
127
  *
92
128
  * @param services the shared services tree the workspace manager lives on
93
129
  * @param folders one or more workspace roots (filesystem paths or URIs)
130
+ * @param options the message locale, when the caller has one
94
131
  */
95
132
  export async function buildWorkspaceProgrammatically(
96
133
  services: ServerSharedServicesMinimal,
97
- folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>
134
+ folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>,
135
+ options: ProgrammaticInitOptions = {}
98
136
  ): Promise<void> {
99
- await initializeWorkspaceProgrammatically(services, folders);
137
+ await initializeWorkspaceProgrammatically(services, folders, options);
100
138
  const documents = services.workspace.LangiumDocuments.all.toArray();
101
139
  await services.workspace.DocumentBuilder.build(documents, { validation: true });
102
140
  }
@@ -7,10 +7,11 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { type AstNode, DefaultLangiumDocuments, type LangiumDocument, type LangiumDocuments, type URI } from '@hydranium/langium';
10
+ import { type AstNode, DefaultLangiumDocuments, type LangiumDocument, type LangiumDocuments, type URI, UriUtils } from '@hydranium/langium';
11
11
  import { defineMessage } from '@hydranium/protocol';
12
12
  import { type ServerSharedServicesMinimal } from '../shared-services.js';
13
13
  import { type DocumentUriPolicy } from './document-uri-policy.js';
14
+ import { type HydraniumLangiumDocumentFactory } from './hydranium-langium-document-factory.js';
14
15
 
15
16
  /**
16
17
  * The document a caller asked to load is not there.
@@ -22,6 +23,19 @@ import { type DocumentUriPolicy } from './document-uri-policy.js';
22
23
  */
23
24
  export const NO_LOADABLE_CONTENT = defineMessage('hydranium/core/no-loadable-content', 'No loadable content for {uri}');
24
25
 
26
+ /**
27
+ * A stand-in was asked for at a URI that routes to no grammar, and no language
28
+ * id was given to route it instead.
29
+ *
30
+ * User-facing, and raised BEFORE the parse: left to Langium's ladder the same
31
+ * condition surfaces as `no services for the extension ''`, which names neither
32
+ * the URI nor the argument that would have answered.
33
+ */
34
+ export const NO_LANGUAGE_FOR_STAND_IN = defineMessage(
35
+ 'hydranium/core/no-language-for-stand-in',
36
+ 'No grammar routes {uri}; pass a languageId to say which one the stand-in should parse with'
37
+ );
38
+
25
39
  /**
26
40
  * The registry surface the framework adds on top of Langium's
27
41
  * {@link LangiumDocuments}. Declared separately from the implementing class so
@@ -30,7 +44,7 @@ export const NO_LOADABLE_CONTENT = defineMessage('hydranium/core/no-loadable-con
30
44
  * depend on itself.
31
45
  */
32
46
  export interface HydraniumDocumentRegistry extends LangiumDocuments {
33
- createEmptyDocument(uri: URI): LangiumDocument<AstNode>;
47
+ createEmptyDocument(uri: URI, languageId?: string): LangiumDocument<AstNode>;
34
48
  }
35
49
 
36
50
  /**
@@ -58,6 +72,13 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
58
72
  /** Document-identity seam, shared with the text store, event filters, and builder. */
59
73
  protected readonly uriPolicy: DocumentUriPolicy;
60
74
 
75
+ /**
76
+ * Narrows the inherited Langium factory field to the framework's, so the
77
+ * language-explicit `fromStringInLanguage` below needs no cast. The
78
+ * framework's shared module binds that class.
79
+ */
80
+ declare protected readonly langiumDocumentFactory: HydraniumLangiumDocumentFactory;
81
+
61
82
  constructor(protected override readonly services: ServerSharedServicesMinimal) {
62
83
  super(services);
63
84
  this.uriPolicy = services.workspace.DocumentUriPolicy;
@@ -65,8 +86,9 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
65
86
 
66
87
  /**
67
88
  * Build a transient document for `uri` by parsing empty text with the
68
- * grammar `uri` routes to, so the root is that language's entry type with
69
- * every containment list initialised.
89
+ * grammar `languageId` names, or the one `uri` routes to when it is
90
+ * omitted, so the root is that language's entry type with every containment
91
+ * list initialised.
70
92
  *
71
93
  * For callers that need a document at a URI with no content on disk — the
72
94
  * scope provider querying before a file exists is the case it was added for.
@@ -75,6 +97,15 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
75
97
  * that silently is not the file, whereas calling this is a caller saying it
76
98
  * wants a stand-in.
77
99
  *
100
+ * **Pass `languageId` whenever the URI names no file.** The create-element
101
+ * flow this exists for asks at the DIRECTORY a file is about to be written
102
+ * into, and a directory URI has no extension for the routing ladder to end
103
+ * on — so omitting the id there fails inside the parse, on an empty
104
+ * extension rather than on the URI. A caller in that position always knows
105
+ * its language: {@link HydraniumScopeProvider} is bound per grammar, and a
106
+ * request that names no document at all still carries the AST type
107
+ * `ExtendedServiceRegistry.soleServicesByType` routes on.
108
+ *
78
109
  * The result is not registered, so nothing downstream can see it, and
79
110
  * `LangiumDocumentFactory.update` would read from disk. It is a probe, not a
80
111
  * document under construction; content that must survive belongs in a
@@ -86,12 +117,32 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
86
117
  * and it is kept: `AstReflection.isComplete` is `false` for such a root
87
118
  * however it is built, so the error states the same thing.
88
119
  */
89
- createEmptyDocument(uri: URI): LangiumDocument<AstNode> {
120
+ createEmptyDocument(uri: URI, languageId?: string): LangiumDocument<AstNode> {
121
+ if (languageId !== undefined) {
122
+ return this.langiumDocumentFactory.fromStringInLanguage('', uri, languageId);
123
+ }
124
+ if (!this.services.ServiceRegistry.getServicesFor(uri)) {
125
+ // Reported here rather than left to the parse, which ends on the empty
126
+ // extension and so names neither the URI nor the id that would have
127
+ // answered.
128
+ throw new Error(NO_LANGUAGE_FOR_STAND_IN.format({ uri: uri.toString() }));
129
+ }
90
130
  // The two-argument overload is synchronous; passing a cancellation token
91
131
  // selects the promise-returning one, which this contract cannot await.
92
132
  return this.langiumDocumentFactory.fromString('', uri);
93
133
  }
94
134
 
135
+ /**
136
+ * Registers `document`, then reports it to `VersionSyncService.modelProduced`:
137
+ * a first load parses outside the build, so no build's re-parse reports it.
138
+ * That marks one below `Parsed`, such as the builder's placeholder for a new
139
+ * file, as a placeholder. A rejected duplicate is not reported.
140
+ */
141
+ override addDocument(document: LangiumDocument): void {
142
+ super.addDocument(document);
143
+ this.services.workspace.VersionSyncService.modelProduced(document);
144
+ }
145
+
95
146
  override async getOrCreateDocument(uri: URI): Promise<LangiumDocument<AstNode>> {
96
147
  const resolved = this.uriPolicy.loadUri(uri);
97
148
  if (resolved) {
@@ -120,6 +171,13 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
120
171
  throw error;
121
172
  }
122
173
  }
174
+ // No file, but possibly a document: one created and not yet saved is
175
+ // built from its text and registered under its canonical URI.
176
+ const created = this.getDocument(UriUtils.toUri(this.uriPolicy.canonicalUri(uri)));
177
+ if (created) {
178
+ this.services.workspace.CstResidencyService.rehydrate(created);
179
+ return created;
180
+ }
123
181
  // The seam reports no loadable content, so there is nothing to read and
124
182
  // no error from a read to carry.
125
183
  throw new Error(NO_LOADABLE_CONTENT.format({ uri: uri.toString() }));
@@ -8,7 +8,8 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { URI } from '@hydranium/langium';
11
- import { type WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
11
+ import { describeErrorWithStack } from '@hydranium/protocol';
12
+ import { type WritableFileSystemProvider } from './file-system-provider.js';
12
13
  import { serverSharedFactory, type ServerSharedServicesMinimal } from '../shared-services.js';
13
14
  import { type FileSystemSeed, InMemoryFileSystemProvider, type InMemoryFileSystemOptions } from './in-memory-file-system-provider.js';
14
15
 
@@ -125,13 +126,6 @@ export interface PersistentFileSystemOptions extends InMemoryFileSystemOptions {
125
126
  * restored as deleted, which is why the marker is NUL-wrapped and text a grammar
126
127
  * can parse is not.
127
128
  *
128
- * # A registered virtual document still wins
129
- *
130
- * `readFileSync` consults the virtual-document seam before the map, so a stdlib
131
- * contributed in code keeps answering for its URI whether or not the store holds
132
- * one. The store cannot shadow it, which is what keeps a rebuild that re-reads
133
- * that URI from losing the stdlib.
134
- *
135
129
  * # What it deliberately does not answer
136
130
  *
137
131
  * The store is scoped to the ORIGIN, not to the page: two pages on the same
@@ -257,7 +251,7 @@ export class PersistentFileSystemProvider extends InMemoryFileSystemProvider {
257
251
  }
258
252
 
259
253
  protected reportStoreFailure(operation: string, uri: URI, error: unknown): void {
260
- this.tracer.error(`Failed to ${operation} ${uri.toString()}: ${error instanceof Error ? error.message : String(error)}`);
254
+ this.tracer.error(`Failed to ${operation} ${uri.toString()}: ${describeErrorWithStack(error)}`);
261
255
  }
262
256
  }
263
257