@hydranium/core 1.0.0-next.22 → 1.0.0-next.221
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 +14 -8
- 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 +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.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 +5 -5
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +42 -17
- 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 +43 -0
- package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
- package/lib/langium/composite-ast-reflection.js +92 -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 +93 -0
- package/lib/langium/document-builder/build-session.d.ts.map +1 -0
- package/lib/langium/document-builder/build-session.js +72 -0
- package/lib/langium/document-builder/build-session.js.map +1 -0
- package/lib/langium/document-builder/document-builder.d.ts +401 -29
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +698 -61
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/document-builder/index.d.ts +1 -0
- package/lib/langium/document-builder/index.d.ts.map +1 -1
- package/lib/langium/document-builder/index.js +1 -0
- package/lib/langium/document-builder/index.js.map +1 -1
- package/lib/langium/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 +157 -35
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +52 -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 +31 -11
- 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 +23 -6
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/transfer/transfer-encoder.d.ts +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 +294 -10
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +448 -5
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/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 +18 -14
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +10 -9
- 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 +86 -17
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +101 -29
- 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 +7 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +42 -17
- package/src/langium/composite-ast-reflection.ts +107 -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/build-session.ts +87 -0
- package/src/langium/document-builder/document-builder.ts +825 -59
- package/src/langium/document-builder/index.ts +1 -0
- 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 +210 -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 +46 -15
- 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 +27 -6
- 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 +537 -11
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/document-uri-policy.ts +18 -14
- 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 +124 -33
- 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
|
@@ -7,12 +7,18 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import type
|
|
10
|
+
import { type CanonicalUri, textHash } from '@hydranium/protocol';
|
|
11
11
|
import type { ApplyWorkspaceEditResult } from 'vscode-languageserver';
|
|
12
|
-
import { Disposable } from 'vscode-languageserver';
|
|
12
|
+
import { Disposable, Emitter } from 'vscode-languageserver';
|
|
13
13
|
import type { TextDocument } from 'vscode-languageserver-textdocument';
|
|
14
14
|
import { LANGUAGE_CLIENT_ID } from '../documents/client-ids.js';
|
|
15
|
-
import
|
|
15
|
+
import { ClientSessionRegistry } from '../documents/client-session-registry.js';
|
|
16
|
+
import type { DocumentDirtyChangedEvent } from '../documents/dirty-state-tracker.js';
|
|
17
|
+
import type {
|
|
18
|
+
ClientTextDocumentChangeEvent,
|
|
19
|
+
HydraniumTextDocuments,
|
|
20
|
+
DocumentReleasedEvent
|
|
21
|
+
} from '../documents/hydranium-text-documents.js';
|
|
16
22
|
|
|
17
23
|
/** Snapshot of an open document tracked by the stub. */
|
|
18
24
|
export interface StubTextDocumentEntry {
|
|
@@ -27,9 +33,14 @@ export interface StubTextDocumentEntry {
|
|
|
27
33
|
* reads from on test paths — the content channel
|
|
28
34
|
* (`notifyDidChangeTextDocument` / `applyContentChange` / `version` /
|
|
29
35
|
* `getAuthor`), the open-state probes (`isOpenInLanguageClient` /
|
|
30
|
-
* `isOpenInAnyClient` / `
|
|
31
|
-
*
|
|
32
|
-
*
|
|
36
|
+
* `isOpenInAnyClient` / `isOpenInClient` / `isReleaseDeferred` /
|
|
37
|
+
* `openDocuments`), the push channel
|
|
38
|
+
* to the language client (`applyEditToLanguageClient` / `stagePendingContent`),
|
|
39
|
+
* the save / close notifications, the dirty state (`isDirty` / `textState` /
|
|
40
|
+
* `onDidChangeDirty` / `setDiskBaseline`, against a baseline {@link seedOpen}
|
|
41
|
+
* sets and a save that carries its text moves), and the client-session table
|
|
42
|
+
* (`registerSession` / `closeSession` / `onDidCloseSession`), which is a real
|
|
43
|
+
* `ClientSessionRegistry` — plus test-only helpers:
|
|
33
44
|
*
|
|
34
45
|
* - {@link seedOpen} — pre-populate an open document without firing change
|
|
35
46
|
* events. Use to set up a baseline version before exercising an `update`.
|
|
@@ -66,9 +77,21 @@ export interface StubHydraniumTextDocuments extends Pick<
|
|
|
66
77
|
| 'getAuthor'
|
|
67
78
|
| 'isOpenInLanguageClient'
|
|
68
79
|
| 'isOpenInAnyClient'
|
|
80
|
+
| 'isReleaseDeferred'
|
|
69
81
|
| 'applyEditToLanguageClient'
|
|
70
82
|
| 'stagePendingContent'
|
|
71
83
|
| 'openDocuments'
|
|
84
|
+
| 'isOpenInClient'
|
|
85
|
+
| 'attachClient'
|
|
86
|
+
| 'registerSession'
|
|
87
|
+
| 'closeSession'
|
|
88
|
+
| 'onDidCloseSession'
|
|
89
|
+
| 'onDidReleaseDocument'
|
|
90
|
+
| 'isDirty'
|
|
91
|
+
| 'textState'
|
|
92
|
+
| 'openedVersion'
|
|
93
|
+
| 'onDidChangeDirty'
|
|
94
|
+
| 'setDiskBaseline'
|
|
72
95
|
> {
|
|
73
96
|
/**
|
|
74
97
|
* Stub-tailored read accessor. Returns just the surface the framework's
|
|
@@ -87,28 +110,46 @@ export interface StubHydraniumTextDocuments extends Pick<
|
|
|
87
110
|
onDidSave(listener: (event: { document: { uri: string }; clientId: string }) => void): Disposable;
|
|
88
111
|
/** Real-shaped close subscription — listener gets {@link ClientTextDocumentChangeEvent}. */
|
|
89
112
|
onDidClose(listener: (event: ClientTextDocumentChangeEvent<TextDocument>) => void): Disposable;
|
|
90
|
-
/** Pre-populate an open document without firing change events. */
|
|
113
|
+
/** Pre-populate an open document without firing change events; `text` is also its disk baseline. */
|
|
91
114
|
seedOpen(uri: string, text: string, clientId: string): void;
|
|
92
115
|
/** Mark `uri` as open in the LSP textual language client (drives {@link isOpenInLanguageClient}). */
|
|
93
116
|
seedOpenInLanguageClient(uri: string): void;
|
|
94
|
-
/**
|
|
117
|
+
/**
|
|
118
|
+
* Synchronously deliver `onDidClose` to subscribers, then `onDidReleaseDocument`
|
|
119
|
+
* when no client has `uri` open any more, then the dirty flip of a dropped
|
|
120
|
+
* holder: the real store's order. The stub keeps no release grace and runs
|
|
121
|
+
* no release handler, so the flip comes at once and without text, where the
|
|
122
|
+
* real store announces it once the handler settles, with text while the
|
|
123
|
+
* build still has the document.
|
|
124
|
+
*/
|
|
95
125
|
fireClose(uri: string, clientId: string): void;
|
|
96
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* Drop recorded state. Useful for `beforeEach` resets.
|
|
128
|
+
*
|
|
129
|
+
* Sessions end without announcing it, so a model service built on this
|
|
130
|
+
* stub still holds the handles it started before the reset. Build a fresh
|
|
131
|
+
* service after a reset rather than reusing one across it.
|
|
132
|
+
*/
|
|
97
133
|
reset(): void;
|
|
98
134
|
readonly changes: readonly StubTextDocumentEntry[];
|
|
99
135
|
readonly saves: readonly { uri: string; clientId: string }[];
|
|
100
136
|
/**
|
|
101
137
|
* Decide what {@link applyEditToLanguageClient} answers, so a suite can drive
|
|
102
138
|
* the rejection path (`{ applied: false }`) the real client takes when its
|
|
103
|
-
* buffer has outrun the version the push was addressed at. The
|
|
104
|
-
* recorded in {@link appliedEdits} either way. Defaults to accepting
|
|
139
|
+
* buffer has outrun the version the push was addressed at. The push is still
|
|
140
|
+
* recorded in {@link appliedEdits} either way. Defaults to accepting; not
|
|
141
|
+
* called for a URI not open in the language client.
|
|
105
142
|
*
|
|
106
143
|
* The handler runs INSIDE the call, which is also the only place a suite can
|
|
107
144
|
* simulate something happening while the push is in flight — a newer settle,
|
|
108
145
|
* a concurrent client edit.
|
|
109
146
|
*/
|
|
110
147
|
setApplyEditHandler(handler: (uri: string, text: string) => ApplyWorkspaceEditResult | undefined): void;
|
|
111
|
-
/**
|
|
148
|
+
/**
|
|
149
|
+
* Replay of every push {@link applyEditToLanguageClient} sent (the text
|
|
150
|
+
* channel to Monaco): none for a URI not seeded open in the language client,
|
|
151
|
+
* as the real store sends none.
|
|
152
|
+
*/
|
|
112
153
|
readonly appliedEdits: readonly { uri: string; text: string; label?: string }[];
|
|
113
154
|
/** Replay of every {@link stagePendingContent} call (the not-yet-open staging path). */
|
|
114
155
|
readonly staged: readonly { uri: string; text: string }[];
|
|
@@ -125,8 +166,37 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
125
166
|
let applyEditHandler: (uri: string, text: string) => ApplyWorkspaceEditResult | undefined = () => ({ applied: true });
|
|
126
167
|
const saveListeners: Array<(event: { document: { uri: string }; clientId: string }) => void> = [];
|
|
127
168
|
const closeListeners: Array<(event: ClientTextDocumentChangeEvent<TextDocument>) => void> = [];
|
|
169
|
+
// The real registry, so the session table, the opens and the closing state
|
|
170
|
+
// behave as the store's do. The stub's plain-string keys
|
|
171
|
+
// stand in for canonical URIs (one stub-boundary cast, like `fireClose`).
|
|
172
|
+
const sessions = new ClientSessionRegistry();
|
|
173
|
+
const key = (uri: string): CanonicalUri => uri as CanonicalUri;
|
|
174
|
+
const documentReleased = new Emitter<DocumentReleasedEvent>();
|
|
175
|
+
const baselines = new Map<string, string | undefined>();
|
|
176
|
+
const openedVersions = new Map<string, number>();
|
|
177
|
+
const dirty = new Set<string>();
|
|
178
|
+
const dirtyChanged = new Emitter<DocumentDirtyChangedEvent>();
|
|
179
|
+
// As the real store: dirty while held with text other than the baseline,
|
|
180
|
+
// announced only when the answer changes.
|
|
181
|
+
const refreshDirty = (uri: string): void => {
|
|
182
|
+
const held = docs.get(uri);
|
|
183
|
+
const now = held !== undefined && held.text !== baselines.get(uri);
|
|
184
|
+
if (now !== dirty.has(uri)) {
|
|
185
|
+
if (now) {
|
|
186
|
+
dirty.add(uri);
|
|
187
|
+
} else {
|
|
188
|
+
dirty.delete(uri);
|
|
189
|
+
}
|
|
190
|
+
// No build behind the stub, so a document no longer held is announced without text.
|
|
191
|
+
dirtyChanged.fire(
|
|
192
|
+
held === undefined
|
|
193
|
+
? { uri: key(uri) }
|
|
194
|
+
: { uri: key(uri), text: { version: held.version, hash: textHash(held.text), dirty: now } }
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
128
198
|
|
|
129
|
-
|
|
199
|
+
const stub: StubHydraniumTextDocuments = {
|
|
130
200
|
get changes() {
|
|
131
201
|
return changes;
|
|
132
202
|
},
|
|
@@ -146,6 +216,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
146
216
|
version(uri) {
|
|
147
217
|
return docs.get(uri)?.version ?? 0;
|
|
148
218
|
},
|
|
219
|
+
openedVersion(uri) {
|
|
220
|
+
return docs.has(uri) ? openedVersions.get(uri) : undefined;
|
|
221
|
+
},
|
|
222
|
+
textState(uri) {
|
|
223
|
+
const held = docs.get(uri);
|
|
224
|
+
return held && { version: held.version, hash: textHash(held.text), dirty: dirty.has(uri) };
|
|
225
|
+
},
|
|
149
226
|
notifyDidChangeTextDocument(event, clientId = LANGUAGE_CLIENT_ID) {
|
|
150
227
|
const existing = docs.get(event.textDocument.uri);
|
|
151
228
|
const next: StubTextDocumentEntry = {
|
|
@@ -159,6 +236,7 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
159
236
|
}
|
|
160
237
|
docs.set(event.textDocument.uri, next);
|
|
161
238
|
changes.push(next);
|
|
239
|
+
refreshDirty(event.textDocument.uri);
|
|
162
240
|
},
|
|
163
241
|
applyContentChange(uri, text, clientId) {
|
|
164
242
|
const existing = docs.get(uri);
|
|
@@ -172,9 +250,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
172
250
|
const next: StubTextDocumentEntry = changed ? { uri, version: existing.version + 1, text, clientId } : existing;
|
|
173
251
|
docs.set(uri, next);
|
|
174
252
|
changes.push({ uri, version: next.version, text, clientId });
|
|
253
|
+
refreshDirty(uri);
|
|
175
254
|
return next.version;
|
|
176
255
|
},
|
|
177
256
|
notifyDidSaveTextDocument(event, clientId) {
|
|
257
|
+
if (event.text !== undefined) {
|
|
258
|
+
stub.setDiskBaseline(event.textDocument.uri, event.text);
|
|
259
|
+
}
|
|
178
260
|
saves.push({ uri: event.textDocument.uri, clientId });
|
|
179
261
|
for (const listener of saveListeners.slice()) {
|
|
180
262
|
listener({ document: { uri: event.textDocument.uri }, clientId });
|
|
@@ -207,26 +289,61 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
207
289
|
isOpenInAnyClient(uri) {
|
|
208
290
|
return docs.has(uri) || languageClientOpen.has(uri);
|
|
209
291
|
},
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
292
|
+
isOpenInClient(uri, clientId) {
|
|
293
|
+
return sessions.isOpenIn(key(uri), clientId);
|
|
294
|
+
},
|
|
295
|
+
isReleaseDeferred() {
|
|
296
|
+
// The stub keeps no release grace.
|
|
297
|
+
return false;
|
|
298
|
+
},
|
|
299
|
+
attachClient(uri, clientId) {
|
|
300
|
+
return docs.has(uri) && sessions.addOpen(key(uri), clientId);
|
|
301
|
+
},
|
|
302
|
+
registerSession(clientId) {
|
|
303
|
+
sessions.register(clientId);
|
|
304
|
+
},
|
|
305
|
+
closeSession(clientId, cause) {
|
|
306
|
+
if (!sessions.isRegistered(clientId)) {
|
|
307
|
+
return;
|
|
216
308
|
}
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
309
|
+
try {
|
|
310
|
+
for (const uri of sessions.beginClose(clientId)) {
|
|
311
|
+
stub.fireClose(uri, clientId);
|
|
312
|
+
}
|
|
313
|
+
} finally {
|
|
314
|
+
sessions.unregister(clientId, cause);
|
|
221
315
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
return
|
|
316
|
+
},
|
|
317
|
+
get onDidCloseSession() {
|
|
318
|
+
return sessions.onDidCloseSession;
|
|
319
|
+
},
|
|
320
|
+
get onDidReleaseDocument() {
|
|
321
|
+
return documentReleased.event;
|
|
322
|
+
},
|
|
323
|
+
isDirty(uri) {
|
|
324
|
+
return dirty.has(uri);
|
|
325
|
+
},
|
|
326
|
+
get onDidChangeDirty() {
|
|
327
|
+
return dirtyChanged.event;
|
|
328
|
+
},
|
|
329
|
+
setDiskBaseline(uri, text) {
|
|
330
|
+
if (docs.has(uri)) {
|
|
331
|
+
baselines.set(uri, text);
|
|
332
|
+
refreshDirty(uri);
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
openDocuments() {
|
|
336
|
+
// From the registry that also answers `isOpenInClient`, which both
|
|
337
|
+
// seeding channels feed, so the two never disagree about an open.
|
|
338
|
+
return sessions.openDocuments();
|
|
225
339
|
},
|
|
226
340
|
setApplyEditHandler(handler) {
|
|
227
341
|
applyEditHandler = handler;
|
|
228
342
|
},
|
|
229
343
|
async applyEditToLanguageClient(uri, newText, options): Promise<ApplyWorkspaceEditResult | undefined> {
|
|
344
|
+
if (!languageClientOpen.has(uri)) {
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
230
347
|
appliedEdits.push({ uri, text: newText, label: options?.label });
|
|
231
348
|
return applyEditHandler(uri, newText);
|
|
232
349
|
},
|
|
@@ -234,9 +351,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
234
351
|
staged.push({ uri, text });
|
|
235
352
|
},
|
|
236
353
|
seedOpen(uri, text, clientId) {
|
|
354
|
+
sessions.addOpen(key(uri), clientId);
|
|
237
355
|
docs.set(uri, { uri, version: 1, text, clientId });
|
|
356
|
+
openedVersions.set(uri, 1);
|
|
357
|
+
baselines.set(uri, text);
|
|
238
358
|
},
|
|
239
359
|
seedOpenInLanguageClient(uri) {
|
|
360
|
+
sessions.addOpen(key(uri), LANGUAGE_CLIENT_ID);
|
|
240
361
|
languageClientOpen.add(uri);
|
|
241
362
|
},
|
|
242
363
|
fireClose(uri, clientId) {
|
|
@@ -244,9 +365,11 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
244
365
|
// class: listeners detect the last-close transition by consulting
|
|
245
366
|
// `isOpenInAnyClient`, which reads the already-decremented state.
|
|
246
367
|
const holder = docs.get(uri);
|
|
247
|
-
|
|
368
|
+
const dropped = holder !== undefined && holder.clientId === clientId;
|
|
369
|
+
if (dropped) {
|
|
248
370
|
docs.delete(uri);
|
|
249
371
|
}
|
|
372
|
+
const removed = sessions.removeOpen(key(uri), clientId);
|
|
250
373
|
if (clientId === LANGUAGE_CLIENT_ID) {
|
|
251
374
|
languageClientOpen.delete(uri);
|
|
252
375
|
}
|
|
@@ -254,6 +377,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
254
377
|
for (const listener of closeListeners.slice()) {
|
|
255
378
|
listener(event);
|
|
256
379
|
}
|
|
380
|
+
if (removed && !sessions.isOpen(key(uri))) {
|
|
381
|
+
documentReleased.fire({ uri: key(uri) });
|
|
382
|
+
}
|
|
383
|
+
// After the release event, in the order the real store announces them.
|
|
384
|
+
if (dropped) {
|
|
385
|
+
refreshDirty(uri);
|
|
386
|
+
}
|
|
257
387
|
},
|
|
258
388
|
reset() {
|
|
259
389
|
docs.clear();
|
|
@@ -262,9 +392,17 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
262
392
|
languageClientOpen.clear();
|
|
263
393
|
appliedEdits.length = 0;
|
|
264
394
|
staged.length = 0;
|
|
395
|
+
baselines.clear();
|
|
396
|
+
openedVersions.clear();
|
|
397
|
+
dirty.clear();
|
|
265
398
|
saveListeners.length = 0;
|
|
266
399
|
closeListeners.length = 0;
|
|
267
400
|
applyEditHandler = () => ({ applied: true });
|
|
401
|
+
// Cleared in place rather than replaced: a model service built on the
|
|
402
|
+
// stub subscribed to `onDidCloseSession` once, and a new registry would
|
|
403
|
+
// leave that subscription on one nothing fires.
|
|
404
|
+
sessions.clear();
|
|
268
405
|
}
|
|
269
406
|
};
|
|
407
|
+
return stub;
|
|
270
408
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { type AstNode, type LangiumDocument, type LangiumDocuments, stream, type URI } from '@hydranium/langium';
|
|
11
11
|
import { makeFakeAstNode, makeFakeDocument, type FakeDocumentOptions } from './fake-document.js';
|
|
12
|
+
import { type AstDiagnostic } from '../langium/validation/document-validator.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Map-backed stub for Langium's {@link LangiumDocuments} registry. Implements
|
|
@@ -31,7 +32,7 @@ import { makeFakeAstNode, makeFakeDocument, type FakeDocumentOptions } from './f
|
|
|
31
32
|
* production code reads the slot value through the `LangiumDocuments`
|
|
32
33
|
* interface and a narrowing cast bridges the stub at the binding site.
|
|
33
34
|
*/
|
|
34
|
-
export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic =
|
|
35
|
+
export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> extends Pick<
|
|
35
36
|
LangiumDocuments,
|
|
36
37
|
'getDocument' | 'hasDocument' | 'getOrCreateDocument' | 'all'
|
|
37
38
|
> {
|
|
@@ -51,7 +52,7 @@ export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnosti
|
|
|
51
52
|
* Build a {@link StubLangiumDocuments}. Seed entries via the optional
|
|
52
53
|
* `seeds` parameter so simple tests don't need a separate `set` call.
|
|
53
54
|
*/
|
|
54
|
-
export function makeStubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic =
|
|
55
|
+
export function makeStubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(
|
|
55
56
|
seeds: ReadonlyArray<{ uri: string | URI; root: TAst; options?: FakeDocumentOptions<TAst, TDiagnostic> }> = []
|
|
56
57
|
): StubLangiumDocuments<TAst, TDiagnostic> {
|
|
57
58
|
const docs = new Map<string, LangiumDocument<TAst>>();
|
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import type {
|
|
10
|
+
import type { TransferElement } from '@hydranium/protocol';
|
|
11
|
+
import type { AstDiagnostic } from '../langium/validation/document-validator.js';
|
|
11
12
|
import type { AstNode } from '@hydranium/langium';
|
|
12
|
-
import { ModelService, type ModelServiceOptions } from '../langium/model-service/model-service.js';
|
|
13
|
+
import { DefaultModelService, type ModelService, type ModelServiceOptions } from '../langium/model-service/model-service.js';
|
|
13
14
|
import type { ServerSharedServices } from '../langium/module.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
@@ -21,9 +22,9 @@ import type { ServerSharedServices } from '../langium/module.js';
|
|
|
21
22
|
*/
|
|
22
23
|
class StubModelServiceImpl<
|
|
23
24
|
TAst extends AstNode,
|
|
24
|
-
TDiagnostic extends
|
|
25
|
+
TDiagnostic extends AstDiagnostic = AstDiagnostic,
|
|
25
26
|
TTransfer extends TransferElement = TransferElement
|
|
26
|
-
> extends
|
|
27
|
+
> extends DefaultModelService<TAst, TDiagnostic, TTransfer> {
|
|
27
28
|
constructor(
|
|
28
29
|
services: ServerSharedServices,
|
|
29
30
|
protected readonly serializeFn: (uri: string, root: TTransfer) => string,
|
|
@@ -40,7 +41,7 @@ class StubModelServiceImpl<
|
|
|
40
41
|
/** The type of the model-service test double produced by {@link makeStubModelService}. */
|
|
41
42
|
export type StubModelService<
|
|
42
43
|
TAst extends AstNode,
|
|
43
|
-
TDiagnostic extends
|
|
44
|
+
TDiagnostic extends AstDiagnostic = AstDiagnostic,
|
|
44
45
|
TTransfer extends TransferElement = TransferElement
|
|
45
46
|
> = ModelService<TAst, TDiagnostic, TTransfer>;
|
|
46
47
|
|
|
@@ -52,8 +53,8 @@ export type StubModelService<
|
|
|
52
53
|
* `makeTestServices` wires this stub automatically.
|
|
53
54
|
*
|
|
54
55
|
* `options` are the framework {@link ModelServiceOptions}, forwarded verbatim, so
|
|
55
|
-
* a test can exercise an option-gated code path (`
|
|
56
|
-
*
|
|
56
|
+
* a test can exercise an option-gated code path (`allowReentrantBuilds`) without
|
|
57
|
+
* hand-rolling a subclass just to reach the constructor.
|
|
57
58
|
*
|
|
58
59
|
* Adopters that need richer override behaviour — the framework's own extension
|
|
59
60
|
* surface is {@link ModelService.rewriteModel} alongside `serialize` — should
|
|
@@ -61,7 +62,7 @@ export type StubModelService<
|
|
|
61
62
|
*/
|
|
62
63
|
export function makeStubModelService<
|
|
63
64
|
TAst extends AstNode,
|
|
64
|
-
TDiagnostic extends
|
|
65
|
+
TDiagnostic extends AstDiagnostic = AstDiagnostic,
|
|
65
66
|
TTransfer extends TransferElement = TransferElement
|
|
66
67
|
>(
|
|
67
68
|
services: ServerSharedServices,
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import type { SelfSaveRegistry } from '../
|
|
10
|
+
import type { SelfSaveRegistry } from '../langium/workspace/self-save-registry.js';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Stub for the framework's {@link SelfSaveRegistry}. Records `register` calls
|
|
@@ -29,7 +29,7 @@ export interface StubLanguageDescriptor {
|
|
|
29
29
|
* AST `$type`s this language's grammar produces. Synthesised into a minimal
|
|
30
30
|
* `Grammar` — one entry-less parser rule per type — which is exactly what
|
|
31
31
|
* `collectProducibleTypes` reads, so type→language routing
|
|
32
|
-
* (`buildLanguageTypeIndex`, `
|
|
32
|
+
* (`buildLanguageTypeIndex`, `ExtendedServiceRegistry.getLanguageFor`) resolves
|
|
33
33
|
* against this stub the same way it does against generated grammars.
|
|
34
34
|
*
|
|
35
35
|
* Entry-less on purpose: `reachableParserRules` falls back to every parser
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import type { URI } from '@hydranium/langium';
|
|
11
|
-
import type { WritableFileSystemProvider } from '../
|
|
11
|
+
import type { WritableFileSystemProvider } from '../langium/workspace/file-system-provider.js';
|
|
12
12
|
import type { StubSelfSaveRegistry } from './stub-self-save-registry.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -8,39 +8,62 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* Phrases
|
|
12
|
-
*
|
|
11
|
+
* Phrases that mean a call lost its connection. Matched on the message because
|
|
12
|
+
* the condition surfaces in shapes that share no discriminator:
|
|
13
13
|
*
|
|
14
14
|
* - a **throw** from `throwIfClosedOrDisposed` (`Connection is disposed.` /
|
|
15
15
|
* `Connection is closed.`), a `ConnectionError` raised synchronously by
|
|
16
16
|
* `sendRequest` / `sendNotification` and by `RemoteConsole.send`;
|
|
17
17
|
* - a **rejection** of an already-issued request (`Pending response rejected
|
|
18
18
|
* since connection got disposed`), a `ResponseError` produced when the
|
|
19
|
-
* pending-response map is drained on teardown
|
|
19
|
+
* pending-response map is drained on teardown;
|
|
20
|
+
* - a **write into a destroyed transport** (`Cannot call write after a stream
|
|
21
|
+
* was destroyed`), Node's own error for a message the writer queued before
|
|
22
|
+
* the connection was disposed and flushed after its stream was destroyed.
|
|
23
|
+
* A notification rejects with Node's error itself, which
|
|
24
|
+
* {@link isDestroyedStreamError} catches by its code; a request rejects with
|
|
25
|
+
* a `ResponseError` that copies only the message, so the phrase is needed
|
|
26
|
+
* too.
|
|
20
27
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
28
|
+
* The typed errors come from different classes carrying codes from different
|
|
29
|
+
* enums, so no single code check covers them. Kept lowercase-normalised and
|
|
30
|
+
* anchored on `connection` or `stream` so an unrelated "disposed" message
|
|
31
|
+
* cannot match.
|
|
25
32
|
*/
|
|
26
|
-
const CONNECTION_GONE_PATTERNS = [
|
|
33
|
+
const CONNECTION_GONE_PATTERNS = [
|
|
34
|
+
/connection is disposed/,
|
|
35
|
+
/connection is closed/,
|
|
36
|
+
/connection got disposed/,
|
|
37
|
+
/connection got closed/,
|
|
38
|
+
/after a stream was destroyed/
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const DESTROYED_STREAM_CODE = 'ERR_STREAM_DESTROYED';
|
|
42
|
+
|
|
43
|
+
function isDestroyedStreamError(err: unknown): boolean {
|
|
44
|
+
return err instanceof Error && 'code' in err && err.code === DESTROYED_STREAM_CODE;
|
|
45
|
+
}
|
|
27
46
|
|
|
28
47
|
/**
|
|
29
48
|
* Whether `err` means "the peer is gone", as opposed to a genuine failure of
|
|
30
49
|
* the operation.
|
|
31
50
|
*
|
|
32
|
-
* The
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
51
|
+
* The two are indistinguishable at the call site otherwise, and callers act on
|
|
52
|
+
* the answer: a gone peer is logged at `debug` or dropped, a genuine failure is
|
|
53
|
+
* logged at `error` or re-raised as an unhandled rejection. Pushing an edit to
|
|
54
|
+
* a language client that has already disconnected is a no-op, not a fault — it
|
|
55
|
+
* happens on every ordinary shutdown — so a `false` here turns routine teardown
|
|
56
|
+
* into errors that look like they need investigation. A `true` for a real
|
|
57
|
+
* `applyEdit` failure (the client refused, the request malformed) hides it.
|
|
38
58
|
*
|
|
39
59
|
* Callers that only need to *survive* a dead connection rather than classify it
|
|
40
60
|
* should just catch — see `LspLogger.emit`, whose fallback path does exactly
|
|
41
61
|
* that, since a logger has nowhere to report a logging failure anyway.
|
|
42
62
|
*/
|
|
43
63
|
export function isConnectionGoneError(err: unknown): boolean {
|
|
64
|
+
if (isDestroyedStreamError(err)) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
44
67
|
const message = err instanceof Error ? err.message : String(err);
|
|
45
68
|
const normalized = message.toLowerCase();
|
|
46
69
|
return CONNECTION_GONE_PATTERNS.some(pattern => pattern.test(normalized));
|
package/src/util/environment.ts
CHANGED
|
@@ -44,7 +44,15 @@ export function isCaseInsensitiveFileSystem(): boolean {
|
|
|
44
44
|
|
|
45
45
|
/** Node `process` lifecycle / error / signal events accepted by {@link onProcessEvent}. */
|
|
46
46
|
export type ProcessEvent =
|
|
47
|
-
|
|
47
|
+
| 'exit'
|
|
48
|
+
| 'beforeExit'
|
|
49
|
+
| 'uncaughtException'
|
|
50
|
+
| 'unhandledRejection'
|
|
51
|
+
| 'rejectionHandled'
|
|
52
|
+
| 'warning'
|
|
53
|
+
| 'SIGINT'
|
|
54
|
+
| 'SIGTERM'
|
|
55
|
+
| 'SIGHUP';
|
|
48
56
|
|
|
49
57
|
/**
|
|
50
58
|
* Register a process lifecycle handler (`'exit'`, `'unhandledRejection'`, …) if
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/********************************************************************************
|
|
2
|
-
* Copyright (c) 2026 CrossBreeze, EclipseSource and others.
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made available under the
|
|
5
|
-
* terms of the MIT License which is available in the project root.
|
|
6
|
-
*
|
|
7
|
-
* SPDX-License-Identifier: MIT
|
|
8
|
-
********************************************************************************/
|
|
9
|
-
import { type TextEdit } from 'vscode-languageserver';
|
|
10
|
-
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
11
|
-
/**
|
|
12
|
-
* The minimum surface the shadow needs from a `HydraniumTextDocuments`:
|
|
13
|
-
* a `create` method that materialises a fresh text document via the
|
|
14
|
-
* configured `TextDocumentsConfiguration`. Declared as a narrow
|
|
15
|
-
* structural interface so the manager satisfies it without an explicit
|
|
16
|
-
* import (sidestepping the circular `HydraniumTextDocuments → shadow → manager`
|
|
17
|
-
* dependency) and so tests can stub it with a minimal object literal.
|
|
18
|
-
*/
|
|
19
|
-
export interface ShadowDocumentSource {
|
|
20
|
-
create(uri: string, languageId: string, version: number, content: string): TextDocument;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Whether `edits` is the single full-document replace {@link LanguageClientTextShadow.computeEdits}
|
|
24
|
-
* emits when it has no usable baseline.
|
|
25
|
-
*
|
|
26
|
-
* The distinction matters at the `workspace/applyEdit` egress: a full replace is
|
|
27
|
-
* position-INDEPENDENT and therefore lands correctly on any client buffer, while
|
|
28
|
-
* a line-keyed diff only lands correctly on the exact text it was diffed
|
|
29
|
-
* against. Only the latter needs a client-version gate.
|
|
30
|
-
*/
|
|
31
|
-
export declare function isFullReplace(edits: readonly TextEdit[]): boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Tracks the text content the language client (typically Monaco) is believed to
|
|
34
|
-
* currently hold so outgoing `workspace/applyEdit` requests can ship minimal
|
|
35
|
-
* diffs instead of full-document replaces.
|
|
36
|
-
*
|
|
37
|
-
* Why it matters: a full-range replace on a moderately-sized YAML or DSL source
|
|
38
|
-
* forces Monaco to re-tokenise the entire document (observed multi-second hangs
|
|
39
|
-
* on large diagrams), whereas line-level diffs usually reduce that to a handful
|
|
40
|
-
* of small edits.
|
|
41
|
-
*
|
|
42
|
-
* Update points the caller is responsible for:
|
|
43
|
-
* - {@link computeEdits} after each outgoing server→client sync (updates the shadow optimistically).
|
|
44
|
-
* - {@link set} when the server receives a `didChange` from the language client (the client now
|
|
45
|
-
* holds that text; we shouldn't resend it).
|
|
46
|
-
* - {@link invalidate} when the client rejects an edit (`applied=false`) or a doc is closed —
|
|
47
|
-
* the shadow is now stale and the next sync must fall back to a full replace.
|
|
48
|
-
*/
|
|
49
|
-
export declare class LanguageClientTextShadow {
|
|
50
|
-
protected onFallback: (uri: string, reason: string) => void;
|
|
51
|
-
protected documents: ShadowDocumentSource;
|
|
52
|
-
protected shadow: Map<string, string>;
|
|
53
|
-
/**
|
|
54
|
-
* @param onFallback invoked when {@link computeEdits} falls back to a full-range replace due to
|
|
55
|
-
* apply-verify mismatch. Useful for logging regressions.
|
|
56
|
-
* @param documents the {@link ShadowDocumentSource} used to materialise the throwaway probe
|
|
57
|
-
* document in {@link computeEdits}. In production this is the owning
|
|
58
|
-
* `HydraniumTextDocuments` (whose `create` threads through its configured
|
|
59
|
-
* `TextDocumentsConfiguration`); tests pass a minimal stub. Routing
|
|
60
|
-
* through the manager rather than `TextDocument.create` directly avoids the
|
|
61
|
-
* `instanceof FullTextDocument` gate in the bare LSP `TextDocument.update`,
|
|
62
|
-
* keeping the verifier honest for adopters with a custom text-document type.
|
|
63
|
-
*/
|
|
64
|
-
constructor(onFallback: (uri: string, reason: string) => void, documents: ShadowDocumentSource);
|
|
65
|
-
/** Record the text the language client is known to hold (e.g. after a `didChange` echo). */
|
|
66
|
-
set(uri: string, text: string): void;
|
|
67
|
-
/**
|
|
68
|
-
* The text the language client is believed to hold, or `undefined` when
|
|
69
|
-
* there is no baseline (first sync, or after an {@link invalidate}).
|
|
70
|
-
*
|
|
71
|
-
* Read at the `workspace/applyEdit` egress BEFORE {@link computeEdits},
|
|
72
|
-
* which overwrites it: a push's minimal edits are keyed to this text, so an
|
|
73
|
-
* echo of that push carries ranges addressing it and nothing else. Losing
|
|
74
|
-
* it is what makes an incremental echo unreconstructable, and applying such
|
|
75
|
-
* an echo to the already-advanced synced text duplicates every inserted
|
|
76
|
-
* line.
|
|
77
|
-
*/
|
|
78
|
-
get(uri: string): string | undefined;
|
|
79
|
-
/** Forget the shadow for a URI; next {@link computeEdits} falls back to a full-document replace. */
|
|
80
|
-
invalidate(uri: string): void;
|
|
81
|
-
/**
|
|
82
|
-
* Return the minimal LSP {@link TextEdit}s required to bring the language client's content from
|
|
83
|
-
* the tracked shadow to `newText`. Updates the shadow to `newText` so subsequent calls diff
|
|
84
|
-
* against it.
|
|
85
|
-
*
|
|
86
|
-
* - Empty array when the shadow already equals `newText` (caller should skip the RPC).
|
|
87
|
-
* - Full-range replace when there is no shadow (first sync or post-{@link invalidate}).
|
|
88
|
-
* - Line-level diff otherwise. Before returning, we locally reconstruct `newText` by applying
|
|
89
|
-
* the diff to `old`; if that doesn't match, we fall back to a full-range replace and notify
|
|
90
|
-
* the fallback callback. This catches any algorithmic regression in {@link diffToEdits}
|
|
91
|
-
* without risking client corruption.
|
|
92
|
-
*/
|
|
93
|
-
computeEdits(uri: string, newText: string): TextEdit[];
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Convert a {@link diffLines} result to a list of LSP {@link TextEdit}s keyed on line positions
|
|
97
|
-
* in the *old* text. Contiguous added/removed hunks are coalesced into a single replace so the
|
|
98
|
-
* client sees one edit per changed region.
|
|
99
|
-
*/
|
|
100
|
-
export declare function diffToEdits(oldText: string, newText: string): TextEdit[];
|
|
101
|
-
//# sourceMappingURL=language-client-text-shadow.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"language-client-text-shadow.d.ts","sourceRoot":"","sources":["../../src/documents/language-client-text-shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAGlF,OAAO,EAAS,KAAK,QAAQ,EAAY,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IAClC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;CAC1F;AAKD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAMjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,wBAAwB;IAe/B,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI;IAC3D,SAAS,CAAC,SAAS,EAAE,oBAAoB;IAf5C,SAAS,CAAC,MAAM,sBAA6B;IAE7C;;;;;;;;;;OAUG;gBAEU,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EACjD,SAAS,EAAE,oBAAoB;IAG5C,4FAA4F;IAC5F,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;;;;;;;OAUG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,oGAAoG;IACpG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;CAkBxD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CA+BxE"}
|