@hydranium/core 1.0.0-next.9 → 1.0.0-next.90
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 +75 -16
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +57 -19
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +5 -19
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +5 -19
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/hydranium-text-documents.d.ts +55 -21
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +142 -46
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/language-client-text-shadow.d.ts +41 -9
- package/lib/documents/language-client-text-shadow.d.ts.map +1 -1
- package/lib/documents/language-client-text-shadow.js +56 -11
- package/lib/documents/language-client-text-shadow.js.map +1 -1
- package/lib/documents/self-save-registry.d.ts +37 -6
- package/lib/documents/self-save-registry.d.ts.map +1 -1
- package/lib/documents/self-save-registry.js +28 -15
- package/lib/documents/self-save-registry.js.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +60 -22
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +16 -9
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/config/configuration-provider.d.ts +81 -0
- package/lib/langium/config/configuration-provider.d.ts.map +1 -0
- package/lib/langium/config/configuration-provider.js +112 -0
- package/lib/langium/config/configuration-provider.js.map +1 -0
- package/lib/langium/config/index.d.ts +1 -0
- package/lib/langium/config/index.d.ts.map +1 -1
- package/lib/langium/config/index.js +1 -0
- package/lib/langium/config/index.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +40 -6
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +13 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +93 -0
- package/lib/langium/document-builder/build-session.d.ts.map +1 -0
- package/lib/langium/document-builder/build-session.js +72 -0
- package/lib/langium/document-builder/build-session.js.map +1 -0
- package/lib/langium/document-builder/document-builder.d.ts +150 -7
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +298 -11
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/document-builder/index.d.ts +1 -0
- package/lib/langium/document-builder/index.d.ts.map +1 -1
- package/lib/langium/document-builder/index.js +1 -0
- package/lib/langium/document-builder/index.js.map +1 -1
- package/lib/langium/integration-services.d.ts +45 -1
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +10 -5
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +5 -0
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +34 -1
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +64 -0
- package/lib/langium/keys/containment.d.ts.map +1 -0
- package/lib/langium/keys/containment.js +53 -0
- package/lib/langium/keys/containment.js.map +1 -0
- package/lib/langium/keys/index.d.ts +1 -0
- package/lib/langium/keys/index.d.ts.map +1 -1
- package/lib/langium/keys/index.js +1 -0
- package/lib/langium/keys/index.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +4 -0
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/model-service/model-service.d.ts +149 -10
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +120 -93
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +84 -15
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +26 -12
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +25 -4
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +2 -1
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts +23 -0
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/naming/name-separator-validation.js +30 -1
- package/lib/langium/naming/name-separator-validation.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +31 -9
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +13 -56
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +32 -13
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +37 -20
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/service-registry.d.ts +5 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +4 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +15 -2
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/transfer/transfer-encoder.d.ts +60 -17
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +38 -16
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/validation/document-validator.d.ts +294 -10
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +448 -5
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/workspace/document-uri-policy.d.ts +3 -4
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +3 -4
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +25 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +25 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +21 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +28 -0
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +8 -0
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +11 -2
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +22 -2
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +13 -5
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +79 -17
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +83 -28
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/locale/index.d.ts +10 -0
- package/lib/locale/index.d.ts.map +1 -0
- package/lib/locale/index.js +10 -0
- package/lib/locale/index.js.map +1 -0
- package/lib/locale/server-locale.d.ts +73 -0
- package/lib/locale/server-locale.d.ts.map +1 -0
- package/lib/locale/server-locale.js +61 -0
- package/lib/locale/server-locale.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.js +1 -1
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +1 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +1 -1
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +34 -1
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +55 -8
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/messages/carriers.d.ts +54 -0
- package/lib/messages/carriers.d.ts.map +1 -0
- package/lib/messages/carriers.js +62 -0
- package/lib/messages/carriers.js.map +1 -0
- package/lib/messages/index.d.ts +25 -0
- package/lib/messages/index.d.ts.map +1 -0
- package/lib/messages/index.js +25 -0
- package/lib/messages/index.js.map +1 -0
- package/lib/messages/renderer.d.ts +136 -0
- package/lib/messages/renderer.d.ts.map +1 -0
- package/lib/messages/renderer.js +159 -0
- package/lib/messages/renderer.js.map +1 -0
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -0
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +1 -0
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +1 -40
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profiling-run.d.ts +2 -2
- package/lib/node/profiling-run.js +1 -1
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +52 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +66 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/socket-launcher.d.ts +15 -0
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +3 -2
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/testing/fake-document.d.ts +16 -4
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js +18 -3
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/make-noop-shared-services.d.ts +14 -0
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +28 -2
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +44 -8
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +19 -3
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +14 -0
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +33 -1
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.js +164 -0
- package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +1 -0
- package/lib/testing/playwright/index.d.ts.map +1 -1
- package/lib/testing/playwright/index.js +1 -0
- package/lib/testing/playwright/index.js.map +1 -1
- package/lib/testing/playwright/server-log-capture.d.ts +14 -4
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +21 -4
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.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 +4 -6
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +8 -0
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +22 -3
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +5 -4
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +2 -2
- package/lib/testing/stub-model-service.js.map +1 -1
- package/package.json +17 -8
- package/src/documents/ast-document-manager.ts +129 -36
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/hydranium-text-documents.ts +167 -61
- package/src/documents/language-client-text-shadow.ts +59 -11
- package/src/documents/self-save-registry.ts +52 -13
- package/src/index.ts +5 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +16 -9
- package/src/langium/config/configuration-provider.ts +119 -0
- package/src/langium/config/index.ts +1 -0
- package/src/langium/diagnostics/lsp-logger.ts +41 -6
- package/src/langium/document-builder/build-pipeline-integration.ts +14 -1
- package/src/langium/document-builder/build-session.ts +87 -0
- package/src/langium/document-builder/document-builder.ts +339 -11
- package/src/langium/document-builder/index.ts +1 -0
- package/src/langium/integration-services.ts +67 -6
- package/src/langium/integrity/integrity-service.ts +35 -1
- package/src/langium/keys/containment.ts +87 -0
- package/src/langium/keys/index.ts +1 -0
- package/src/langium/keys/name-based-key-provider.ts +4 -0
- package/src/langium/model-service/model-service.ts +211 -30
- package/src/langium/module.ts +106 -21
- package/src/langium/naming/name-provider.ts +27 -5
- package/src/langium/naming/name-separator-validation.ts +34 -5
- package/src/langium/residency/cst-residency-service.ts +36 -12
- package/src/langium/scope/hydranium-scope-provider.ts +40 -22
- package/src/langium/service-registry.ts +6 -2
- package/src/langium/shared-services.ts +19 -2
- package/src/langium/transfer/transfer-encoder.ts +85 -24
- package/src/langium/validation/document-validator.ts +537 -11
- package/src/langium/workspace/document-uri-policy.ts +3 -4
- package/src/langium/workspace/hydranium-langium-document-factory.ts +34 -0
- package/src/langium/workspace/hydranium-workspace-manager.ts +30 -1
- package/src/langium/workspace/in-memory-file-system-provider.ts +13 -3
- package/src/langium/workspace/initialize-workspace.ts +34 -5
- package/src/langium/workspace/langium-documents.ts +106 -33
- package/src/locale/index.ts +10 -0
- package/src/locale/server-locale.ts +86 -0
- package/src/lsp/hydranium-document-update-handler.ts +1 -1
- package/src/lsp/index.ts +1 -1
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/semantic-token-provider.ts +74 -7
- package/src/messages/carriers.ts +78 -0
- package/src/messages/index.ts +36 -0
- package/src/messages/renderer.ts +204 -0
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +1 -0
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/node-file-system-provider.ts +1 -41
- package/src/node/profiling-run.ts +3 -3
- package/src/node/rename-over-open-readers.ts +78 -0
- package/src/node/socket-launcher.ts +18 -2
- package/src/testing/fake-document.ts +24 -5
- package/src/testing/make-noop-shared-services.ts +50 -2
- package/src/testing/make-test-services.ts +73 -18
- package/src/testing/node/spawned-server.ts +35 -1
- package/src/testing/playwright/flaky-network-proxy.ts +240 -0
- package/src/testing/playwright/index.ts +1 -0
- package/src/testing/playwright/server-log-capture.ts +24 -5
- package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
- package/src/testing/stub-ast-document-manager.ts +10 -14
- package/src/testing/stub-document-builder.ts +32 -3
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +7 -6
- package/lib/lsp/instrument-connection.d.ts +0 -36
- package/lib/lsp/instrument-connection.d.ts.map +0 -1
- package/lib/lsp/instrument-connection.js +0 -62
- package/lib/lsp/instrument-connection.js.map +0 -1
- package/src/lsp/instrument-connection.ts +0 -66
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
*
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
|
-
import { type CloseModelArgs, type Tracer, type TransferSavedEvent, type TransferUpdatedEvent, type OpenModelArgs } from '@hydranium/protocol';
|
|
9
|
+
import { type CloseModelArgs, type Tracer, type TransferSavedEvent, type TransferUpdatedEvent, type OpenModelArgs, type SnapshotVersion } from '@hydranium/protocol';
|
|
10
10
|
import { type AstNode, type DocumentBuilder, type FileSystemProvider, type LangiumDocument, type LangiumDocuments } from '@hydranium/langium';
|
|
11
11
|
import { type LogNameOptions } from '../langium/diagnostics/logger.js';
|
|
12
|
+
import { type AstDiagnostic } from '../langium/validation/document-validator.js';
|
|
12
13
|
/**
|
|
13
14
|
* File-system provider extension that supports writes. Langium's standard
|
|
14
15
|
* {@link FileSystemProvider} is read-only; the manager needs to persist saves,
|
|
@@ -82,19 +83,19 @@ export interface UpdateInfo {
|
|
|
82
83
|
* twins; the type-system distinction is the generic constraint, and the
|
|
83
84
|
* conversion seam between them is the framework `TransferEncoder`.
|
|
84
85
|
*/
|
|
85
|
-
export interface AstDocument<TAst extends AstNode, TDiagnostic> {
|
|
86
|
+
export interface AstDocument<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> {
|
|
86
87
|
root: TAst;
|
|
87
88
|
diagnostics: TDiagnostic[];
|
|
88
89
|
uri: string;
|
|
89
90
|
/**
|
|
90
91
|
* Text-document version this snapshot was taken at — read from
|
|
91
92
|
* `LangiumDocument.textDocument.version`. Symmetric with
|
|
92
|
-
* `TransferDocument.version` on the wire side: in-process
|
|
93
|
-
*
|
|
94
|
-
* `TransferUpdateArgs.
|
|
95
|
-
*
|
|
93
|
+
* `TransferDocument.version` on the wire side: an in-process caller that
|
|
94
|
+
* holds an `AstDocument` and mutates it sends this straight back as
|
|
95
|
+
* `TransferUpdateArgs.basedOn` / `TransferSaveArgs.basedOn`, and the
|
|
96
|
+
* conflict gate arms on it.
|
|
96
97
|
*/
|
|
97
|
-
version:
|
|
98
|
+
version: SnapshotVersion;
|
|
98
99
|
}
|
|
99
100
|
export declare namespace AstDocument {
|
|
100
101
|
/**
|
|
@@ -103,7 +104,7 @@ export declare namespace AstDocument {
|
|
|
103
104
|
* don't need to repeat the empty array at every call site. Mirrors
|
|
104
105
|
* `TransferDocument.create` on the wire side.
|
|
105
106
|
*/
|
|
106
|
-
function create<TAst extends AstNode, TDiagnostic =
|
|
107
|
+
function create<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(uri: string, version: number, root: TAst, diagnostics?: TDiagnostic[]): AstDocument<TAst, TDiagnostic>;
|
|
107
108
|
/**
|
|
108
109
|
* Project a {@link LangiumDocument} into its {@link AstDocument}
|
|
109
110
|
* envelope — the single place that reads `root` / `diagnostics` /
|
|
@@ -117,15 +118,59 @@ export declare namespace AstDocument {
|
|
|
117
118
|
* carry that identity, not the subscriber's (possibly non-canonical) URI:
|
|
118
119
|
* a subscriber already knows the URI it subscribed with, so the useful
|
|
119
120
|
* thing to surface is the canonical one every other layer keys by.
|
|
121
|
+
*
|
|
122
|
+
* Narrowing `TDiagnostic` below the constraint asserts that the validators
|
|
123
|
+
* in play produce that shape, and nothing here checks it: the build fills the
|
|
124
|
+
* array, so a document carrying a diagnostic from elsewhere — a lexer error,
|
|
125
|
+
* another validator — satisfies the declared type and not the narrowed one.
|
|
120
126
|
*/
|
|
121
|
-
function from<TAst extends AstNode, TDiagnostic =
|
|
127
|
+
function from<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(document: LangiumDocument): AstDocument<TAst, TDiagnostic>;
|
|
122
128
|
}
|
|
123
129
|
/** Update event delivered by {@link AstDocumentManager.onUpdate} — typed alias over the generic event wrapper. */
|
|
124
|
-
export type AstDocumentUpdatedEvent<TAst extends AstNode, TDiagnostic> = TransferUpdatedEvent<AstDocument<TAst, TDiagnostic>>;
|
|
130
|
+
export type AstDocumentUpdatedEvent<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> = TransferUpdatedEvent<AstDocument<TAst, TDiagnostic>>;
|
|
125
131
|
/** Save event delivered by {@link AstDocumentManager.onSave} — typed alias over the generic event wrapper. */
|
|
126
|
-
export type AstDocumentSavedEvent<TAst extends AstNode, TDiagnostic> = TransferSavedEvent<AstDocument<TAst, TDiagnostic>>;
|
|
132
|
+
export type AstDocumentSavedEvent<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> = TransferSavedEvent<AstDocument<TAst, TDiagnostic>>;
|
|
127
133
|
/** Construction options for {@link AstDocumentManager}. */
|
|
128
134
|
export type AstDocumentManagerOptions = LogNameOptions;
|
|
135
|
+
/**
|
|
136
|
+
* The document slot the model server and the integrity service talk to:
|
|
137
|
+
* open/close/update/save plus the AST-typed event streams, with the LSP
|
|
138
|
+
* plumbing hidden.
|
|
139
|
+
*
|
|
140
|
+
* Generic over `<TAst extends AstNode, TDiagnostic>` so each consumer projects
|
|
141
|
+
* its own AST root type and diagnostic shape into the emitted
|
|
142
|
+
* {@link AstDocument} envelopes.
|
|
143
|
+
*
|
|
144
|
+
* **URI contract.** Every URI-accepting member takes a URI in *any* spelling
|
|
145
|
+
* (canonical, symlinked, `..`/case-divergent) and canonicalizes internally
|
|
146
|
+
* through the {@link DocumentUriPolicy}, so a caller never has to canonicalize
|
|
147
|
+
* first and an implementation may not require it.
|
|
148
|
+
*/
|
|
149
|
+
export interface AstDocumentManager<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> {
|
|
150
|
+
open(args: OpenModelArgs): Promise<Disposable>;
|
|
151
|
+
close(args: CloseModelArgs): Promise<void>;
|
|
152
|
+
isOpen(uri: string): boolean;
|
|
153
|
+
/** Apply `text` as `clientId`'s edit. Resolves to the resulting text-document version. */
|
|
154
|
+
update(uri: string, text: string, clientId: string): Promise<number>;
|
|
155
|
+
save(uri: string, clientId: string): Promise<void>;
|
|
156
|
+
onUpdate(uri: string, listener: (event: AstDocumentUpdatedEvent<TAst, TDiagnostic>) => void): Disposable;
|
|
157
|
+
onSave(uri: string, listener: (event: AstDocumentSavedEvent<TAst, TDiagnostic>) => void | Promise<void>): Disposable;
|
|
158
|
+
onClientClosed(uri: string, clientId: string, listener: () => void): Disposable;
|
|
159
|
+
getDocument(uri: string): LangiumDocument | undefined;
|
|
160
|
+
/** Client id that authored the document's current version, or `undefined` for a framework-internal build. */
|
|
161
|
+
getAuthor(document: LangiumDocument): string | undefined;
|
|
162
|
+
/**
|
|
163
|
+
* Whether `uri` is one of the URIs the most recent build request named, as
|
|
164
|
+
* opposed to a document that build swept in as a dependent. Deletions are
|
|
165
|
+
* excluded: they never reach this layer, since a deleted document is
|
|
166
|
+
* removed before the build set is computed.
|
|
167
|
+
*
|
|
168
|
+
* The answer refers to the latest request, which may still be building, and
|
|
169
|
+
* it is retained between builds — so outside a build it describes whichever
|
|
170
|
+
* one ran last.
|
|
171
|
+
*/
|
|
172
|
+
isTriggeringEdit(uri: string): boolean;
|
|
173
|
+
}
|
|
129
174
|
/**
|
|
130
175
|
* Higher-level facade over {@link HydraniumTextDocuments} that speaks the
|
|
131
176
|
* model-server protocol (open/close/update/save with the transfer-model event
|
|
@@ -146,7 +191,7 @@ export type AstDocumentManagerOptions = LogNameOptions;
|
|
|
146
191
|
* resolution (the egress `applyEditToLanguageClient`) stay on
|
|
147
192
|
* {@link HydraniumTextDocuments}, their owner.
|
|
148
193
|
*/
|
|
149
|
-
export declare class
|
|
194
|
+
export declare class DefaultAstDocumentManager<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> implements AstDocumentManager<TAst, TDiagnostic> {
|
|
150
195
|
protected readonly services: ServerSharedServices;
|
|
151
196
|
protected lastUpdate?: UpdateInfo;
|
|
152
197
|
protected readonly textDocuments: HydraniumTextDocuments<TextDocument>;
|
|
@@ -195,7 +240,7 @@ export declare class AstDocumentManager<TAst extends AstNode = AstNode, TDiagnos
|
|
|
195
240
|
* concrete value (the `onUpdate` event's `sourceClientId`, the data-server's
|
|
196
241
|
* `resolveSourceClientId`).
|
|
197
242
|
*/
|
|
198
|
-
getAuthor(document: LangiumDocument
|
|
243
|
+
getAuthor(document: LangiumDocument): string | undefined;
|
|
199
244
|
open(args: OpenModelArgs): Promise<Disposable>;
|
|
200
245
|
close(args: CloseModelArgs): Promise<void>;
|
|
201
246
|
/**
|
|
@@ -217,12 +262,27 @@ export declare class AstDocumentManager<TAst extends AstNode = AstNode, TDiagnos
|
|
|
217
262
|
* callers don't need to pass it — the manager owns content and version
|
|
218
263
|
* sequencing.
|
|
219
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
|
+
*
|
|
220
271
|
* Throws if no document is open for `uri`.
|
|
221
272
|
*/
|
|
222
273
|
save(uri: string, clientId: string): Promise<void>;
|
|
274
|
+
/**
|
|
275
|
+
* Whether the file at `uri` already holds `text`.
|
|
276
|
+
*
|
|
277
|
+
* Compared by CONTENT rather than against a remembered version, so a write
|
|
278
|
+
* from outside this server is still corrected: a version this manager already
|
|
279
|
+
* saved says nothing about what is on disk now. `false` when the file cannot
|
|
280
|
+
* be read at all, which is the answer that writes — a document whose file does
|
|
281
|
+
* not exist yet is exactly the one a first save has to create.
|
|
282
|
+
*/
|
|
283
|
+
protected matchesDisk(uri: string, text: string): Promise<boolean>;
|
|
223
284
|
isOpen(uri: string): boolean;
|
|
224
|
-
|
|
225
|
-
isDirectChange(uri: string): boolean;
|
|
285
|
+
isTriggeringEdit(uri: string): boolean;
|
|
226
286
|
/**
|
|
227
287
|
* The `LangiumDocument` for an externally-supplied URI, looked up by its
|
|
228
288
|
* canonical identity. Folds the `getDocument(toUri(canonicalUri(uri)))` idiom
|
|
@@ -232,7 +292,6 @@ export declare class AstDocumentManager<TAst extends AstNode = AstNode, TDiagnos
|
|
|
232
292
|
*/
|
|
233
293
|
getDocument(uri: string): LangiumDocument | undefined;
|
|
234
294
|
protected createDocumentFromTextOrFileSystem(uri: string, languageId?: string, version?: number, text?: string): Promise<TextDocumentItem>;
|
|
235
|
-
readFile(uri: string): Promise<string>;
|
|
236
295
|
/**
|
|
237
296
|
* Hook for subclasses that want to re-shape the emitted document (e.g. inject
|
|
238
297
|
* a custom-typed `diagnostics` field). The default delegates to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-document-manager.d.ts","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EACJ,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"ast-document-manager.d.ts","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
|
+
import { asSnapshotVersion } from '@hydranium/protocol';
|
|
9
10
|
import { DocumentState, UriUtils } from '@hydranium/langium';
|
|
10
11
|
import { Disposable } from 'vscode-languageserver';
|
|
11
12
|
import { TextDocumentIdentifier } from 'vscode-languageserver-protocol';
|
|
@@ -21,7 +22,7 @@ export var AstDocument;
|
|
|
21
22
|
* `TransferDocument.create` on the wire side.
|
|
22
23
|
*/
|
|
23
24
|
function create(uri, version, root, diagnostics = []) {
|
|
24
|
-
return { uri, version, root, diagnostics };
|
|
25
|
+
return { uri, version: asSnapshotVersion(version), root, diagnostics };
|
|
25
26
|
}
|
|
26
27
|
AstDocument.create = create;
|
|
27
28
|
/**
|
|
@@ -37,6 +38,11 @@ export var AstDocument;
|
|
|
37
38
|
* carry that identity, not the subscriber's (possibly non-canonical) URI:
|
|
38
39
|
* a subscriber already knows the URI it subscribed with, so the useful
|
|
39
40
|
* thing to surface is the canonical one every other layer keys by.
|
|
41
|
+
*
|
|
42
|
+
* Narrowing `TDiagnostic` below the constraint asserts that the validators
|
|
43
|
+
* in play produce that shape, and nothing here checks it: the build fills the
|
|
44
|
+
* array, so a document carrying a diagnostic from elsewhere — a lexer error,
|
|
45
|
+
* another validator — satisfies the declared type and not the narrowed one.
|
|
40
46
|
*/
|
|
41
47
|
function from(document) {
|
|
42
48
|
return create(document.textDocument.uri, document.textDocument.version, document.parseResult.value, (document.diagnostics ?? []));
|
|
@@ -63,7 +69,7 @@ export var AstDocument;
|
|
|
63
69
|
* resolution (the egress `applyEditToLanguageClient`) stay on
|
|
64
70
|
* {@link HydraniumTextDocuments}, their owner.
|
|
65
71
|
*/
|
|
66
|
-
export class
|
|
72
|
+
export class DefaultAstDocumentManager {
|
|
67
73
|
services;
|
|
68
74
|
lastUpdate;
|
|
69
75
|
textDocuments;
|
|
@@ -176,11 +182,12 @@ export class AstDocumentManager {
|
|
|
176
182
|
const event = {
|
|
177
183
|
document: this.toAstDocument(document),
|
|
178
184
|
sourceClientId,
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
// No `'deleted'` arm: `DocumentBuilder.update` drops a deleted
|
|
186
|
+
// document from `LangiumDocuments` before deriving the rebuild set
|
|
187
|
+
// from it, so a deleted URI is never built and never reaches this
|
|
188
|
+
// phase listener. A subscriber needing deletions has to be told on
|
|
189
|
+
// a channel that does not require a built document.
|
|
190
|
+
reason: this.lastUpdate?.changed.some(changed => UriUtils.equals(changed, document.uri)) ? 'changed' : 'rebuilt'
|
|
184
191
|
};
|
|
185
192
|
this.tracer.with(uri).trace(`emitUpdate start: source=${sourceClientId}, reason=${event.reason}`);
|
|
186
193
|
listener(event);
|
|
@@ -218,11 +225,19 @@ export class AstDocumentManager {
|
|
|
218
225
|
// transiently breaks cross-document linking mid-rebuild (a dependent briefly
|
|
219
226
|
// seeing an `extends`/`type` reference unresolved). And because the constructor
|
|
220
227
|
// wires `onDidOpen -> this.open`, it would fire a second, identical rebuild on
|
|
221
|
-
// every first open.
|
|
228
|
+
// every first open.
|
|
229
|
+
//
|
|
230
|
+
// So an already-open `open()` records the attaching client's hold and nothing
|
|
231
|
+
// else. The hold is per `(uri, clientId)` and the last-close revert counts down
|
|
232
|
+
// to it, so skipping it lets the first holder's close tear down a document
|
|
233
|
+
// another client is still reading.
|
|
222
234
|
if (!this.isOpen(args.uri)) {
|
|
223
235
|
const textDocument = await this.createDocumentFromTextOrFileSystem(args.uri, args.languageId, args.version, args.text);
|
|
224
236
|
this.textDocuments.notifyDidOpenTextDocument({ textDocument }, args.clientId);
|
|
225
237
|
}
|
|
238
|
+
else {
|
|
239
|
+
this.textDocuments.attachClient(args.uri, args.clientId);
|
|
240
|
+
}
|
|
226
241
|
return Disposable.create(() => this.close(args));
|
|
227
242
|
}
|
|
228
243
|
async close(args) {
|
|
@@ -253,24 +268,50 @@ export class AstDocumentManager {
|
|
|
253
268
|
* callers don't need to pass it — the manager owns content and version
|
|
254
269
|
* sequencing.
|
|
255
270
|
*
|
|
271
|
+
* **The write is skipped when the file already holds that text; the
|
|
272
|
+
* notification is not.** A save announces that the content is on disk, which
|
|
273
|
+
* is true either way — so a subscriber clearing a dirty marker or reacting to
|
|
274
|
+
* a persist behaves the same, while an mtime is not moved for byte-identical
|
|
275
|
+
* content that a downstream mtime-keyed build would then read as new work.
|
|
276
|
+
*
|
|
256
277
|
* Throws if no document is open for `uri`.
|
|
257
278
|
*/
|
|
258
279
|
async save(uri, clientId) {
|
|
259
|
-
|
|
280
|
+
// Canonical throughout: the write and the read that gates it must address
|
|
281
|
+
// the same file the store was keyed by, or a divergent spelling compares
|
|
282
|
+
// one file and writes another.
|
|
283
|
+
const canonical = this.uriPolicy.canonicalUri(uri);
|
|
284
|
+
const document = this.textDocuments.get(canonical);
|
|
260
285
|
if (!document) {
|
|
261
286
|
throw new Error(`Document ${uri} hasn't been opened for saving yet`);
|
|
262
287
|
}
|
|
263
288
|
const text = document.getText();
|
|
264
|
-
await this.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
289
|
+
if (!(await this.matchesDisk(canonical, text))) {
|
|
290
|
+
await this.tracer.with(canonical).time(`Write file (${text.length} bytes, from ${clientId})`,
|
|
291
|
+
// Async write so a slow disk does not block the event loop for the duration of the fs call.
|
|
292
|
+
() => this.fileSystemProvider.writeFile(UriUtils.toUri(canonical), text), 'debug');
|
|
293
|
+
}
|
|
294
|
+
this.textDocuments.notifyDidSaveTextDocument({ textDocument: TextDocumentIdentifier.create(canonical), text }, clientId);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Whether the file at `uri` already holds `text`.
|
|
298
|
+
*
|
|
299
|
+
* Compared by CONTENT rather than against a remembered version, so a write
|
|
300
|
+
* from outside this server is still corrected: a version this manager already
|
|
301
|
+
* saved says nothing about what is on disk now. `false` when the file cannot
|
|
302
|
+
* be read at all, which is the answer that writes — a document whose file does
|
|
303
|
+
* not exist yet is exactly the one a first save has to create.
|
|
304
|
+
*/
|
|
305
|
+
async matchesDisk(uri, text) {
|
|
306
|
+
return this.fileSystemProvider
|
|
307
|
+
.readFile(UriUtils.toUri(uri))
|
|
308
|
+
.then(onDisk => onDisk === text)
|
|
309
|
+
.catch(() => false);
|
|
268
310
|
}
|
|
269
311
|
isOpen(uri) {
|
|
270
312
|
return !!this.textDocuments.get(uri);
|
|
271
313
|
}
|
|
272
|
-
|
|
273
|
-
isDirectChange(uri) {
|
|
314
|
+
isTriggeringEdit(uri) {
|
|
274
315
|
const canonical = this.uriPolicy.canonicalUri(uri);
|
|
275
316
|
return this.lastUpdate?.changed.some(changed => this.uriPolicy.canonicalUri(changed) === canonical) ?? false;
|
|
276
317
|
}
|
|
@@ -285,10 +326,7 @@ export class AstDocumentManager {
|
|
|
285
326
|
return this.langiumDocs.getDocument(UriUtils.toUri(this.uriPolicy.canonicalUri(uri)));
|
|
286
327
|
}
|
|
287
328
|
async createDocumentFromTextOrFileSystem(uri, languageId = this.resolveLanguageId(uri), version = 0, text) {
|
|
288
|
-
return { uri, languageId, version, text: text ?? (await this.readFile(uri)) };
|
|
289
|
-
}
|
|
290
|
-
async readFile(uri) {
|
|
291
|
-
return this.fileSystemProvider.readFile(UriUtils.toUri(uri));
|
|
329
|
+
return { uri, languageId, version, text: text ?? (await this.fileSystemProvider.readFile(UriUtils.toUri(uri))) };
|
|
292
330
|
}
|
|
293
331
|
/**
|
|
294
332
|
* Hook for subclasses that want to re-shape the emitted document (e.g. inject
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-document-manager.js","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;
|
|
1
|
+
{"version":3,"file":"ast-document-manager.js","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAMJ,iBAAiB,EAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGJ,aAAa,EAIb,QAAQ,EACV,MAAM,oBAAoB,CAAC;AAqD5B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAyB,MAAM,gCAAgC,CAAC;AAE/F,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAqCpD,MAAM,KAAW,WAAW,CA6C3B;AA7CD,WAAiB,WAAW;IACzB;;;;;OAKG;IACH,SAAgB,MAAM,CACnB,GAAW,EACX,OAAe,EACf,IAAU,EACV,cAA6B,EAAE;QAE/B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC1E,CAAC;IAPe,kBAAM,SAOrB,CAAA;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAgB,IAAI,CACjB,QAAyB;QAEzB,OAAO,MAAM,CACV,QAAQ,CAAC,YAAY,CAAC,GAAG,EACzB,QAAQ,CAAC,YAAY,CAAC,OAAO,EAC7B,QAAQ,CAAC,WAAW,CAAC,KAAa,EAClC,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAkB,CAC/C,CAAC;IACL,CAAC;IATe,gBAAI,OASnB,CAAA;AACJ,CAAC,EA7CgB,WAAW,KAAX,WAAW,QA6C3B;AA4DD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,yBAAyB;IAcb;IAVZ,UAAU,CAAc;IAEf,aAAa,CAAuC;IACpD,kBAAkB,CAA6B;IAC/C,WAAW,CAAmB;IAC9B,eAAe,CAAkB;IACjC,SAAS,CAAoB;IAC7B,MAAM,CAAS;IAElC,YACsB,QAA8B,EACjD,UAAqC,EAAE;QADpB,aAAQ,GAAR,QAAQ,CAAsB;QAGjD,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC;QACtD,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC;QAChE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CAAC;QACvD,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,SAAS,CAAC,eAAe,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,iBAAiB,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,oBAAoB,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACjG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAClC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CACzG,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1G,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YAChD,IAAI,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,sEAAsE;QACtE,sEAAsE;QACtE,yEAAyE;QACzE,wEAAwE;QACxE,0EAA0E;QAC1E,kEAAkE;QAClE,wEAAwE;QACxE,mEAAmE;QACnE,yEAAyE;QACzE,uEAAuE;QACvE,IAAI,CAAC,eAAe,CAAC,eAAe,CACjC,aAAa,CAAC,MAAM,EACpB,kBAAkB,CAAC,QAAQ,CAAC,EAAE;YAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;YAChI,IAAI,eAAe,KAAK,SAAS,IAAI,QAAQ,CAAC,YAAY,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;gBACtF,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;YACzE,CAAC;QACJ,CAAC,EAAE,6CAA6C,CAAC,CACnD,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACO,iBAAiB,CAAC,GAAW;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC;QACxF,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC;QACpD,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IAC1F,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,GAAW,EAAE,QAA6F;QAC9G,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;YAC/C,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC9D,OAAO,SAAS,CAAC;YACpB,CAAC;YACD,2DAA2D;YAC3D,iEAAiE;YACjE,4DAA4D;YAC5D,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;gBACzE,OAAO,QAAQ,CAAC;oBACb,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;oBACtC,cAAc,EAAE,KAAK,CAAC,QAAQ;iBAChC,CAAC,CAAC;YACN,CAAC;YACD,OAAO,SAAS,CAAC;QACpB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,6FAA6F;IAC7F,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,QAAoB;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAC1C,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC7F,QAAQ,EAAE,CAAC;YACd,CAAC;QACJ,CAAC,CAAC,CAAC;IACN,CAAC;IAED,+EAA+E;IAC/E,QAAQ,CAAC,GAAW,EAAE,QAA+E;QAClG,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,CAAC,QAAyB,EAAQ,EAAE;YACpD,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC;gBACxD,OAAO;YACV,CAAC;YACD,uEAAuE;YACvE,wEAAwE;YACxE,mDAAmD;YACnD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC;YACrE,MAAM,KAAK,GAAyD;gBACjE,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;gBACtC,cAAc;gBACd,+DAA+D;gBAC/D,mEAAmE;gBACnE,kEAAkE;gBAClE,mEAAmE;gBACnE,oDAAoD;gBACpD,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;aAClH,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,4BAA4B,cAAc,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAClG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC/D,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,EAAE,kBAAkB,CAAC,UAAU,EAAE,6BAA6B,CAAC,CAAC,CAAC;IACvI,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS,CAAC,QAAyB;QAChC,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAmB;QAC3B,gFAAgF;QAChF,iFAAiF;QACjF,iFAAiF;QACjF,kFAAkF;QAClF,6EAA6E;QAC7E,kFAAkF;QAClF,EAAE;QACF,+EAA+E;QAC/E,gEAAgE;QAChE,yEAAyE;QACzE,0EAA0E;QAC1E,gFAAgF;QAChF,uEAAuE;QACvE,6EAA6E;QAC7E,gFAAgF;QAChF,+EAA+E;QAC/E,oBAAoB;QACpB,EAAE;QACF,8EAA8E;QAC9E,gFAAgF;QAChF,2EAA2E;QAC3E,mCAAmC;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvH,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACL,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAoB;QAC7B,IAAI,CAAC,aAAa,CAAC,0BAA0B,CAAC,EAAE,YAAY,EAAE,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3H,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,IAAY,EAAE,QAAgB;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,sCAAsC,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,gBAAgB,QAAQ,GAAG,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,QAAgB;QACrC,0EAA0E;QAC1E,yEAAyE;QACzE,+BAA+B;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,oCAAoC,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACnC,eAAe,IAAI,CAAC,MAAM,gBAAgB,QAAQ,GAAG;YACrD,4FAA4F;YAC5F,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EACxE,OAAO,CACT,CAAC;QACL,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,YAAY,EAAE,sBAAsB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5H,CAAC;IAED;;;;;;;;OAQG;IACO,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,IAAY;QAClD,OAAO,IAAI,CAAC,kBAAkB;aAC1B,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC;aAC/B,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,GAAW;QACf,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,gBAAgB,CAAC,GAAW;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,IAAI,KAAK,CAAC;IAChH,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;IAES,KAAK,CAAC,kCAAkC,CAC/C,GAAW,EACX,aAAqB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAChD,OAAO,GAAG,CAAC,EACX,IAAa;QAEb,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpH,CAAC;IAED;;;;OAIG;IACO,aAAa,CAAC,QAAyB;QAC9C,OAAO,WAAW,CAAC,IAAI,CAAoB,QAAQ,CAAC,CAAC;IACxD,CAAC;CACH"}
|
|
@@ -7,24 +7,10 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* client, and/or a structured-form client. Each kind carries a stable id so
|
|
15
|
-
* the server can route outbound corrections, edits, and notifications to the
|
|
16
|
-
* right transport.
|
|
17
|
-
*/
|
|
18
|
-
/** Identifier for an LSP-text client (Monaco, VS Code, …). */
|
|
19
|
-
export declare const LANGUAGE_CLIENT_ID = "language-client";
|
|
20
|
-
/** Fallback identifier when a document's author is unknown (e.g. cold workspace-init load). */
|
|
21
|
-
export declare const UNKNOWN_CLIENT_ID = "unknown";
|
|
22
|
-
/**
|
|
23
|
-
* Synthetic author id on the `onDocumentUpdated` broadcast a data-server
|
|
24
|
-
* emits after the LAST client closed a document and the framework rebuilt it
|
|
25
|
-
* from its disk content (discarding unsaved in-session edits). Not a real
|
|
26
|
-
* client: it lets consumers distinguish the revert broadcast from
|
|
27
|
-
* client-authored updates.
|
|
10
|
+
* Re-export, because these are WIRE values and the side that has to recognise
|
|
11
|
+
* them is the client. They are defined in `@hydranium/protocol` so a frontend
|
|
12
|
+
* can name them without depending on the server tier; this path stays so
|
|
13
|
+
* server-side code keeps importing them from where it already does.
|
|
28
14
|
*/
|
|
29
|
-
export
|
|
15
|
+
export { FRAMEWORK_CLIENT_IDS, LANGUAGE_CLIENT_ID, REVERT_ON_CLOSE_CLIENT_ID, UNKNOWN_CLIENT_ID } from '@hydranium/protocol';
|
|
30
16
|
//# sourceMappingURL=client-ids.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-ids.d.ts","sourceRoot":"","sources":["../../src/documents/client-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF
|
|
1
|
+
{"version":3,"file":"client-ids.d.ts","sourceRoot":"","sources":["../../src/documents/client-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF;;;;;GAKG;AACH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -7,24 +7,10 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* client, and/or a structured-form client. Each kind carries a stable id so
|
|
15
|
-
* the server can route outbound corrections, edits, and notifications to the
|
|
16
|
-
* right transport.
|
|
17
|
-
*/
|
|
18
|
-
/** Identifier for an LSP-text client (Monaco, VS Code, …). */
|
|
19
|
-
export const LANGUAGE_CLIENT_ID = 'language-client';
|
|
20
|
-
/** Fallback identifier when a document's author is unknown (e.g. cold workspace-init load). */
|
|
21
|
-
export const UNKNOWN_CLIENT_ID = 'unknown';
|
|
22
|
-
/**
|
|
23
|
-
* Synthetic author id on the `onDocumentUpdated` broadcast a data-server
|
|
24
|
-
* emits after the LAST client closed a document and the framework rebuilt it
|
|
25
|
-
* from its disk content (discarding unsaved in-session edits). Not a real
|
|
26
|
-
* client: it lets consumers distinguish the revert broadcast from
|
|
27
|
-
* client-authored updates.
|
|
10
|
+
* Re-export, because these are WIRE values and the side that has to recognise
|
|
11
|
+
* them is the client. They are defined in `@hydranium/protocol` so a frontend
|
|
12
|
+
* can name them without depending on the server tier; this path stays so
|
|
13
|
+
* server-side code keeps importing them from where it already does.
|
|
28
14
|
*/
|
|
29
|
-
export
|
|
15
|
+
export { FRAMEWORK_CLIENT_IDS, LANGUAGE_CLIENT_ID, REVERT_ON_CLOSE_CLIENT_ID, UNKNOWN_CLIENT_ID } from '@hydranium/protocol';
|
|
30
16
|
//# sourceMappingURL=client-ids.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-ids.js","sourceRoot":"","sources":["../../src/documents/client-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF
|
|
1
|
+
{"version":3,"file":"client-ids.js","sourceRoot":"","sources":["../../src/documents/client-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF;;;;;GAKG;AACH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -98,15 +98,15 @@ interface VersionSequence {
|
|
|
98
98
|
*/
|
|
99
99
|
interface PendingPush {
|
|
100
100
|
/**
|
|
101
|
-
* The text the client held BEFORE this push
|
|
102
|
-
*
|
|
103
|
-
*
|
|
101
|
+
* The text the client held BEFORE this push, and therefore the text its
|
|
102
|
+
* echo addresses with its ranges. Wider than the baseline the push's edits
|
|
103
|
+
* were diffed against: a full replace is sent with no diff baseline and
|
|
104
|
+
* still lands on a buffer the echo is keyed to.
|
|
104
105
|
*
|
|
105
|
-
* `undefined` when
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* application is position-independent.
|
|
106
|
+
* `undefined` only when that buffer is unknown — the client never declared
|
|
107
|
+
* one, or a rejection invalidated what was tracked. The echo is then
|
|
108
|
+
* reconstructed against the synced text, which is sound only for a
|
|
109
|
+
* position-independent (full-text) change.
|
|
110
110
|
*/
|
|
111
111
|
readonly before: string | undefined;
|
|
112
112
|
/** {@link contentHash} of the text this push moves the client to. */
|
|
@@ -114,7 +114,7 @@ interface PendingPush {
|
|
|
114
114
|
}
|
|
115
115
|
/**
|
|
116
116
|
* What an incoming language-client change turns out to be once reconstructed
|
|
117
|
-
* against the
|
|
117
|
+
* against the buffer its ranges address — the return of
|
|
118
118
|
* {@link HydraniumTextDocuments.classifyLanguageClientChange}.
|
|
119
119
|
*/
|
|
120
120
|
type LanguageClientChangeOrigin =
|
|
@@ -123,13 +123,22 @@ type LanguageClientChangeOrigin =
|
|
|
123
123
|
readonly kind: 'echo';
|
|
124
124
|
}
|
|
125
125
|
/**
|
|
126
|
-
* The client's buffer
|
|
127
|
-
* a
|
|
128
|
-
* reconstructed text is what it now holds, and is authoritative.
|
|
126
|
+
* The client's buffer holds a text we did not push it — a keystroke that
|
|
127
|
+
* raced a push, or an edit to a buffer the store has already been written
|
|
128
|
+
* past. The reconstructed text is what it now holds, and is authoritative.
|
|
129
129
|
*/
|
|
130
130
|
| {
|
|
131
131
|
readonly kind: 'divergent';
|
|
132
132
|
readonly text: string;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The change carries ranges and no known text addresses them, so no
|
|
136
|
+
* reconstruction is offered. Adopting one anyway splices the document and
|
|
137
|
+
* stores an edit nobody made; dropping costs at most the one keystroke the
|
|
138
|
+
* client still holds and the next push contradicts.
|
|
139
|
+
*/
|
|
140
|
+
| {
|
|
141
|
+
readonly kind: 'unreconstructable';
|
|
133
142
|
};
|
|
134
143
|
/**
|
|
135
144
|
* Multi-client text-document tracking on top of Langium's `NormalizedTextDocuments`.
|
|
@@ -142,7 +151,7 @@ type LanguageClientChangeOrigin =
|
|
|
142
151
|
* per-client staleness guard and never leak into the shared sequence —
|
|
143
152
|
* the two are different things (an editor's edit-operation counter vs the
|
|
144
153
|
* document's content-revision number), and splicing them lets versions drift
|
|
145
|
-
* silently past
|
|
154
|
+
* silently past based-on gate holders.
|
|
146
155
|
* - Version-author history so each edit is attributable to its originating client.
|
|
147
156
|
* - Pending-content staging used by the integrity service to thread corrections
|
|
148
157
|
* through `workspace/applyEdit` cycles for currently-closed documents.
|
|
@@ -169,7 +178,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
169
178
|
* that record is deleted on last close, while the version sequence must
|
|
170
179
|
* survive it — the shared version is a server-owned, monotonic,
|
|
171
180
|
* advances-iff-content-changes counter that never resets while the server
|
|
172
|
-
* lives. That invariant is what makes an optimistic
|
|
181
|
+
* lives. That invariant is what makes an optimistic based-on gate
|
|
173
182
|
* sound: "version unchanged ⇔ content unchanged", with no false conflicts
|
|
174
183
|
* from close/reopen version resets and no false passes from a reopened
|
|
175
184
|
* sequence coincidentally landing on a stale writer's number.
|
|
@@ -254,7 +263,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
254
263
|
* A content-identical write still fires the change event (rebuild): the
|
|
255
264
|
* authored write's server-side rebuild is correctness-bearing, it just
|
|
256
265
|
* mints no new version — nothing observable changed, so watchers'
|
|
257
|
-
*
|
|
266
|
+
* based-on versions stay valid.
|
|
258
267
|
*
|
|
259
268
|
* Returns the resulting shared version. Throws when the document is not
|
|
260
269
|
* open — callers (`AstDocumentManager.update`) open first.
|
|
@@ -265,6 +274,26 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
265
274
|
notifyWillSaveTextDocumentWaitUntil(event: WillSaveTextDocumentParams, token: CancellationToken): HandlerResult<TextEdit[], void>;
|
|
266
275
|
notifyDidSaveTextDocument(event: DidSaveTextDocumentParams, clientId?: string): void;
|
|
267
276
|
notifyDidOpenTextDocument(event: DidOpenTextDocumentParams, clientId?: string): void;
|
|
277
|
+
/**
|
|
278
|
+
* Record `clientId` as an additional holder of a document another client
|
|
279
|
+
* already has open.
|
|
280
|
+
*
|
|
281
|
+
* Unlike the attach branch of {@link notifyDidOpenTextDocument} this does
|
|
282
|
+
* not refresh. That branch re-renders an attaching TEXTUAL view; a client
|
|
283
|
+
* reaching a document through a non-textual route has nothing to re-render,
|
|
284
|
+
* and refreshing per attach turns each into a Langium rebuild and dependent
|
|
285
|
+
* relink cascade.
|
|
286
|
+
*
|
|
287
|
+
* The staleness guard baselines at the SYNCED version, not a declared buffer
|
|
288
|
+
* version, because a client arriving this way holds no buffer of its own.
|
|
289
|
+
* Unifying the two routes therefore rebaselines a textual client's guard to a
|
|
290
|
+
* version it never declared.
|
|
291
|
+
*
|
|
292
|
+
* Returns whether a hold was added — `false` when `uri` is not open, or
|
|
293
|
+
* `clientId` already holds it.
|
|
294
|
+
*/
|
|
295
|
+
attachClient(uri: DocumentUri, clientId: string): boolean;
|
|
296
|
+
protected logClientJoined(uri: DocumentUri, clientId: string, version: number, existingClients: readonly string[]): void;
|
|
268
297
|
refreshContent(uri: DocumentUri, clientId: string): void;
|
|
269
298
|
/**
|
|
270
299
|
* The canonical key a document is stored under — the single point this store
|
|
@@ -313,7 +342,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
313
342
|
* `0` for a URI this store has never seen. The shared sequence is
|
|
314
343
|
* server-owned and monotonic across close/reopen cycles, and advances
|
|
315
344
|
* exactly when the synced content changes — which is what makes it a sound
|
|
316
|
-
* optimistic-concurrency token (
|
|
345
|
+
* optimistic-concurrency token (based-on gates): version unchanged ⇔
|
|
317
346
|
* content unchanged.
|
|
318
347
|
*/
|
|
319
348
|
version(uri: DocumentUri): number;
|
|
@@ -436,12 +465,17 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
436
465
|
protected recordPendingPush(targetUri: LanguageClientUri, before: string | undefined, newText: string): void;
|
|
437
466
|
/**
|
|
438
467
|
* Decide what an incoming language-client change actually is, by
|
|
439
|
-
* reconstructing the client's resulting buffer against the
|
|
440
|
-
* in flight for
|
|
468
|
+
* reconstructing the client's resulting buffer against the text its ranges
|
|
469
|
+
* address — the pre-push buffer of the OLDEST push still in flight for
|
|
470
|
+
* `clientFacing`, else whatever that client is believed to hold.
|
|
441
471
|
*
|
|
442
|
-
* `undefined` when
|
|
443
|
-
*
|
|
444
|
-
*
|
|
472
|
+
* `undefined` when the client's ranges address the synced text itself —
|
|
473
|
+
* nothing in flight, and no evidence the client holds anything else. That
|
|
474
|
+
* is the ordinary path, and the caller then applies the ranges directly.
|
|
475
|
+
* The two texts part company without a push in flight whenever a client
|
|
476
|
+
* attaches to a document another client has already written: it opened
|
|
477
|
+
* from disk, so applying its ranges to the synced text splices lines they
|
|
478
|
+
* never addressed.
|
|
445
479
|
*
|
|
446
480
|
* **Why the oldest, and why reconstruct at all.** The client applies our
|
|
447
481
|
* pushes in order and echoes each against the buffer it held before that
|