@hydranium/core 1.0.0-next.205 → 1.0.0-next.208
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 +179 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +283 -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 +137 -455
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +373 -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 +18 -4
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +4 -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 +25 -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 +365 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/hydranium-text-documents.ts +407 -1033
- 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 +22 -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 +41 -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
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 CrossBreeze, 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
|
+
import { textHash } from '@hydranium/protocol';
|
|
10
|
+
import { diffLines } from 'diff';
|
|
11
|
+
import { Range, TextDocumentContentChangeEvent as ContentChange, uinteger } from 'vscode-languageserver';
|
|
12
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
13
|
+
/**
|
|
14
|
+
* Upper bound on the pending pushes per URI. Echoes normally return within
|
|
15
|
+
* milliseconds; a queue this deep means the client stopped echoing.
|
|
16
|
+
*/
|
|
17
|
+
const PENDING_ECHO_CAP = 32;
|
|
18
|
+
/** The range every full-document replace emitted here carries. */
|
|
19
|
+
const FULL_RANGE = Range.create(0, 0, uinteger.MAX_VALUE, uinteger.MAX_VALUE);
|
|
20
|
+
/**
|
|
21
|
+
* Whether `edits` is the single full-document replace a push emits when it has
|
|
22
|
+
* no usable baseline. A full replace is position-independent and lands on any
|
|
23
|
+
* client buffer; a line-keyed diff lands only on the text it was diffed
|
|
24
|
+
* against, so only the latter needs a client-version gate.
|
|
25
|
+
*/
|
|
26
|
+
export function isFullReplace(edits) {
|
|
27
|
+
if (edits.length !== 1) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const { start, end } = edits[0].range;
|
|
31
|
+
return start.line === FULL_RANGE.start.line && start.character === FULL_RANGE.start.character && end.line === FULL_RANGE.end.line;
|
|
32
|
+
}
|
|
33
|
+
export class DefaultLanguageClientShadow {
|
|
34
|
+
configuration;
|
|
35
|
+
tracer;
|
|
36
|
+
opens = new Map();
|
|
37
|
+
/** The diff baseline: the text the client is believed to hold. */
|
|
38
|
+
baselines = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* The text the client declared at an open with no diff baseline, compared
|
|
41
|
+
* for equality only. A line-keyed diff keyed to this snapshot splices a
|
|
42
|
+
* buffer the client may have moved past.
|
|
43
|
+
*/
|
|
44
|
+
openedTexts = new Map();
|
|
45
|
+
pending = new Map();
|
|
46
|
+
/**
|
|
47
|
+
* @param configuration the store's text-document factories, the store's own
|
|
48
|
+
* `create` and `update`. Probes go through them rather than `TextDocument`
|
|
49
|
+
* directly, so an adopter's custom text-document type applies ranges here
|
|
50
|
+
* as it does on the synced document; the bare `TextDocument.update` also
|
|
51
|
+
* refuses a document it did not create.
|
|
52
|
+
*/
|
|
53
|
+
constructor(configuration, tracer) {
|
|
54
|
+
this.configuration = configuration;
|
|
55
|
+
this.tracer = tracer;
|
|
56
|
+
}
|
|
57
|
+
addOpen(key, clientUri, version, text, firstOpen) {
|
|
58
|
+
let uris = this.opens.get(key);
|
|
59
|
+
if (uris?.has(clientUri)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (!uris) {
|
|
63
|
+
uris = new Map();
|
|
64
|
+
this.opens.set(key, uris);
|
|
65
|
+
}
|
|
66
|
+
uris.set(clientUri, { declaredVersion: version });
|
|
67
|
+
if (!firstOpen) {
|
|
68
|
+
this.openedTexts.set(clientUri, text);
|
|
69
|
+
}
|
|
70
|
+
else if (!this.baselines.has(clientUri)) {
|
|
71
|
+
// A push to a closed file has the client open it from disk and apply
|
|
72
|
+
// afterwards, so a tracked text already names what it is about to hold.
|
|
73
|
+
this.baselines.set(clientUri, text);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
declaredVersion(key, clientUri) {
|
|
77
|
+
return this.opens.get(key)?.get(clientUri)?.declaredVersion;
|
|
78
|
+
}
|
|
79
|
+
acceptChange(key, clientUri, version, document, changes) {
|
|
80
|
+
const state = this.opens.get(key)?.get(clientUri);
|
|
81
|
+
if (state) {
|
|
82
|
+
state.declaredVersion = version;
|
|
83
|
+
}
|
|
84
|
+
return this.classify(clientUri, document, changes);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Reconstruct the client's resulting buffer against the text its ranges
|
|
88
|
+
* address: the pre-push buffer of the oldest push still in flight, else
|
|
89
|
+
* what the client is believed to hold.
|
|
90
|
+
*
|
|
91
|
+
* The client applies pushes in order and echoes each against the buffer it
|
|
92
|
+
* held before that push, so the first echo belongs to the oldest entry.
|
|
93
|
+
* Matching against every pending hash, not only the oldest, recognises an
|
|
94
|
+
* echo a newer push already superseded, and consumes everything older too.
|
|
95
|
+
* A reconstruction matching none means the client's buffer went somewhere
|
|
96
|
+
* we did not send it, and the queue drops.
|
|
97
|
+
*
|
|
98
|
+
* Content equality is a sound echo proof because entries live only between
|
|
99
|
+
* a push and its echo, and `didChange` arrives in mutation order: an undo
|
|
100
|
+
* back to a previously pushed text revisits a past state, while the queue
|
|
101
|
+
* holds only in-flight ones.
|
|
102
|
+
*/
|
|
103
|
+
classify(clientUri, document, changes) {
|
|
104
|
+
const queued = this.pending.get(clientUri);
|
|
105
|
+
const pending = queued?.length ? queued : undefined;
|
|
106
|
+
const clientText = pending?.[0].before ?? this.clientText(clientUri);
|
|
107
|
+
if (pending === undefined && (clientText === undefined || clientText === document.getText())) {
|
|
108
|
+
return { kind: 'direct' };
|
|
109
|
+
}
|
|
110
|
+
if (pending !== undefined && pending[0].before === undefined && changes.some(change => ContentChange.isIncremental(change))) {
|
|
111
|
+
// A push sent to a buffer it did not know: the tracked text is now the
|
|
112
|
+
// text that push moves the client to, the one text these ranges
|
|
113
|
+
// provably do not address. Dropped, the next push is a full replace. A
|
|
114
|
+
// full-text change reconstructs identically against any baseline.
|
|
115
|
+
this.invalidateClientText(clientUri);
|
|
116
|
+
return { kind: 'unreconstructable' };
|
|
117
|
+
}
|
|
118
|
+
const probe = this.configuration.create(clientUri, document.languageId, 0, clientText ?? document.getText());
|
|
119
|
+
const reconstructed = this.configuration.update(probe, changes, 0).getText();
|
|
120
|
+
if (pending !== undefined) {
|
|
121
|
+
const matchIndex = pending.findIndex(push => push.afterHash === textHash(reconstructed));
|
|
122
|
+
if (matchIndex >= 0) {
|
|
123
|
+
pending.splice(0, matchIndex + 1);
|
|
124
|
+
return { kind: 'echo' };
|
|
125
|
+
}
|
|
126
|
+
this.pending.delete(clientUri);
|
|
127
|
+
}
|
|
128
|
+
return { kind: 'divergent', text: reconstructed };
|
|
129
|
+
}
|
|
130
|
+
setClientText(clientUri, text) {
|
|
131
|
+
this.baselines.set(clientUri, text);
|
|
132
|
+
this.pending.delete(clientUri);
|
|
133
|
+
}
|
|
134
|
+
removeOpen(key, clientUri) {
|
|
135
|
+
const uris = this.opens.get(key);
|
|
136
|
+
if (uris?.delete(clientUri)) {
|
|
137
|
+
this.invalidateClientText(clientUri);
|
|
138
|
+
if (uris.size === 0) {
|
|
139
|
+
this.opens.delete(key);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
isOpen(key, clientUri) {
|
|
144
|
+
const uris = this.opens.get(key);
|
|
145
|
+
return clientUri === undefined ? uris !== undefined : (uris?.has(clientUri) ?? false);
|
|
146
|
+
}
|
|
147
|
+
removeAllOpens(key) {
|
|
148
|
+
for (const clientUri of this.opens.get(key)?.keys() ?? []) {
|
|
149
|
+
this.invalidateClientText(clientUri);
|
|
150
|
+
}
|
|
151
|
+
this.opens.delete(key);
|
|
152
|
+
}
|
|
153
|
+
pushTargets(key, fallback) {
|
|
154
|
+
const uris = this.opens.get(key);
|
|
155
|
+
return uris && uris.size > 0 ? [...uris.keys()] : [fallback];
|
|
156
|
+
}
|
|
157
|
+
preparePush(key, clientUri, text) {
|
|
158
|
+
// Read before computing the edits, which moves the baseline: this is the
|
|
159
|
+
// only text the push's echo can be reconstructed against.
|
|
160
|
+
const before = this.clientText(clientUri);
|
|
161
|
+
const edits = this.computeEdits(clientUri, text);
|
|
162
|
+
if (edits.length === 0) {
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
this.recordPendingPush(clientUri, before, text);
|
|
166
|
+
// Captured now: a reopen while the push is in flight replaces the state.
|
|
167
|
+
const state = this.opens.get(key)?.get(clientUri);
|
|
168
|
+
// Gating a full replace turns a stale-by-one version into a refused
|
|
169
|
+
// update for no safety gain, and refuses the retry after a rejection.
|
|
170
|
+
const version = isFullReplace(edits) || state === undefined ? null : Math.max(state.declaredVersion, state.pushedVersion ?? state.declaredVersion);
|
|
171
|
+
let settled = false;
|
|
172
|
+
return {
|
|
173
|
+
clientUri,
|
|
174
|
+
edits,
|
|
175
|
+
version,
|
|
176
|
+
notifyOutcome: outcome => {
|
|
177
|
+
if (!settled) {
|
|
178
|
+
settled = true;
|
|
179
|
+
if (outcome === 'refused' && version !== null) {
|
|
180
|
+
this.tracer
|
|
181
|
+
.with(key)
|
|
182
|
+
.warn(`Language client refused applyEdit addressed at version ${version} (it last declared version ${state?.declaredVersion})`);
|
|
183
|
+
}
|
|
184
|
+
this.settle(clientUri, version, state, outcome);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/** What a prepared push's {@link PreparedLanguageClientPush.notifyOutcome} does. */
|
|
190
|
+
settle(clientUri, version, state, outcome) {
|
|
191
|
+
if (outcome !== 'applied') {
|
|
192
|
+
this.invalidateClientText(clientUri);
|
|
193
|
+
}
|
|
194
|
+
else if (version !== null && state) {
|
|
195
|
+
// A client steps once per applied edit that changes its buffer. Left
|
|
196
|
+
// to the echo, a push sent next is refused at the old version.
|
|
197
|
+
state.pushedVersion = version + 1;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
invalidateClientText(clientUri) {
|
|
201
|
+
this.baselines.delete(clientUri);
|
|
202
|
+
this.openedTexts.delete(clientUri);
|
|
203
|
+
this.pending.delete(clientUri);
|
|
204
|
+
}
|
|
205
|
+
/** The text the client is believed to hold: the diff baseline, else what it declared at open. */
|
|
206
|
+
clientText(clientUri) {
|
|
207
|
+
return this.baselines.get(clientUri) ?? this.openedTexts.get(clientUri);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* The edits that bring the client from its baseline to `text`, moving the
|
|
211
|
+
* baseline to `text`. A full replace without a baseline, none when the
|
|
212
|
+
* client opened with exactly `text` (pushing it anyway dirties the buffer on
|
|
213
|
+
* open), and otherwise a line diff, verified by applying it: a diff that
|
|
214
|
+
* does not reproduce `text` falls back to a full replace rather than
|
|
215
|
+
* corrupting the client.
|
|
216
|
+
*/
|
|
217
|
+
computeEdits(clientUri, text) {
|
|
218
|
+
const old = this.baselines.get(clientUri);
|
|
219
|
+
if (old === text) {
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
this.baselines.set(clientUri, text);
|
|
223
|
+
const fullReplace = { range: FULL_RANGE, newText: text };
|
|
224
|
+
if (old === undefined) {
|
|
225
|
+
const openedText = this.openedTexts.get(clientUri);
|
|
226
|
+
this.openedTexts.delete(clientUri);
|
|
227
|
+
return openedText === text ? [] : [fullReplace];
|
|
228
|
+
}
|
|
229
|
+
const edits = diffToEdits(old, text);
|
|
230
|
+
const probe = this.configuration.create(clientUri, 'plaintext', 0, old);
|
|
231
|
+
if (TextDocument.applyEdits(probe, edits) !== text) {
|
|
232
|
+
this.tracer.with(clientUri).warn('Diff apply-verify fallback (apply-verify-mismatch) — using full-document replace');
|
|
233
|
+
return [fullReplace];
|
|
234
|
+
}
|
|
235
|
+
return edits;
|
|
236
|
+
}
|
|
237
|
+
/** Bounded, so an echo that never arrives cannot grow the queue without limit. */
|
|
238
|
+
recordPendingPush(clientUri, before, text) {
|
|
239
|
+
let queue = this.pending.get(clientUri);
|
|
240
|
+
if (!queue) {
|
|
241
|
+
queue = [];
|
|
242
|
+
this.pending.set(clientUri, queue);
|
|
243
|
+
}
|
|
244
|
+
queue.push({ before, afterHash: textHash(text) });
|
|
245
|
+
if (queue.length > PENDING_ECHO_CAP) {
|
|
246
|
+
queue.shift();
|
|
247
|
+
this.tracer.with(clientUri).debug(`Pending-echo queue exceeded ${PENDING_ECHO_CAP} entries; dropped the oldest`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Convert a {@link diffLines} result to a list of LSP {@link TextEdit}s keyed on line positions
|
|
253
|
+
* in the *old* text. Contiguous added/removed hunks are coalesced into a single replace so the
|
|
254
|
+
* client sees one edit per changed region.
|
|
255
|
+
*/
|
|
256
|
+
export function diffToEdits(oldText, newText) {
|
|
257
|
+
const hunks = diffLines(oldText, newText);
|
|
258
|
+
const edits = [];
|
|
259
|
+
let oldLine = 0;
|
|
260
|
+
let i = 0;
|
|
261
|
+
while (i < hunks.length) {
|
|
262
|
+
const hunk = hunks[i];
|
|
263
|
+
if (!hunk.added && !hunk.removed) {
|
|
264
|
+
oldLine += hunk.count ?? 0;
|
|
265
|
+
i++;
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
// Coalesce a run of add/remove hunks into a single replace for this region.
|
|
269
|
+
let removedLines = 0;
|
|
270
|
+
let addedText = '';
|
|
271
|
+
while (i < hunks.length && (hunks[i].added || hunks[i].removed)) {
|
|
272
|
+
if (hunks[i].removed) {
|
|
273
|
+
removedLines += hunks[i].count ?? 0;
|
|
274
|
+
}
|
|
275
|
+
if (hunks[i].added) {
|
|
276
|
+
addedText += hunks[i].value;
|
|
277
|
+
}
|
|
278
|
+
i++;
|
|
279
|
+
}
|
|
280
|
+
edits.push({
|
|
281
|
+
range: Range.create(oldLine, 0, oldLine + removedLines, 0),
|
|
282
|
+
newText: addedText
|
|
283
|
+
});
|
|
284
|
+
oldLine += removedLines;
|
|
285
|
+
}
|
|
286
|
+
return edits;
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=language-client-shadow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-client-shadow.js","sourceRoot":"","sources":["../../src/documents/language-client-shadow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
import { type CanonicalUri, type TextVersion } from '@hydranium/protocol';
|
|
10
|
+
import { type TextDocument } from 'vscode-languageserver-textdocument';
|
|
11
|
+
/** What {@link TextLedger} holds for a document: where its version sequence stands, kept across closes and reopens. */
|
|
12
|
+
export interface TextRecord {
|
|
13
|
+
readonly version: TextVersion;
|
|
14
|
+
/** {@link textHash} of the text at that version. */
|
|
15
|
+
readonly hash: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Where each document's {@link TextVersion} sequence stands, and who authored
|
|
19
|
+
* each version; the text-side counterpart of `ModelLedger`.
|
|
20
|
+
*
|
|
21
|
+
* A record survives the document's release and is never pruned, not even when
|
|
22
|
+
* the file is deleted: a sequence that restarts lets a write based on the old
|
|
23
|
+
* text pass the base-version gate. Authors last only until the release.
|
|
24
|
+
*/
|
|
25
|
+
export interface TextLedger {
|
|
26
|
+
/**
|
|
27
|
+
* The version a first open of `key` with `text` starts at: the record's
|
|
28
|
+
* version when the text is unchanged, one step on when it changed;
|
|
29
|
+
* `undefined` without a record.
|
|
30
|
+
*/
|
|
31
|
+
openingVersion(key: CanonicalUri, text: string): TextVersion | undefined;
|
|
32
|
+
/** Keep where the sequence of the released `document` stands. */
|
|
33
|
+
record(key: CanonicalUri, document: TextDocument): void;
|
|
34
|
+
recordOf(key: CanonicalUri): TextRecord | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Text reached the closed document `key` outside the store's write paths.
|
|
37
|
+
* Steps the record iff `text` differs from it, and starts one at `0` when
|
|
38
|
+
* there is none.
|
|
39
|
+
*/
|
|
40
|
+
reconcile(key: CanonicalUri, text: string): TextVersion;
|
|
41
|
+
/** {@link textHash} of `document`'s text, taken once per version. */
|
|
42
|
+
hashOf(document: TextDocument): string;
|
|
43
|
+
setAuthor(key: CanonicalUri, version: TextVersion, author: string): void;
|
|
44
|
+
/** The author of `version`, or of the latest version when `version` is omitted. */
|
|
45
|
+
authorOf(key: CanonicalUri, version?: TextVersion): string | undefined;
|
|
46
|
+
clearAuthors(key: CanonicalUri): void;
|
|
47
|
+
}
|
|
48
|
+
export declare class DefaultTextLedger implements TextLedger {
|
|
49
|
+
protected readonly records: Map<CanonicalUri, TextRecord>;
|
|
50
|
+
protected readonly authors: Map<CanonicalUri, string[]>;
|
|
51
|
+
protected readonly hashes: WeakMap<TextDocument, {
|
|
52
|
+
readonly version: number;
|
|
53
|
+
readonly hash: string;
|
|
54
|
+
}>;
|
|
55
|
+
openingVersion(key: CanonicalUri, text: string): TextVersion | undefined;
|
|
56
|
+
record(key: CanonicalUri, document: TextDocument): void;
|
|
57
|
+
recordOf(key: CanonicalUri): TextRecord | undefined;
|
|
58
|
+
reconcile(key: CanonicalUri, text: string): TextVersion;
|
|
59
|
+
hashOf(document: TextDocument): string;
|
|
60
|
+
setAuthor(key: CanonicalUri, version: TextVersion, author: string): void;
|
|
61
|
+
authorOf(key: CanonicalUri, version?: TextVersion): string | undefined;
|
|
62
|
+
clearAuthors(key: CanonicalUri): void;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=text-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-ledger.d.ts","sourceRoot":"","sources":["../../src/documents/text-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAY,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvE,uHAAuH;AACvH,MAAM,WAAW,UAAU;IACxB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACxB;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IACzE,iEAAiE;IACjE,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;IACpD;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IACxD,qEAAqE;IACrE,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC;IACvC,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACzE,mFAAmF;IACnF,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;IACvE,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;CACxC;AAED,qBAAa,iBAAkB,YAAW,UAAU;IACjD,SAAS,CAAC,QAAQ,CAAC,OAAO,gCAAuC;IACjE,SAAS,CAAC,QAAQ,CAAC,OAAO,8BAAqC;IAC/D,SAAS,CAAC,QAAQ,CAAC,MAAM;0BAAiD,MAAM;uBAAiB,MAAM;OAAM;IAE7G,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMvE;IAED,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAEtD;IAED,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAElD;IAED,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAStD;IAED,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAQrC;IAED,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOvE;IAED,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAIrE;IAED,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAEpC;CACH"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
import { textHash } from '@hydranium/protocol';
|
|
10
|
+
export class DefaultTextLedger {
|
|
11
|
+
records = new Map();
|
|
12
|
+
authors = new Map();
|
|
13
|
+
hashes = new WeakMap();
|
|
14
|
+
openingVersion(key, text) {
|
|
15
|
+
const recorded = this.records.get(key);
|
|
16
|
+
if (recorded === undefined) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return recorded.hash === textHash(text) ? recorded.version : recorded.version + 1;
|
|
20
|
+
}
|
|
21
|
+
record(key, document) {
|
|
22
|
+
this.records.set(key, { version: document.version, hash: this.hashOf(document) });
|
|
23
|
+
}
|
|
24
|
+
recordOf(key) {
|
|
25
|
+
return this.records.get(key);
|
|
26
|
+
}
|
|
27
|
+
reconcile(key, text) {
|
|
28
|
+
const hash = textHash(text);
|
|
29
|
+
const recorded = this.records.get(key);
|
|
30
|
+
if (recorded?.hash === hash) {
|
|
31
|
+
return recorded.version;
|
|
32
|
+
}
|
|
33
|
+
const version = recorded === undefined ? 0 : recorded.version + 1;
|
|
34
|
+
this.records.set(key, { version, hash });
|
|
35
|
+
return version;
|
|
36
|
+
}
|
|
37
|
+
hashOf(document) {
|
|
38
|
+
const taken = this.hashes.get(document);
|
|
39
|
+
if (taken?.version === document.version) {
|
|
40
|
+
return taken.hash;
|
|
41
|
+
}
|
|
42
|
+
const hash = textHash(document.getText());
|
|
43
|
+
this.hashes.set(document, { version: document.version, hash });
|
|
44
|
+
return hash;
|
|
45
|
+
}
|
|
46
|
+
setAuthor(key, version, author) {
|
|
47
|
+
let history = this.authors.get(key);
|
|
48
|
+
if (!history) {
|
|
49
|
+
history = [];
|
|
50
|
+
this.authors.set(key, history);
|
|
51
|
+
}
|
|
52
|
+
history[version] = author;
|
|
53
|
+
}
|
|
54
|
+
authorOf(key, version) {
|
|
55
|
+
const history = this.authors.get(key);
|
|
56
|
+
// `!== undefined` so version 0 is not read as "latest".
|
|
57
|
+
return version !== undefined ? history?.[version] : history?.at(-1);
|
|
58
|
+
}
|
|
59
|
+
clearAuthors(key) {
|
|
60
|
+
this.authors.delete(key);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=text-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-ledger.js","sourceRoot":"","sources":["../../src/documents/text-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,15 +21,16 @@ export declare const DEFAULT_LOGGED_PHASES: DocumentState[];
|
|
|
21
21
|
/**
|
|
22
22
|
* The build reasons the framework stages through
|
|
23
23
|
* {@link HydraniumDocumentBuilder.markNextReason}: the LSP events the update
|
|
24
|
-
* handler dispatches on, and `
|
|
25
|
-
*
|
|
26
|
-
* the names the
|
|
24
|
+
* handler dispatches on, and `didRelease` for the builds the
|
|
25
|
+
* `DocumentReleaseHandler` runs once the text store has released a document.
|
|
26
|
+
* Exposed so a subclass layering reasons of its own keeps the names the
|
|
27
|
+
* framework emits.
|
|
27
28
|
*/
|
|
28
29
|
export declare const HYDRANIUM_BUILD_REASONS: Readonly<{
|
|
29
30
|
readonly didOpen: 'didOpen';
|
|
30
31
|
readonly didChangeContent: 'didChangeContent';
|
|
31
32
|
readonly didChangeWatchedFiles: 'didChangeWatchedFiles';
|
|
32
|
-
readonly
|
|
33
|
+
readonly didRelease: 'didRelease';
|
|
33
34
|
}>;
|
|
34
35
|
/** Constructor options for {@link HydraniumDocumentBuilder}. */
|
|
35
36
|
export interface DocumentBuilderOptions extends LogNameOptions {
|
|
@@ -212,7 +213,7 @@ export declare class HydraniumDocumentBuilder extends DefaultDocumentBuilder {
|
|
|
212
213
|
/**
|
|
213
214
|
* Stage an LSP event name for the next `update()` call. Adopters call before
|
|
214
215
|
* the update fires; `HydraniumDocumentUpdateHandler` does it for the LSP
|
|
215
|
-
* events, and the
|
|
216
|
+
* events, and the release handler for the builds that follow a release.
|
|
216
217
|
*
|
|
217
218
|
* The framework stages the value and never reads it back. The consumer is a
|
|
218
219
|
* subclass overriding the build logging, which takes
|
|
@@ -438,7 +439,7 @@ export declare class HydraniumDocumentBuilder extends DefaultDocumentBuilder {
|
|
|
438
439
|
* `drained` set, from a {@link WorkspaceLock} read: it runs once no write
|
|
439
440
|
* runs or is queued, so no locked build is left that could still carry a
|
|
440
441
|
* waited-on document. A cancelled build is usually followed by its
|
|
441
|
-
* canceller's, but a write that builds nothing, such as a
|
|
442
|
+
* canceller's, but a write that builds nothing, such as a release build
|
|
442
443
|
* that finds its document reopened, leaves a wait armed during the build
|
|
443
444
|
* with nothing to resolve it, and so does a build that fails. One read
|
|
444
445
|
* serves every build that throws before it runs.
|
|
@@ -595,7 +596,7 @@ export declare class HydraniumDocumentBuilder extends DefaultDocumentBuilder {
|
|
|
595
596
|
* both hold it by. A document created and not yet saved has text but no
|
|
596
597
|
* file, and a policy that checks the disk reports it absent. A registered
|
|
597
598
|
* document whose file has gone is kept too: its rebuild then fails on the
|
|
598
|
-
* read, which is how the
|
|
599
|
+
* read, which is how the release handler learns to remove it rather
|
|
599
600
|
* than leave it holding its last client's text.
|
|
600
601
|
*/
|
|
601
602
|
protected flattenAndAdaptURI(uri: URI): URI[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-builder.d.ts","sourceRoot":"","sources":["../../../src/langium/document-builder/document-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,eAAe,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7H,OAAO,EACJ,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,aAAa,EACb,KAAK,eAAe,EACpB,QAAQ,EAER,GAAG,EAEH,KAAK,aAAa,EAGpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,iBAAiB,EAAc,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE3F,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG5E,0FAA0F;AAC1F,eAAO,MAAM,qBAAqB,EAAE,aAAa,EAOhD,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"document-builder.d.ts","sourceRoot":"","sources":["../../../src/langium/document-builder/document-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,eAAe,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7H,OAAO,EACJ,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,aAAa,EACb,KAAK,eAAe,EACpB,QAAQ,EAER,GAAG,EAEH,KAAK,aAAa,EAGpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,iBAAiB,EAAc,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE3F,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG5E,0FAA0F;AAC1F,eAAO,MAAM,qBAAqB,EAAE,aAAa,EAOhD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;sBACxB,SAAS;+BACA,kBAAkB;oCACb,uBAAuB;yBAClC,YAAY;EAChB,CAAC;AAWZ,gEAAgE;AAChE,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC3D;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpD;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtD;;;;;;;;;OASG;IACH,QAAQ,CAAC,kCAAkC,CAAC,EAAE,OAAO,CAAC;CACxD;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC9B;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC7B,6GAA6G;IAC7G,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,2IAA2I;IAC3I,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4GAA4G;IAC5G,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAC9C,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,wBAAyB,SAAQ,sBAAsB;IACjE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,6EAA6E;IAC7E,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAC1C,6EAA6E;IAC7E,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC;IACjD,gEAAgE;IAChE,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACxD,4DAA4D;IAC5D,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3D,sEAAsE;IACtE,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACxD,6FAA6F;IAC7F,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1D,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IACpD,oDAAoD;IACpD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAChD,kGAAkG;IAClG,SAAS,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC5C,kIAAkI;IAClI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;IAC7D,SAAS,CAAC,sBAAsB,EAAE,MAAM,EAAE,CAAM;IAChD,yHAAyH;IACzH,SAAS,CAAC,mBAAmB,SAAM;IACnC,SAAS,CAAC,WAAW,SAAK;IAC1B,uFAAuF;IACvF,SAAS,CAAC,QAAQ,CAAC,kCAAkC,EAAE,OAAO,CAAC;IAC/D,2FAA2F;IAC3F,SAAS,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACvC;;;;;;;;OAQG;IACH,SAAS,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC;IACvC;;;;OAIG;IACH,SAAS,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACxC,qEAAqE;IACrE,SAAS,CAAC,QAAQ,CAAC,+BAA+B,qCAA0C,eAAe,WAAW,MAAM,KAAK,IAAI,EAAI;IACzI,+CAA+C;IAC/C,SAAS,CAAC,QAAQ,CAAC,mBAAmB,gBAAqB,OAAO,KAAK,IAAI,EAAI;IAC/E,gFAAgF;IAChF,SAAS,CAAC,gBAAgB,UAAS;IACnC,gEAAgE;IAChE,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;IAEhE,YAAY,QAAQ,EAAE,2BAA2B,EAAE,OAAO,GAAE,sBAA2B,EAmBtF;IAMD;;;;;;;;;;OAUG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE/C;IAED;;;;;;;;;;;;OAYG;IACH,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,UAAU,CAGzH;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,UAAU,CAGvE;IAED;;;;;;;;;OASG;IACH,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAQlC;IAED;;;;;;;;OAQG;IACH,eAAe,IAAI,aAAa,CAE/B;IAED,gGAAgG;IAChG,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,CAMjE;IAMD;;;;OAIG;IACM,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAY/H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;IACH,UAAmB,kBAAkB,CAClC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,GAAG,EACR,WAAW,EAAE,iBAAiB,EAC9B,EAAE,eAAuB,EAAE,GAAE,gBAAqB,GAClD,OAAO,CAAC,GAAG,CAAC,CA4Gd;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAM5D;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE7E;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS3G;IAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7E;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CAAC,oBAAoB,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAYlG;IAED,+FAA+F;IAC/F,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,MAAM,EAAE,CAGpD;IAED;;;;;;OAMG;IACH,UAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpG;IAED;;;;;;;;;;OAUG;IACH,UAAyB,cAAc,CACpC,SAAS,EAAE,eAAe,EAAE,EAC5B,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,iBAAiB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAKf;IAED;;;;;;;;;OASG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI,CAWtC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,UAAmB,YAAY,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAazF;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,UAAmB,YAAY,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAK5F;IAMQ,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9F;IAED;;;;OAIG;IACM,KAAK,CAAC,CAAC,SAAS,OAAO,EAC7B,SAAS,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EACpC,OAAO,CAAC,EAAE,YAAY,EACtB,WAAW,CAAC,EAAE,iBAAiB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAOf;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACM,YAAY,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAyB3E;IAED;;;;;;;;;;OAUG;IACG,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,GAAE,iBAA0C,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/G;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,GAAE,iBAA0C,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxH;IAED;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,4BAA4B,IAAI,IAAI,CAM7C;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAQ5C;IAED;;mEAE+D;IAC/D,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAU9C;IAED;;mCAE+B;IAC/B,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAMvC;IAED,qFAAqF;IACrF,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAE1C;IAED;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAW5C;IAMD;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C5G;IAED;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAEvE;IAED;;;;;OAKG;IACH,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAQhD;IAED;;;;OAIG;IACH,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAQlD;IAED,yEAAyE;IACzE,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAW7D;IAED,kHAAkH;IAClH,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAWlE;IAMD,SAAS,CAAC,sBAAsB,IAAI,IAAI,CAIvC;IAED,+FAA+F;IAC/F,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,IAAI,CAUjF;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAaxG;IAMc,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDjI;IAED;;;;;;;;;;OAUG;IACH,SAAS,CAAC,0BAA0B,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9H;IAED,8EAA8E;IAC9E,SAAS,CAAC,qBAAqB,CAC5B,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,qBAAqB,EAAE,EAClC,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,EAAE,MAAM,GACf,MAAM,CAQR;IAMc,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYjI;IAED,uEAAuE;IACvE,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/H;IAMD,iHAAiH;IACjH,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAEpC;IAED,uGAAuG;IACvG,SAAS,CAAC,cAAc,CAAC,QAAQ,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/E;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAiC3D;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CA2B3D;IAMD;;;;;;;;OAQG;IACH,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOnC;IAED,uGAAuG;IACvG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpC;CACH"}
|
|
@@ -29,15 +29,16 @@ export const DEFAULT_LOGGED_PHASES = [
|
|
|
29
29
|
/**
|
|
30
30
|
* The build reasons the framework stages through
|
|
31
31
|
* {@link HydraniumDocumentBuilder.markNextReason}: the LSP events the update
|
|
32
|
-
* handler dispatches on, and `
|
|
33
|
-
*
|
|
34
|
-
* the names the
|
|
32
|
+
* handler dispatches on, and `didRelease` for the builds the
|
|
33
|
+
* `DocumentReleaseHandler` runs once the text store has released a document.
|
|
34
|
+
* Exposed so a subclass layering reasons of its own keeps the names the
|
|
35
|
+
* framework emits.
|
|
35
36
|
*/
|
|
36
37
|
export const HYDRANIUM_BUILD_REASONS = Object.freeze({
|
|
37
38
|
didOpen: 'didOpen',
|
|
38
39
|
didChangeContent: 'didChangeContent',
|
|
39
40
|
didChangeWatchedFiles: 'didChangeWatchedFiles',
|
|
40
|
-
|
|
41
|
+
didRelease: 'didRelease'
|
|
41
42
|
});
|
|
42
43
|
/**
|
|
43
44
|
* Consecutive re-queued builds that leave a waited-on document at the same state
|
|
@@ -174,7 +175,7 @@ export class HydraniumDocumentBuilder extends DefaultDocumentBuilder {
|
|
|
174
175
|
/**
|
|
175
176
|
* Stage an LSP event name for the next `update()` call. Adopters call before
|
|
176
177
|
* the update fires; `HydraniumDocumentUpdateHandler` does it for the LSP
|
|
177
|
-
* events, and the
|
|
178
|
+
* events, and the release handler for the builds that follow a release.
|
|
178
179
|
*
|
|
179
180
|
* The framework stages the value and never reads it back. The consumer is a
|
|
180
181
|
* subclass overriding the build logging, which takes
|
|
@@ -616,7 +617,7 @@ export class HydraniumDocumentBuilder extends DefaultDocumentBuilder {
|
|
|
616
617
|
* `drained` set, from a {@link WorkspaceLock} read: it runs once no write
|
|
617
618
|
* runs or is queued, so no locked build is left that could still carry a
|
|
618
619
|
* waited-on document. A cancelled build is usually followed by its
|
|
619
|
-
* canceller's, but a write that builds nothing, such as a
|
|
620
|
+
* canceller's, but a write that builds nothing, such as a release build
|
|
620
621
|
* that finds its document reopened, leaves a wait armed during the build
|
|
621
622
|
* with nothing to resolve it, and so does a build that fails. One read
|
|
622
623
|
* serves every build that throws before it runs.
|
|
@@ -868,7 +869,7 @@ export class HydraniumDocumentBuilder extends DefaultDocumentBuilder {
|
|
|
868
869
|
* both hold it by. A document created and not yet saved has text but no
|
|
869
870
|
* file, and a policy that checks the disk reports it absent. A registered
|
|
870
871
|
* document whose file has gone is kept too: its rebuild then fails on the
|
|
871
|
-
* read, which is how the
|
|
872
|
+
* read, which is how the release handler learns to remove it rather
|
|
872
873
|
* than leave it holding its last client's text.
|
|
873
874
|
*/
|
|
874
875
|
flattenAndAdaptURI(uri) {
|