@hydranium/core 1.0.0-next.117 → 1.0.0-next.123
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.
- package/lib/documents/ast-document-manager.d.ts +8 -44
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +22 -41
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +4 -33
- package/lib/documents/client-session-errors.d.ts.map +1 -1
- package/lib/documents/client-session-errors.js +4 -46
- package/lib/documents/client-session-errors.js.map +1 -1
- package/lib/documents/client-session-registry.d.ts +40 -20
- package/lib/documents/client-session-registry.d.ts.map +1 -1
- package/lib/documents/client-session-registry.js +33 -20
- package/lib/documents/client-session-registry.js.map +1 -1
- package/lib/documents/file-system-task-queue.d.ts +49 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +34 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +138 -13
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +283 -40
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +1 -0
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +1 -0
- package/lib/documents/index.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +15 -2
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +15 -2
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +3 -2
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +9 -6
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/language-module.d.ts +2 -2
- package/lib/langium/language-module.js +2 -2
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +203 -24
- package/lib/langium/model-service/client-session.d.ts.map +1 -1
- package/lib/langium/model-service/client-session.js +233 -29
- package/lib/langium/model-service/client-session.js.map +1 -1
- package/lib/langium/model-service/model-service.d.ts +62 -217
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +54 -357
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +11 -1
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +5 -1
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +10 -2
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +1 -1
- package/lib/langium/workspace/write-lock-scope.js +1 -1
- package/lib/lsp/hydranium-document-update-handler.d.ts +69 -67
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +111 -89
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +3 -4
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +3 -4
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +16 -4
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +6 -2
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +1 -1
- package/lib/testing/node/scratch-workspace.js +1 -1
- package/lib/testing/run-update-pipeline.d.ts +4 -4
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +5 -5
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +6 -8
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +10 -5
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +16 -9
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +2 -2
- package/lib/testing/stub-model-service.js +2 -2
- package/package.json +5 -5
- package/src/documents/ast-document-manager.ts +27 -78
- package/src/documents/client-session-errors.ts +11 -43
- package/src/documents/client-session-registry.ts +54 -28
- package/src/documents/file-system-task-queue.ts +68 -0
- package/src/documents/hydranium-text-documents.ts +348 -44
- package/src/documents/index.ts +1 -0
- package/src/langium/document-builder/document-builder.ts +16 -2
- package/src/langium/integrity/integrity-service.ts +9 -6
- package/src/langium/language-module.ts +4 -4
- package/src/langium/model-service/client-session.ts +363 -39
- package/src/langium/model-service/model-service.ts +91 -420
- package/src/langium/module.ts +14 -2
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/workspace/in-memory-file-system-provider.ts +11 -2
- package/src/langium/workspace/write-lock-scope.ts +1 -1
- package/src/lsp/hydranium-document-update-handler.ts +138 -92
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +3 -4
- package/src/testing/make-test-services.ts +25 -6
- package/src/testing/node/lsp-server-connection.ts +1 -1
- package/src/testing/node/scratch-workspace.ts +1 -1
- package/src/testing/run-update-pipeline.ts +4 -4
- package/src/testing/stub-ast-document-manager.ts +10 -24
- package/src/testing/stub-hydranium-text-documents.ts +29 -16
- package/src/testing/stub-model-service.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stub-ast-document-manager.d.ts","sourceRoot":"","sources":["../../src/testing/stub-ast-document-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,OAAO,EAAkC,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAEJ,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EACjC,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,sBAAsB,CAAC,IAAI,SAAS,OAAO,EAAE,WAAW,SAAS,aAAa,GAAG,aAAa,CAAE,SAAQ,IAAI,CAC1H,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"stub-ast-document-manager.d.ts","sourceRoot":"","sources":["../../src/testing/stub-ast-document-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,OAAO,EAAkC,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAEJ,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EACjC,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,sBAAsB,CAAC,IAAI,SAAS,OAAO,EAAE,WAAW,SAAS,aAAa,GAAG,aAAa,CAAE,SAAQ,IAAI,CAC1H,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,EACrC,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,gBAAgB,GAAG,WAAW,GAAG,aAAa,CAC1H;IACE,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC;IAEnF;;;;;;OAMG;IACH,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5C;AAED,wBAAgB,0BAA0B,CAAC,IAAI,SAAS,OAAO,EAAE,WAAW,SAAS,aAAa,GAAG,aAAa,EAC/G,aAAa,EAAE,0BAA0B,EACzC,UAAU,EAAE,IAAI,CAAC,0BAA0B,EAAE,WAAW,CAAC,EACzD,SAAS,CAAC,EAAE,oBAAoB,CAAC,IAAI,EAAE,WAAW,CAAC,GACnD,sBAAsB,CAAC,IAAI,EAAE,WAAW,CAAC,CA8G3C"}
|
|
@@ -32,11 +32,15 @@ export function makeStubAstDocumentManager(textDocuments, fileSystem, documents)
|
|
|
32
32
|
clients.add(args.clientId);
|
|
33
33
|
openClients.set(args.uri, clients);
|
|
34
34
|
// The real `open` materialises the synced document (from the payload
|
|
35
|
-
// text or the filesystem)
|
|
36
|
-
//
|
|
35
|
+
// text or the filesystem), or attaches the client to the one that is
|
|
36
|
+
// there; mirror both so a subsequent `update` finds the document open
|
|
37
|
+
// for this client.
|
|
37
38
|
if (!textDocuments.get(args.uri)) {
|
|
38
39
|
textDocuments.seedOpen(args.uri, args.text ?? '', args.clientId);
|
|
39
40
|
}
|
|
41
|
+
else {
|
|
42
|
+
textDocuments.attachClient(args.uri, args.clientId);
|
|
43
|
+
}
|
|
40
44
|
return Disposable.create(() => close({ uri: args.uri, clientId: args.clientId }));
|
|
41
45
|
},
|
|
42
46
|
close,
|
|
@@ -53,9 +57,6 @@ export function makeStubAstDocumentManager(textDocuments, fileSystem, documents)
|
|
|
53
57
|
await fileSystem.writeFile(UriUtils.toUri(uri), text);
|
|
54
58
|
textDocuments.notifyDidSaveTextDocument({ textDocument: { uri }, text }, clientId);
|
|
55
59
|
},
|
|
56
|
-
queueDiskTask(_uri, task) {
|
|
57
|
-
return task();
|
|
58
|
-
},
|
|
59
60
|
// Registers the listener but never calls it by itself — the real manager
|
|
60
61
|
// emits from a `DocumentBuilder.onDocumentPhase(Validated)` hook and the
|
|
61
62
|
// stub tree runs no phases. `emitUpdate` is the only thing that fires it;
|
|
@@ -117,9 +118,6 @@ export function makeStubAstDocumentManager(textDocuments, fileSystem, documents)
|
|
|
117
118
|
// that need real symlink canonicalization wire the real AstDocumentManager).
|
|
118
119
|
getDocument(uri) {
|
|
119
120
|
return documents?.getDocument(UriUtils.toUri(uri));
|
|
120
|
-
},
|
|
121
|
-
isTriggeringEdit() {
|
|
122
|
-
return notSupported('isTriggeringEdit');
|
|
123
121
|
}
|
|
124
122
|
};
|
|
125
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stub-ast-document-manager.js","sourceRoot":"","sources":["../../src/testing/stub-ast-document-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAsC,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACJ,WAAW,EAIb,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"stub-ast-document-manager.js","sourceRoot":"","sources":["../../src/testing/stub-ast-document-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,11 +22,12 @@ export interface StubTextDocumentEntry {
|
|
|
22
22
|
* reads from on test paths — the content channel
|
|
23
23
|
* (`notifyDidChangeTextDocument` / `applyContentChange` / `version` /
|
|
24
24
|
* `getAuthor`), the open-state probes (`isOpenInLanguageClient` /
|
|
25
|
-
* `isOpenInAnyClient` / `isOpenInClient` / `
|
|
25
|
+
* `isOpenInAnyClient` / `isOpenInClient` / `isRevertPending` /
|
|
26
|
+
* `openDocuments`), the push channel
|
|
26
27
|
* to the language client (`applyEditToLanguageClient` / `stagePendingContent`),
|
|
27
28
|
* the save / close notifications, and the client-session table
|
|
28
|
-
* (`registerSession` / `closeSession` / `onDidCloseSession`
|
|
29
|
-
*
|
|
29
|
+
* (`registerSession` / `closeSession` / `onDidCloseSession`), which is a real
|
|
30
|
+
* `ClientSessionRegistry` — plus test-only helpers:
|
|
30
31
|
*
|
|
31
32
|
* - {@link seedOpen} — pre-populate an open document without firing change
|
|
32
33
|
* events. Use to set up a baseline version before exercising an `update`.
|
|
@@ -55,7 +56,7 @@ export interface StubTextDocumentEntry {
|
|
|
55
56
|
* {@link applyContentChange} mirrors the real server-assigned write path:
|
|
56
57
|
* the version steps iff the text differs from the current content.
|
|
57
58
|
*/
|
|
58
|
-
export interface StubHydraniumTextDocuments extends Pick<HydraniumTextDocuments<TextDocument>, 'version' | 'notifyDidChangeTextDocument' | 'applyContentChange' | 'getAuthor' | 'isOpenInLanguageClient' | 'isOpenInAnyClient' | 'applyEditToLanguageClient' | 'stagePendingContent' | 'openDocuments' | 'isOpenInClient' | '
|
|
59
|
+
export interface StubHydraniumTextDocuments extends Pick<HydraniumTextDocuments<TextDocument>, 'version' | 'notifyDidChangeTextDocument' | 'applyContentChange' | 'getAuthor' | 'isOpenInLanguageClient' | 'isOpenInAnyClient' | 'isRevertPending' | 'applyEditToLanguageClient' | 'stagePendingContent' | 'openDocuments' | 'isOpenInClient' | 'attachClient' | 'registerSession' | 'closeSession' | 'onDidCloseSession' | 'onDidCloseLastOpen'> {
|
|
59
60
|
/**
|
|
60
61
|
* Stub-tailored read accessor. Returns just the surface the framework's
|
|
61
62
|
* save path reads (`version` + `getText()`), rather than the real `get`'s
|
|
@@ -90,7 +91,11 @@ export interface StubHydraniumTextDocuments extends Pick<HydraniumTextDocuments<
|
|
|
90
91
|
seedOpen(uri: string, text: string, clientId: string): void;
|
|
91
92
|
/** Mark `uri` as open in the LSP textual language client (drives {@link isOpenInLanguageClient}). */
|
|
92
93
|
seedOpenInLanguageClient(uri: string): void;
|
|
93
|
-
/**
|
|
94
|
+
/**
|
|
95
|
+
* Synchronously deliver `onDidClose` to subscribers, then `onDidCloseLastOpen`
|
|
96
|
+
* when no client has `uri` open any more. The stub keeps no revert grace, so
|
|
97
|
+
* a last close is announced at once.
|
|
98
|
+
*/
|
|
94
99
|
fireClose(uri: string, clientId: string): void;
|
|
95
100
|
/**
|
|
96
101
|
* Drop recorded state. Useful for `beforeEach` resets.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stub-hydranium-text-documents.d.ts","sourceRoot":"","sources":["../../src/testing/stub-hydranium-text-documents.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAGlF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"stub-hydranium-text-documents.d.ts","sourceRoot":"","sources":["../../src/testing/stub-hydranium-text-documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
|
-
import { Disposable } from 'vscode-languageserver';
|
|
9
|
+
import { Disposable, Emitter } from 'vscode-languageserver';
|
|
10
10
|
import { LANGUAGE_CLIENT_ID } from '../documents/client-ids.js';
|
|
11
11
|
import { ClientSessionRegistry } from '../documents/client-session-registry.js';
|
|
12
12
|
/** Build a {@link StubHydraniumTextDocuments}. */
|
|
@@ -20,11 +20,12 @@ export function makeStubHydraniumTextDocuments() {
|
|
|
20
20
|
let applyEditHandler = () => ({ applied: true });
|
|
21
21
|
const saveListeners = [];
|
|
22
22
|
const closeListeners = [];
|
|
23
|
-
// The real registry, so the session table, the opens
|
|
24
|
-
//
|
|
23
|
+
// The real registry, so the session table, the opens and the closing state
|
|
24
|
+
// behave as the store's do. The stub's plain-string keys
|
|
25
25
|
// stand in for canonical URIs (one stub-boundary cast, like `fireClose`).
|
|
26
26
|
const sessions = new ClientSessionRegistry();
|
|
27
27
|
const key = (uri) => uri;
|
|
28
|
+
const lastOpenClosed = new Emitter();
|
|
28
29
|
const stub = {
|
|
29
30
|
get changes() {
|
|
30
31
|
return changes;
|
|
@@ -109,6 +110,12 @@ export function makeStubHydraniumTextDocuments() {
|
|
|
109
110
|
isOpenInClient(uri, clientId) {
|
|
110
111
|
return sessions.isOpenIn(key(uri), clientId);
|
|
111
112
|
},
|
|
113
|
+
isRevertPending(uri) {
|
|
114
|
+
return sessions.isRevertPending(key(uri));
|
|
115
|
+
},
|
|
116
|
+
attachClient(uri, clientId) {
|
|
117
|
+
return docs.has(uri) && sessions.addOpen(key(uri), clientId);
|
|
118
|
+
},
|
|
112
119
|
registerSession(clientId) {
|
|
113
120
|
sessions.register(clientId);
|
|
114
121
|
},
|
|
@@ -128,11 +135,8 @@ export function makeStubHydraniumTextDocuments() {
|
|
|
128
135
|
get onDidCloseSession() {
|
|
129
136
|
return sessions.onDidCloseSession;
|
|
130
137
|
},
|
|
131
|
-
|
|
132
|
-
return
|
|
133
|
-
},
|
|
134
|
-
setOpenOptions(uri, clientId, options) {
|
|
135
|
-
sessions.setOpenOptions(key(uri), clientId, options);
|
|
138
|
+
get onDidCloseLastOpen() {
|
|
139
|
+
return lastOpenClosed.event;
|
|
136
140
|
},
|
|
137
141
|
openDocuments() {
|
|
138
142
|
// From the registry that also answers `isOpenInClient`, which both
|
|
@@ -165,7 +169,7 @@ export function makeStubHydraniumTextDocuments() {
|
|
|
165
169
|
if (holder && holder.clientId === clientId) {
|
|
166
170
|
docs.delete(uri);
|
|
167
171
|
}
|
|
168
|
-
sessions.removeOpen(key(uri), clientId);
|
|
172
|
+
const removed = sessions.removeOpen(key(uri), clientId);
|
|
169
173
|
if (clientId === LANGUAGE_CLIENT_ID) {
|
|
170
174
|
languageClientOpen.delete(uri);
|
|
171
175
|
}
|
|
@@ -173,6 +177,9 @@ export function makeStubHydraniumTextDocuments() {
|
|
|
173
177
|
for (const listener of closeListeners.slice()) {
|
|
174
178
|
listener(event);
|
|
175
179
|
}
|
|
180
|
+
if (removed && !sessions.isOpen(key(uri))) {
|
|
181
|
+
lastOpenClosed.fire({ uri: key(uri) });
|
|
182
|
+
}
|
|
176
183
|
},
|
|
177
184
|
reset() {
|
|
178
185
|
docs.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stub-hydranium-text-documents.js","sourceRoot":"","sources":["../../src/testing/stub-hydranium-text-documents.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAIlF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"stub-hydranium-text-documents.js","sourceRoot":"","sources":["../../src/testing/stub-hydranium-text-documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,8 +21,8 @@ export type StubModelService<TAst extends AstNode, TDiagnostic extends AstDiagno
|
|
|
21
21
|
* `makeTestServices` wires this stub automatically.
|
|
22
22
|
*
|
|
23
23
|
* `options` are the framework {@link ModelServiceOptions}, forwarded verbatim, so
|
|
24
|
-
* a test can exercise an option-gated code path (`serializeBuilds
|
|
25
|
-
*
|
|
24
|
+
* a test can exercise an option-gated code path (`serializeBuilds`) without
|
|
25
|
+
* hand-rolling a subclass just to reach the constructor.
|
|
26
26
|
*
|
|
27
27
|
* Adopters that need richer override behaviour — the framework's own extension
|
|
28
28
|
* surface is {@link ModelService.rewriteModel} alongside `serialize` — should
|
|
@@ -32,8 +32,8 @@ class StubModelServiceImpl extends DefaultModelService {
|
|
|
32
32
|
* `makeTestServices` wires this stub automatically.
|
|
33
33
|
*
|
|
34
34
|
* `options` are the framework {@link ModelServiceOptions}, forwarded verbatim, so
|
|
35
|
-
* a test can exercise an option-gated code path (`serializeBuilds
|
|
36
|
-
*
|
|
35
|
+
* a test can exercise an option-gated code path (`serializeBuilds`) without
|
|
36
|
+
* hand-rolling a subclass just to reach the constructor.
|
|
37
37
|
*
|
|
38
38
|
* Adopters that need richer override behaviour — the framework's own extension
|
|
39
39
|
* surface is {@link ModelService.rewriteModel} alongside `serialize` — should
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hydranium/core",
|
|
3
|
-
"version": "1.0.0-next.
|
|
3
|
+
"version": "1.0.0-next.123",
|
|
4
4
|
"description": "Foundational runtime of the hydranium framework: AST coordination layer (services, integrity, AST extension, serialization, multi-client documents) plus the LSP textual head at the /lsp subpath. Consumed by protocol-head packages (@hydranium/data-server, @hydranium/glsp-server).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"hydranium",
|
|
@@ -104,8 +104,8 @@
|
|
|
104
104
|
"diff": "^5.2.0"
|
|
105
105
|
},
|
|
106
106
|
"devDependencies": {
|
|
107
|
-
"@hydranium/langium": "1.0.0-next.
|
|
108
|
-
"@hydranium/protocol": "1.0.0-next.
|
|
107
|
+
"@hydranium/langium": "1.0.0-next.123",
|
|
108
|
+
"@hydranium/protocol": "1.0.0-next.123",
|
|
109
109
|
"@playwright/test": "^1.40.0",
|
|
110
110
|
"@types/diff": "^5.2.0",
|
|
111
111
|
"rimraf": "^5.0.0",
|
|
@@ -117,8 +117,8 @@
|
|
|
117
117
|
"vscode-languageserver-types": "^3.17.5"
|
|
118
118
|
},
|
|
119
119
|
"peerDependencies": {
|
|
120
|
-
"@hydranium/langium": "1.0.0-next.
|
|
121
|
-
"@hydranium/protocol": "1.0.0-next.
|
|
120
|
+
"@hydranium/langium": "1.0.0-next.123",
|
|
121
|
+
"@hydranium/protocol": "1.0.0-next.123",
|
|
122
122
|
"@playwright/test": "^1.40.0",
|
|
123
123
|
"vscode-jsonrpc": "9.0.1",
|
|
124
124
|
"vscode-languageserver": "~10.0.1",
|
|
@@ -114,9 +114,8 @@ export interface AstDocument<TAst extends AstNode, TDiagnostic extends AstDiagno
|
|
|
114
114
|
* Text-document version this snapshot was taken at — read from
|
|
115
115
|
* `LangiumDocument.textDocument.version`. Symmetric with
|
|
116
116
|
* `TransferDocument.version` on the wire side: an in-process caller that
|
|
117
|
-
* holds an `AstDocument` and mutates it sends this straight back as
|
|
118
|
-
* `
|
|
119
|
-
* conflict gate arms on it.
|
|
117
|
+
* holds an `AstDocument` and mutates it sends this straight back as the
|
|
118
|
+
* `basedOn` of its session's write, and the conflict gate arms on it.
|
|
120
119
|
*/
|
|
121
120
|
version: SnapshotVersion;
|
|
122
121
|
}
|
|
@@ -214,28 +213,12 @@ export interface AstDocumentManager<TAst extends AstNode, TDiagnostic extends As
|
|
|
214
213
|
/** Apply `text` as `clientId`'s edit. Resolves to the resulting text-document version. */
|
|
215
214
|
update(uri: string, text: string, clientId: string): Promise<number>;
|
|
216
215
|
/**
|
|
217
|
-
* Write the document's current text to disk through
|
|
218
|
-
* The text is taken when this is called, so saves of one
|
|
216
|
+
* Write the document's current text to disk through `FileSystemTaskQueue`.
|
|
217
|
+
* The text is taken when this is called, so saves of one file land in the
|
|
219
218
|
* order they were called.
|
|
220
219
|
*/
|
|
221
220
|
save(uri: string, clientId: string): Promise<void>;
|
|
222
221
|
|
|
223
|
-
/**
|
|
224
|
-
* Run `task` once every disk task already queued for `uri` has settled, and
|
|
225
|
-
* before any queued after it. Every server-side disk access of a file that
|
|
226
|
-
* must not interleave with its saves goes through here: two writes of one
|
|
227
|
-
* file that bypass it can land in either order, and the older text then
|
|
228
|
-
* stays on disk. Tasks of different URIs run in parallel. A task that has
|
|
229
|
-
* nothing to do still resolves once the tasks before it have settled.
|
|
230
|
-
*
|
|
231
|
-
* A task must not await a build, nor a save, another disk task or an open
|
|
232
|
-
* of a document no client has open, all of the same URI: a build's
|
|
233
|
-
* integrity repair queues its own write here and the build waits for it,
|
|
234
|
-
* and such an open reads the file here, so a task waiting on either queued
|
|
235
|
-
* behind it never resolves, which wedges the URI's queue for good.
|
|
236
|
-
*/
|
|
237
|
-
queueDiskTask<T>(uri: string, task: () => Promise<T>): Promise<T>;
|
|
238
|
-
|
|
239
222
|
onUpdate(uri: string, listener: (event: AstDocumentUpdatedEvent<TAst, TDiagnostic>) => void): Disposable;
|
|
240
223
|
onSave(uri: string, listener: (event: AstDocumentSavedEvent<TAst, TDiagnostic>) => void | Promise<void>): Disposable;
|
|
241
224
|
onClientClosed(uri: string, clientId: string, listener: () => void): Disposable;
|
|
@@ -244,18 +227,6 @@ export interface AstDocumentManager<TAst extends AstNode, TDiagnostic extends As
|
|
|
244
227
|
|
|
245
228
|
/** Client id that authored the document's current version, or `undefined` for a framework-internal build. */
|
|
246
229
|
getAuthor(document: LangiumDocument): string | undefined;
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Whether `uri` is one of the URIs the most recent build request named, as
|
|
250
|
-
* opposed to a document that build swept in as a dependent. Deletions are
|
|
251
|
-
* excluded: they never reach this layer, since a deleted document is
|
|
252
|
-
* removed before the build set is computed.
|
|
253
|
-
*
|
|
254
|
-
* The answer refers to the latest request, which may still be building, and
|
|
255
|
-
* it is retained between builds — so outside a build it describes whichever
|
|
256
|
-
* one ran last.
|
|
257
|
-
*/
|
|
258
|
-
isTriggeringEdit(uri: string): boolean;
|
|
259
230
|
}
|
|
260
231
|
|
|
261
232
|
/**
|
|
@@ -284,13 +255,6 @@ export class DefaultAstDocumentManager<
|
|
|
284
255
|
> implements AstDocumentManager<TAst, TDiagnostic> {
|
|
285
256
|
protected lastUpdate?: UpdateInfo;
|
|
286
257
|
|
|
287
|
-
/**
|
|
288
|
-
* Per canonical URI, the settling of the last disk task queued for it; the
|
|
289
|
-
* next task chains behind it. An entry leaves once its URI's queue is idle.
|
|
290
|
-
* Kept outside the workspace lock, whose `write` cancels the write before
|
|
291
|
-
* it: a save cancelled that way reports success for text it never wrote.
|
|
292
|
-
*/
|
|
293
|
-
protected readonly diskQueues = new Map<CanonicalUri, Promise<void>>();
|
|
294
258
|
/** Per canonical URI, the newest save queued for it, which {@link coalesceSaves} lets older queued saves defer to. */
|
|
295
259
|
protected readonly newestSaves = new Map<CanonicalUri, Promise<void>>();
|
|
296
260
|
protected readonly coalesceSaves: boolean;
|
|
@@ -442,8 +406,8 @@ export class DefaultAstDocumentManager<
|
|
|
442
406
|
* The client that authored `document`'s current version, or `undefined` when
|
|
443
407
|
* no client wrote it — a framework-internal rebuild (workspace startup, a
|
|
444
408
|
* cascade relink, a `didClose`-reload) or a genuine author gap. Honest about
|
|
445
|
-
* absence so routing
|
|
446
|
-
*
|
|
409
|
+
* absence so a routing consumer tests `undefined` directly rather than
|
|
410
|
+
* against a sentinel; the presentation
|
|
447
411
|
* default ({@link UNKNOWN_CLIENT_ID}) is applied at the boundary that needs a
|
|
448
412
|
* concrete value (the `onUpdate` event's `sourceClientId`, the data-server's
|
|
449
413
|
* `resolveSourceClientId`).
|
|
@@ -454,9 +418,9 @@ export class DefaultAstDocumentManager<
|
|
|
454
418
|
|
|
455
419
|
async open(args: OpenModelArgs): Promise<Disposable> {
|
|
456
420
|
// `open()` is the RPC-level "ensure this document is loaded" call. It is issued
|
|
457
|
-
// by a
|
|
458
|
-
//
|
|
459
|
-
//
|
|
421
|
+
// by a session opening the document, including by every additional client
|
|
422
|
+
// attaching to the same URI and the several sub-editors a composite view
|
|
423
|
+
// opens. When the document is already loaded there is nothing to
|
|
460
424
|
// do here but hand back the close-disposable — callers that want the current
|
|
461
425
|
// state read it from this method's surrounding RPC response, not from a re-build.
|
|
462
426
|
//
|
|
@@ -471,15 +435,19 @@ export class DefaultAstDocumentManager<
|
|
|
471
435
|
// wires `onDidOpen -> this.open`, it would fire a second, identical rebuild on
|
|
472
436
|
// every first open.
|
|
473
437
|
//
|
|
474
|
-
// So an already-open `open()` records the attaching client's
|
|
475
|
-
// else. The
|
|
476
|
-
// to it, so skipping it lets the first
|
|
477
|
-
// another client is still reading.
|
|
438
|
+
// So an already-open `open()` records the attaching client's open and nothing
|
|
439
|
+
// else. The open is per `(uri, clientId)` and the last-close revert counts down
|
|
440
|
+
// to it, so skipping it lets the first client's close tear down a document
|
|
441
|
+
// another client is still reading. A document waiting out the revert grace
|
|
442
|
+
// is still loaded: a client lost from it within its own grace attaches and
|
|
443
|
+
// keeps its text, and for any other client the attach releases it, so the
|
|
444
|
+
// open reads the file.
|
|
445
|
+
if (this.isOpen(args.uri)) {
|
|
446
|
+
this.textDocuments.attachClient(args.uri, args.clientId);
|
|
447
|
+
}
|
|
478
448
|
if (!this.isOpen(args.uri)) {
|
|
479
449
|
const textDocument = await this.createDocumentFromTextOrFileSystem(args.uri, args.languageId, args.version, args.text);
|
|
480
450
|
this.textDocuments.notifyDidOpenTextDocument({ textDocument }, args.clientId);
|
|
481
|
-
} else {
|
|
482
|
-
this.textDocuments.attachClient(args.uri, args.clientId);
|
|
483
451
|
}
|
|
484
452
|
return Disposable.create(() => this.close(args));
|
|
485
453
|
}
|
|
@@ -514,7 +482,7 @@ export class DefaultAstDocumentManager<
|
|
|
514
482
|
* callers don't need to pass it — the manager owns content and version
|
|
515
483
|
* sequencing.
|
|
516
484
|
*
|
|
517
|
-
* The text is taken synchronously, before the save waits in the
|
|
485
|
+
* The text is taken synchronously, before the save waits in the file's task
|
|
518
486
|
* queue; the compare and the write run in the queue. Taken later, a save
|
|
519
487
|
* that waits behind another writes whatever the store holds when its turn
|
|
520
488
|
* comes, edits made after the call included, and announces that text under
|
|
@@ -539,7 +507,7 @@ export class DefaultAstDocumentManager<
|
|
|
539
507
|
}
|
|
540
508
|
const text = document.getText();
|
|
541
509
|
let supersededBy: Promise<void> | undefined;
|
|
542
|
-
const saved: Promise<void> = this.
|
|
510
|
+
const saved: Promise<void> = this.services.workspace.FileSystemTaskQueue.enqueue(canonical, async () => {
|
|
543
511
|
const newest = this.newestSaves.get(canonical);
|
|
544
512
|
if (this.coalesceSaves && newest !== saved) {
|
|
545
513
|
supersededBy = newest;
|
|
@@ -557,7 +525,7 @@ export class DefaultAstDocumentManager<
|
|
|
557
525
|
return saved;
|
|
558
526
|
}
|
|
559
527
|
|
|
560
|
-
/** Write `text` to `uri` unless the file already holds it, then announce the save. Runs inside the
|
|
528
|
+
/** Write `text` to `uri` unless the file already holds it, then announce the save. Runs inside the file's task queue. */
|
|
561
529
|
protected async writeSave(uri: CanonicalUri, text: string, clientId: string): Promise<void> {
|
|
562
530
|
if (!(await this.matchesDisk(uri, text))) {
|
|
563
531
|
await this.tracer.with(uri).time(
|
|
@@ -570,22 +538,6 @@ export class DefaultAstDocumentManager<
|
|
|
570
538
|
this.textDocuments.notifyDidSaveTextDocument({ textDocument: TextDocumentIdentifier.create(uri), text }, clientId);
|
|
571
539
|
}
|
|
572
540
|
|
|
573
|
-
queueDiskTask<T>(uri: string, task: () => Promise<T>): Promise<T> {
|
|
574
|
-
const key = this.uriPolicy.canonicalUri(uri);
|
|
575
|
-
const result = (this.diskQueues.get(key) ?? Promise.resolve()).then(task);
|
|
576
|
-
const settled = result.then(
|
|
577
|
-
() => undefined,
|
|
578
|
-
() => undefined
|
|
579
|
-
);
|
|
580
|
-
this.diskQueues.set(key, settled);
|
|
581
|
-
void settled.then(() => {
|
|
582
|
-
if (this.diskQueues.get(key) === settled) {
|
|
583
|
-
this.diskQueues.delete(key);
|
|
584
|
-
}
|
|
585
|
-
});
|
|
586
|
-
return result;
|
|
587
|
-
}
|
|
588
|
-
|
|
589
541
|
/**
|
|
590
542
|
* Whether the file at `uri` already holds `text`.
|
|
591
543
|
*
|
|
@@ -606,11 +558,6 @@ export class DefaultAstDocumentManager<
|
|
|
606
558
|
return !!this.textDocuments.get(uri);
|
|
607
559
|
}
|
|
608
560
|
|
|
609
|
-
isTriggeringEdit(uri: string): boolean {
|
|
610
|
-
const canonical = this.uriPolicy.canonicalUri(uri);
|
|
611
|
-
return this.lastUpdate?.changed.some(changed => this.uriPolicy.canonicalUri(changed) === canonical) ?? false;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
561
|
/**
|
|
615
562
|
* The `LangiumDocument` for an externally-supplied URI, looked up by its
|
|
616
563
|
* canonical identity. Folds the `getDocument(toUri(canonicalUri(uri)))` idiom
|
|
@@ -628,13 +575,15 @@ export class DefaultAstDocumentManager<
|
|
|
628
575
|
version = 0,
|
|
629
576
|
text?: string
|
|
630
577
|
): Promise<TextDocumentItem> {
|
|
631
|
-
// Read in the
|
|
632
|
-
// the text from before it, and the document then opens on that.
|
|
578
|
+
// Read in the file's task queue: a read beside a queued save of the file
|
|
579
|
+
// returns the text from before it, and the document then opens on that.
|
|
633
580
|
return {
|
|
634
581
|
uri,
|
|
635
582
|
languageId,
|
|
636
583
|
version,
|
|
637
|
-
text:
|
|
584
|
+
text:
|
|
585
|
+
text ??
|
|
586
|
+
(await this.services.workspace.FileSystemTaskQueue.enqueue(uri, () => this.fileSystemProvider.readFile(UriUtils.toUri(uri))))
|
|
638
587
|
};
|
|
639
588
|
}
|
|
640
589
|
|
|
@@ -8,47 +8,15 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* The message names the client id, so it is addressed to whoever composes the
|
|
15
|
-
* system rather than to an end user.
|
|
16
|
-
*/
|
|
17
|
-
export class SessionClosedError extends Error {
|
|
18
|
-
constructor(readonly clientId: string) {
|
|
19
|
-
super(`Client session ${clientId} is closed`);
|
|
20
|
-
this.name = 'SessionClosedError';
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Thrown when a client session writes a document it does not have open.
|
|
26
|
-
*
|
|
27
|
-
* A session writes only what it has open, so this is the answer both to a write
|
|
28
|
-
* that never opened and to one whose open was closed underneath it — by the
|
|
29
|
-
* session itself, or by the document being deleted.
|
|
30
|
-
*/
|
|
31
|
-
export class DocumentNotOpenError extends Error {
|
|
32
|
-
constructor(
|
|
33
|
-
readonly uri: string,
|
|
34
|
-
readonly clientId: string
|
|
35
|
-
) {
|
|
36
|
-
super(`Document ${uri} is not open in client session ${clientId}`);
|
|
37
|
-
this.name = 'DocumentNotOpenError';
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Thrown when a client session is started under an id that is already live in
|
|
43
|
-
* the process, or that the framework reserves for itself.
|
|
44
|
-
*
|
|
45
|
-
* Ids are unique process-wide because the id is also the author label on every
|
|
46
|
-
* version and the key a client recognises its own echoes by; two participants
|
|
47
|
-
* sharing one would each take the other's writes for their own.
|
|
11
|
+
* Re-export, because these errors cross the wire and the side that has to
|
|
12
|
+
* recognise them is the client. They are defined in `@hydranium/protocol` so a
|
|
13
|
+
* frontend can name them without depending on the server tier.
|
|
48
14
|
*/
|
|
49
|
-
export
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
15
|
+
export {
|
|
16
|
+
DocumentNotOpenError,
|
|
17
|
+
DuplicateClientIdError,
|
|
18
|
+
SessionClosedError,
|
|
19
|
+
isDocumentNotOpenError,
|
|
20
|
+
isDuplicateClientIdError,
|
|
21
|
+
isSessionClosedError
|
|
22
|
+
} from '@hydranium/protocol';
|