@hydranium/core 1.0.0-next.5 → 1.0.0-next.50

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 (236) hide show
  1. package/lib/documents/ast-document-manager.d.ts +42 -5
  2. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  3. package/lib/documents/ast-document-manager.js +9 -12
  4. package/lib/documents/ast-document-manager.js.map +1 -1
  5. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  6. package/lib/documents/hydranium-text-documents.js +41 -9
  7. package/lib/documents/hydranium-text-documents.js.map +1 -1
  8. package/lib/documents/language-client-text-shadow.d.ts +24 -1
  9. package/lib/documents/language-client-text-shadow.d.ts.map +1 -1
  10. package/lib/documents/language-client-text-shadow.js +36 -2
  11. package/lib/documents/language-client-text-shadow.js.map +1 -1
  12. package/lib/documents/self-save-registry.d.ts +37 -6
  13. package/lib/documents/self-save-registry.d.ts.map +1 -1
  14. package/lib/documents/self-save-registry.js +28 -15
  15. package/lib/documents/self-save-registry.js.map +1 -1
  16. package/lib/index.d.ts +2 -0
  17. package/lib/index.d.ts.map +1 -1
  18. package/lib/index.js +5 -0
  19. package/lib/index.js.map +1 -1
  20. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  21. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  22. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  23. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  24. package/lib/langium/bootstrap.d.ts.map +1 -1
  25. package/lib/langium/bootstrap.js +16 -9
  26. package/lib/langium/bootstrap.js.map +1 -1
  27. package/lib/langium/document-builder/build-pipeline-integration.d.ts +13 -1
  28. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  29. package/lib/langium/document-builder/build-pipeline-integration.js +1 -1
  30. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  31. package/lib/langium/document-builder/build-session.d.ts +93 -0
  32. package/lib/langium/document-builder/build-session.d.ts.map +1 -0
  33. package/lib/langium/document-builder/build-session.js +72 -0
  34. package/lib/langium/document-builder/build-session.js.map +1 -0
  35. package/lib/langium/document-builder/document-builder.d.ts +150 -7
  36. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  37. package/lib/langium/document-builder/document-builder.js +298 -11
  38. package/lib/langium/document-builder/document-builder.js.map +1 -1
  39. package/lib/langium/document-builder/index.d.ts +1 -0
  40. package/lib/langium/document-builder/index.d.ts.map +1 -1
  41. package/lib/langium/document-builder/index.js +1 -0
  42. package/lib/langium/document-builder/index.js.map +1 -1
  43. package/lib/langium/integration-services.d.ts +45 -1
  44. package/lib/langium/integration-services.d.ts.map +1 -1
  45. package/lib/langium/integration-services.js +10 -5
  46. package/lib/langium/integration-services.js.map +1 -1
  47. package/lib/langium/integrity/integrity-service.d.ts +5 -0
  48. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  49. package/lib/langium/integrity/integrity-service.js +34 -1
  50. package/lib/langium/integrity/integrity-service.js.map +1 -1
  51. package/lib/langium/keys/containment.d.ts +64 -0
  52. package/lib/langium/keys/containment.d.ts.map +1 -0
  53. package/lib/langium/keys/containment.js +53 -0
  54. package/lib/langium/keys/containment.js.map +1 -0
  55. package/lib/langium/keys/index.d.ts +1 -0
  56. package/lib/langium/keys/index.d.ts.map +1 -1
  57. package/lib/langium/keys/index.js +1 -0
  58. package/lib/langium/keys/index.js.map +1 -1
  59. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  60. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  61. package/lib/langium/keys/name-based-key-provider.js +4 -0
  62. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  63. package/lib/langium/model-service/model-service.d.ts +103 -7
  64. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  65. package/lib/langium/model-service/model-service.js +70 -89
  66. package/lib/langium/model-service/model-service.js.map +1 -1
  67. package/lib/langium/module.d.ts +82 -13
  68. package/lib/langium/module.d.ts.map +1 -1
  69. package/lib/langium/module.js +21 -12
  70. package/lib/langium/module.js.map +1 -1
  71. package/lib/langium/naming/name-provider.d.ts +10 -0
  72. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  73. package/lib/langium/naming/name-provider.js.map +1 -1
  74. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  75. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  76. package/lib/langium/naming/name-separator-validation.js +30 -1
  77. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  78. package/lib/langium/residency/cst-residency-service.d.ts +31 -9
  79. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  80. package/lib/langium/residency/cst-residency-service.js +13 -56
  81. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  82. package/lib/langium/scope/hydranium-scope-provider.d.ts +32 -13
  83. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  84. package/lib/langium/scope/hydranium-scope-provider.js +37 -20
  85. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  86. package/lib/langium/shared-services.d.ts +15 -2
  87. package/lib/langium/shared-services.d.ts.map +1 -1
  88. package/lib/langium/shared-services.js.map +1 -1
  89. package/lib/langium/transfer/transfer-encoder.d.ts +33 -2
  90. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  91. package/lib/langium/transfer/transfer-encoder.js +14 -3
  92. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  93. package/lib/langium/validation/document-validator.d.ts +145 -6
  94. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  95. package/lib/langium/validation/document-validator.js +211 -4
  96. package/lib/langium/validation/document-validator.js.map +1 -1
  97. package/lib/langium/workspace/document-uri-policy.d.ts +3 -4
  98. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  99. package/lib/langium/workspace/document-uri-policy.js +3 -4
  100. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  101. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +25 -0
  102. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  103. package/lib/langium/workspace/hydranium-langium-document-factory.js +25 -0
  104. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  105. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +21 -1
  106. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  107. package/lib/langium/workspace/hydranium-workspace-manager.js +28 -0
  108. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  109. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +8 -0
  110. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  111. package/lib/langium/workspace/in-memory-file-system-provider.js +11 -2
  112. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  113. package/lib/langium/workspace/initialize-workspace.d.ts +22 -2
  114. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  115. package/lib/langium/workspace/initialize-workspace.js +13 -5
  116. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  117. package/lib/langium/workspace/langium-documents.d.ts +79 -17
  118. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  119. package/lib/langium/workspace/langium-documents.js +83 -28
  120. package/lib/langium/workspace/langium-documents.js.map +1 -1
  121. package/lib/locale/index.d.ts +10 -0
  122. package/lib/locale/index.d.ts.map +1 -0
  123. package/lib/locale/index.js +10 -0
  124. package/lib/locale/index.js.map +1 -0
  125. package/lib/locale/server-locale.d.ts +73 -0
  126. package/lib/locale/server-locale.d.ts.map +1 -0
  127. package/lib/locale/server-locale.js +61 -0
  128. package/lib/locale/server-locale.js.map +1 -0
  129. package/lib/lsp/hydranium-document-update-handler.js +1 -1
  130. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  131. package/lib/messages/carriers.d.ts +54 -0
  132. package/lib/messages/carriers.d.ts.map +1 -0
  133. package/lib/messages/carriers.js +62 -0
  134. package/lib/messages/carriers.js.map +1 -0
  135. package/lib/messages/index.d.ts +25 -0
  136. package/lib/messages/index.d.ts.map +1 -0
  137. package/lib/messages/index.js +25 -0
  138. package/lib/messages/index.js.map +1 -0
  139. package/lib/messages/renderer.d.ts +136 -0
  140. package/lib/messages/renderer.d.ts.map +1 -0
  141. package/lib/messages/renderer.js +159 -0
  142. package/lib/messages/renderer.js.map +1 -0
  143. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  144. package/lib/node/node-file-system-provider.js +1 -40
  145. package/lib/node/node-file-system-provider.js.map +1 -1
  146. package/lib/node/profiling-run.js +1 -1
  147. package/lib/node/profiling-run.js.map +1 -1
  148. package/lib/node/rename-over-open-readers.d.ts +52 -0
  149. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  150. package/lib/node/rename-over-open-readers.js +66 -0
  151. package/lib/node/rename-over-open-readers.js.map +1 -0
  152. package/lib/testing/fake-document.d.ts +14 -3
  153. package/lib/testing/fake-document.d.ts.map +1 -1
  154. package/lib/testing/fake-document.js +18 -3
  155. package/lib/testing/fake-document.js.map +1 -1
  156. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  157. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  158. package/lib/testing/make-noop-shared-services.js +28 -2
  159. package/lib/testing/make-noop-shared-services.js.map +1 -1
  160. package/lib/testing/make-test-services.d.ts +31 -4
  161. package/lib/testing/make-test-services.d.ts.map +1 -1
  162. package/lib/testing/make-test-services.js +19 -3
  163. package/lib/testing/make-test-services.js.map +1 -1
  164. package/lib/testing/node/spawned-server.d.ts +14 -0
  165. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  166. package/lib/testing/node/spawned-server.js +33 -1
  167. package/lib/testing/node/spawned-server.js.map +1 -1
  168. package/lib/testing/playwright/server-log-capture.d.ts +14 -4
  169. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  170. package/lib/testing/playwright/server-log-capture.js +21 -4
  171. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  172. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  173. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  174. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  175. package/lib/testing/stub-ast-document-manager.d.ts +3 -4
  176. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  177. package/lib/testing/stub-ast-document-manager.js +2 -5
  178. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  179. package/lib/testing/stub-document-builder.d.ts +8 -0
  180. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  181. package/lib/testing/stub-document-builder.js +22 -3
  182. package/lib/testing/stub-document-builder.js.map +1 -1
  183. package/lib/testing/stub-model-service.d.ts +1 -1
  184. package/lib/testing/stub-model-service.d.ts.map +1 -1
  185. package/lib/testing/stub-model-service.js +2 -2
  186. package/lib/testing/stub-model-service.js.map +1 -1
  187. package/package.json +17 -8
  188. package/src/documents/ast-document-manager.ts +55 -14
  189. package/src/documents/hydranium-text-documents.ts +41 -9
  190. package/src/documents/language-client-text-shadow.ts +38 -2
  191. package/src/documents/self-save-registry.ts +52 -13
  192. package/src/index.ts +5 -0
  193. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  194. package/src/langium/bootstrap.ts +16 -9
  195. package/src/langium/document-builder/build-pipeline-integration.ts +14 -1
  196. package/src/langium/document-builder/build-session.ts +87 -0
  197. package/src/langium/document-builder/document-builder.ts +339 -11
  198. package/src/langium/document-builder/index.ts +1 -0
  199. package/src/langium/integration-services.ts +67 -6
  200. package/src/langium/integrity/integrity-service.ts +35 -1
  201. package/src/langium/keys/containment.ts +87 -0
  202. package/src/langium/keys/index.ts +1 -0
  203. package/src/langium/keys/name-based-key-provider.ts +4 -0
  204. package/src/langium/model-service/model-service.ts +145 -22
  205. package/src/langium/module.ts +99 -19
  206. package/src/langium/naming/name-provider.ts +10 -0
  207. package/src/langium/naming/name-separator-validation.ts +34 -5
  208. package/src/langium/residency/cst-residency-service.ts +36 -12
  209. package/src/langium/scope/hydranium-scope-provider.ts +40 -22
  210. package/src/langium/shared-services.ts +19 -2
  211. package/src/langium/transfer/transfer-encoder.ts +45 -3
  212. package/src/langium/validation/document-validator.ts +255 -8
  213. package/src/langium/workspace/document-uri-policy.ts +3 -4
  214. package/src/langium/workspace/hydranium-langium-document-factory.ts +34 -0
  215. package/src/langium/workspace/hydranium-workspace-manager.ts +30 -1
  216. package/src/langium/workspace/in-memory-file-system-provider.ts +13 -3
  217. package/src/langium/workspace/initialize-workspace.ts +34 -5
  218. package/src/langium/workspace/langium-documents.ts +106 -33
  219. package/src/locale/index.ts +10 -0
  220. package/src/locale/server-locale.ts +86 -0
  221. package/src/lsp/hydranium-document-update-handler.ts +1 -1
  222. package/src/messages/carriers.ts +78 -0
  223. package/src/messages/index.ts +27 -0
  224. package/src/messages/renderer.ts +204 -0
  225. package/src/node/node-file-system-provider.ts +1 -41
  226. package/src/node/profiling-run.ts +1 -1
  227. package/src/node/rename-over-open-readers.ts +78 -0
  228. package/src/testing/fake-document.ts +22 -4
  229. package/src/testing/make-noop-shared-services.ts +50 -2
  230. package/src/testing/make-test-services.ts +49 -7
  231. package/src/testing/node/spawned-server.ts +35 -1
  232. package/src/testing/playwright/server-log-capture.ts +24 -5
  233. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  234. package/src/testing/stub-ast-document-manager.ts +5 -10
  235. package/src/testing/stub-document-builder.ts +32 -3
  236. package/src/testing/stub-model-service.ts +2 -2
@@ -160,16 +160,28 @@ export function serverLogSpecName(file: string): string {
160
160
  * Rename each `<token>.log` (backend) and `<token>.browser.log` (forwarded
161
161
  * browser console) to the spec name recorded in its `<token>.spec` sidecar
162
162
  * (written by {@link markServerLog}), then delete the sidecar. Colliding names —
163
- * a spec that opened more than one workspace — get a `-2`, `-3`, … suffix. Token
164
- * logs without a sidecar are left untouched. Run once, after all server processes
165
- * have exited (e.g. a reporter's `onEnd`). Best-effort.
163
+ * a spec that opened more than one workspace — get a `-2`, `-3`, … suffix. Run
164
+ * once, after all server processes have exited (e.g. a reporter's `onEnd`).
165
+ * Best-effort.
166
+ *
167
+ * Returns the workspace tokens left UNATTRIBUTED — a log the capture wrote that
168
+ * no test claimed, because that spec never reached
169
+ * {@link markServerLog} (no `serverLog` fixture, no `beforeEach` call).
170
+ *
171
+ * **Returned rather than ignored, because the unattributed state is the
172
+ * misleading one.** Such a log still exists, still has content, and is named by
173
+ * an opaque token with no test boundaries in it — so a capture run that covered
174
+ * nothing looks exactly like one that covered everything, and the logs are
175
+ * there to be read. A caller that can warn should warn.
166
176
  */
167
- export function renameServerLogs(dir: string): void {
177
+ export function renameServerLogs(dir: string): string[] {
168
178
  let entries: string[];
169
179
  try {
170
180
  entries = readdirSync(dir);
171
181
  } catch {
172
- return;
182
+ // An unreadable capture dir has nothing to report — including nothing
183
+ // unattributed, since no log was observed at all.
184
+ return [];
173
185
  }
174
186
  // Per suffix (`.log`, `.browser.log`) a `taken` set guards collisions, so the
175
187
  // backend and browser logs for one spec share the same friendly base name.
@@ -190,6 +202,11 @@ export function renameServerLogs(dir: string): void {
190
202
  // ignore
191
203
  }
192
204
  };
205
+ // Every token the capture produced a backend log for, so the ones no sidecar
206
+ // claims can be reported rather than silently left behind.
207
+ const unattributed = new Set(
208
+ entries.filter(entry => entry.endsWith('.log') && !entry.endsWith('.browser.log')).map(entry => entry.slice(0, -'.log'.length))
209
+ );
193
210
  for (const entry of entries) {
194
211
  if (!entry.endsWith('.spec')) {
195
212
  continue;
@@ -210,9 +227,11 @@ export function renameServerLogs(dir: string): void {
210
227
  if (!name) {
211
228
  continue;
212
229
  }
230
+ unattributed.delete(token);
213
231
  rename(token, name, '.log');
214
232
  rename(token, name, '.browser.log');
215
233
  }
234
+ return [...unattributed];
216
235
  }
217
236
 
218
237
  /**
@@ -24,6 +24,17 @@ export default class ServerLogRenameReporter {
24
24
  }
25
25
 
26
26
  onEnd(): void {
27
- renameServerLogs(this.dir);
27
+ const unattributed = renameServerLogs(this.dir);
28
+ if (unattributed.length > 0) {
29
+ // Loud, because the alternative is a capture run that reads as
30
+ // complete: these logs exist and have content, but are named by an
31
+ // opaque workspace token and carry no test boundaries, so nothing
32
+ // about them says which spec they belong to.
33
+ console.warn(
34
+ `[server-log] ${unattributed.length} captured log(s) belong to no test: ${unattributed.join(', ')}.\n` +
35
+ '[server-log] Those specs never marked a boundary — apply the `serverLog` fixture, ' +
36
+ 'or call `markServerLog`/`attachServerLog` from the suite, or their logs cannot be read per test.'
37
+ );
38
+ }
28
39
  }
29
40
  }
@@ -27,9 +27,8 @@ import type { StubLangiumDocuments } from './stub-langium-documents.js';
27
27
  * underlying stub text-document manager, `onUpdate` is driven explicitly
28
28
  * through {@link StubAstDocumentManager.emitUpdate} because the stub tree runs
29
29
  * no build phases to emit from, and the remaining read helpers
30
- * (`isDirectChange`, `getAuthor`, `readFile`) throw if invoked — tests that
31
- * need them should wire a richer stub or use the real
32
- * {@link AstDocumentManager}.
30
+ * (`isTriggeringEdit`, `getAuthor`) throw if invoked — tests that need them
31
+ * should wire a richer stub or use the real {@link AstDocumentManager}.
33
32
  *
34
33
  * Open state is tracked per URI as the set of holding client ids, so a
35
34
  * document stays open until its last client closes. The stub forwards
@@ -57,8 +56,7 @@ export interface StubAstDocumentManager<TAst extends AstNode, TDiagnostic = unkn
57
56
  | 'onClientClosed'
58
57
  | 'getAuthor'
59
58
  | 'getDocument'
60
- | 'isDirectChange'
61
- | 'readFile'
59
+ | 'isTriggeringEdit'
62
60
  > {
63
61
  readonly openClients: Map<string, Set<string>>;
64
62
 
@@ -214,11 +212,8 @@ export function makeStubAstDocumentManager<TAst extends AstNode, TDiagnostic = u
214
212
  getDocument(uri: string): LangiumDocument | undefined {
215
213
  return documents?.getDocument(UriUtils.toUri(uri));
216
214
  },
217
- isDirectChange(): boolean {
218
- return notSupported('isDirectChange');
219
- },
220
- async readFile(uri: string): Promise<string> {
221
- return notSupported(`readFile(${uri})`);
215
+ isTriggeringEdit(): boolean {
216
+ return notSupported('isTriggeringEdit');
222
217
  }
223
218
  };
224
219
  }
@@ -9,6 +9,7 @@
9
9
 
10
10
  import {
11
11
  type DocumentBuilder,
12
+ type DocumentBuildListener,
12
13
  type DocumentPhaseListener,
13
14
  type DocumentState,
14
15
  type DocumentUpdateListener,
@@ -94,6 +95,14 @@ export interface StubDocumentBuilder extends Pick<
94
95
  firePhase(state: DocumentState, document: LangiumDocument, cancelToken?: CancellationToken): void;
95
96
  /** Synchronously fire every registered `onUpdate` listener. */
96
97
  fireOnUpdate(changed: URI[], deleted: URI[]): void;
98
+ /**
99
+ * Synchronously fire the BUILD-phase listener(s) for `state` with the whole
100
+ * batch. The per-build counterpart of {@link firePhase}: a subject that
101
+ * reports once per build rather than once per document subscribes here, and
102
+ * a stub that only fired {@link firePhase} would leave it silent while
103
+ * looking wired.
104
+ */
105
+ fireBuildPhase(state: DocumentState, built: LangiumDocument[], cancelToken?: CancellationToken): void;
97
106
  /**
98
107
  * Hold the next {@link waitUntil} call. The returned handle releases it;
99
108
  * the call's return value resolves on the next tick after `resolve` runs.
@@ -131,6 +140,7 @@ function reraise(result: unknown): void {
131
140
  */
132
141
  export function makeStubDocumentBuilder(): StubDocumentBuilder {
133
142
  const phaseListeners = new Map<DocumentState, DocumentPhaseListener[]>();
143
+ const buildPhaseListeners = new Map<DocumentState, DocumentBuildListener[]>();
134
144
  const onUpdateListeners: DocumentUpdateListener[] = [];
135
145
  const gates: Array<{ take(release: () => void): void }> = [];
136
146
  const updateCalls: RecordedBuilderCall<[URI[], URI[]]>[] = [];
@@ -194,6 +204,28 @@ export function makeStubDocumentBuilder(): StubDocumentBuilder {
194
204
  reraise(listener(changed, deleted));
195
205
  }
196
206
  },
207
+ onBuildPhase(state: DocumentState, listener: DocumentBuildListener) {
208
+ const list = buildPhaseListeners.get(state) ?? [];
209
+ list.push(listener);
210
+ buildPhaseListeners.set(state, list);
211
+ return Disposable.create(() => {
212
+ const idx = list.indexOf(listener);
213
+ if (idx >= 0) {
214
+ list.splice(idx, 1);
215
+ }
216
+ });
217
+ },
218
+ fireBuildPhase(state: DocumentState, built: LangiumDocument[], cancelToken?: CancellationToken) {
219
+ const token =
220
+ cancelToken ??
221
+ ({
222
+ isCancellationRequested: false,
223
+ onCancellationRequested: () => Disposable.create(() => undefined)
224
+ } as CancellationToken);
225
+ for (const listener of buildPhaseListeners.get(state) ?? []) {
226
+ reraise(listener(built, token));
227
+ }
228
+ },
197
229
  gateNextWaitUntil(): StubWaitUntilGate {
198
230
  let release: (() => void) | undefined;
199
231
  const entry = {
@@ -224,9 +256,6 @@ export function makeStubDocumentBuilder(): StubDocumentBuilder {
224
256
  build() {
225
257
  return notSupported('build');
226
258
  },
227
- onBuildPhase() {
228
- return notSupported('onBuildPhase');
229
- },
230
259
  resetToState() {
231
260
  return notSupported('resetToState');
232
261
  },
@@ -9,7 +9,7 @@
9
9
 
10
10
  import type { TransferDiagnostic, TransferElement } from '@hydranium/protocol';
11
11
  import type { AstNode } from '@hydranium/langium';
12
- import { ModelService, type ModelServiceOptions } from '../langium/model-service/model-service.js';
12
+ import { DefaultModelService, type ModelService, type ModelServiceOptions } from '../langium/model-service/model-service.js';
13
13
  import type { ServerSharedServices } from '../langium/module.js';
14
14
 
15
15
  /**
@@ -23,7 +23,7 @@ class StubModelServiceImpl<
23
23
  TAst extends AstNode,
24
24
  TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
25
25
  TTransfer extends TransferElement = TransferElement
26
- > extends ModelService<TAst, TDiagnostic, TTransfer> {
26
+ > extends DefaultModelService<TAst, TDiagnostic, TTransfer> {
27
27
  constructor(
28
28
  services: ServerSharedServices,
29
29
  protected readonly serializeFn: (uri: string, root: TTransfer) => string,