@hydranium/core 1.0.0-next.34 → 1.0.0-next.341
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/README.md +78 -82
- package/lib/browser/host-heads-in-worker.d.ts +77 -0
- package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
- package/lib/browser/host-heads-in-worker.js +169 -0
- package/lib/browser/host-heads-in-worker.js.map +1 -0
- package/lib/browser/index.d.ts +12 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +17 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
- package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
- package/lib/browser/indexeddb-file-system-store.js +181 -0
- package/lib/browser/indexeddb-file-system-store.js.map +1 -0
- package/lib/browser/start-language-server-in-worker.d.ts +32 -0
- package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
- package/lib/browser/start-language-server-in-worker.js +40 -0
- package/lib/browser/start-language-server-in-worker.js.map +1 -0
- package/lib/documents/ast-document-manager.d.ts +256 -124
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +293 -132
- 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/client-session-errors.d.ts +15 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +15 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +146 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +207 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/dirty-state-tracker.d.ts +101 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +85 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +204 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +317 -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/file-system-task-queue.d.ts +52 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +37 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +445 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +903 -483
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +10 -2
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +10 -2
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-shadow.d.ts +234 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +306 -0
- package/lib/documents/language-client-shadow.js.map +1 -0
- package/lib/documents/model-ledger.d.ts +47 -0
- package/lib/documents/model-ledger.d.ts.map +1 -0
- package/lib/documents/model-ledger.js +30 -0
- package/lib/documents/model-ledger.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/documents/version-sync-service.d.ts +138 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +173 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js +45 -19
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +25 -9
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +49 -36
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +83 -44
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
- package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
- package/lib/langium/composite-ast-reflection.d.ts +46 -0
- package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
- package/lib/langium/composite-ast-reflection.js +97 -0
- package/lib/langium/composite-ast-reflection.js.map +1 -0
- 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/config/settings.js.map +1 -1
- package/lib/langium/diagnostics/console-tee.d.ts +27 -0
- package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
- package/lib/langium/diagnostics/console-tee.js +142 -0
- package/lib/langium/diagnostics/console-tee.js.map +1 -0
- package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
- package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
- package/lib/langium/diagnostics/format-log-arg.js +36 -0
- package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/log-preamble.js +1 -1
- package/lib/langium/diagnostics/log-preamble.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +25 -6
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +49 -17
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +81 -45
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
- package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
- package/lib/langium/diagnostics/server-tracer.js.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +6 -5
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js +5 -5
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +283 -41
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +449 -79
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
- package/lib/langium/documentation/comment-provider.js.map +1 -1
- package/lib/langium/integration-services.d.ts +40 -24
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +7 -4
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +17 -8
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +95 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +303 -63
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/positional-key-provider.js.map +1 -1
- package/lib/langium/labeling/label-provider.d.ts.map +1 -1
- package/lib/langium/labeling/label-provider.js.map +1 -1
- package/lib/langium/language-module.d.ts +30 -5
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +18 -4
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +383 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +455 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +2 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +2 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-events.d.ts +66 -0
- package/lib/langium/model-service/model-events.d.ts.map +1 -0
- package/lib/langium/model-service/model-events.js +10 -0
- package/lib/langium/model-service/model-events.js.map +1 -0
- package/lib/langium/model-service/model-service.d.ts +456 -300
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +571 -466
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +141 -40
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +52 -40
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +32 -7
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +10 -4
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +13 -6
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +2 -2
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +38 -14
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +24 -58
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/fallback-scope.d.ts +27 -0
- package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
- package/lib/langium/scope/fallback-scope.js +35 -0
- package/lib/langium/scope/fallback-scope.js.map +1 -0
- package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js +38 -39
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +66 -26
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +114 -33
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/index.d.ts +1 -0
- package/lib/langium/scope/index.d.ts.map +1 -1
- package/lib/langium/scope/index.js +1 -0
- package/lib/langium/scope/index.js.map +1 -1
- package/lib/langium/scope/reference-builder.d.ts.map +1 -1
- package/lib/langium/scope/reference-builder.js.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js +3 -2
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts +41 -37
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js +57 -29
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
- package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.js +1 -3
- package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +54 -30
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +8 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js +13 -3
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/serializer.d.ts +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js +4 -0
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +29 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +37 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +13 -7
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/single-langium-copy.d.ts +22 -0
- package/lib/langium/single-langium-copy.d.ts.map +1 -0
- package/lib/langium/single-langium-copy.js +36 -0
- package/lib/langium/single-langium-copy.js.map +1 -0
- package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +36 -25
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +543 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +1164 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +62 -0
- package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
- package/lib/langium/trivia/index.d.ts +14 -0
- package/lib/langium/trivia/index.d.ts.map +1 -0
- package/lib/langium/trivia/index.js +14 -0
- package/lib/langium/trivia/index.js.map +1 -0
- package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
- package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-contribution.js +10 -0
- package/lib/langium/trivia/trivia-contribution.js.map +1 -0
- package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +168 -23
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +264 -26
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.js +1 -1
- package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
- package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +22 -13
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +23 -0
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
- package/lib/langium/workspace/file-not-found.js +31 -0
- package/lib/langium/workspace/file-not-found.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +167 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +115 -13
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/index.d.ts +1 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +1 -0
- package/lib/langium/workspace/index.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +68 -3
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +7 -0
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +18 -1
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/self-save-registry.d.ts +84 -0
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +55 -21
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +87 -24
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +15 -5
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/launcher/integrated-server.d.ts +3 -1
- package/lib/launcher/integrated-server.d.ts.map +1 -1
- package/lib/locale/server-locale.d.ts +19 -5
- package/lib/locale/server-locale.d.ts.map +1 -1
- package/lib/locale/server-locale.js +1 -1
- package/lib/locale/server-locale.js.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
- package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
- package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
- package/lib/lsp/connection-features.d.ts +23 -0
- package/lib/lsp/connection-features.d.ts.map +1 -0
- package/lib/lsp/connection-features.js +60 -0
- package/lib/lsp/connection-features.js.map +1 -0
- package/lib/lsp/diagnostics-connection.d.ts +27 -0
- package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
- package/lib/lsp/diagnostics-connection.js +53 -0
- package/lib/lsp/diagnostics-connection.js.map +1 -0
- package/lib/lsp/edit-requests-guard.d.ts +31 -0
- package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
- package/lib/lsp/edit-requests-guard.js +125 -0
- package/lib/lsp/edit-requests-guard.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +235 -102
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +6 -2
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +6 -2
- 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/save-text-document.d.ts +31 -0
- package/lib/lsp/save-text-document.d.ts.map +1 -0
- package/lib/lsp/save-text-document.js +52 -0
- package/lib/lsp/save-text-document.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +58 -2
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +98 -9
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +12 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +21 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +4 -6
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +4 -6
- package/lib/messages/carriers.js.map +1 -1
- package/lib/messages/index.d.ts +2 -2
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +2 -2
- package/lib/messages/index.js.map +1 -1
- package/lib/messages/renderer.d.ts +32 -7
- package/lib/messages/renderer.d.ts.map +1 -1
- package/lib/messages/renderer.js +7 -1
- package/lib/messages/renderer.js.map +1 -1
- package/lib/node/event-loop-monitor.d.ts.map +1 -1
- package/lib/node/event-loop-monitor.js +2 -1
- package/lib/node/event-loop-monitor.js.map +1 -1
- 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 -1
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +5 -1
- 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/lint-grammar.js.map +1 -1
- package/lib/node/log-file-sink.d.ts +3 -2
- package/lib/node/log-file-sink.d.ts.map +1 -1
- package/lib/node/log-file-sink.js +6 -2
- package/lib/node/log-file-sink.js.map +1 -1
- package/lib/node/log-preamble-node.d.ts +5 -3
- package/lib/node/log-preamble-node.d.ts.map +1 -1
- package/lib/node/log-preamble-node.js +13 -10
- package/lib/node/log-preamble-node.js.map +1 -1
- package/lib/node/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +5 -4
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.d.ts +2 -2
- package/lib/node/memory-monitor.d.ts.map +1 -1
- package/lib/node/memory-monitor.js +9 -10
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +67 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +198 -53
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +12 -4
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +8 -6
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +13 -3
- package/lib/node/profiling-run.d.ts.map +1 -1
- package/lib/node/profiling-run.js +17 -8
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +61 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +80 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/server-diagnostics.js +1 -1
- package/lib/node/server-diagnostics.js.map +1 -1
- package/lib/node/server-state-snapshot.js +4 -4
- package/lib/node/server-state-snapshot.js.map +1 -1
- package/lib/node/socket-launcher.d.ts +43 -7
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +42 -7
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/startup-cpu-profile.d.ts +29 -0
- package/lib/node/startup-cpu-profile.d.ts.map +1 -0
- package/lib/node/startup-cpu-profile.js +91 -0
- package/lib/node/startup-cpu-profile.js.map +1 -0
- package/lib/node/stdio-launcher.d.ts +13 -13
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +21 -11
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/node/validate-workspace.d.ts +1 -1
- package/lib/node/validate-workspace.d.ts.map +1 -1
- package/lib/node/validate-workspace.js +5 -1
- package/lib/node/validate-workspace.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js +1 -1
- package/lib/testing/document-uri-policy-conformance.js.map +1 -1
- package/lib/testing/fake-description.js.map +1 -1
- package/lib/testing/fake-document.d.ts +2 -1
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/index.d.ts +1 -1
- package/lib/testing/index.d.ts.map +1 -1
- package/lib/testing/index.js +2 -1
- package/lib/testing/index.js.map +1 -1
- package/lib/testing/langium-test-helpers.d.ts.map +1 -1
- package/lib/testing/langium-test-helpers.js +1 -0
- package/lib/testing/langium-test-helpers.js.map +1 -1
- package/lib/testing/make-noop-language-services.js.map +1 -1
- package/lib/testing/make-noop-shared-services.d.ts +4 -4
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +4 -4
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +51 -20
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +29 -13
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/make-test-tracer.d.ts +12 -0
- package/lib/testing/make-test-tracer.d.ts.map +1 -1
- package/lib/testing/make-test-tracer.js +13 -0
- package/lib/testing/make-test-tracer.js.map +1 -1
- package/lib/testing/node/applied-edit-capture.d.ts +29 -0
- package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
- package/lib/testing/node/applied-edit-capture.js +117 -0
- package/lib/testing/node/applied-edit-capture.js.map +1 -0
- package/lib/testing/node/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +21 -6
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +49 -106
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +30 -1
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +39 -2
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/node/unhandled-rejections.d.ts +20 -0
- package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
- package/lib/testing/node/unhandled-rejections.js +32 -0
- package/lib/testing/node/unhandled-rejections.js.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
- package/lib/testing/playwright/e2e-profiling.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 +46 -16
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +111 -40
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
- package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-fixture.js +25 -6
- package/lib/testing/playwright/server-log-fixture.js.map +1 -1
- package/lib/testing/playwright/server-log-region.d.ts +15 -0
- package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-region.js +30 -0
- package/lib/testing/playwright/server-log-region.js.map +1 -0
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +8 -5
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/run-update-pipeline.js.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +11 -52
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +31 -62
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +33 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +103 -5
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +132 -16
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.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 +9 -8
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +6 -6
- package/lib/testing/stub-model-service.js.map +1 -1
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-self-save-registry.d.ts +1 -1
- package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
- package/lib/testing/stub-service-registry.d.ts +1 -1
- package/lib/testing/stub-service-registry.js.map +1 -1
- package/lib/testing/stub-writable-file-system.d.ts +1 -1
- package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
- package/lib/testing/stub-writable-file-system.js +2 -1
- package/lib/testing/stub-writable-file-system.js.map +1 -1
- package/lib/util/connection-liveness.d.ts +22 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +74 -15
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts +7 -0
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js +15 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +41 -60
- package/src/browser/host-heads-in-worker.ts +218 -0
- package/src/browser/index.ts +17 -0
- package/src/browser/indexeddb-file-system-store.ts +192 -0
- package/src/browser/start-language-server-in-worker.ts +56 -0
- package/src/documents/ast-document-manager.ts +467 -233
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +24 -0
- package/src/documents/client-session-registry.ts +262 -0
- package/src/documents/dirty-state-tracker.ts +167 -0
- package/src/documents/document-release-handler.ts +404 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +74 -0
- package/src/documents/hydranium-text-documents.ts +1029 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +501 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +275 -0
- package/src/index.ts +7 -0
- package/src/langium/ast-extension/ast-extension-service.ts +77 -41
- package/src/langium/ast-extension/ast-node-builder.ts +35 -13
- package/src/langium/bootstrap.ts +87 -51
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
- package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
- package/src/langium/composite-ast-reflection.ts +112 -0
- package/src/langium/config/configuration-provider.ts +119 -0
- package/src/langium/config/index.ts +1 -0
- package/src/langium/diagnostics/console-tee.ts +151 -0
- package/src/langium/diagnostics/format-log-arg.ts +36 -0
- package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
- package/src/langium/diagnostics/log-preamble.ts +1 -1
- package/src/langium/diagnostics/logger.ts +51 -17
- package/src/langium/diagnostics/lsp-logger.ts +83 -44
- package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +554 -79
- package/src/langium/integration-services.ts +59 -28
- package/src/langium/integrity/integrity-rule.ts +17 -8
- package/src/langium/integrity/integrity-service.ts +332 -69
- package/src/langium/language-module.ts +49 -8
- package/src/langium/model-service/client-session.ts +718 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +80 -0
- package/src/langium/model-service/model-service.ts +878 -494
- package/src/langium/module.ts +195 -72
- package/src/langium/naming/name-provider.ts +34 -8
- package/src/langium/project/abstract-project-manager.ts +13 -5
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +54 -19
- package/src/langium/scope/fallback-scope.ts +38 -0
- package/src/langium/scope/hydranium-scope-computation.ts +45 -44
- package/src/langium/scope/hydranium-scope-provider.ts +132 -33
- package/src/langium/scope/index.ts +1 -0
- package/src/langium/scope/reference-candidate-provider.ts +6 -5
- package/src/langium/scope/scope-extension-service.ts +74 -59
- package/src/langium/scope/scoped-ast-node-description.ts +1 -3
- package/src/langium/serialization/abstract-serializer.ts +57 -41
- package/src/langium/serialization/json-serializer.ts +14 -3
- package/src/langium/serialization/serializer.ts +1 -1
- package/src/langium/serialization/yaml-serializer.ts +4 -0
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +16 -7
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +104 -47
- package/src/langium/trivia/comment-preserver.ts +1409 -0
- package/src/langium/trivia/document-ending-preserver.ts +71 -0
- package/src/langium/trivia/index.ts +14 -0
- package/src/langium/trivia/trivia-contribution.ts +39 -0
- package/src/langium/trivia/trivia-preserver.ts +56 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +312 -31
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/document-uri-policy.ts +32 -18
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +258 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +1 -0
- package/src/langium/workspace/initialize-workspace.ts +96 -4
- package/src/langium/workspace/langium-documents.ts +19 -1
- package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
- package/src/langium/workspace/self-save-registry.ts +118 -0
- package/src/langium/workspace/virtual-document.ts +106 -25
- package/src/langium/workspace/write-lock-scope.ts +27 -12
- package/src/launcher/integrated-server.ts +3 -1
- package/src/locale/server-locale.ts +20 -5
- package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
- package/src/lsp/connection-features.ts +67 -0
- package/src/lsp/diagnostics-connection.ts +56 -0
- package/src/lsp/edit-requests-guard.ts +152 -0
- package/src/lsp/hydranium-document-update-handler.ts +285 -111
- package/src/lsp/index.ts +6 -2
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/save-text-document.ts +63 -0
- package/src/lsp/semantic-token-provider.ts +146 -8
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +21 -7
- package/src/messages/carriers.ts +4 -6
- package/src/messages/index.ts +11 -2
- package/src/messages/renderer.ts +34 -6
- package/src/node/event-loop-monitor.ts +2 -1
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +5 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/log-file-sink.ts +6 -2
- package/src/node/log-preamble-node.ts +20 -10
- package/src/node/measure-memory.ts +5 -4
- package/src/node/memory-monitor.ts +10 -10
- package/src/node/node-file-system-provider.ts +214 -57
- package/src/node/profile-capture.ts +16 -15
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +94 -0
- package/src/node/server-diagnostics.ts +1 -1
- package/src/node/server-state-snapshot.ts +5 -5
- package/src/node/socket-launcher.ts +78 -14
- package/src/node/startup-cpu-profile.ts +94 -0
- package/src/node/stdio-launcher.ts +29 -19
- package/src/node/validate-workspace.ts +8 -2
- package/src/testing/document-uri-policy-conformance.ts +1 -1
- package/src/testing/fake-document.ts +2 -1
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-noop-shared-services.ts +6 -6
- package/src/testing/make-test-services.ts +93 -41
- package/src/testing/make-test-tracer.ts +26 -0
- package/src/testing/node/applied-edit-capture.ts +141 -0
- package/src/testing/node/index.ts +1 -0
- package/src/testing/node/lsp-harness.ts +2 -0
- package/src/testing/node/lsp-server-connection.ts +83 -119
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +57 -3
- package/src/testing/node/unhandled-rejections.ts +31 -0
- package/src/testing/parse-semantic-root.ts +1 -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 +137 -47
- package/src/testing/playwright/server-log-fixture.ts +46 -6
- package/src/testing/playwright/server-log-region.ts +32 -0
- package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
- package/src/testing/run-update-pipeline.ts +8 -5
- package/src/testing/stub-ast-document-manager.ts +47 -128
- package/src/testing/stub-document-builder.ts +133 -18
- package/src/testing/stub-hydranium-text-documents.ts +184 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +11 -10
- package/src/testing/stub-self-save-registry.ts +1 -1
- package/src/testing/stub-service-registry.ts +1 -1
- package/src/testing/stub-writable-file-system.ts +3 -2
- package/src/util/connection-liveness.ts +80 -15
- package/src/util/environment.ts +24 -2
- package/lib/documents/language-client-text-shadow.d.ts +0 -101
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -156
- package/lib/documents/language-client-text-shadow.js.map +0 -1
- package/lib/documents/self-save-registry.d.ts +0 -55
- package/lib/documents/self-save-registry.d.ts.map +0 -1
- package/lib/documents/self-save-registry.js.map +0 -1
- 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/lib/node/process-memory.d.ts +0 -66
- package/lib/node/process-memory.d.ts.map +0 -1
- package/lib/node/process-memory.js +0 -252
- package/lib/node/process-memory.js.map +0 -1
- package/src/documents/language-client-text-shadow.ts +0 -175
- package/src/documents/self-save-registry.ts +0 -81
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -8,12 +8,18 @@
|
|
|
8
8
|
* SPDX-License-Identifier: MIT
|
|
9
9
|
********************************************************************************/
|
|
10
10
|
import { NormalizedTextDocuments } from '@hydranium/langium/lsp';
|
|
11
|
+
import { type URI } from '@hydranium/langium';
|
|
11
12
|
import { type ServerSharedServices } from '../langium/module.js';
|
|
12
|
-
import { type ApplyWorkspaceEditResult, type CancellationToken, type Connection, type DidChangeTextDocumentParams, type DidCloseTextDocumentParams, type DidOpenTextDocumentParams, type DidSaveTextDocumentParams, type Disposable,
|
|
13
|
+
import { type ApplyWorkspaceEditResult, type CancellationToken, type Connection, type DidChangeTextDocumentParams, type DidCloseTextDocumentParams, type DidOpenTextDocumentParams, type DidSaveTextDocumentParams, type Disposable, Emitter, type Event, type HandlerResult, type RequestHandler, type TextDocumentChangeEvent, type TextDocumentWillSaveEvent, type TextDocumentsConfiguration, type TextEdit, type WillSaveTextDocumentParams } from 'vscode-languageserver';
|
|
13
14
|
import { type DocumentUri, TextDocument, type TextDocumentContentChangeEvent } from 'vscode-languageserver-textdocument';
|
|
14
|
-
import { type CanonicalUri, type LanguageClientUri, type Tracer } from '@hydranium/protocol';
|
|
15
|
+
import { type CanonicalUri, type LanguageClientUri, type TextState, type TextVersion, type Tracer } from '@hydranium/protocol';
|
|
15
16
|
import { type LogNameOptions } from '../langium/diagnostics/logger.js';
|
|
16
|
-
import {
|
|
17
|
+
import { type ClientSessionClosedEvent, ClientSessionRegistry, type SessionEndCause } from './client-session-registry.js';
|
|
18
|
+
import { type LanguageClientShadow } from './language-client-shadow.js';
|
|
19
|
+
import { type TextLedger } from './text-ledger.js';
|
|
20
|
+
import { type ReleasedDocument } from './document-release-handler.js';
|
|
21
|
+
import { type DocumentReleaseScheduler } from './document-release-scheduler.js';
|
|
22
|
+
import { type CleanAnnouncement, type DirtyStateTracker, type DocumentDirtyChangedEvent } from './dirty-state-tracker.js';
|
|
17
23
|
export interface ClientTextDocumentChangeEvent<T> extends TextDocumentChangeEvent<T> {
|
|
18
24
|
clientId: string;
|
|
19
25
|
}
|
|
@@ -28,46 +34,30 @@ export interface HydraniumTextDocumentsOptions<T extends TextDocument = TextDocu
|
|
|
28
34
|
* Adopters with a custom text-document type (rare) pass their factory.
|
|
29
35
|
*/
|
|
30
36
|
readonly configuration?: TextDocumentsConfiguration<T>;
|
|
37
|
+
/**
|
|
38
|
+
* How long a document whose last open closed because its client's
|
|
39
|
+
* connection was lost keeps its text before the store releases it. An open
|
|
40
|
+
* by a client lost from the document, within this time of its own loss,
|
|
41
|
+
* cancels the release, so a client that registers again under its id after
|
|
42
|
+
* a dropped connection finds its unsaved edits. Any other open releases the
|
|
43
|
+
* document first and then opens it as a first open does, from the text the
|
|
44
|
+
* opener supplies (an editor's own) or else from the file. Meanwhile the
|
|
45
|
+
* document counts as open for the integrity service, which therefore writes
|
|
46
|
+
* none of its unsaved text to disk. A close the client makes itself, or
|
|
47
|
+
* ending its session, releases at once whatever this is.
|
|
48
|
+
*
|
|
49
|
+
* Defaults to 10 s. `0` releases such a document at once as well, in the
|
|
50
|
+
* close itself rather than on a timer.
|
|
51
|
+
*/
|
|
52
|
+
readonly releaseGraceMs?: number;
|
|
31
53
|
}
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
* Two neighbours deliberately stay separate:
|
|
40
|
-
* - The inherited `__syncedDocuments` (Langium's parsed `TextDocument` store).
|
|
41
|
-
* - {@link LanguageClientTextShadow} (`__shadow`), a self-contained,
|
|
42
|
-
* separately-tested diff/apply-verify abstraction that owns its own baseline
|
|
43
|
-
* text; folding its storage here would couple a clean utility to this record
|
|
44
|
-
* for no real gain.
|
|
45
|
-
*/
|
|
46
|
-
interface DocumentTracking {
|
|
47
|
-
/** Client ids currently holding this document open (multi-client membership). */
|
|
48
|
-
readonly clients: Set<string>;
|
|
49
|
-
/** Author of each version, sparse-indexed by the SHARED (server-assigned) version number. */
|
|
50
|
-
readonly versionAuthors: string[];
|
|
51
|
-
/**
|
|
52
|
-
* Last version id each client declared for this document (didOpen baseline,
|
|
53
|
-
* advanced by every accepted didChange). Client version ids are CLIENT-owned
|
|
54
|
-
* per LSP (Monaco numbers its own buffer) and are used ONLY for this
|
|
55
|
-
* per-client staleness guard — they never leak into the shared version
|
|
56
|
-
* sequence, which the server assigns (see {@link HydraniumTextDocuments.__versionSequences}).
|
|
57
|
-
*/
|
|
58
|
-
readonly clientVersions: Map<string, number>;
|
|
59
|
-
/** Content staged by integrity rules for a closed document. Consumed on next open. */
|
|
60
|
-
pendingContent?: string;
|
|
61
|
-
/**
|
|
62
|
-
* The URI(s) the LSP textual language client opened this (canonically-keyed)
|
|
63
|
-
* document under. Usually one; a set because the same physical file can be
|
|
64
|
-
* opened under more than one URI (a symlink path and its real path). This is
|
|
65
|
-
* the egress address: `applyEditToLanguageClient`
|
|
66
|
-
* targets these, since the document is *keyed* by its canonical identity but
|
|
67
|
-
* Monaco holds it under the URI it opened. Lifecycle-bound — cleared with the
|
|
68
|
-
* record on last close.
|
|
69
|
-
*/
|
|
70
|
-
languageClientUris?: Set<LanguageClientUri>;
|
|
54
|
+
/** Delivered by {@link HydraniumTextDocuments.onDidSaveInLanguageClient}. */
|
|
55
|
+
export interface LanguageClientSavedEvent {
|
|
56
|
+
readonly uri: string;
|
|
57
|
+
}
|
|
58
|
+
/** Delivered by {@link HydraniumTextDocuments.onDidReleaseDocument}. */
|
|
59
|
+
export interface DocumentReleasedEvent {
|
|
60
|
+
readonly uri: CanonicalUri;
|
|
71
61
|
}
|
|
72
62
|
/**
|
|
73
63
|
* A document held open by at least one client, with the client ids holding it —
|
|
@@ -80,153 +70,93 @@ export interface OpenDocument {
|
|
|
80
70
|
readonly clients: readonly string[];
|
|
81
71
|
}
|
|
82
72
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
readonly contentHash: string;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* One text pushed to the LSP textual language client by
|
|
96
|
-
* {@link HydraniumTextDocuments.applyEditToLanguageClient} whose echo has not
|
|
97
|
-
* come back yet. One entry of {@link HydraniumTextDocuments.__pendingPushes}.
|
|
98
|
-
*/
|
|
99
|
-
interface PendingPush {
|
|
100
|
-
/**
|
|
101
|
-
* The text the client held BEFORE this push — the shadow baseline the
|
|
102
|
-
* push's edits were diffed against, and therefore the text the client's
|
|
103
|
-
* echo addresses with its ranges.
|
|
104
|
-
*
|
|
105
|
-
* `undefined` when the push was a full replace sent with no baseline (a
|
|
106
|
-
* first sync, or the recovery push after a rejection). There is then no
|
|
107
|
-
* knowing what the client held, so the echo is reconstructed against the
|
|
108
|
-
* synced text instead — which is sound for a full replace, whose
|
|
109
|
-
* application is position-independent.
|
|
110
|
-
*/
|
|
111
|
-
readonly before: string | undefined;
|
|
112
|
-
/** {@link contentHash} of the text this push moves the client to. */
|
|
113
|
-
readonly afterHash: string;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* What an incoming language-client change turns out to be once reconstructed
|
|
117
|
-
* against the pushes still in flight — the return of
|
|
118
|
-
* {@link HydraniumTextDocuments.classifyLanguageClientChange}.
|
|
119
|
-
*/
|
|
120
|
-
type LanguageClientChangeOrigin =
|
|
121
|
-
/** The client is reporting a text we pushed it. The synced document is already there. */
|
|
122
|
-
{
|
|
123
|
-
readonly kind: 'echo';
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* The client's buffer has moved somewhere we did not push it — it coalesced
|
|
127
|
-
* a genuine keystroke into the echo, or typed before the push arrived. The
|
|
128
|
-
* reconstructed text is what it now holds, and is authoritative.
|
|
73
|
+
* What {@link HydraniumTextDocuments.commitRepair} did with an integrity repair.
|
|
74
|
+
*
|
|
75
|
+
* Three outcomes rather than a document-or-nothing, because the two ways of
|
|
76
|
+
* getting nothing call for opposite responses: `not-open` means there is no
|
|
77
|
+
* store document to correct and the caller carries on with the one it holds,
|
|
78
|
+
* while `stale` means there IS one and it has moved past the text the repair
|
|
79
|
+
* was computed against — so carrying on would persist a correction over an edit
|
|
80
|
+
* that superseded it. Collapsing them lets the second read as permission to
|
|
81
|
+
* proceed, which is the failure this shape exists to make unrepresentable.
|
|
129
82
|
*/
|
|
130
|
-
|
|
131
|
-
readonly
|
|
132
|
-
readonly
|
|
83
|
+
export type RepairCommit<T extends TextDocument> = {
|
|
84
|
+
readonly status: 'committed';
|
|
85
|
+
readonly document: T;
|
|
86
|
+
} | {
|
|
87
|
+
readonly status: 'stale';
|
|
88
|
+
} | {
|
|
89
|
+
readonly status: 'not-open';
|
|
133
90
|
};
|
|
134
91
|
/**
|
|
135
|
-
*
|
|
92
|
+
* The one text store every head writes to, on top of Langium's
|
|
93
|
+
* `NormalizedTextDocuments`, and the LSP text-sync endpoint: every
|
|
94
|
+
* `textDocument/*` notification and every `workspace/applyEdit` push goes
|
|
95
|
+
* through here.
|
|
96
|
+
*
|
|
97
|
+
* Each open, change, close and save is one synchronous transition over the
|
|
98
|
+
* held document and the collaborators its `create…` methods build. A
|
|
99
|
+
* collaborator that defers its part lets a listener of the transition's event
|
|
100
|
+
* read state from before it. A document no client holds any more is
|
|
101
|
+
* released to the `DocumentReleaseHandler` slot, after
|
|
102
|
+
* {@link HydraniumTextDocumentsOptions.releaseGraceMs} when its last client's
|
|
103
|
+
* connection was lost.
|
|
104
|
+
*
|
|
105
|
+
* Client-declared version ids feed only the per-client staleness guard and
|
|
106
|
+
* never a running shared sequence: the two count different things, and
|
|
107
|
+
* splicing them lets versions drift past base-version gate holders. A URI
|
|
108
|
+
* with no ledger record and no built root starts at its opener's declared id:
|
|
109
|
+
* no version was handed out for it.
|
|
136
110
|
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* Client-declared version ids (Monaco's buffer numbering) feed only a
|
|
142
|
-
* per-client staleness guard and never leak into the shared sequence —
|
|
143
|
-
* the two are different things (an editor's edit-operation counter vs the
|
|
144
|
-
* document's content-revision number), and splicing them lets versions drift
|
|
145
|
-
* silently past `baseVersion` gate holders.
|
|
146
|
-
* - Version-author history so each edit is attributable to its originating client.
|
|
147
|
-
* - Pending-content staging used by the integrity service to thread corrections
|
|
148
|
-
* through `workspace/applyEdit` cycles for currently-closed documents.
|
|
149
|
-
* - `didOpen` notifications arriving over the LSP connection wait on the
|
|
150
|
-
* workspace-ready promise, so a client's first open cannot race workspace
|
|
151
|
-
* discovery. Direct {@link notifyDidOpenTextDocument} calls (the non-LSP
|
|
152
|
-
* heads) do not pass that gate — their caller owns the ordering.
|
|
111
|
+
* `didOpen` notifications arriving over the LSP connection wait on the
|
|
112
|
+
* workspace-ready promise, so a client's first open cannot race workspace
|
|
113
|
+
* discovery. Direct {@link notifyDidOpenTextDocument} calls (the non-LSP
|
|
114
|
+
* heads) do not pass that gate — their caller owns the ordering.
|
|
153
115
|
*/
|
|
154
116
|
export declare class HydraniumTextDocuments<T extends TextDocument = TextDocument> extends NormalizedTextDocuments<T> {
|
|
155
117
|
protected services: ServerSharedServices;
|
|
118
|
+
protected readonly options: HydraniumTextDocumentsOptions<T>;
|
|
119
|
+
/** Content staged by integrity rules for a document no client holds, consumed by its first open. */
|
|
120
|
+
protected readonly __pendingContent: Map<CanonicalUri, string>;
|
|
156
121
|
/**
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
* {@link __shadow} (its own abstraction); the parsed-document store stays in
|
|
162
|
-
* the inherited `__syncedDocuments`.
|
|
163
|
-
*/
|
|
164
|
-
protected __documents: Map<CanonicalUri, DocumentTracking>;
|
|
165
|
-
/**
|
|
166
|
-
* Per-URI shared-version continuity across close/reopen cycles
|
|
167
|
-
* ({@link VersionSequence}), written at last-client close and consulted by
|
|
168
|
-
* the next first-client open. DELIBERATELY outside {@link DocumentTracking}:
|
|
169
|
-
* that record is deleted on last close, while the version sequence must
|
|
170
|
-
* survive it — the shared version is a server-owned, monotonic,
|
|
171
|
-
* advances-iff-content-changes counter that never resets while the server
|
|
172
|
-
* lives. That invariant is what makes an optimistic `baseVersion` gate
|
|
173
|
-
* sound: "version unchanged ⇔ content unchanged", with no false conflicts
|
|
174
|
-
* from close/reopen version resets and no false passes from a reopened
|
|
175
|
-
* sequence coincidentally landing on a stale writer's number.
|
|
176
|
-
*
|
|
177
|
-
* Never pruned: two small values per URI ever touched — bounded by
|
|
178
|
-
* workspace size, not by activity.
|
|
179
|
-
*/
|
|
180
|
-
protected readonly __versionSequences: Map<CanonicalUri, VersionSequence>;
|
|
181
|
-
/**
|
|
182
|
-
* Texts pushed to the LSP textual language client via
|
|
183
|
-
* {@link applyEditToLanguageClient} whose echoes have not come back yet
|
|
184
|
-
* ({@link PendingPush}), keyed like the shadow by language-client URI.
|
|
185
|
-
* Outbound pushes and inbound echoes are uncorrelated on the wire; this
|
|
186
|
-
* FIFO is the explicit correlation, and it is what
|
|
187
|
-
* {@link classifyLanguageClientChange} reconstructs against.
|
|
188
|
-
*
|
|
189
|
-
* **Each entry keeps the client's PRE-push text, not only a hash of the
|
|
190
|
-
* post-push one.** A hash alone can classify a full-text echo, whose
|
|
191
|
-
* application is a no-op either way — and that is all it ever classified,
|
|
192
|
-
* because a conforming client echoes INCREMENTAL ranges keyed to its
|
|
193
|
-
* previous buffer. Those ranges cannot be applied to the synced text (which
|
|
194
|
-
* the authored write already advanced) and cannot be reconstructed without
|
|
195
|
-
* the baseline: the line they insert lands twice, validates cleanly, and
|
|
196
|
-
* compounds on every later edit.
|
|
197
|
-
*
|
|
198
|
-
* Lifecycle: entries are consumed by the matching echo (together with any
|
|
199
|
-
* older entries it supersedes), and the whole queue drops when the client
|
|
200
|
-
* stops being a pure mirror — a divergent change, an `applyEdit`
|
|
201
|
-
* failure/rejection (shadow invalidation), a close, or an explicit
|
|
202
|
-
* shadow (re)baseline. {@link PENDING_ECHO_CAP} bounds the queue against
|
|
203
|
-
* a pathological echo that never arrives; the memory cost until then is
|
|
204
|
-
* one pre-push text per in-flight push, for milliseconds.
|
|
205
|
-
*/
|
|
206
|
-
protected readonly __pendingPushes: Map<LanguageClientUri, PendingPush[]>;
|
|
207
|
-
/**
|
|
208
|
-
* Tracked text content per URI for the LSP textual language client (Monaco / VS Code).
|
|
209
|
-
* Owned here so {@link applyEditToLanguageClient} can compute minimal `workspace/applyEdit`
|
|
210
|
-
* diffs instead of full-document replaces (5–20 s → <500 ms on 20-30 KB YAML diagrams).
|
|
211
|
-
*
|
|
212
|
-
* Auto-tracked from the multi-client text-document events: open / change / close of
|
|
213
|
-
* the language client (re)baseline or invalidate the shadow. Other client ids
|
|
214
|
-
* (form editor, GLSP, integrity) do NOT touch the shadow — only what Monaco believes
|
|
215
|
-
* it has matters for the diff.
|
|
216
|
-
*
|
|
217
|
-
* Apply-verify safety net is built in: if the diff doesn't reconstruct `newText`
|
|
218
|
-
* exactly, {@link LanguageClientTextShadow.computeEdits} falls back to a full-range
|
|
219
|
-
* replace and invokes the `onFallback` callback — a diff regression becomes log
|
|
220
|
-
* noise, not a 0-byte save.
|
|
221
|
-
*
|
|
222
|
-
* Assigned in the constructor body so the `onFallback` callback can capture
|
|
223
|
-
* `this.logger` after the parameter-property assignment has run (field
|
|
224
|
-
* initializers fire BEFORE parameter-property assignment in TS).
|
|
122
|
+
* Which client has which document open, which client ids are registered
|
|
123
|
+
* sessions, and each client's declared version, the staleness guard's
|
|
124
|
+
* baseline. Every open-state predicate on this class reads it, so an open
|
|
125
|
+
* recorded anywhere else is invisible to the last-close transition.
|
|
225
126
|
*/
|
|
226
|
-
protected readonly
|
|
127
|
+
protected readonly __sessions: ClientSessionRegistry;
|
|
128
|
+
/** The version each open document was opened at; see {@link openedVersion}. */
|
|
129
|
+
protected readonly __openedVersions: Map<CanonicalUri, number>;
|
|
227
130
|
protected readonly tracer: Tracer;
|
|
228
131
|
protected readonly configuration: TextDocumentsConfiguration<T>;
|
|
132
|
+
protected __textLedger: TextLedger | undefined;
|
|
133
|
+
protected __languageClientShadow: LanguageClientShadow | undefined;
|
|
134
|
+
protected __dirtyStateTracker: DirtyStateTracker | undefined;
|
|
135
|
+
protected __documentReleaseScheduler: DocumentReleaseScheduler | undefined;
|
|
136
|
+
protected readonly documentReleasedEmitter: Emitter<DocumentReleasedEvent>;
|
|
137
|
+
protected readonly languageClientSavedEmitter: Emitter<LanguageClientSavedEvent>;
|
|
229
138
|
constructor(services: ServerSharedServices, options?: HydraniumTextDocumentsOptions<T>);
|
|
139
|
+
protected get textLedger(): TextLedger;
|
|
140
|
+
protected get languageClientShadow(): LanguageClientShadow;
|
|
141
|
+
protected get dirtyStateTracker(): DirtyStateTracker;
|
|
142
|
+
protected get documentReleaseScheduler(): DocumentReleaseScheduler;
|
|
143
|
+
protected createTextLedger(): TextLedger;
|
|
144
|
+
protected createLanguageClientShadow(): LanguageClientShadow;
|
|
145
|
+
protected createDirtyStateTracker(): DirtyStateTracker;
|
|
146
|
+
protected createDocumentReleaseScheduler(): DocumentReleaseScheduler;
|
|
147
|
+
/** Hold `document` as the text of `key`, a new version authored by `author`. */
|
|
148
|
+
protected commitText(key: CanonicalUri, document: T, author: string): void;
|
|
149
|
+
/**
|
|
150
|
+
* Apply `changes` to `document`, the held text of `key`, and hold the
|
|
151
|
+
* result. The version steps only when the text changes, which is what a
|
|
152
|
+
* base-version gate relies on: unchanged text keeps its version and its
|
|
153
|
+
* author. The new text is known only once the changes are applied, so they
|
|
154
|
+
* go in at a tentative step that an identical result rolls back.
|
|
155
|
+
*/
|
|
156
|
+
protected commitChange(key: CanonicalUri, document: T, changes: TextDocumentContentChangeEvent[], author: string): {
|
|
157
|
+
document: T;
|
|
158
|
+
changed: boolean;
|
|
159
|
+
};
|
|
230
160
|
create(uri: string, languageId: string, version: number, content: string): T;
|
|
231
161
|
update(document: T, changes: TextDocumentContentChangeEvent[], version: number): T;
|
|
232
162
|
protected get __syncedDocuments(): Map<string, T>;
|
|
@@ -254,17 +184,83 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
254
184
|
* A content-identical write still fires the change event (rebuild): the
|
|
255
185
|
* authored write's server-side rebuild is correctness-bearing, it just
|
|
256
186
|
* mints no new version — nothing observable changed, so watchers'
|
|
257
|
-
*
|
|
187
|
+
* base versions stay valid.
|
|
258
188
|
*
|
|
259
189
|
* Returns the resulting shared version. Throws when the document is not
|
|
260
190
|
* open — callers (`AstDocumentManager.update`) open first.
|
|
261
191
|
*/
|
|
262
|
-
applyContentChange(uri: DocumentUri, text: string, clientId: string):
|
|
263
|
-
|
|
192
|
+
applyContentChange(uri: DocumentUri, text: string, clientId: string): TextVersion;
|
|
193
|
+
/**
|
|
194
|
+
* Close `clientId`'s open of the document. When it was the last open, the
|
|
195
|
+
* document is released, at once or, for a `'lost'`
|
|
196
|
+
* close, after {@link HydraniumTextDocumentsOptions.releaseGraceMs}.
|
|
197
|
+
*/
|
|
198
|
+
notifyDidCloseTextDocument(event: DidCloseTextDocumentParams, clientId?: string, cause?: SessionEndCause): void;
|
|
199
|
+
/**
|
|
200
|
+
* Keep the document, text and all, for the release grace, then release it.
|
|
201
|
+
* The document stays in the store meanwhile, so a lost client that opens it
|
|
202
|
+
* again within its own grace attaches to it and finds its unsaved text
|
|
203
|
+
* rather than reading disk; see {@link resolveDeferredRelease} for any other
|
|
204
|
+
* open.
|
|
205
|
+
*/
|
|
206
|
+
protected deferRelease(uri: CanonicalUri): void;
|
|
207
|
+
/** Resolve a deferred release of `uri` for an open by `clientId`: a release the scheduler decides on runs now. */
|
|
208
|
+
protected resolveDeferredRelease(uri: CanonicalUri, clientId: string): void;
|
|
209
|
+
/** Release now a document waiting out the grace, as its last close would have; one that is not waiting is left alone. */
|
|
210
|
+
protected releaseIfDeferred(uri: CanonicalUri): void;
|
|
211
|
+
/**
|
|
212
|
+
* Drop the document no client has open any more, announce it on
|
|
213
|
+
* {@link onDidReleaseDocument}, then hand it to the
|
|
214
|
+
* `DocumentReleaseHandler` slot: its listeners, such as the update
|
|
215
|
+
* handler dropping a change it still holds back, act before any build the
|
|
216
|
+
* handler runs.
|
|
217
|
+
*/
|
|
218
|
+
protected releaseDocument(uri: CanonicalUri): void;
|
|
219
|
+
/**
|
|
220
|
+
* Call the `DocumentReleaseHandler` slot, and announce a document released
|
|
221
|
+
* dirty clean once the promise it returns settles, which is after the
|
|
222
|
+
* release event. A failure is logged rather than thrown: the store has let
|
|
223
|
+
* go of the document by now, and a throw would abort the transition that
|
|
224
|
+
* released it, a session's close of its other documents included.
|
|
225
|
+
*/
|
|
226
|
+
protected handOverRelease(released: ReleasedDocument, cleanAnnouncement: CleanAnnouncement | undefined): void;
|
|
227
|
+
/** `uri` as the `DocumentReleaseHandler` slot receives it. */
|
|
228
|
+
protected toReleasedDocument(uri: CanonicalUri): ReleasedDocument;
|
|
264
229
|
notifyWillSaveTextDocument(event: WillSaveTextDocumentParams): void;
|
|
265
230
|
notifyWillSaveTextDocumentWaitUntil(event: WillSaveTextDocumentParams, token: CancellationToken): HandlerResult<TextEdit[], void>;
|
|
231
|
+
/**
|
|
232
|
+
* Handle a save the language client reports: fire
|
|
233
|
+
* {@link onDidSaveInLanguageClient}, then announce it on {@link onDidSave}
|
|
234
|
+
* only once the file read back from disk holds the store's current text.
|
|
235
|
+
*/
|
|
236
|
+
protected notifyLanguageClientSave(event: DidSaveTextDocumentParams): Promise<void>;
|
|
237
|
+
/**
|
|
238
|
+
* Announce a save the server made. `event.text`, when given, is what the
|
|
239
|
+
* file now holds, written or found there, and becomes the disk baseline
|
|
240
|
+
* before the save is announced. It lags the store when an edit landed
|
|
241
|
+
* after the save took its text, and the document then stays dirty.
|
|
242
|
+
*/
|
|
266
243
|
notifyDidSaveTextDocument(event: DidSaveTextDocumentParams, clientId?: string): void;
|
|
244
|
+
/** Fire {@link onDidSave} for `document`, which need not be synced any more. */
|
|
245
|
+
protected announceSave(document: T, clientId: string): void;
|
|
267
246
|
notifyDidOpenTextDocument(event: DidOpenTextDocumentParams, clientId?: string): void;
|
|
247
|
+
/**
|
|
248
|
+
* Record `clientId` as an additional holder of a document another client
|
|
249
|
+
* already has open.
|
|
250
|
+
*
|
|
251
|
+
* Unlike the attach branch of {@link notifyDidOpenTextDocument} this does
|
|
252
|
+
* not refresh. That branch re-renders an attaching TEXTUAL view; a client
|
|
253
|
+
* reaching a document through a non-textual route has nothing to re-render,
|
|
254
|
+
* and refreshing per attach turns each into a Langium rebuild and dependent
|
|
255
|
+
* relink cascade.
|
|
256
|
+
*
|
|
257
|
+
* Returns whether a hold was added — `false` when `uri` is not open,
|
|
258
|
+
* `clientId` already holds it, or the document was waiting out the release
|
|
259
|
+
* grace for other clients and was released instead (see
|
|
260
|
+
* {@link resolveDeferredRelease}); the caller then opens it anew.
|
|
261
|
+
*/
|
|
262
|
+
attachClient(uri: DocumentUri, clientId: string): boolean;
|
|
263
|
+
protected logClientJoined(uri: DocumentUri, clientId: string, version: number, existingClients: readonly string[]): void;
|
|
268
264
|
refreshContent(uri: DocumentUri, clientId: string): void;
|
|
269
265
|
/**
|
|
270
266
|
* The canonical key a document is stored under — the single point this store
|
|
@@ -273,7 +269,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
273
269
|
* two URIs for one physical file (a symlink path and its real path) into a
|
|
274
270
|
* single registration — dedup at the editor layer, not just in
|
|
275
271
|
* `LangiumDocuments`. The URI the client opened under is preserved separately
|
|
276
|
-
* for egress addressing
|
|
272
|
+
* for egress addressing, by the {@link LanguageClientShadow}. The
|
|
277
273
|
* policy is always bound (the framework defaults it to
|
|
278
274
|
* `DefaultDocumentUriPolicy`, where canonical ≡ syntactic normalize).
|
|
279
275
|
*/
|
|
@@ -287,8 +283,6 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
287
283
|
* from its real path (symlink / `..` / case).
|
|
288
284
|
*/
|
|
289
285
|
protected toLanguageClientUri(uri: string): LanguageClientUri;
|
|
290
|
-
/** Get-or-create the per-URI tracking record. `uri` must already be a {@link documentKey}. */
|
|
291
|
-
protected trackingFor(uri: CanonicalUri): DocumentTracking;
|
|
292
286
|
setAuthor(uri: DocumentUri, version: number, author: string): void;
|
|
293
287
|
/**
|
|
294
288
|
* Resolve the synced `TextDocument` for `uri`. The store keys documents by
|
|
@@ -309,50 +303,132 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
309
303
|
get(uri: DocumentUri): T | undefined;
|
|
310
304
|
/**
|
|
311
305
|
* Current SHARED version of the document at `uri`: the open document's
|
|
312
|
-
* version, else where
|
|
313
|
-
*
|
|
306
|
+
* version, else where its persisted sequence left off, else `0` for a URI
|
|
307
|
+
* this store has never seen. The shared sequence is
|
|
314
308
|
* server-owned and monotonic across close/reopen cycles, and advances
|
|
315
309
|
* exactly when the synced content changes — which is what makes it a sound
|
|
316
|
-
* optimistic-concurrency token (
|
|
310
|
+
* optimistic-concurrency token (base-version gates): version unchanged ⇔
|
|
317
311
|
* content unchanged.
|
|
318
312
|
*/
|
|
319
|
-
version(uri: DocumentUri):
|
|
313
|
+
version(uri: DocumentUri): TextVersion;
|
|
314
|
+
/**
|
|
315
|
+
* The version the document at `uri` was opened at, which a client's write
|
|
316
|
+
* or an integrity repair steps past; `undefined` while it is not open.
|
|
317
|
+
*/
|
|
318
|
+
openedVersion(uri: DocumentUri): TextVersion | undefined;
|
|
319
|
+
/**
|
|
320
|
+
* Refuse unless the editor's buffer under `uri`, at its own `version`, holds
|
|
321
|
+
* the synced text, so a save the editor asks for persists what it shows.
|
|
322
|
+
* The editor's version counts its own buffer and the store's counts the
|
|
323
|
+
* synced text, so neither stands in for the other: `version` has to be the
|
|
324
|
+
* one the editor last declared, and the shadow has to know the buffer to
|
|
325
|
+
* hold the store's current version, which a push in flight breaks.
|
|
326
|
+
*
|
|
327
|
+
* A refusal is a {@link ConflictError} based on the store version the buffer
|
|
328
|
+
* last held, or on {@link STALE_VERSION} when it never held one or `version`
|
|
329
|
+
* names a buffer the editor never declared. It is a
|
|
330
|
+
* {@link DocumentNotOpenError} when the editor does not have `uri` open, or
|
|
331
|
+
* a delete of it is under way, which a save landing before the deletion
|
|
332
|
+
* build would undo by writing the file back.
|
|
333
|
+
*/
|
|
334
|
+
assertLanguageClientHolds(uri: DocumentUri, version: number): void;
|
|
335
|
+
/**
|
|
336
|
+
* Whether the editor holds text older than the store's text at `version`,
|
|
337
|
+
* or text the store never held. The first is the case while the push of
|
|
338
|
+
* that text is in flight. An answer computed on the store's text at
|
|
339
|
+
* `version` then refers to text the editor does not have. `false` once the
|
|
340
|
+
* editor holds that text or a later one, and when it does not have `uri`
|
|
341
|
+
* open.
|
|
342
|
+
*/
|
|
343
|
+
isLanguageClientBehind(uri: DocumentUri, version: TextVersion): boolean;
|
|
344
|
+
/**
|
|
345
|
+
* The text the store holds for `uri`: an open document's, or for a closed
|
|
346
|
+
* one, the clean text its version sequence left off at, which for a deleted
|
|
347
|
+
* document is its last text. `undefined` for a URI no build and no client
|
|
348
|
+
* gave the store.
|
|
349
|
+
*/
|
|
350
|
+
textState(uri: DocumentUri): TextState | undefined;
|
|
351
|
+
/**
|
|
352
|
+
* The built root's recorded version for a first open of `key` with `text`,
|
|
353
|
+
* one on when the text differs from the root's; `undefined` when the root
|
|
354
|
+
* records no store version. Seeded from the opener's declared version
|
|
355
|
+
* instead, a write based on the built root passes the gate over other text,
|
|
356
|
+
* and the same text looks newer than its model. A built root records none
|
|
357
|
+
* only under a `LangiumDocuments` that does not reconcile at registration.
|
|
358
|
+
*/
|
|
359
|
+
protected builtRootOpeningVersion(key: CanonicalUri, text: string): TextVersion | undefined;
|
|
320
360
|
/**
|
|
321
361
|
* Reconcile the persisted version sequence with content that reached the
|
|
322
362
|
* build OUTSIDE the store's write paths — a closed document rebuilt from
|
|
323
|
-
* disk
|
|
363
|
+
* disk after its release, or replaced by a watched-file change. Steps the
|
|
324
364
|
* sequence iff `text` differs from the sequence's last-known content and
|
|
325
365
|
* returns the resulting sequence version so the caller can re-stamp the
|
|
326
|
-
* rebuilt document (
|
|
366
|
+
* rebuilt document (`VersionSyncService.modelProduced`) —
|
|
327
367
|
* keeping the "version advances iff content changes" invariant for
|
|
328
368
|
* documents no client currently holds.
|
|
329
369
|
*
|
|
330
|
-
*
|
|
331
|
-
*
|
|
332
|
-
*
|
|
333
|
-
*
|
|
334
|
-
*
|
|
370
|
+
* For an open document, its version when it holds `text`, since a build
|
|
371
|
+
* that read the file while the document was closed can finish after an
|
|
372
|
+
* open; else `undefined`, and the caller has to build the document again.
|
|
373
|
+
*
|
|
374
|
+
* A document without a sequence starts one at `0` with `text`: snapshots
|
|
375
|
+
* hand out versions for documents no client opened, so an uncounted change
|
|
376
|
+
* would let a write based on the old text pass the gate.
|
|
335
377
|
*/
|
|
336
378
|
reconcileExternalContent(uri: DocumentUri, text: string): number | undefined;
|
|
379
|
+
/**
|
|
380
|
+
* Commit an integrity repair into the OPEN document for `uri`, returning the
|
|
381
|
+
* document that now holds it, or `undefined` when there was nothing here to
|
|
382
|
+
* commit into.
|
|
383
|
+
*
|
|
384
|
+
* The one thing this exists to do is address the store BY URI. A repair
|
|
385
|
+
* reaches the resync as a text-document object, and that object is the
|
|
386
|
+
* store's own only on the LSP path; a document built for an already-open URI
|
|
387
|
+
* through `LangiumDocumentFactory.fromString` carries its own, so writing the
|
|
388
|
+
* repair into it corrects a copy the store does not know about and the editor
|
|
389
|
+
* never sees.
|
|
390
|
+
*
|
|
391
|
+
* `parsedFrom` is the text the repaired AST was parsed from, and a mismatch
|
|
392
|
+
* against the current content REFUSES the commit: the store has moved on,
|
|
393
|
+
* which means an editor change landed after that parse, and committing would
|
|
394
|
+
* overwrite a newer edit with a repair computed against text the user has
|
|
395
|
+
* already replaced. The build that change provokes recomputes the repair.
|
|
396
|
+
*
|
|
397
|
+
* Deliberately NOT compared by version. A separately created document seeds
|
|
398
|
+
* its own numbering, so requiring the two to agree would refuse every commit
|
|
399
|
+
* on the path this exists for. Content is the thing both sides can be held to.
|
|
400
|
+
*
|
|
401
|
+
* A changed text is a new version authored by {@link INTEGRITY_CLIENT_ID}.
|
|
402
|
+
* Kept at the old version, the repair is invisible to every reader keyed on
|
|
403
|
+
* versions: a write based on the unrepaired version passes the base-version gate
|
|
404
|
+
* and replaces the repair, and an echo filter credits the repair to the
|
|
405
|
+
* client whose edit it corrected. No change event is fired: the repair
|
|
406
|
+
* rides the build already under way, and an event would re-enter it.
|
|
407
|
+
*/
|
|
408
|
+
commitRepair(uri: DocumentUri, parsedFrom: string, repaired: string): RepairCommit<T>;
|
|
337
409
|
getAuthor(uri: DocumentUri, version?: number): string | undefined;
|
|
338
410
|
isOpen(uri: DocumentUri): boolean;
|
|
339
411
|
/**
|
|
340
412
|
* True iff any client still holds `uri` open. Distinct from {@link isOpen},
|
|
341
413
|
* which reads `__syncedDocuments` — that map is cleared only AFTER the
|
|
342
414
|
* `onDidClose` event fires for the last client, so `isOpen` returns `true`
|
|
343
|
-
* during the close event itself. `isOpenInAnyClient` reads the
|
|
344
|
-
*
|
|
345
|
-
* subscriber that finds this `false` knows the last client just closed
|
|
346
|
-
*
|
|
415
|
+
* during the close event itself. `isOpenInAnyClient` reads the open table
|
|
416
|
+
* ({@link __sessions}), which is updated BEFORE the fire, so an `onDidClose`
|
|
417
|
+
* subscriber that finds this `false` knows the last client just closed.
|
|
418
|
+
* What the build keeps is the release's: a subscriber that re-read or
|
|
419
|
+
* rebuilt the document would race the `DocumentReleaseHandler`, and after a
|
|
420
|
+
* lost connection the release waits out its grace.
|
|
347
421
|
*/
|
|
348
422
|
isOpenInAnyClient(uri: DocumentUri): boolean;
|
|
349
423
|
isOpenInClient(uri: DocumentUri, client: string): boolean;
|
|
350
424
|
isOpenInLanguageClient(uri: DocumentUri): boolean;
|
|
425
|
+
/** The clients that have `uri` open, in the order they opened it. */
|
|
426
|
+
clientsOf(uri: DocumentUri): string[];
|
|
351
427
|
isOnlyOpenInClient(uri: DocumentUri, client: string): boolean;
|
|
352
428
|
/**
|
|
353
429
|
* Every document currently held open by at least one client, with the client
|
|
354
|
-
* ids holding it. Reads the same
|
|
355
|
-
*
|
|
430
|
+
* ids holding it. Reads the same open table as {@link isOpenInAnyClient}, so
|
|
431
|
+
* it reflects a last-client close immediately.
|
|
356
432
|
*
|
|
357
433
|
* Diagnostics-oriented — the server-state snapshot lists these so an operator
|
|
358
434
|
* can see WHY a document is pinned: a document that lingers here after its
|
|
@@ -360,19 +436,151 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
360
436
|
* under a shedding policy, explains why its CST is never shed).
|
|
361
437
|
*/
|
|
362
438
|
openDocuments(): OpenDocument[];
|
|
439
|
+
/** Fires once a client session has ended, after every document it had open was closed. */
|
|
440
|
+
get onDidCloseSession(): Event<ClientSessionClosedEvent>;
|
|
441
|
+
/**
|
|
442
|
+
* Fires once a document no client has open is released: at its last close,
|
|
443
|
+
* or, for a lost client's last close, when its release grace runs out,
|
|
444
|
+
* another client opens it, or it is deleted, before the
|
|
445
|
+
* `DocumentReleaseHandler` slot is handed the document.
|
|
446
|
+
*/
|
|
447
|
+
get onDidReleaseDocument(): Event<DocumentReleasedEvent>;
|
|
448
|
+
/**
|
|
449
|
+
* Fires for every save the language client reports of a document it has
|
|
450
|
+
* open: the editor has written the file. {@link onDidSave} follows only
|
|
451
|
+
* when the file holds the store's text.
|
|
452
|
+
*/
|
|
453
|
+
get onDidSaveInLanguageClient(): Event<LanguageClientSavedEvent>;
|
|
454
|
+
/**
|
|
455
|
+
* Whether `uri` is waiting out the release grace: its last open closed with a
|
|
456
|
+
* lost connection, and it still holds its unsaved text. Such a document is
|
|
457
|
+
* open for no client, yet not closed either, so a caller that would persist
|
|
458
|
+
* a closed document's text to disk treats it as open.
|
|
459
|
+
*/
|
|
460
|
+
isReleaseDeferred(uri: DocumentUri): boolean;
|
|
363
461
|
/**
|
|
364
|
-
*
|
|
462
|
+
* Whether the store holds `uri` with text that differs from its disk
|
|
463
|
+
* baseline: what the server last knew the file to hold. `false` for a URI
|
|
464
|
+
* the store does not hold; a document waiting out the release grace is still
|
|
465
|
+
* held.
|
|
365
466
|
*
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
*
|
|
369
|
-
*
|
|
467
|
+
* The baseline is the text a first open brought, or what the server wrote,
|
|
468
|
+
* or read back after an editor's save or a watched-file change, so it can
|
|
469
|
+
* trail a change to the file that none of these has seen yet. A check that
|
|
470
|
+
* must know the file reads it instead.
|
|
471
|
+
*/
|
|
472
|
+
isDirty(uri: DocumentUri): boolean;
|
|
473
|
+
/**
|
|
474
|
+
* Fires each time the answer of {@link isDirty} changes. For a document
|
|
475
|
+
* released dirty it fires once the `DocumentReleaseHandler` slot reports the
|
|
476
|
+
* release settled: at the version of the text the build then holds, or
|
|
477
|
+
* without text when the document is gone or the handler failed, though
|
|
478
|
+
* {@link isDirty} answers clean from the release on.
|
|
479
|
+
*/
|
|
480
|
+
get onDidChangeDirty(): Event<DocumentDirtyChangedEvent>;
|
|
481
|
+
/**
|
|
482
|
+
* Record that the file behind `uri` holds `text`, or no file at all for
|
|
483
|
+
* `undefined`. A no-op for a URI the store does not hold: the next first
|
|
484
|
+
* open sets the baseline from its own text.
|
|
485
|
+
*/
|
|
486
|
+
setDiskBaseline(uri: DocumentUri, text: string | undefined): void;
|
|
487
|
+
/**
|
|
488
|
+
* Record that `uri` was created from a session's text rather than read from
|
|
489
|
+
* its file: it has no disk baseline, so it is dirty until its first save,
|
|
490
|
+
* and {@link isUnsavedCreation} answers `true` until then. A no-op for a
|
|
491
|
+
* URI the store does not hold.
|
|
492
|
+
*/
|
|
493
|
+
markCreated(uri: DocumentUri): void;
|
|
494
|
+
/**
|
|
495
|
+
* Whether `uri` was created from a session's text and the store has not
|
|
496
|
+
* seen its file since, by a save or a reload that found it. A baseline
|
|
497
|
+
* cleared because the file went missing does not count. `false` for a URI
|
|
498
|
+
* the store does not hold.
|
|
499
|
+
*/
|
|
500
|
+
isUnsavedCreation(uri: DocumentUri): boolean;
|
|
501
|
+
/**
|
|
502
|
+
* Read the file behind `uri` through its disk queue and take it as the
|
|
503
|
+
* baseline. A file that cannot be read counts as none, the side that
|
|
504
|
+
* leaves the document dirty, once `existsSettled` confirms it gone: a file
|
|
505
|
+
* it finds is read again. That wait runs outside the queue, so it holds up
|
|
506
|
+
* no write to the file.
|
|
507
|
+
*/
|
|
508
|
+
reloadDiskBaseline(uri: DocumentUri): Promise<void>;
|
|
509
|
+
/**
|
|
510
|
+
* Start a client session under `clientId`. Throws where
|
|
511
|
+
* {@link ClientSessionRegistry.register} refuses the id.
|
|
512
|
+
*/
|
|
513
|
+
registerSession(clientId: string): void;
|
|
514
|
+
/**
|
|
515
|
+
* End the client session `clientId`: close every document it has open, then
|
|
516
|
+
* free the id. Immediate — each close runs the ordinary close path before
|
|
517
|
+
* this returns, with `cause` as its cause. A no-op for an id that is not a
|
|
518
|
+
* registered session.
|
|
519
|
+
*/
|
|
520
|
+
closeSession(clientId: string, cause?: SessionEndCause): void;
|
|
521
|
+
/**
|
|
522
|
+
* Close every document the language client has open, as a `didClose` for
|
|
523
|
+
* each would, so each last close releases its document. For a host whose editor connection
|
|
524
|
+
* can end while the process lives on, such as a worker whose port's peer
|
|
525
|
+
* closed: the language client is no session, so nothing else closes them.
|
|
526
|
+
*
|
|
527
|
+
* It first waits for the workspace initialization the open handler waits
|
|
528
|
+
* for, so an open that arrived before the close is closed too; closing at
|
|
529
|
+
* once would leave that open to land afterwards, held by a client that is
|
|
530
|
+
* gone.
|
|
531
|
+
*/
|
|
532
|
+
closeLanguageClientDocuments(): Promise<void>;
|
|
533
|
+
/**
|
|
534
|
+
* Settles once the initial workspace build has finished, whether it
|
|
535
|
+
* completed, was cancelled or failed. Awaiting `workspaceInitialized` itself
|
|
536
|
+
* throws after a cancelled build, which any write during startup causes, and
|
|
537
|
+
* every open and close gated on it is then dropped for the process lifetime.
|
|
538
|
+
* The workspace manager logs a failed build.
|
|
539
|
+
*/
|
|
540
|
+
protected initialBuildFinished(): Promise<void>;
|
|
541
|
+
/**
|
|
542
|
+
* The file behind `uri` was deleted: close every open of it except the
|
|
543
|
+
* language client's, and release now a document waiting out the grace,
|
|
544
|
+
* whose lost client's open would otherwise bring its text back with no
|
|
545
|
+
* file behind it.
|
|
546
|
+
*
|
|
547
|
+
* The editor's open is left alone because the editor owns it: it keeps the
|
|
548
|
+
* buffer of a deleted file and goes on sending changes for it, and a store
|
|
549
|
+
* that had closed the document would drop every one of them until the editor
|
|
550
|
+
* reopened.
|
|
551
|
+
*/
|
|
552
|
+
notifyDocumentDeleted(uri: DocumentUri): void;
|
|
553
|
+
/**
|
|
554
|
+
* Remove the document for `uri`, closing every open of it first — the
|
|
555
|
+
* editor's included, since the document it would keep editing is gone.
|
|
556
|
+
*
|
|
557
|
+
* The base removes the synced document without consulting the open table,
|
|
558
|
+
* which leaves every open recorded against a document that no longer exists:
|
|
559
|
+
* the store then answers that the URI is open, and the next open attaches to
|
|
560
|
+
* nothing.
|
|
561
|
+
*/
|
|
562
|
+
delete(uri: string | URI | T): void;
|
|
563
|
+
/**
|
|
564
|
+
* A client id as log lines print it. An id containing `#` is cut eight
|
|
565
|
+
* characters after its last `#`, which leaves a minted `label#uuid` as the
|
|
566
|
+
* label and enough of the UUID to tell sessions apart; an id without `#`
|
|
567
|
+
* prints whole. The full id goes out at trace level wherever a session
|
|
568
|
+
* starts or ends.
|
|
569
|
+
*/
|
|
570
|
+
protected formatClientId(clientId: string): string;
|
|
571
|
+
/**
|
|
572
|
+
* Stages integrity-updated content for a document no client holds.
|
|
573
|
+
*
|
|
574
|
+
* Nothing is pushed to a file no client holds. The next open of it reads
|
|
575
|
+
* disk, which lacks the update; {@link notifyDidOpenTextDocument} takes this
|
|
576
|
+
* staged content in place of that text, and the open's sync then delivers
|
|
577
|
+
* it to an editor as an unsaved change.
|
|
370
578
|
*
|
|
371
|
-
*
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
*
|
|
375
|
-
*
|
|
579
|
+
* Only a FIRST open consumes it, so stage only for a URI no client holds
|
|
580
|
+
* ({@link isOpenInAnyClient} is `false`). A URI held only through another
|
|
581
|
+
* head is not closed: an editor attaching to it joins the existing entry and
|
|
582
|
+
* never reads the stage, and the release discards it. An entry waits for
|
|
583
|
+
* that first open, at one serialised string per URI.
|
|
376
584
|
*/
|
|
377
585
|
stagePendingContent(uri: DocumentUri, text: string): void;
|
|
378
586
|
/**
|
|
@@ -384,98 +592,54 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
384
592
|
* - The shared services have no LSP {@link Connection} bound (non-LSP
|
|
385
593
|
* hosts like CLI / tests).
|
|
386
594
|
* - The shadow already matches `newText` (no edits needed; quiet skip).
|
|
595
|
+
* - The language client has not opened the document. A client applies an
|
|
596
|
+
* edit to a closed file by opening it, and that open races the edit;
|
|
597
|
+
* the document's own open delivers its text instead.
|
|
387
598
|
*
|
|
388
599
|
* On `applyEdit` rejection (`result.applied === false`) or RPC failure the
|
|
389
|
-
* shadow is invalidated so the next call sends a full
|
|
600
|
+
* shadow is invalidated so the next call sends a full replace, or nothing
|
|
601
|
+
* when the client was last heard to hold that text.
|
|
390
602
|
* Errors are re-thrown — callers wrap with their own retry / coalescing
|
|
391
603
|
* policy as needed.
|
|
392
604
|
*
|
|
393
605
|
* The diff path is apply-verify-safe: the shadow internally checks that
|
|
394
606
|
* `TextDocument.applyEdits(old, edits) === newText` and falls back to a
|
|
395
|
-
* full replace on mismatch
|
|
396
|
-
*
|
|
607
|
+
* full replace on mismatch, logged, so a diff regression becomes log noise,
|
|
608
|
+
* not data loss.
|
|
397
609
|
*
|
|
398
610
|
* That safety net verifies the diff against the SHADOW, which is what the
|
|
399
611
|
* client is *believed* to hold — so it cannot see the client's buffer moving
|
|
400
612
|
* underneath a push. A line-keyed edit is position-dependent: if a genuine
|
|
401
|
-
* client keystroke lands between
|
|
402
|
-
*
|
|
403
|
-
*
|
|
613
|
+
* client keystroke lands between computing the edits and the client
|
|
614
|
+
* applying them, the ranges address the wrong lines and splice the buffer
|
|
615
|
+
* (observed as a duplicated declaration, which the integrity tier then
|
|
404
616
|
* "repairs" into a suffixed name and persists). The edit is therefore
|
|
405
|
-
* addressed at the language client's
|
|
406
|
-
* `null` ("version intentionally unknown"), which is what lets the
|
|
407
|
-
* reject a push its buffer has outrun. On rejection the shadow is invalidated,
|
|
617
|
+
* addressed at the language client's last known version for that URI rather
|
|
618
|
+
* than at `null` ("version intentionally unknown"), which is what lets the
|
|
619
|
+
* client reject a push its buffer has outrun. On rejection the shadow is invalidated,
|
|
408
620
|
* so the caller's retry is a full-range replace — position-independent, and
|
|
409
|
-
* safe to apply to whatever the client now holds
|
|
621
|
+
* safe to apply to whatever the client now holds — or nothing when the
|
|
622
|
+
* client was last heard to hold that text.
|
|
410
623
|
*/
|
|
411
624
|
applyEditToLanguageClient(uri: DocumentUri, newText: string, options?: {
|
|
412
625
|
label?: string;
|
|
413
626
|
}): Promise<ApplyWorkspaceEditResult | undefined>;
|
|
414
627
|
/**
|
|
415
|
-
*
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
*
|
|
419
|
-
*
|
|
420
|
-
*
|
|
421
|
-
*
|
|
422
|
-
*
|
|
423
|
-
* Falls back to {@link UNKNOWN_CLIENT_VERSION} when the client has never
|
|
424
|
-
* declared one, which is the honest answer for a document it has not opened.
|
|
425
|
-
* That is also the case in which there is no shadow, so the push is already a
|
|
426
|
-
* position-independent full replace and has nothing to gain from a gate.
|
|
427
|
-
*/
|
|
428
|
-
protected languageClientVersion(uri: DocumentUri): number;
|
|
429
|
-
/**
|
|
430
|
-
* Append a push to the in-flight queue for `targetUri`
|
|
431
|
-
* (see {@link __pendingPushes}). Bounded: beyond
|
|
432
|
-
* {@link PENDING_ECHO_CAP} the oldest entry drops with a debug log — an
|
|
433
|
-
* echo that far outstanding means the client is not echoing at all, and
|
|
434
|
-
* an unbounded queue must not become the leak.
|
|
435
|
-
*/
|
|
436
|
-
protected recordPendingPush(targetUri: LanguageClientUri, before: string | undefined, newText: string): void;
|
|
437
|
-
/**
|
|
438
|
-
* Decide what an incoming language-client change actually is, by
|
|
439
|
-
* reconstructing the client's resulting buffer against the OLDEST push still
|
|
440
|
-
* in flight for `clientFacing`.
|
|
441
|
-
*
|
|
442
|
-
* `undefined` when nothing of ours is in flight, which is the ordinary path:
|
|
443
|
-
* the client's ranges then address the synced text and the caller applies
|
|
444
|
-
* them to it directly.
|
|
445
|
-
*
|
|
446
|
-
* **Why the oldest, and why reconstruct at all.** The client applies our
|
|
447
|
-
* pushes in order and echoes each against the buffer it held before that
|
|
448
|
-
* push, so the first echo to arrive belongs to the oldest entry — a FIFO
|
|
449
|
-
* correspondence the queue preserves by consuming from the front. Comparing
|
|
450
|
-
* the reconstruction against every pending hash, not only the oldest, is
|
|
451
|
-
* what recognises an echo that a newer write already superseded: a rapid
|
|
452
|
-
* write sequence can deliver the echo of push N after the store applied
|
|
453
|
-
* push N+1, and everything older is then accounted for too.
|
|
454
|
-
*
|
|
455
|
-
* A reconstruction matching NO pending push means the client's buffer went
|
|
456
|
-
* somewhere we did not send it — it coalesced a keystroke into the echo, or
|
|
457
|
-
* typed before the push landed. That text is authoritative, and the queue
|
|
458
|
-
* drops: the client has stopped being a pure mirror, so no outstanding echo
|
|
459
|
-
* can match again. (A push still in flight at that point will be refused by
|
|
460
|
-
* the client's own version gate, which invalidates the shadow and makes the
|
|
461
|
-
* next sync a position-independent full replace.)
|
|
462
|
-
*
|
|
463
|
-
* Content equality is a sound echo proof because entries live only between a
|
|
464
|
-
* push and its echo — a milliseconds window, never history — and the
|
|
465
|
-
* client's `didChange` stream is ordered, so every buffer state arrives in
|
|
466
|
-
* mutation order. An UNDO returning the buffer to previously-pushed text is
|
|
467
|
-
* therefore never swallowed: the edit that preceded it already emptied the
|
|
468
|
-
* queue, so undo revisits PAST states while the queue holds IN-FLIGHT ones.
|
|
628
|
+
* Explicitly baseline the language-client shadow for a URI the client has
|
|
629
|
+
* open, for an adopter that knows what the client holds without a
|
|
630
|
+
* `didChange` saying so (e.g. after a sideband save). Normal didOpen /
|
|
631
|
+
* didChange paths from the LSP language client already auto-track the
|
|
632
|
+
* shadow. A seed for a URI the client has not opened is kept but changes no
|
|
633
|
+
* push, since nothing is pushed there; its open replaces it with the text it
|
|
634
|
+
* declares. `text` other than the synced text refuses the editor's saves
|
|
635
|
+
* until the editor holds the synced text again.
|
|
469
636
|
*/
|
|
470
|
-
|
|
637
|
+
setLanguageClientText(uri: DocumentUri, text: string): void;
|
|
471
638
|
/**
|
|
472
|
-
*
|
|
473
|
-
*
|
|
474
|
-
*
|
|
475
|
-
* paths from the LSP language client already auto-track the shadow.
|
|
639
|
+
* Drop the shadow baseline for a URI; the next applyEditToLanguageClient
|
|
640
|
+
* sends a full replace, or nothing when the client was last heard to hold
|
|
641
|
+
* that text.
|
|
476
642
|
*/
|
|
477
|
-
setLanguageClientText(uri: DocumentUri, text: string): void;
|
|
478
|
-
/** Drop the shadow baseline for a URI; the next applyEditToLanguageClient sends a full replace. */
|
|
479
643
|
invalidateLanguageClientText(uri: DocumentUri): void;
|
|
480
644
|
protected consumePendingContent(uri: DocumentUri): string | undefined;
|
|
481
645
|
protected log(uri: DocumentUri, message: string): void;
|
|
@@ -486,5 +650,4 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
486
650
|
dispose(): void;
|
|
487
651
|
};
|
|
488
652
|
}
|
|
489
|
-
export {};
|
|
490
653
|
//# sourceMappingURL=hydranium-text-documents.d.ts.map
|