@hydranium/core 1.0.0-next.204 → 1.0.0-next.206
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.js +4 -4
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +1 -1
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +1 -1
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/client-session-registry.d.ts +24 -17
- package/lib/documents/client-session-registry.d.ts.map +1 -1
- package/lib/documents/client-session-registry.js +49 -29
- package/lib/documents/client-session-registry.js.map +1 -1
- package/lib/documents/dirty-state-tracker.d.ts +79 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +69 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +174 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +270 -0
- package/lib/documents/document-release-handler.js.map +1 -0
- package/lib/documents/document-release-scheduler.d.ts +67 -0
- package/lib/documents/document-release-scheduler.d.ts.map +1 -0
- package/lib/documents/document-release-scheduler.js +80 -0
- package/lib/documents/document-release-scheduler.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +130 -455
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +362 -835
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +5 -1
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +5 -1
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-shadow.d.ts +221 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +288 -0
- package/lib/documents/language-client-shadow.js.map +1 -0
- package/lib/documents/text-ledger.d.ts +64 -0
- package/lib/documents/text-ledger.d.ts.map +1 -0
- package/lib/documents/text-ledger.js +63 -0
- package/lib/documents/text-ledger.js.map +1 -0
- package/lib/langium/document-builder/document-builder.d.ts +8 -7
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +8 -7
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +1 -1
- package/lib/langium/integrity/integrity-service.js +4 -4
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +4 -4
- package/lib/langium/model-service/client-session.js +2 -2
- package/lib/langium/model-service/client-session.js.map +1 -1
- package/lib/langium/model-service/model-events.d.ts +8 -11
- package/lib/langium/model-service/model-events.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.d.ts +12 -4
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +1 -1
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +7 -0
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +3 -1
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +7 -1
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -1
- package/lib/langium/workspace/file-not-found.js +14 -3
- package/lib/langium/workspace/file-not-found.js.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.d.ts +6 -6
- package/lib/lsp/hydranium-document-update-handler.js +10 -10
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +3 -0
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +5 -2
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +9 -6
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +19 -11
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/package.json +5 -5
- package/src/documents/ast-document-manager.ts +4 -4
- package/src/documents/client-ids.ts +1 -1
- package/src/documents/client-session-registry.ts +55 -34
- package/src/documents/dirty-state-tracker.ts +130 -0
- package/src/documents/document-release-handler.ts +351 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/hydranium-text-documents.ts +395 -1034
- package/src/documents/index.ts +5 -1
- package/src/documents/language-client-shadow.ts +463 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/langium/document-builder/document-builder.ts +8 -7
- package/src/langium/integrity/integrity-service.ts +4 -4
- package/src/langium/model-service/client-session.ts +6 -6
- package/src/langium/model-service/model-events.ts +12 -11
- package/src/langium/model-service/model-service.ts +13 -4
- package/src/langium/module.ts +9 -1
- package/src/langium/workspace/file-not-found.ts +15 -3
- package/src/lsp/hydranium-document-update-handler.ts +10 -10
- package/src/testing/make-test-services.ts +7 -2
- package/src/testing/stub-hydranium-text-documents.ts +34 -21
- package/lib/documents/language-client-text-shadow.d.ts +0 -133
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -201
- package/lib/documents/language-client-text-shadow.js.map +0 -1
- package/src/documents/language-client-text-shadow.ts +0 -223
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stub-hydranium-text-documents.js","sourceRoot":"","sources":["../../src/testing/stub-hydranium-text-documents.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAqB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,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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"}
|
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.206",
|
|
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
|
"ast",
|
|
@@ -107,8 +107,8 @@
|
|
|
107
107
|
"diff": "^5.2.0"
|
|
108
108
|
},
|
|
109
109
|
"devDependencies": {
|
|
110
|
-
"@hydranium/langium": "1.0.0-next.
|
|
111
|
-
"@hydranium/protocol": "1.0.0-next.
|
|
110
|
+
"@hydranium/langium": "1.0.0-next.206",
|
|
111
|
+
"@hydranium/protocol": "1.0.0-next.206",
|
|
112
112
|
"@playwright/test": "^1.40.0",
|
|
113
113
|
"@types/diff": "^5.2.0",
|
|
114
114
|
"rimraf": "^5.0.0",
|
|
@@ -120,8 +120,8 @@
|
|
|
120
120
|
"vscode-languageserver-types": "^3.17.5"
|
|
121
121
|
},
|
|
122
122
|
"peerDependencies": {
|
|
123
|
-
"@hydranium/langium": "1.0.0-next.
|
|
124
|
-
"@hydranium/protocol": "1.0.0-next.
|
|
123
|
+
"@hydranium/langium": "1.0.0-next.206",
|
|
124
|
+
"@hydranium/protocol": "1.0.0-next.206",
|
|
125
125
|
"@playwright/test": "^1.40.0",
|
|
126
126
|
"vscode-jsonrpc": "9.0.1",
|
|
127
127
|
"vscode-languageserver": "~10.0.1",
|
|
@@ -422,9 +422,9 @@ export class DefaultAstDocumentManager<
|
|
|
422
422
|
// every first open.
|
|
423
423
|
//
|
|
424
424
|
// So an already-open `open()` records the attaching client's open and nothing
|
|
425
|
-
// else. The open is per `(uri, clientId)` and the
|
|
426
|
-
//
|
|
427
|
-
// another client is still reading. A document waiting out the
|
|
425
|
+
// else. The open is per `(uri, clientId)` and the store releases the document
|
|
426
|
+
// only once none is left, so skipping it lets the first client's close tear down a document
|
|
427
|
+
// another client is still reading. A document waiting out the release grace
|
|
428
428
|
// is still loaded: a client lost from it within its own grace attaches and
|
|
429
429
|
// keeps its text, and for any other client the attach releases it, so the
|
|
430
430
|
// open reads the file.
|
|
@@ -439,7 +439,7 @@ export class DefaultAstDocumentManager<
|
|
|
439
439
|
// Text the caller supplies was not read from the file, so no file
|
|
440
440
|
// is assumed: the document is dirty until its first save, whatever
|
|
441
441
|
// the file holds.
|
|
442
|
-
this.textDocuments.
|
|
442
|
+
this.textDocuments.setDiskBaseline(args.uri, undefined);
|
|
443
443
|
}
|
|
444
444
|
const built = this.getDocument(args.uri);
|
|
445
445
|
if (creates && built) {
|
|
@@ -13,4 +13,4 @@
|
|
|
13
13
|
* can name them without depending on the server tier; this path stays so
|
|
14
14
|
* server-side code keeps importing them from where it already does.
|
|
15
15
|
*/
|
|
16
|
-
export { FRAMEWORK_CLIENT_IDS, LANGUAGE_CLIENT_ID,
|
|
16
|
+
export { FRAMEWORK_CLIENT_IDS, LANGUAGE_CLIENT_ID, DOCUMENT_RELEASE_CLIENT_ID, UNKNOWN_CLIENT_ID } from '@hydranium/protocol';
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { type CanonicalUri, FRAMEWORK_CLIENT_IDS } from '@hydranium/protocol';
|
|
11
|
-
import {
|
|
11
|
+
import { Emitter, type Event } from 'vscode-languageserver';
|
|
12
12
|
import { INTEGRITY_CLIENT_ID } from '../langium/integrity/integrity-rule.js';
|
|
13
13
|
import { DuplicateClientIdError, ReservedClientIdError, SessionClosedError } from './client-session-errors.js';
|
|
14
14
|
|
|
@@ -42,7 +42,7 @@ export interface ClientSessionClosedEvent {
|
|
|
42
42
|
/**
|
|
43
43
|
* Why a close happened. `'lost'` is a close caused by the client's connection
|
|
44
44
|
* going away rather than by the client, and only such a last close waits out
|
|
45
|
-
* the store's
|
|
45
|
+
* the store's release grace: a client that closed or ended on purpose has
|
|
46
46
|
* discarded its unsaved edits, while one that lost its connection may be about
|
|
47
47
|
* to register again and open the document once more.
|
|
48
48
|
*/
|
|
@@ -78,15 +78,15 @@ export class ClientSessionRegistry {
|
|
|
78
78
|
protected readonly sessions = new Map<string, ClientSessionState>();
|
|
79
79
|
protected readonly clientsByUri = new Map<CanonicalUri, Set<string>>();
|
|
80
80
|
protected readonly opensByClient = new Map<string, Set<CanonicalUri>>();
|
|
81
|
-
protected readonly reservedIds: ReadonlySet<string> = new Set(RESERVED_CLIENT_IDS);
|
|
82
|
-
protected readonly sessionClosedEmitter = new Emitter<ClientSessionClosedEvent>();
|
|
83
81
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
82
|
+
* Per document, the newest version id each client declared for its own
|
|
83
|
+
* buffer: the baseline of the store's per-client staleness guard. A
|
|
84
|
+
* client's goes when it closes the document, every one when the store
|
|
85
|
+
* releases it.
|
|
88
86
|
*/
|
|
89
|
-
protected readonly
|
|
87
|
+
protected readonly clientVersions = new Map<CanonicalUri, Map<string, number>>();
|
|
88
|
+
protected readonly reservedIds: ReadonlySet<string> = new Set(RESERVED_CLIENT_IDS);
|
|
89
|
+
protected readonly sessionClosedEmitter = new Emitter<ClientSessionClosedEvent>();
|
|
90
90
|
|
|
91
91
|
/** Fires once a session has been removed from the table, after all its opens closed. */
|
|
92
92
|
get onDidCloseSession(): Event<ClientSessionClosedEvent> {
|
|
@@ -129,11 +129,21 @@ export class ClientSessionRegistry {
|
|
|
129
129
|
return this.opensOf(clientId);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
/**
|
|
132
|
+
/**
|
|
133
|
+
* Remove `clientId` from the session table, with every client version it
|
|
134
|
+
* declared, and announce it with `cause`. A no-op for an id that is not
|
|
135
|
+
* registered. The versions go too: a client registered again under the same
|
|
136
|
+
* id counts its versions afresh.
|
|
137
|
+
*/
|
|
133
138
|
unregister(clientId: string, cause: SessionEndCause = 'closed'): void {
|
|
134
139
|
if (!this.sessions.delete(clientId)) {
|
|
135
140
|
return;
|
|
136
141
|
}
|
|
142
|
+
for (const [uri, versions] of this.clientVersions) {
|
|
143
|
+
if (versions.delete(clientId) && versions.size === 0) {
|
|
144
|
+
this.clientVersions.delete(uri);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
137
147
|
this.sessionClosedEmitter.fire(Object.freeze({ clientId, cause }));
|
|
138
148
|
}
|
|
139
149
|
|
|
@@ -144,9 +154,7 @@ export class ClientSessionRegistry {
|
|
|
144
154
|
* Throws {@link SessionClosedError} for a session that is closing.
|
|
145
155
|
*/
|
|
146
156
|
addOpen(uri: CanonicalUri, clientId: string): boolean {
|
|
147
|
-
|
|
148
|
-
throw new SessionClosedError(clientId);
|
|
149
|
-
}
|
|
157
|
+
this.assertCanOpen(clientId);
|
|
150
158
|
let opens = this.opensByClient.get(clientId);
|
|
151
159
|
if (opens?.has(uri)) {
|
|
152
160
|
return false;
|
|
@@ -165,6 +173,13 @@ export class ClientSessionRegistry {
|
|
|
165
173
|
return true;
|
|
166
174
|
}
|
|
167
175
|
|
|
176
|
+
/** Throws {@link SessionClosedError} when `clientId` is a session that is closing, and so can open nothing more. */
|
|
177
|
+
assertCanOpen(clientId: string): void {
|
|
178
|
+
if (this.sessions.get(clientId) === 'closing') {
|
|
179
|
+
throw new SessionClosedError(clientId);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
168
183
|
/** Record that `clientId` closed `uri`. Returns `false` when it did not have it open. */
|
|
169
184
|
removeOpen(uri: CanonicalUri, clientId: string): boolean {
|
|
170
185
|
const opens = this.opensByClient.get(clientId);
|
|
@@ -179,9 +194,34 @@ export class ClientSessionRegistry {
|
|
|
179
194
|
if (!clients?.size) {
|
|
180
195
|
this.clientsByUri.delete(uri);
|
|
181
196
|
}
|
|
197
|
+
const versions = this.clientVersions.get(uri);
|
|
198
|
+
versions?.delete(clientId);
|
|
199
|
+
if (!versions?.size) {
|
|
200
|
+
this.clientVersions.delete(uri);
|
|
201
|
+
}
|
|
182
202
|
return true;
|
|
183
203
|
}
|
|
184
204
|
|
|
205
|
+
/** Take `version` as the newest `clientId` declared for `uri`, whether or not it has `uri` open. */
|
|
206
|
+
setClientVersion(uri: CanonicalUri, clientId: string, version: number): void {
|
|
207
|
+
let versions = this.clientVersions.get(uri);
|
|
208
|
+
if (!versions) {
|
|
209
|
+
versions = new Map();
|
|
210
|
+
this.clientVersions.set(uri, versions);
|
|
211
|
+
}
|
|
212
|
+
versions.set(clientId, version);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** The newest version id `clientId` declared for `uri`. */
|
|
216
|
+
clientVersionOf(uri: CanonicalUri, clientId: string): number | undefined {
|
|
217
|
+
return this.clientVersions.get(uri)?.get(clientId);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Drop every client version of `uri`, for a document the store released. */
|
|
221
|
+
forgetClientVersions(uri: CanonicalUri): void {
|
|
222
|
+
this.clientVersions.delete(uri);
|
|
223
|
+
}
|
|
224
|
+
|
|
185
225
|
/** Whether `clientId` has `uri` open. */
|
|
186
226
|
isOpenIn(uri: CanonicalUri, clientId: string): boolean {
|
|
187
227
|
return !!this.clientsByUri.get(uri)?.has(clientId);
|
|
@@ -207,24 +247,8 @@ export class ClientSessionRegistry {
|
|
|
207
247
|
return [...this.clientsByUri].map(([uri, clients]) => ({ uri, clients: [...clients] }));
|
|
208
248
|
}
|
|
209
249
|
|
|
210
|
-
/** Record `timer` as the deferred revert of `uri`. */
|
|
211
|
-
deferRevert(uri: CanonicalUri, timer: Disposable): void {
|
|
212
|
-
this.pendingReverts.set(uri, timer);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/** Whether the revert of `uri` is deferred. */
|
|
216
|
-
isRevertPending(uri: CanonicalUri): boolean {
|
|
217
|
-
return this.pendingReverts.has(uri);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/** Cancel the deferred revert of `uri`, if one is pending. */
|
|
221
|
-
cancelRevert(uri: CanonicalUri): void {
|
|
222
|
-
this.pendingReverts.get(uri)?.dispose();
|
|
223
|
-
this.pendingReverts.delete(uri);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
250
|
/**
|
|
227
|
-
* Forget every session
|
|
251
|
+
* Forget every session and open without announcing
|
|
228
252
|
* anything, for a test double that resets between tests. Subscriptions
|
|
229
253
|
* stay, so a listener registered before the clear hears the sessions that
|
|
230
254
|
* end after it.
|
|
@@ -233,9 +257,6 @@ export class ClientSessionRegistry {
|
|
|
233
257
|
this.sessions.clear();
|
|
234
258
|
this.clientsByUri.clear();
|
|
235
259
|
this.opensByClient.clear();
|
|
236
|
-
|
|
237
|
-
timer.dispose();
|
|
238
|
-
}
|
|
239
|
-
this.pendingReverts.clear();
|
|
260
|
+
this.clientVersions.clear();
|
|
240
261
|
}
|
|
241
262
|
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
|
|
10
|
+
import { type CanonicalUri, type TextState } from '@hydranium/protocol';
|
|
11
|
+
import { Emitter, type Event } from 'vscode-languageserver';
|
|
12
|
+
import { type TextDocument } from 'vscode-languageserver-textdocument';
|
|
13
|
+
import { type TextLedger } from './text-ledger.js';
|
|
14
|
+
|
|
15
|
+
/** Delivered by the store's `onDidChangeDirty`, which forwards {@link DirtyStateTracker.onDidChangeDirty}. */
|
|
16
|
+
export interface DocumentDirtyChangedEvent {
|
|
17
|
+
readonly uri: CanonicalUri;
|
|
18
|
+
/**
|
|
19
|
+
* The text the new answer of {@link DirtyStateTracker.isDirty} was decided
|
|
20
|
+
* on. The answer changes with the text, before any build, so it can name
|
|
21
|
+
* text whose model has not been sent yet. Absent when the document no longer
|
|
22
|
+
* exists, or when the build that follows its release failed.
|
|
23
|
+
*/
|
|
24
|
+
readonly text?: TextState;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Owed by a document released dirty: the announcement that it is clean. A
|
|
29
|
+
* first open before it is made takes it over, and each release owes one of its
|
|
30
|
+
* own, so announcing for an earlier release cannot announce a later one clean.
|
|
31
|
+
*/
|
|
32
|
+
export interface CleanAnnouncement {
|
|
33
|
+
/** Whether it is still owed: neither made nor taken over. */
|
|
34
|
+
isOwed(): boolean;
|
|
35
|
+
/** Make it, naming `text`; a no-op once it is no longer owed. */
|
|
36
|
+
announce(text?: TextState): void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Whether each tracked document differs from its disk baseline: what the
|
|
41
|
+
* server last knew the file to hold. The store reports every change of its
|
|
42
|
+
* text and of the baseline; this decides the answer and announces it when it
|
|
43
|
+
* changes.
|
|
44
|
+
*/
|
|
45
|
+
export interface DirtyStateTracker {
|
|
46
|
+
readonly onDidChangeDirty: Event<DocumentDirtyChangedEvent>;
|
|
47
|
+
/** `false` for a document not tracked. */
|
|
48
|
+
isDirty(key: CanonicalUri): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Track `key` from its first open, holding `document`, while its file
|
|
51
|
+
* holds `diskText`. Takes over the clean announcement a release still owes, so its
|
|
52
|
+
* own answer decides the flip.
|
|
53
|
+
*/
|
|
54
|
+
track(key: CanonicalUri, document: TextDocument, diskText: string | undefined): void;
|
|
55
|
+
/** The text of `key` is now `document`'s. A no-op for a document not tracked. */
|
|
56
|
+
refreshDirty(key: CanonicalUri, document: TextDocument): void;
|
|
57
|
+
/** The file behind `key` holds `text`, `undefined` for none. A no-op for a document not tracked. */
|
|
58
|
+
setDiskBaseline(key: CanonicalUri, document: TextDocument, text: string | undefined): void;
|
|
59
|
+
/**
|
|
60
|
+
* The store released `key`. Answers the clean announcement a document
|
|
61
|
+
* released dirty now owes; `undefined` for one released clean.
|
|
62
|
+
*/
|
|
63
|
+
release(key: CanonicalUri): CleanAnnouncement | undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export class DefaultDirtyStateTracker implements DirtyStateTracker {
|
|
67
|
+
protected readonly states = new Map<CanonicalUri, { baseline: string | undefined; dirty: boolean }>();
|
|
68
|
+
/** Per document released dirty, the token of the announcement it owes. */
|
|
69
|
+
protected readonly owedClean = new Map<CanonicalUri, object>();
|
|
70
|
+
protected readonly dirtyChangedEmitter = new Emitter<DocumentDirtyChangedEvent>();
|
|
71
|
+
|
|
72
|
+
/** @param textLedger hashes the text an announcement names. */
|
|
73
|
+
constructor(protected readonly textLedger: TextLedger) {}
|
|
74
|
+
|
|
75
|
+
get onDidChangeDirty(): Event<DocumentDirtyChangedEvent> {
|
|
76
|
+
return this.dirtyChangedEmitter.event;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
isDirty(key: CanonicalUri): boolean {
|
|
80
|
+
return this.states.get(key)?.dirty ?? false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
track(key: CanonicalUri, document: TextDocument, diskText: string | undefined): void {
|
|
84
|
+
this.states.set(key, { baseline: diskText, dirty: this.owedClean.delete(key) });
|
|
85
|
+
this.refreshDirty(key, document);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
refreshDirty(key: CanonicalUri, document: TextDocument): void {
|
|
89
|
+
const state = this.states.get(key);
|
|
90
|
+
if (!state) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const dirty = document.getText() !== state.baseline;
|
|
94
|
+
if (dirty !== state.dirty) {
|
|
95
|
+
state.dirty = dirty;
|
|
96
|
+
this.dirtyChangedEmitter.fire(
|
|
97
|
+
Object.freeze({ uri: key, text: { version: document.version, hash: this.textLedger.hashOf(document), dirty } })
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
setDiskBaseline(key: CanonicalUri, document: TextDocument, text: string | undefined): void {
|
|
103
|
+
const state = this.states.get(key);
|
|
104
|
+
if (!state) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
state.baseline = text;
|
|
108
|
+
this.refreshDirty(key, document);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
release(key: CanonicalUri): CleanAnnouncement | undefined {
|
|
112
|
+
const dirty = this.states.get(key)?.dirty;
|
|
113
|
+
this.states.delete(key);
|
|
114
|
+
if (!dirty) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const token = {};
|
|
118
|
+
this.owedClean.set(key, token);
|
|
119
|
+
const isOwed = (): boolean => this.owedClean.get(key) === token;
|
|
120
|
+
return {
|
|
121
|
+
isOwed,
|
|
122
|
+
announce: text => {
|
|
123
|
+
if (isOwed()) {
|
|
124
|
+
this.owedClean.delete(key);
|
|
125
|
+
this.dirtyChangedEmitter.fire(Object.freeze(text ? { uri: key, text } : { uri: key }));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|