@hydranium/core 1.0.0-next.24 → 1.0.0-next.242
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 +23 -18
- package/lib/documents/ast-document-manager.d.ts +219 -122
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +241 -130
- 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 +79 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +69 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +179 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +283 -0
- package/lib/documents/document-release-handler.js.map +1 -0
- package/lib/documents/document-release-scheduler.d.ts +67 -0
- package/lib/documents/document-release-scheduler.d.ts.map +1 -0
- package/lib/documents/document-release-scheduler.js +80 -0
- package/lib/documents/document-release-scheduler.js.map +1 -0
- package/lib/documents/file-system-task-queue.d.ts +49 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +34 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +399 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +816 -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 +218 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +283 -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 +134 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +171 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +60 -22
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +23 -16
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +66 -28
- package/lib/langium/bootstrap.js.map +1 -1
- 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.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/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +10 -3
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +12 -5
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +57 -16
- 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 +32 -5
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +294 -33
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +477 -61
- 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 +61 -19
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +10 -5
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +16 -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 +81 -24
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +264 -57
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +64 -0
- package/lib/langium/keys/containment.d.ts.map +1 -0
- package/lib/langium/keys/containment.js +53 -0
- package/lib/langium/keys/containment.js.map +1 -0
- package/lib/langium/keys/index.d.ts +1 -0
- package/lib/langium/keys/index.d.ts.map +1 -1
- package/lib/langium/keys/index.js +1 -0
- package/lib/langium/keys/index.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +4 -0
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/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 +29 -4
- 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 +343 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +411 -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 +61 -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 +432 -282
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +504 -438
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +150 -35
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +47 -35
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +25 -4
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +2 -1
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts +23 -0
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/naming/name-separator-validation.js +30 -1
- package/lib/langium/naming/name-separator-validation.js.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +9 -2
- 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 +30 -10
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +23 -57
- 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/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +56 -20
- package/lib/langium/scope/hydranium-scope-provider.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.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +12 -21
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +1 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- 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 +21 -6
- 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 +77 -26
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +46 -24
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +423 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +906 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +48 -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 +50 -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.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 +280 -9
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +448 -5
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/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 +15 -10
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +7 -5
- 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 +135 -9
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +93 -14
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -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 +82 -9
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
- 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 +31 -2
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +13 -5
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +46 -4
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +60 -5
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +48 -15
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +78 -18
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +12 -4
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/locale/index.d.ts +10 -0
- package/lib/locale/index.d.ts.map +1 -0
- package/lib/locale/index.js +10 -0
- package/lib/locale/index.js.map +1 -0
- package/lib/locale/server-locale.d.ts +73 -0
- package/lib/locale/server-locale.d.ts.map +1 -0
- package/lib/locale/server-locale.js +61 -0
- package/lib/locale/server-locale.js.map +1 -0
- package/lib/lsp/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/hydranium-document-update-handler.d.ts +92 -81
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +153 -99
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +3 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +3 -1
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +34 -1
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +55 -8
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/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 +8 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +13 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +54 -0
- package/lib/messages/carriers.d.ts.map +1 -0
- package/lib/messages/carriers.js +62 -0
- package/lib/messages/carriers.js.map +1 -0
- package/lib/messages/index.d.ts +25 -0
- package/lib/messages/index.d.ts.map +1 -0
- package/lib/messages/index.js +25 -0
- package/lib/messages/index.js.map +1 -0
- package/lib/messages/renderer.d.ts +142 -0
- package/lib/messages/renderer.d.ts.map +1 -0
- package/lib/messages/renderer.js +165 -0
- package/lib/messages/renderer.js.map +1 -0
- 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 +1 -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/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +1 -0
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +41 -6
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +109 -49
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +8 -2
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +1 -1
- 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 +52 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +66 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/socket-launcher.d.ts +20 -4
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +5 -4
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/stdio-launcher.d.ts +6 -5
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +2 -2
- package/lib/node/stdio-launcher.js.map +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 +16 -4
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js +18 -3
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/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 +14 -0
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +28 -2
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +72 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +42 -10
- 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/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 +11 -3
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +43 -10
- 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 +14 -0
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +34 -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 +24 -8
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +27 -6
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +4 -4
- package/lib/testing/run-update-pipeline.d.ts.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 +24 -65
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +26 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +78 -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 +115 -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 +7 -6
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +4 -4
- 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/util/connection-liveness.d.ts +7 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +35 -14
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +32 -48
- package/src/documents/ast-document-manager.ts +379 -231
- 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 +130 -0
- package/src/documents/document-release-handler.ts +365 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +68 -0
- package/src/documents/hydranium-text-documents.ts +931 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +451 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +267 -0
- package/src/index.ts +8 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +66 -28
- 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/logger.ts +12 -5
- package/src/langium/diagnostics/lsp-logger.ts +59 -15
- package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
- package/src/langium/document-builder/document-builder.ts +565 -59
- package/src/langium/integration-services.ts +83 -24
- package/src/langium/integrity/integrity-rule.ts +16 -8
- package/src/langium/integrity/integrity-service.ts +287 -62
- package/src/langium/keys/containment.ts +87 -0
- package/src/langium/keys/index.ts +1 -0
- package/src/langium/keys/name-based-key-provider.ts +4 -0
- package/src/langium/language-module.ts +48 -7
- package/src/langium/model-service/client-session.ts +644 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +75 -0
- package/src/langium/model-service/model-service.ts +790 -468
- package/src/langium/module.ts +199 -64
- package/src/langium/naming/name-provider.ts +27 -5
- package/src/langium/naming/name-separator-validation.ts +34 -5
- package/src/langium/project/abstract-project-manager.ts +9 -1
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +45 -14
- package/src/langium/scope/hydranium-scope-provider.ts +60 -22
- package/src/langium/serialization/abstract-serializer.ts +13 -32
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +21 -6
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +104 -37
- package/src/langium/trivia/comment-preserver.ts +1100 -0
- package/src/langium/trivia/document-ending-preserver.ts +55 -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 +54 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +523 -10
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/document-uri-policy.ts +15 -10
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +205 -17
- package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +154 -14
- package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
- package/src/langium/workspace/index.ts +1 -0
- package/src/langium/workspace/initialize-workspace.ts +43 -5
- package/src/langium/workspace/langium-documents.ts +75 -6
- package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
- package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
- package/src/langium/workspace/virtual-document.ts +96 -19
- package/src/langium/workspace/write-lock-scope.ts +24 -11
- package/src/locale/index.ts +10 -0
- package/src/locale/server-locale.ts +86 -0
- 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/hydranium-document-update-handler.ts +187 -108
- package/src/lsp/index.ts +3 -1
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/semantic-token-provider.ts +74 -7
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +13 -7
- package/src/messages/carriers.ts +78 -0
- package/src/messages/index.ts +36 -0
- package/src/messages/renderer.ts +212 -0
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +1 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/measure-memory.ts +1 -0
- package/src/node/node-file-system-provider.ts +124 -53
- package/src/node/profile-capture.ts +9 -3
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +78 -0
- package/src/node/socket-launcher.ts +24 -8
- package/src/node/stdio-launcher.ts +8 -7
- package/src/testing/fake-document.ts +24 -5
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-noop-shared-services.ts +50 -2
- package/src/testing/make-test-services.ts +125 -31
- package/src/testing/make-test-tracer.ts +26 -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 +66 -12
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +36 -2
- 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 +45 -11
- package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
- package/src/testing/run-update-pipeline.ts +4 -4
- package/src/testing/stub-ast-document-manager.ts +36 -138
- package/src/testing/stub-document-builder.ts +102 -18
- package/src/testing/stub-hydranium-text-documents.ts +165 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +9 -8
- 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 +1 -1
- package/src/util/connection-liveness.ts +37 -14
- package/src/util/environment.ts +9 -1
- 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.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/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.
|
|
136
104
|
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
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.
|
|
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.
|
|
110
|
+
*
|
|
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.
|
|
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.
|
|
179
126
|
*/
|
|
180
|
-
protected readonly
|
|
181
|
-
/**
|
|
182
|
-
|
|
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).
|
|
225
|
-
*/
|
|
226
|
-
protected readonly __shadow: LanguageClientTextShadow;
|
|
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,81 @@ 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
|
+
/**
|
|
210
|
+
* Drop the document no client has open any more, announce it on
|
|
211
|
+
* {@link onDidReleaseDocument}, then hand it to the
|
|
212
|
+
* `DocumentReleaseHandler` slot: its listeners, such as the update
|
|
213
|
+
* handler dropping a change it still holds back, act before any build the
|
|
214
|
+
* handler runs.
|
|
215
|
+
*/
|
|
216
|
+
protected releaseDocument(uri: CanonicalUri): void;
|
|
217
|
+
/**
|
|
218
|
+
* Call the `DocumentReleaseHandler` slot, and announce a document released
|
|
219
|
+
* dirty clean once the promise it returns settles, which is after the
|
|
220
|
+
* release event. A failure is logged rather than thrown: the store has let
|
|
221
|
+
* go of the document by now, and a throw would abort the transition that
|
|
222
|
+
* released it, a session's close of its other documents included.
|
|
223
|
+
*/
|
|
224
|
+
protected handOverRelease(released: ReleasedDocument, cleanAnnouncement: CleanAnnouncement | undefined): void;
|
|
225
|
+
/** `uri` as the `DocumentReleaseHandler` slot receives it. */
|
|
226
|
+
protected toReleasedDocument(uri: CanonicalUri): ReleasedDocument;
|
|
264
227
|
notifyWillSaveTextDocument(event: WillSaveTextDocumentParams): void;
|
|
265
228
|
notifyWillSaveTextDocumentWaitUntil(event: WillSaveTextDocumentParams, token: CancellationToken): HandlerResult<TextEdit[], void>;
|
|
229
|
+
/**
|
|
230
|
+
* Handle a save the language client reports: fire
|
|
231
|
+
* {@link onDidSaveInLanguageClient}, then announce it on {@link onDidSave}
|
|
232
|
+
* only once the file read back from disk holds the store's current text.
|
|
233
|
+
*/
|
|
234
|
+
protected notifyLanguageClientSave(event: DidSaveTextDocumentParams): Promise<void>;
|
|
235
|
+
/**
|
|
236
|
+
* Announce a save the server made. `event.text`, when given, is what the
|
|
237
|
+
* file now holds, written or found there, and becomes the disk baseline
|
|
238
|
+
* before the save is announced. It lags the store when an edit landed
|
|
239
|
+
* after the save took its text, and the document then stays dirty.
|
|
240
|
+
*/
|
|
266
241
|
notifyDidSaveTextDocument(event: DidSaveTextDocumentParams, clientId?: string): void;
|
|
242
|
+
/** Fire {@link onDidSave} for `document`, which need not be synced any more. */
|
|
243
|
+
protected announceSave(document: T, clientId: string): void;
|
|
267
244
|
notifyDidOpenTextDocument(event: DidOpenTextDocumentParams, clientId?: string): void;
|
|
245
|
+
/**
|
|
246
|
+
* Record `clientId` as an additional holder of a document another client
|
|
247
|
+
* already has open.
|
|
248
|
+
*
|
|
249
|
+
* Unlike the attach branch of {@link notifyDidOpenTextDocument} this does
|
|
250
|
+
* not refresh. That branch re-renders an attaching TEXTUAL view; a client
|
|
251
|
+
* reaching a document through a non-textual route has nothing to re-render,
|
|
252
|
+
* and refreshing per attach turns each into a Langium rebuild and dependent
|
|
253
|
+
* relink cascade.
|
|
254
|
+
*
|
|
255
|
+
* Returns whether a hold was added — `false` when `uri` is not open,
|
|
256
|
+
* `clientId` already holds it, or the document was waiting out the release
|
|
257
|
+
* grace for other clients and was released instead (see
|
|
258
|
+
* {@link resolveDeferredRelease}); the caller then opens it anew.
|
|
259
|
+
*/
|
|
260
|
+
attachClient(uri: DocumentUri, clientId: string): boolean;
|
|
261
|
+
protected logClientJoined(uri: DocumentUri, clientId: string, version: number, existingClients: readonly string[]): void;
|
|
268
262
|
refreshContent(uri: DocumentUri, clientId: string): void;
|
|
269
263
|
/**
|
|
270
264
|
* The canonical key a document is stored under — the single point this store
|
|
@@ -273,7 +267,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
273
267
|
* two URIs for one physical file (a symlink path and its real path) into a
|
|
274
268
|
* single registration — dedup at the editor layer, not just in
|
|
275
269
|
* `LangiumDocuments`. The URI the client opened under is preserved separately
|
|
276
|
-
* for egress addressing
|
|
270
|
+
* for egress addressing, by the {@link LanguageClientShadow}. The
|
|
277
271
|
* policy is always bound (the framework defaults it to
|
|
278
272
|
* `DefaultDocumentUriPolicy`, where canonical ≡ syntactic normalize).
|
|
279
273
|
*/
|
|
@@ -287,8 +281,6 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
287
281
|
* from its real path (symlink / `..` / case).
|
|
288
282
|
*/
|
|
289
283
|
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
284
|
setAuthor(uri: DocumentUri, version: number, author: string): void;
|
|
293
285
|
/**
|
|
294
286
|
* Resolve the synced `TextDocument` for `uri`. The store keys documents by
|
|
@@ -309,50 +301,107 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
309
301
|
get(uri: DocumentUri): T | undefined;
|
|
310
302
|
/**
|
|
311
303
|
* Current SHARED version of the document at `uri`: the open document's
|
|
312
|
-
* version, else where
|
|
313
|
-
*
|
|
304
|
+
* version, else where its persisted sequence left off, else `0` for a URI
|
|
305
|
+
* this store has never seen. The shared sequence is
|
|
314
306
|
* server-owned and monotonic across close/reopen cycles, and advances
|
|
315
307
|
* exactly when the synced content changes — which is what makes it a sound
|
|
316
|
-
* optimistic-concurrency token (
|
|
308
|
+
* optimistic-concurrency token (base-version gates): version unchanged ⇔
|
|
317
309
|
* content unchanged.
|
|
318
310
|
*/
|
|
319
|
-
version(uri: DocumentUri):
|
|
311
|
+
version(uri: DocumentUri): TextVersion;
|
|
312
|
+
/**
|
|
313
|
+
* The version the document at `uri` was opened at, which a client's write
|
|
314
|
+
* or an integrity repair steps past; `undefined` while it is not open.
|
|
315
|
+
*/
|
|
316
|
+
openedVersion(uri: DocumentUri): TextVersion | undefined;
|
|
317
|
+
/**
|
|
318
|
+
* The text the store holds for `uri`: an open document's, or for a closed
|
|
319
|
+
* one, the clean text its version sequence left off at, which for a deleted
|
|
320
|
+
* document is its last text. `undefined` for a URI no build and no client
|
|
321
|
+
* gave the store.
|
|
322
|
+
*/
|
|
323
|
+
textState(uri: DocumentUri): TextState | undefined;
|
|
324
|
+
/**
|
|
325
|
+
* The built root's recorded version for a first open of `key` with `text`,
|
|
326
|
+
* one on when the text differs from the root's; `undefined` when the root
|
|
327
|
+
* records no store version. Seeded from the opener's declared version
|
|
328
|
+
* instead, a write based on the built root passes the gate over other text,
|
|
329
|
+
* and the same text looks newer than its model. A built root records none
|
|
330
|
+
* only under a `LangiumDocuments` that does not reconcile at registration.
|
|
331
|
+
*/
|
|
332
|
+
protected builtRootOpeningVersion(key: CanonicalUri, text: string): TextVersion | undefined;
|
|
320
333
|
/**
|
|
321
334
|
* Reconcile the persisted version sequence with content that reached the
|
|
322
335
|
* build OUTSIDE the store's write paths — a closed document rebuilt from
|
|
323
|
-
* disk
|
|
336
|
+
* disk after its release, or replaced by a watched-file change. Steps the
|
|
324
337
|
* sequence iff `text` differs from the sequence's last-known content and
|
|
325
338
|
* returns the resulting sequence version so the caller can re-stamp the
|
|
326
|
-
* rebuilt document (
|
|
339
|
+
* rebuilt document (`VersionSyncService.modelProduced`) —
|
|
327
340
|
* keeping the "version advances iff content changes" invariant for
|
|
328
341
|
* documents no client currently holds.
|
|
329
342
|
*
|
|
330
|
-
*
|
|
331
|
-
*
|
|
332
|
-
*
|
|
333
|
-
*
|
|
334
|
-
*
|
|
343
|
+
* For an open document, its version when it holds `text`, since a build
|
|
344
|
+
* that read the file while the document was closed can finish after an
|
|
345
|
+
* open; else `undefined`, and the caller has to build the document again.
|
|
346
|
+
*
|
|
347
|
+
* A document without a sequence starts one at `0` with `text`: snapshots
|
|
348
|
+
* hand out versions for documents no client opened, so an uncounted change
|
|
349
|
+
* would let a write based on the old text pass the gate.
|
|
335
350
|
*/
|
|
336
351
|
reconcileExternalContent(uri: DocumentUri, text: string): number | undefined;
|
|
352
|
+
/**
|
|
353
|
+
* Commit an integrity repair into the OPEN document for `uri`, returning the
|
|
354
|
+
* document that now holds it, or `undefined` when there was nothing here to
|
|
355
|
+
* commit into.
|
|
356
|
+
*
|
|
357
|
+
* The one thing this exists to do is address the store BY URI. A repair
|
|
358
|
+
* reaches the resync as a text-document object, and that object is the
|
|
359
|
+
* store's own only on the LSP path; a document built for an already-open URI
|
|
360
|
+
* through `LangiumDocumentFactory.fromString` carries its own, so writing the
|
|
361
|
+
* repair into it corrects a copy the store does not know about and the editor
|
|
362
|
+
* never sees.
|
|
363
|
+
*
|
|
364
|
+
* `parsedFrom` is the text the repaired AST was parsed from, and a mismatch
|
|
365
|
+
* against the current content REFUSES the commit: the store has moved on,
|
|
366
|
+
* which means an editor change landed after that parse, and committing would
|
|
367
|
+
* overwrite a newer edit with a repair computed against text the user has
|
|
368
|
+
* already replaced. The build that change provokes recomputes the repair.
|
|
369
|
+
*
|
|
370
|
+
* Deliberately NOT compared by version. A separately created document seeds
|
|
371
|
+
* its own numbering, so requiring the two to agree would refuse every commit
|
|
372
|
+
* on the path this exists for. Content is the thing both sides can be held to.
|
|
373
|
+
*
|
|
374
|
+
* A changed text is a new version authored by {@link INTEGRITY_CLIENT_ID}.
|
|
375
|
+
* Kept at the old version, the repair is invisible to every reader keyed on
|
|
376
|
+
* versions: a write based on the unrepaired version passes the base-version gate
|
|
377
|
+
* and replaces the repair, and an echo filter credits the repair to the
|
|
378
|
+
* client whose edit it corrected. No change event is fired: the repair
|
|
379
|
+
* rides the build already under way, and an event would re-enter it.
|
|
380
|
+
*/
|
|
381
|
+
commitRepair(uri: DocumentUri, parsedFrom: string, repaired: string): RepairCommit<T>;
|
|
337
382
|
getAuthor(uri: DocumentUri, version?: number): string | undefined;
|
|
338
383
|
isOpen(uri: DocumentUri): boolean;
|
|
339
384
|
/**
|
|
340
385
|
* True iff any client still holds `uri` open. Distinct from {@link isOpen},
|
|
341
386
|
* which reads `__syncedDocuments` — that map is cleared only AFTER the
|
|
342
387
|
* `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
|
-
*
|
|
388
|
+
* during the close event itself. `isOpenInAnyClient` reads the open table
|
|
389
|
+
* ({@link __sessions}), which is updated BEFORE the fire, so an `onDidClose`
|
|
390
|
+
* subscriber that finds this `false` knows the last client just closed.
|
|
391
|
+
* What the build keeps is the release's: a subscriber that re-read or
|
|
392
|
+
* rebuilt the document would race the `DocumentReleaseHandler`, and after a
|
|
393
|
+
* lost connection the release waits out its grace.
|
|
347
394
|
*/
|
|
348
395
|
isOpenInAnyClient(uri: DocumentUri): boolean;
|
|
349
396
|
isOpenInClient(uri: DocumentUri, client: string): boolean;
|
|
350
397
|
isOpenInLanguageClient(uri: DocumentUri): boolean;
|
|
398
|
+
/** The clients that have `uri` open, in the order they opened it. */
|
|
399
|
+
clientsOf(uri: DocumentUri): string[];
|
|
351
400
|
isOnlyOpenInClient(uri: DocumentUri, client: string): boolean;
|
|
352
401
|
/**
|
|
353
402
|
* Every document currently held open by at least one client, with the client
|
|
354
|
-
* ids holding it. Reads the same
|
|
355
|
-
*
|
|
403
|
+
* ids holding it. Reads the same open table as {@link isOpenInAnyClient}, so
|
|
404
|
+
* it reflects a last-client close immediately.
|
|
356
405
|
*
|
|
357
406
|
* Diagnostics-oriented — the server-state snapshot lists these so an operator
|
|
358
407
|
* can see WHY a document is pinned: a document that lingers here after its
|
|
@@ -360,19 +409,133 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
360
409
|
* under a shedding policy, explains why its CST is never shed).
|
|
361
410
|
*/
|
|
362
411
|
openDocuments(): OpenDocument[];
|
|
412
|
+
/** Fires once a client session has ended, after every document it had open was closed. */
|
|
413
|
+
get onDidCloseSession(): Event<ClientSessionClosedEvent>;
|
|
414
|
+
/**
|
|
415
|
+
* Fires once a document no client has open is released: at its last close,
|
|
416
|
+
* or, for a lost client's last close, when its release grace runs out,
|
|
417
|
+
* another client opens it, or it is deleted, before the
|
|
418
|
+
* `DocumentReleaseHandler` slot is handed the document.
|
|
419
|
+
*/
|
|
420
|
+
get onDidReleaseDocument(): Event<DocumentReleasedEvent>;
|
|
363
421
|
/**
|
|
364
|
-
*
|
|
422
|
+
* Fires for every save the language client reports of a document it has
|
|
423
|
+
* open: the editor has written the file. {@link onDidSave} follows only
|
|
424
|
+
* when the file holds the store's text.
|
|
425
|
+
*/
|
|
426
|
+
get onDidSaveInLanguageClient(): Event<LanguageClientSavedEvent>;
|
|
427
|
+
/**
|
|
428
|
+
* Whether `uri` is waiting out the release grace: its last open closed with a
|
|
429
|
+
* lost connection, and it still holds its unsaved text. Such a document is
|
|
430
|
+
* open for no client, yet not closed either, so a caller that would persist
|
|
431
|
+
* a closed document's text to disk treats it as open.
|
|
432
|
+
*/
|
|
433
|
+
isReleaseDeferred(uri: DocumentUri): boolean;
|
|
434
|
+
/**
|
|
435
|
+
* Whether the store holds `uri` with text that differs from its disk
|
|
436
|
+
* baseline: what the server last knew the file to hold. `false` for a URI
|
|
437
|
+
* the store does not hold; a document waiting out the release grace is still
|
|
438
|
+
* held.
|
|
365
439
|
*
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
*
|
|
369
|
-
*
|
|
440
|
+
* The baseline is the text a first open brought, or what the server wrote,
|
|
441
|
+
* or read back after an editor's save or a watched-file change, so it can
|
|
442
|
+
* trail a change to the file that none of these has seen yet. A check that
|
|
443
|
+
* must know the file reads it instead.
|
|
444
|
+
*/
|
|
445
|
+
isDirty(uri: DocumentUri): boolean;
|
|
446
|
+
/**
|
|
447
|
+
* Fires each time the answer of {@link isDirty} changes. For a document
|
|
448
|
+
* released dirty it fires once the `DocumentReleaseHandler` slot reports the
|
|
449
|
+
* release settled: at the version of the text the build then holds, or
|
|
450
|
+
* without text when the document is gone or the handler failed, though
|
|
451
|
+
* {@link isDirty} answers clean from the release on.
|
|
452
|
+
*/
|
|
453
|
+
get onDidChangeDirty(): Event<DocumentDirtyChangedEvent>;
|
|
454
|
+
/**
|
|
455
|
+
* Record that the file behind `uri` holds `text`, or no file at all for
|
|
456
|
+
* `undefined`. A no-op for a URI the store does not hold: the next first
|
|
457
|
+
* open sets the baseline from its own text.
|
|
458
|
+
*/
|
|
459
|
+
setDiskBaseline(uri: DocumentUri, text: string | undefined): void;
|
|
460
|
+
/**
|
|
461
|
+
* Read the file behind `uri` through its disk queue and take it as the
|
|
462
|
+
* baseline. A file that cannot be read counts as none, the side that
|
|
463
|
+
* leaves the document dirty.
|
|
464
|
+
*/
|
|
465
|
+
reloadDiskBaseline(uri: DocumentUri): Promise<void>;
|
|
466
|
+
/**
|
|
467
|
+
* Start a client session under `clientId`. Throws where
|
|
468
|
+
* {@link ClientSessionRegistry.register} refuses the id.
|
|
469
|
+
*/
|
|
470
|
+
registerSession(clientId: string): void;
|
|
471
|
+
/**
|
|
472
|
+
* End the client session `clientId`: close every document it has open, then
|
|
473
|
+
* free the id. Immediate — each close runs the ordinary close path before
|
|
474
|
+
* this returns, with `cause` as its cause. A no-op for an id that is not a
|
|
475
|
+
* registered session.
|
|
476
|
+
*/
|
|
477
|
+
closeSession(clientId: string, cause?: SessionEndCause): void;
|
|
478
|
+
/**
|
|
479
|
+
* Close every document the language client has open, as a `didClose` for
|
|
480
|
+
* each would, so each last close releases its document. For a host whose editor connection
|
|
481
|
+
* can end while the process lives on, such as a worker whose port's peer
|
|
482
|
+
* closed: the language client is no session, so nothing else closes them.
|
|
370
483
|
*
|
|
371
|
-
*
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
*
|
|
375
|
-
|
|
484
|
+
* It first waits for the workspace initialization the open handler waits
|
|
485
|
+
* for, so an open that arrived before the close is closed too; closing at
|
|
486
|
+
* once would leave that open to land afterwards, held by a client that is
|
|
487
|
+
* gone.
|
|
488
|
+
*/
|
|
489
|
+
closeLanguageClientDocuments(): Promise<void>;
|
|
490
|
+
/**
|
|
491
|
+
* Settles once the initial workspace build has finished, whether it
|
|
492
|
+
* completed, was cancelled or failed. Awaiting `workspaceInitialized` itself
|
|
493
|
+
* throws after a cancelled build, which any write during startup causes, and
|
|
494
|
+
* every open and close gated on it is then dropped for the process lifetime.
|
|
495
|
+
* The workspace manager logs a failed build.
|
|
496
|
+
*/
|
|
497
|
+
protected initialBuildFinished(): Promise<void>;
|
|
498
|
+
/**
|
|
499
|
+
* The file behind `uri` was deleted: close every open of it except the
|
|
500
|
+
* language client's.
|
|
501
|
+
*
|
|
502
|
+
* The editor's open is left alone because the editor owns it: it keeps the
|
|
503
|
+
* buffer of a deleted file and goes on sending changes for it, and a store
|
|
504
|
+
* that had closed the document would drop every one of them until the editor
|
|
505
|
+
* reopened.
|
|
506
|
+
*/
|
|
507
|
+
notifyDocumentDeleted(uri: DocumentUri): void;
|
|
508
|
+
/**
|
|
509
|
+
* Remove the document for `uri`, closing every open of it first — the
|
|
510
|
+
* editor's included, since the document it would keep editing is gone.
|
|
511
|
+
*
|
|
512
|
+
* The base removes the synced document without consulting the open table,
|
|
513
|
+
* which leaves every open recorded against a document that no longer exists:
|
|
514
|
+
* the store then answers that the URI is open, and the next open attaches to
|
|
515
|
+
* nothing.
|
|
516
|
+
*/
|
|
517
|
+
delete(uri: string | URI | T): void;
|
|
518
|
+
/**
|
|
519
|
+
* A client id as log lines print it. An id containing `#` is cut eight
|
|
520
|
+
* characters after its last `#`, which leaves a minted `label#uuid` as the
|
|
521
|
+
* label and enough of the UUID to tell sessions apart; an id without `#`
|
|
522
|
+
* prints whole. The full id goes out at trace level wherever a session
|
|
523
|
+
* starts or ends.
|
|
524
|
+
*/
|
|
525
|
+
protected formatClientId(clientId: string): string;
|
|
526
|
+
/**
|
|
527
|
+
* Stages integrity-updated content for a document no client holds.
|
|
528
|
+
*
|
|
529
|
+
* Nothing is pushed to a file no client holds. The next open of it reads
|
|
530
|
+
* disk, which lacks the update; {@link notifyDidOpenTextDocument} takes this
|
|
531
|
+
* staged content in place of that text, and the open's sync then delivers
|
|
532
|
+
* it to an editor as an unsaved change.
|
|
533
|
+
*
|
|
534
|
+
* Only a FIRST open consumes it, so stage only for a URI no client holds
|
|
535
|
+
* ({@link isOpenInAnyClient} is `false`). A URI held only through another
|
|
536
|
+
* head is not closed: an editor attaching to it joins the existing entry and
|
|
537
|
+
* never reads the stage, and the release discards it. An entry waits for
|
|
538
|
+
* that first open, at one serialised string per URI.
|
|
376
539
|
*/
|
|
377
540
|
stagePendingContent(uri: DocumentUri, text: string): void;
|
|
378
541
|
/**
|
|
@@ -384,98 +547,53 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
384
547
|
* - The shared services have no LSP {@link Connection} bound (non-LSP
|
|
385
548
|
* hosts like CLI / tests).
|
|
386
549
|
* - The shadow already matches `newText` (no edits needed; quiet skip).
|
|
550
|
+
* - The language client has not opened the document. A client applies an
|
|
551
|
+
* edit to a closed file by opening it, and that open races the edit;
|
|
552
|
+
* the document's own open delivers its text instead.
|
|
387
553
|
*
|
|
388
554
|
* On `applyEdit` rejection (`result.applied === false`) or RPC failure the
|
|
389
|
-
* shadow is invalidated so the next call sends a full
|
|
555
|
+
* shadow is invalidated so the next call sends a full replace, or nothing
|
|
556
|
+
* when the client was last heard to hold that text.
|
|
390
557
|
* Errors are re-thrown — callers wrap with their own retry / coalescing
|
|
391
558
|
* policy as needed.
|
|
392
559
|
*
|
|
393
560
|
* The diff path is apply-verify-safe: the shadow internally checks that
|
|
394
561
|
* `TextDocument.applyEdits(old, edits) === newText` and falls back to a
|
|
395
|
-
* full replace on mismatch
|
|
396
|
-
*
|
|
562
|
+
* full replace on mismatch, logged, so a diff regression becomes log noise,
|
|
563
|
+
* not data loss.
|
|
397
564
|
*
|
|
398
565
|
* That safety net verifies the diff against the SHADOW, which is what the
|
|
399
566
|
* client is *believed* to hold — so it cannot see the client's buffer moving
|
|
400
567
|
* underneath a push. A line-keyed edit is position-dependent: if a genuine
|
|
401
|
-
* client keystroke lands between
|
|
402
|
-
*
|
|
403
|
-
*
|
|
568
|
+
* client keystroke lands between computing the edits and the client
|
|
569
|
+
* applying them, the ranges address the wrong lines and splice the buffer
|
|
570
|
+
* (observed as a duplicated declaration, which the integrity tier then
|
|
404
571
|
* "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,
|
|
572
|
+
* addressed at the language client's last known version for that URI rather
|
|
573
|
+
* than at `null` ("version intentionally unknown"), which is what lets the
|
|
574
|
+
* client reject a push its buffer has outrun. On rejection the shadow is invalidated,
|
|
408
575
|
* so the caller's retry is a full-range replace — position-independent, and
|
|
409
|
-
* safe to apply to whatever the client now holds
|
|
576
|
+
* safe to apply to whatever the client now holds — or nothing when the
|
|
577
|
+
* client was last heard to hold that text.
|
|
410
578
|
*/
|
|
411
579
|
applyEditToLanguageClient(uri: DocumentUri, newText: string, options?: {
|
|
412
580
|
label?: string;
|
|
413
581
|
}): Promise<ApplyWorkspaceEditResult | undefined>;
|
|
414
582
|
/**
|
|
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.
|
|
583
|
+
* Explicitly baseline the language-client shadow for a URI the client has
|
|
584
|
+
* open, for an adopter that knows what the client holds without a
|
|
585
|
+
* `didChange` saying so (e.g. after a sideband save). Normal didOpen /
|
|
586
|
+
* didChange paths from the LSP language client already auto-track the
|
|
587
|
+
* shadow. A seed for a URI the client has not opened is kept but changes no
|
|
588
|
+
* push, since nothing is pushed there; its open replaces it with the text it
|
|
589
|
+
* declares.
|
|
427
590
|
*/
|
|
428
|
-
|
|
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.
|
|
469
|
-
*/
|
|
470
|
-
protected classifyLanguageClientChange(clientFacing: LanguageClientUri, document: T, changes: TextDocumentContentChangeEvent[]): LanguageClientChangeOrigin | undefined;
|
|
591
|
+
setLanguageClientText(uri: DocumentUri, text: string): void;
|
|
471
592
|
/**
|
|
472
|
-
*
|
|
473
|
-
*
|
|
474
|
-
*
|
|
475
|
-
* paths from the LSP language client already auto-track the shadow.
|
|
593
|
+
* Drop the shadow baseline for a URI; the next applyEditToLanguageClient
|
|
594
|
+
* sends a full replace, or nothing when the client was last heard to hold
|
|
595
|
+
* that text.
|
|
476
596
|
*/
|
|
477
|
-
setLanguageClientText(uri: DocumentUri, text: string): void;
|
|
478
|
-
/** Drop the shadow baseline for a URI; the next applyEditToLanguageClient sends a full replace. */
|
|
479
597
|
invalidateLanguageClientText(uri: DocumentUri): void;
|
|
480
598
|
protected consumePendingContent(uri: DocumentUri): string | undefined;
|
|
481
599
|
protected log(uri: DocumentUri, message: string): void;
|
|
@@ -486,5 +604,4 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
486
604
|
dispose(): void;
|
|
487
605
|
};
|
|
488
606
|
}
|
|
489
|
-
export {};
|
|
490
607
|
//# sourceMappingURL=hydranium-text-documents.d.ts.map
|