@hydranium/core 1.0.0-next.67 → 1.0.0-next.70

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.
@@ -256,9 +256,25 @@ export declare class DefaultAstDocumentManager<TAst extends AstNode, TDiagnostic
256
256
  * callers don't need to pass it — the manager owns content and version
257
257
  * sequencing.
258
258
  *
259
+ * **The write is skipped when the file already holds that text; the
260
+ * notification is not.** A save announces that the content is on disk, which
261
+ * is true either way — so a subscriber clearing a dirty marker or reacting to
262
+ * a persist behaves the same, while an mtime is not moved for byte-identical
263
+ * content that a downstream mtime-keyed build would then read as new work.
264
+ *
259
265
  * Throws if no document is open for `uri`.
260
266
  */
261
267
  save(uri: string, clientId: string): Promise<void>;
268
+ /**
269
+ * Whether the file at `uri` already holds `text`.
270
+ *
271
+ * Compared by CONTENT rather than against a remembered version, so a write
272
+ * from outside this server is still corrected: a version this manager already
273
+ * saved says nothing about what is on disk now. `false` when the file cannot
274
+ * be read at all, which is the answer that writes — a document whose file does
275
+ * not exist yet is exactly the one a first save has to create.
276
+ */
277
+ protected matchesDisk(uri: string, text: string): Promise<boolean>;
262
278
  isOpen(uri: string): boolean;
263
279
  isTriggeringEdit(uri: string): boolean;
264
280
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ast-document-manager.d.ts","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast-document-manager.d.ts","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"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"}
@@ -262,18 +262,45 @@ export class DefaultAstDocumentManager {
262
262
  * callers don't need to pass it — the manager owns content and version
263
263
  * sequencing.
264
264
  *
265
+ * **The write is skipped when the file already holds that text; the
266
+ * notification is not.** A save announces that the content is on disk, which
267
+ * is true either way — so a subscriber clearing a dirty marker or reacting to
268
+ * a persist behaves the same, while an mtime is not moved for byte-identical
269
+ * content that a downstream mtime-keyed build would then read as new work.
270
+ *
265
271
  * Throws if no document is open for `uri`.
266
272
  */
267
273
  async save(uri, clientId) {
268
- const document = this.textDocuments.get(uri);
274
+ // Canonical throughout: the write and the read that gates it must address
275
+ // the same file the store was keyed by, or a divergent spelling compares
276
+ // one file and writes another.
277
+ const canonical = this.uriPolicy.canonicalUri(uri);
278
+ const document = this.textDocuments.get(canonical);
269
279
  if (!document) {
270
280
  throw new Error(`Document ${uri} hasn't been opened for saving yet`);
271
281
  }
272
282
  const text = document.getText();
273
- await this.tracer.with(uri).time(`Write file (${text.length} bytes, from ${clientId})`,
274
- // Async write so a slow disk does not block the event loop for the duration of the fs call.
275
- () => this.fileSystemProvider.writeFile(UriUtils.toUri(uri), text), 'debug');
276
- this.textDocuments.notifyDidSaveTextDocument({ textDocument: TextDocumentIdentifier.create(uri), text }, clientId);
283
+ if (!(await this.matchesDisk(canonical, text))) {
284
+ await this.tracer.with(canonical).time(`Write file (${text.length} bytes, from ${clientId})`,
285
+ // Async write so a slow disk does not block the event loop for the duration of the fs call.
286
+ () => this.fileSystemProvider.writeFile(UriUtils.toUri(canonical), text), 'debug');
287
+ }
288
+ this.textDocuments.notifyDidSaveTextDocument({ textDocument: TextDocumentIdentifier.create(canonical), text }, clientId);
289
+ }
290
+ /**
291
+ * Whether the file at `uri` already holds `text`.
292
+ *
293
+ * Compared by CONTENT rather than against a remembered version, so a write
294
+ * from outside this server is still corrected: a version this manager already
295
+ * saved says nothing about what is on disk now. `false` when the file cannot
296
+ * be read at all, which is the answer that writes — a document whose file does
297
+ * not exist yet is exactly the one a first save has to create.
298
+ */
299
+ async matchesDisk(uri, text) {
300
+ return this.fileSystemProvider
301
+ .readFile(UriUtils.toUri(uri))
302
+ .then(onDisk => onDisk === text)
303
+ .catch(() => false);
277
304
  }
278
305
  isOpen(uri) {
279
306
  return !!this.textDocuments.get(uri);
@@ -1 +1 @@
1
- {"version":3,"file":"ast-document-manager.js","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast-document-manager.js","sourceRoot":"","sources":["../../src/documents/ast-document-manager.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.67",
3
+ "version": "1.0.0-next.70",
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.67",
108
- "@hydranium/protocol": "1.0.0-next.67",
107
+ "@hydranium/langium": "1.0.0-next.70",
108
+ "@hydranium/protocol": "1.0.0-next.70",
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.67",
121
- "@hydranium/protocol": "1.0.0-next.67",
120
+ "@hydranium/langium": "1.0.0-next.70",
121
+ "@hydranium/protocol": "1.0.0-next.70",
122
122
  "@playwright/test": "^1.40.0",
123
123
  "vscode-jsonrpc": "9.0.1",
124
124
  "vscode-languageserver": "~10.0.1",
@@ -446,21 +446,49 @@ export class DefaultAstDocumentManager<TAst extends AstNode, TDiagnostic = unkno
446
446
  * callers don't need to pass it — the manager owns content and version
447
447
  * sequencing.
448
448
  *
449
+ * **The write is skipped when the file already holds that text; the
450
+ * notification is not.** A save announces that the content is on disk, which
451
+ * is true either way — so a subscriber clearing a dirty marker or reacting to
452
+ * a persist behaves the same, while an mtime is not moved for byte-identical
453
+ * content that a downstream mtime-keyed build would then read as new work.
454
+ *
449
455
  * Throws if no document is open for `uri`.
450
456
  */
451
457
  async save(uri: string, clientId: string): Promise<void> {
452
- const document = this.textDocuments.get(uri);
458
+ // Canonical throughout: the write and the read that gates it must address
459
+ // the same file the store was keyed by, or a divergent spelling compares
460
+ // one file and writes another.
461
+ const canonical = this.uriPolicy.canonicalUri(uri);
462
+ const document = this.textDocuments.get(canonical);
453
463
  if (!document) {
454
464
  throw new Error(`Document ${uri} hasn't been opened for saving yet`);
455
465
  }
456
466
  const text = document.getText();
457
- await this.tracer.with(uri).time(
458
- `Write file (${text.length} bytes, from ${clientId})`,
459
- // Async write so a slow disk does not block the event loop for the duration of the fs call.
460
- () => this.fileSystemProvider.writeFile(UriUtils.toUri(uri), text),
461
- 'debug'
462
- );
463
- this.textDocuments.notifyDidSaveTextDocument({ textDocument: TextDocumentIdentifier.create(uri), text }, clientId);
467
+ if (!(await this.matchesDisk(canonical, text))) {
468
+ await this.tracer.with(canonical).time(
469
+ `Write file (${text.length} bytes, from ${clientId})`,
470
+ // Async write so a slow disk does not block the event loop for the duration of the fs call.
471
+ () => this.fileSystemProvider.writeFile(UriUtils.toUri(canonical), text),
472
+ 'debug'
473
+ );
474
+ }
475
+ this.textDocuments.notifyDidSaveTextDocument({ textDocument: TextDocumentIdentifier.create(canonical), text }, clientId);
476
+ }
477
+
478
+ /**
479
+ * Whether the file at `uri` already holds `text`.
480
+ *
481
+ * Compared by CONTENT rather than against a remembered version, so a write
482
+ * from outside this server is still corrected: a version this manager already
483
+ * saved says nothing about what is on disk now. `false` when the file cannot
484
+ * be read at all, which is the answer that writes — a document whose file does
485
+ * not exist yet is exactly the one a first save has to create.
486
+ */
487
+ protected async matchesDisk(uri: string, text: string): Promise<boolean> {
488
+ return this.fileSystemProvider
489
+ .readFile(UriUtils.toUri(uri))
490
+ .then(onDisk => onDisk === text)
491
+ .catch(() => false);
464
492
  }
465
493
 
466
494
  isOpen(uri: string): boolean {