@hydranium/core 1.0.0-next.35 → 1.0.0-next.350
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -82
- package/lib/browser/host-heads-in-worker.d.ts +77 -0
- package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
- package/lib/browser/host-heads-in-worker.js +169 -0
- package/lib/browser/host-heads-in-worker.js.map +1 -0
- package/lib/browser/index.d.ts +12 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +17 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
- package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
- package/lib/browser/indexeddb-file-system-store.js +181 -0
- package/lib/browser/indexeddb-file-system-store.js.map +1 -0
- package/lib/browser/start-language-server-in-worker.d.ts +32 -0
- package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
- package/lib/browser/start-language-server-in-worker.js +40 -0
- package/lib/browser/start-language-server-in-worker.js.map +1 -0
- package/lib/documents/ast-document-manager.d.ts +266 -124
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +293 -132
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +5 -19
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +5 -19
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +15 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +15 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +146 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +207 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/dirty-state-tracker.d.ts +101 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +85 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +204 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +317 -0
- package/lib/documents/document-release-handler.js.map +1 -0
- package/lib/documents/document-release-scheduler.d.ts +67 -0
- package/lib/documents/document-release-scheduler.d.ts.map +1 -0
- package/lib/documents/document-release-scheduler.js +80 -0
- package/lib/documents/document-release-scheduler.js.map +1 -0
- package/lib/documents/file-system-task-queue.d.ts +52 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +37 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +445 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +903 -483
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +10 -2
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +10 -2
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-shadow.d.ts +234 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +306 -0
- package/lib/documents/language-client-shadow.js.map +1 -0
- package/lib/documents/model-ledger.d.ts +47 -0
- package/lib/documents/model-ledger.d.ts.map +1 -0
- package/lib/documents/model-ledger.js +30 -0
- package/lib/documents/model-ledger.js.map +1 -0
- package/lib/documents/text-ledger.d.ts +64 -0
- package/lib/documents/text-ledger.d.ts.map +1 -0
- package/lib/documents/text-ledger.js +63 -0
- package/lib/documents/text-ledger.js.map +1 -0
- package/lib/documents/version-sync-service.d.ts +138 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +173 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js +45 -19
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +25 -9
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +49 -36
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +83 -44
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
- package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
- package/lib/langium/composite-ast-reflection.d.ts +46 -0
- package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
- package/lib/langium/composite-ast-reflection.js +97 -0
- package/lib/langium/composite-ast-reflection.js.map +1 -0
- package/lib/langium/config/configuration-provider.d.ts +81 -0
- package/lib/langium/config/configuration-provider.d.ts.map +1 -0
- package/lib/langium/config/configuration-provider.js +112 -0
- package/lib/langium/config/configuration-provider.js.map +1 -0
- package/lib/langium/config/index.d.ts +1 -0
- package/lib/langium/config/index.d.ts.map +1 -1
- package/lib/langium/config/index.js +1 -0
- package/lib/langium/config/index.js.map +1 -1
- package/lib/langium/config/settings.js.map +1 -1
- package/lib/langium/diagnostics/console-tee.d.ts +27 -0
- package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
- package/lib/langium/diagnostics/console-tee.js +142 -0
- package/lib/langium/diagnostics/console-tee.js.map +1 -0
- package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
- package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
- package/lib/langium/diagnostics/format-log-arg.js +36 -0
- package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/log-preamble.js +1 -1
- package/lib/langium/diagnostics/log-preamble.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +25 -6
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +49 -17
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +81 -45
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
- package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
- package/lib/langium/diagnostics/server-tracer.js.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +6 -5
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js +5 -5
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +310 -41
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +490 -79
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
- package/lib/langium/documentation/comment-provider.js.map +1 -1
- package/lib/langium/integration-services.d.ts +40 -24
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +7 -4
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +17 -8
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +95 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +303 -63
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/positional-key-provider.js.map +1 -1
- package/lib/langium/labeling/label-provider.d.ts.map +1 -1
- package/lib/langium/labeling/label-provider.js.map +1 -1
- package/lib/langium/language-module.d.ts +30 -5
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +18 -4
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +383 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +455 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +2 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +2 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-events.d.ts +66 -0
- package/lib/langium/model-service/model-events.d.ts.map +1 -0
- package/lib/langium/model-service/model-events.js +10 -0
- package/lib/langium/model-service/model-events.js.map +1 -0
- package/lib/langium/model-service/model-service.d.ts +456 -300
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +571 -466
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +141 -40
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +52 -40
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +32 -7
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +10 -4
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +13 -6
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +2 -2
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +38 -14
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +24 -58
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/fallback-scope.d.ts +27 -0
- package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
- package/lib/langium/scope/fallback-scope.js +35 -0
- package/lib/langium/scope/fallback-scope.js.map +1 -0
- package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js +38 -39
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +115 -32
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +201 -39
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/index.d.ts +1 -0
- package/lib/langium/scope/index.d.ts.map +1 -1
- package/lib/langium/scope/index.js +1 -0
- package/lib/langium/scope/index.js.map +1 -1
- package/lib/langium/scope/reference-builder.d.ts.map +1 -1
- package/lib/langium/scope/reference-builder.js.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js +3 -2
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts +69 -37
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js +102 -29
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
- package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.js +1 -3
- package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +54 -30
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +8 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js +13 -3
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/serializer.d.ts +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js +24 -4
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +29 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +37 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +13 -7
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/single-langium-copy.d.ts +22 -0
- package/lib/langium/single-langium-copy.d.ts.map +1 -0
- package/lib/langium/single-langium-copy.js +36 -0
- package/lib/langium/single-langium-copy.js.map +1 -0
- package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +36 -25
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +543 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +1164 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +62 -0
- package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
- package/lib/langium/trivia/index.d.ts +14 -0
- package/lib/langium/trivia/index.d.ts.map +1 -0
- package/lib/langium/trivia/index.js +14 -0
- package/lib/langium/trivia/index.js.map +1 -0
- package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
- package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-contribution.js +10 -0
- package/lib/langium/trivia/trivia-contribution.js.map +1 -0
- package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +168 -23
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +264 -26
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.js +1 -1
- package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
- package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +22 -13
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +23 -0
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
- package/lib/langium/workspace/file-not-found.js +31 -0
- package/lib/langium/workspace/file-not-found.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +167 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +115 -13
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/index.d.ts +1 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +1 -0
- package/lib/langium/workspace/index.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +68 -3
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +7 -0
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +18 -1
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/self-save-registry.d.ts +84 -0
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +55 -21
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +87 -24
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +15 -5
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/launcher/integrated-server.d.ts +3 -1
- package/lib/launcher/integrated-server.d.ts.map +1 -1
- package/lib/locale/server-locale.d.ts +19 -5
- package/lib/locale/server-locale.d.ts.map +1 -1
- package/lib/locale/server-locale.js +1 -1
- package/lib/locale/server-locale.js.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
- package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
- package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
- package/lib/lsp/connection-features.d.ts +23 -0
- package/lib/lsp/connection-features.d.ts.map +1 -0
- package/lib/lsp/connection-features.js +60 -0
- package/lib/lsp/connection-features.js.map +1 -0
- package/lib/lsp/diagnostics-connection.d.ts +27 -0
- package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
- package/lib/lsp/diagnostics-connection.js +53 -0
- package/lib/lsp/diagnostics-connection.js.map +1 -0
- package/lib/lsp/edit-requests-guard.d.ts +31 -0
- package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
- package/lib/lsp/edit-requests-guard.js +125 -0
- package/lib/lsp/edit-requests-guard.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +235 -102
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +6 -2
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +6 -2
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/save-text-document.d.ts +31 -0
- package/lib/lsp/save-text-document.d.ts.map +1 -0
- package/lib/lsp/save-text-document.js +52 -0
- package/lib/lsp/save-text-document.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +58 -2
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +98 -9
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +12 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +21 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +4 -6
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +4 -6
- package/lib/messages/carriers.js.map +1 -1
- package/lib/messages/index.d.ts +2 -2
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +2 -2
- package/lib/messages/index.js.map +1 -1
- package/lib/messages/renderer.d.ts +32 -7
- package/lib/messages/renderer.d.ts.map +1 -1
- package/lib/messages/renderer.js +7 -1
- package/lib/messages/renderer.js.map +1 -1
- package/lib/node/event-loop-monitor.d.ts.map +1 -1
- package/lib/node/event-loop-monitor.js +2 -1
- package/lib/node/event-loop-monitor.js.map +1 -1
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +5 -1
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/lint-grammar.js.map +1 -1
- package/lib/node/log-file-sink.d.ts +3 -2
- package/lib/node/log-file-sink.d.ts.map +1 -1
- package/lib/node/log-file-sink.js +6 -2
- package/lib/node/log-file-sink.js.map +1 -1
- package/lib/node/log-preamble-node.d.ts +5 -3
- package/lib/node/log-preamble-node.d.ts.map +1 -1
- package/lib/node/log-preamble-node.js +13 -10
- package/lib/node/log-preamble-node.js.map +1 -1
- package/lib/node/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +5 -4
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.d.ts +2 -2
- package/lib/node/memory-monitor.d.ts.map +1 -1
- package/lib/node/memory-monitor.js +9 -10
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +67 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +198 -53
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +12 -4
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +8 -6
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +13 -3
- package/lib/node/profiling-run.d.ts.map +1 -1
- package/lib/node/profiling-run.js +17 -8
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +61 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +80 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/server-diagnostics.js +1 -1
- package/lib/node/server-diagnostics.js.map +1 -1
- package/lib/node/server-state-snapshot.js +4 -4
- package/lib/node/server-state-snapshot.js.map +1 -1
- package/lib/node/socket-launcher.d.ts +43 -7
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +42 -7
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/startup-cpu-profile.d.ts +29 -0
- package/lib/node/startup-cpu-profile.d.ts.map +1 -0
- package/lib/node/startup-cpu-profile.js +91 -0
- package/lib/node/startup-cpu-profile.js.map +1 -0
- package/lib/node/stdio-launcher.d.ts +13 -13
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +21 -11
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/node/validate-workspace.d.ts +1 -1
- package/lib/node/validate-workspace.d.ts.map +1 -1
- package/lib/node/validate-workspace.js +5 -1
- package/lib/node/validate-workspace.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js +1 -1
- package/lib/testing/document-uri-policy-conformance.js.map +1 -1
- package/lib/testing/fake-description.js.map +1 -1
- package/lib/testing/fake-document.d.ts +2 -1
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/index.d.ts +1 -1
- package/lib/testing/index.d.ts.map +1 -1
- package/lib/testing/index.js +2 -1
- package/lib/testing/index.js.map +1 -1
- package/lib/testing/langium-test-helpers.d.ts.map +1 -1
- package/lib/testing/langium-test-helpers.js +1 -0
- package/lib/testing/langium-test-helpers.js.map +1 -1
- package/lib/testing/make-noop-language-services.js.map +1 -1
- package/lib/testing/make-noop-shared-services.d.ts +4 -4
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +4 -4
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +51 -20
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +29 -13
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/make-test-tracer.d.ts +12 -0
- package/lib/testing/make-test-tracer.d.ts.map +1 -1
- package/lib/testing/make-test-tracer.js +13 -0
- package/lib/testing/make-test-tracer.js.map +1 -1
- package/lib/testing/node/applied-edit-capture.d.ts +29 -0
- package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
- package/lib/testing/node/applied-edit-capture.js +117 -0
- package/lib/testing/node/applied-edit-capture.js.map +1 -0
- package/lib/testing/node/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +21 -6
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +49 -106
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +30 -1
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +39 -2
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/node/unhandled-rejections.d.ts +20 -0
- package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
- package/lib/testing/node/unhandled-rejections.js +32 -0
- package/lib/testing/node/unhandled-rejections.js.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
- package/lib/testing/playwright/e2e-profiling.js.map +1 -1
- package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.js +164 -0
- package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +1 -0
- package/lib/testing/playwright/index.d.ts.map +1 -1
- package/lib/testing/playwright/index.js +1 -0
- package/lib/testing/playwright/index.js.map +1 -1
- package/lib/testing/playwright/server-log-capture.d.ts +46 -16
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +111 -40
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
- package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-fixture.js +25 -6
- package/lib/testing/playwright/server-log-fixture.js.map +1 -1
- package/lib/testing/playwright/server-log-region.d.ts +15 -0
- package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-region.js +30 -0
- package/lib/testing/playwright/server-log-region.js.map +1 -0
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +8 -5
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/run-update-pipeline.js.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +11 -52
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +31 -62
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +33 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +103 -5
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +132 -16
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +9 -8
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +6 -6
- package/lib/testing/stub-model-service.js.map +1 -1
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-self-save-registry.d.ts +1 -1
- package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
- package/lib/testing/stub-service-registry.d.ts +1 -1
- package/lib/testing/stub-service-registry.js.map +1 -1
- package/lib/testing/stub-writable-file-system.d.ts +1 -1
- package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
- package/lib/testing/stub-writable-file-system.js +2 -1
- package/lib/testing/stub-writable-file-system.js.map +1 -1
- package/lib/util/connection-liveness.d.ts +22 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +74 -15
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts +7 -0
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js +15 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +41 -60
- package/src/browser/host-heads-in-worker.ts +218 -0
- package/src/browser/index.ts +17 -0
- package/src/browser/indexeddb-file-system-store.ts +192 -0
- package/src/browser/start-language-server-in-worker.ts +56 -0
- package/src/documents/ast-document-manager.ts +479 -233
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +24 -0
- package/src/documents/client-session-registry.ts +262 -0
- package/src/documents/dirty-state-tracker.ts +167 -0
- package/src/documents/document-release-handler.ts +404 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +74 -0
- package/src/documents/hydranium-text-documents.ts +1029 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +501 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +275 -0
- package/src/index.ts +7 -0
- package/src/langium/ast-extension/ast-extension-service.ts +77 -41
- package/src/langium/ast-extension/ast-node-builder.ts +35 -13
- package/src/langium/bootstrap.ts +87 -51
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
- package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
- package/src/langium/composite-ast-reflection.ts +112 -0
- package/src/langium/config/configuration-provider.ts +119 -0
- package/src/langium/config/index.ts +1 -0
- package/src/langium/diagnostics/console-tee.ts +151 -0
- package/src/langium/diagnostics/format-log-arg.ts +36 -0
- package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
- package/src/langium/diagnostics/log-preamble.ts +1 -1
- package/src/langium/diagnostics/logger.ts +51 -17
- package/src/langium/diagnostics/lsp-logger.ts +83 -44
- package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +615 -79
- package/src/langium/integration-services.ts +59 -28
- package/src/langium/integrity/integrity-rule.ts +17 -8
- package/src/langium/integrity/integrity-service.ts +332 -69
- package/src/langium/language-module.ts +49 -8
- package/src/langium/model-service/client-session.ts +726 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +80 -0
- package/src/langium/model-service/model-service.ts +878 -494
- package/src/langium/module.ts +195 -72
- package/src/langium/naming/name-provider.ts +34 -8
- package/src/langium/project/abstract-project-manager.ts +13 -5
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +54 -19
- package/src/langium/scope/fallback-scope.ts +38 -0
- package/src/langium/scope/hydranium-scope-computation.ts +45 -44
- package/src/langium/scope/hydranium-scope-provider.ts +228 -41
- package/src/langium/scope/index.ts +1 -0
- package/src/langium/scope/reference-candidate-provider.ts +6 -5
- package/src/langium/scope/scope-extension-service.ts +148 -56
- package/src/langium/scope/scoped-ast-node-description.ts +1 -3
- package/src/langium/serialization/abstract-serializer.ts +57 -41
- package/src/langium/serialization/json-serializer.ts +14 -3
- package/src/langium/serialization/serializer.ts +1 -1
- package/src/langium/serialization/yaml-serializer.ts +26 -4
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +16 -7
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +104 -47
- package/src/langium/trivia/comment-preserver.ts +1409 -0
- package/src/langium/trivia/document-ending-preserver.ts +71 -0
- package/src/langium/trivia/index.ts +14 -0
- package/src/langium/trivia/trivia-contribution.ts +39 -0
- package/src/langium/trivia/trivia-preserver.ts +56 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +312 -31
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/document-uri-policy.ts +32 -18
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +258 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +1 -0
- package/src/langium/workspace/initialize-workspace.ts +96 -4
- package/src/langium/workspace/langium-documents.ts +19 -1
- package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
- package/src/langium/workspace/self-save-registry.ts +118 -0
- package/src/langium/workspace/virtual-document.ts +106 -25
- package/src/langium/workspace/write-lock-scope.ts +27 -12
- package/src/launcher/integrated-server.ts +3 -1
- package/src/locale/server-locale.ts +20 -5
- package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
- package/src/lsp/connection-features.ts +67 -0
- package/src/lsp/diagnostics-connection.ts +56 -0
- package/src/lsp/edit-requests-guard.ts +152 -0
- package/src/lsp/hydranium-document-update-handler.ts +285 -111
- package/src/lsp/index.ts +6 -2
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/save-text-document.ts +63 -0
- package/src/lsp/semantic-token-provider.ts +146 -8
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +21 -7
- package/src/messages/carriers.ts +4 -6
- package/src/messages/index.ts +11 -2
- package/src/messages/renderer.ts +34 -6
- package/src/node/event-loop-monitor.ts +2 -1
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +5 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/log-file-sink.ts +6 -2
- package/src/node/log-preamble-node.ts +20 -10
- package/src/node/measure-memory.ts +5 -4
- package/src/node/memory-monitor.ts +10 -10
- package/src/node/node-file-system-provider.ts +214 -57
- package/src/node/profile-capture.ts +16 -15
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +94 -0
- package/src/node/server-diagnostics.ts +1 -1
- package/src/node/server-state-snapshot.ts +5 -5
- package/src/node/socket-launcher.ts +78 -14
- package/src/node/startup-cpu-profile.ts +94 -0
- package/src/node/stdio-launcher.ts +29 -19
- package/src/node/validate-workspace.ts +8 -2
- package/src/testing/document-uri-policy-conformance.ts +1 -1
- package/src/testing/fake-document.ts +2 -1
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-noop-shared-services.ts +6 -6
- package/src/testing/make-test-services.ts +93 -41
- package/src/testing/make-test-tracer.ts +26 -0
- package/src/testing/node/applied-edit-capture.ts +141 -0
- package/src/testing/node/index.ts +1 -0
- package/src/testing/node/lsp-harness.ts +2 -0
- package/src/testing/node/lsp-server-connection.ts +83 -119
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +57 -3
- package/src/testing/node/unhandled-rejections.ts +31 -0
- package/src/testing/parse-semantic-root.ts +1 -1
- package/src/testing/playwright/flaky-network-proxy.ts +240 -0
- package/src/testing/playwright/index.ts +1 -0
- package/src/testing/playwright/server-log-capture.ts +137 -47
- package/src/testing/playwright/server-log-fixture.ts +46 -6
- package/src/testing/playwright/server-log-region.ts +32 -0
- package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
- package/src/testing/run-update-pipeline.ts +8 -5
- package/src/testing/stub-ast-document-manager.ts +47 -128
- package/src/testing/stub-document-builder.ts +138 -18
- package/src/testing/stub-hydranium-text-documents.ts +184 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +11 -10
- package/src/testing/stub-self-save-registry.ts +1 -1
- package/src/testing/stub-service-registry.ts +1 -1
- package/src/testing/stub-writable-file-system.ts +3 -2
- package/src/util/connection-liveness.ts +80 -15
- package/src/util/environment.ts +24 -2
- package/lib/documents/language-client-text-shadow.d.ts +0 -101
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -156
- package/lib/documents/language-client-text-shadow.js.map +0 -1
- package/lib/documents/self-save-registry.d.ts +0 -55
- package/lib/documents/self-save-registry.d.ts.map +0 -1
- package/lib/documents/self-save-registry.js.map +0 -1
- package/lib/lsp/instrument-connection.d.ts +0 -36
- package/lib/lsp/instrument-connection.d.ts.map +0 -1
- package/lib/lsp/instrument-connection.js +0 -62
- package/lib/lsp/instrument-connection.js.map +0 -1
- package/lib/node/process-memory.d.ts +0 -66
- package/lib/node/process-memory.d.ts.map +0 -1
- package/lib/node/process-memory.js +0 -252
- package/lib/node/process-memory.js.map +0 -1
- package/src/documents/language-client-text-shadow.ts +0 -175
- package/src/documents/self-save-registry.ts +0 -81
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -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,23 @@ 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'
|
|
95
|
+
| 'markCreated'
|
|
96
|
+
| 'isUnsavedCreation'
|
|
72
97
|
> {
|
|
73
98
|
/**
|
|
74
99
|
* Stub-tailored read accessor. Returns just the surface the framework's
|
|
@@ -87,28 +112,46 @@ export interface StubHydraniumTextDocuments extends Pick<
|
|
|
87
112
|
onDidSave(listener: (event: { document: { uri: string }; clientId: string }) => void): Disposable;
|
|
88
113
|
/** Real-shaped close subscription — listener gets {@link ClientTextDocumentChangeEvent}. */
|
|
89
114
|
onDidClose(listener: (event: ClientTextDocumentChangeEvent<TextDocument>) => void): Disposable;
|
|
90
|
-
/** Pre-populate an open document without firing change events. */
|
|
115
|
+
/** Pre-populate an open document without firing change events; `text` is also its disk baseline. */
|
|
91
116
|
seedOpen(uri: string, text: string, clientId: string): void;
|
|
92
117
|
/** Mark `uri` as open in the LSP textual language client (drives {@link isOpenInLanguageClient}). */
|
|
93
118
|
seedOpenInLanguageClient(uri: string): void;
|
|
94
|
-
/**
|
|
119
|
+
/**
|
|
120
|
+
* Synchronously deliver `onDidClose` to subscribers, then `onDidReleaseDocument`
|
|
121
|
+
* when no client has `uri` open any more, then the dirty flip of a dropped
|
|
122
|
+
* holder: the real store's order. The stub keeps no release grace and runs
|
|
123
|
+
* no release handler, so the flip comes at once and without text, where the
|
|
124
|
+
* real store announces it once the handler settles, with text while the
|
|
125
|
+
* build still has the document.
|
|
126
|
+
*/
|
|
95
127
|
fireClose(uri: string, clientId: string): void;
|
|
96
|
-
/**
|
|
128
|
+
/**
|
|
129
|
+
* Drop recorded state. Useful for `beforeEach` resets.
|
|
130
|
+
*
|
|
131
|
+
* Sessions end without announcing it, so a model service built on this
|
|
132
|
+
* stub still holds the handles it started before the reset. Build a fresh
|
|
133
|
+
* service after a reset rather than reusing one across it.
|
|
134
|
+
*/
|
|
97
135
|
reset(): void;
|
|
98
136
|
readonly changes: readonly StubTextDocumentEntry[];
|
|
99
137
|
readonly saves: readonly { uri: string; clientId: string }[];
|
|
100
138
|
/**
|
|
101
139
|
* Decide what {@link applyEditToLanguageClient} answers, so a suite can drive
|
|
102
140
|
* 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
|
|
141
|
+
* buffer has outrun the version the push was addressed at. The push is still
|
|
142
|
+
* recorded in {@link appliedEdits} either way. Defaults to accepting; not
|
|
143
|
+
* called for a URI not open in the language client.
|
|
105
144
|
*
|
|
106
145
|
* The handler runs INSIDE the call, which is also the only place a suite can
|
|
107
146
|
* simulate something happening while the push is in flight — a newer settle,
|
|
108
147
|
* a concurrent client edit.
|
|
109
148
|
*/
|
|
110
149
|
setApplyEditHandler(handler: (uri: string, text: string) => ApplyWorkspaceEditResult | undefined): void;
|
|
111
|
-
/**
|
|
150
|
+
/**
|
|
151
|
+
* Replay of every push {@link applyEditToLanguageClient} sent (the text
|
|
152
|
+
* channel to Monaco): none for a URI not seeded open in the language client,
|
|
153
|
+
* as the real store sends none.
|
|
154
|
+
*/
|
|
112
155
|
readonly appliedEdits: readonly { uri: string; text: string; label?: string }[];
|
|
113
156
|
/** Replay of every {@link stagePendingContent} call (the not-yet-open staging path). */
|
|
114
157
|
readonly staged: readonly { uri: string; text: string }[];
|
|
@@ -125,8 +168,38 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
125
168
|
let applyEditHandler: (uri: string, text: string) => ApplyWorkspaceEditResult | undefined = () => ({ applied: true });
|
|
126
169
|
const saveListeners: Array<(event: { document: { uri: string }; clientId: string }) => void> = [];
|
|
127
170
|
const closeListeners: Array<(event: ClientTextDocumentChangeEvent<TextDocument>) => void> = [];
|
|
171
|
+
// The real registry, so the session table, the opens and the closing state
|
|
172
|
+
// behave as the store's do. The stub's plain-string keys
|
|
173
|
+
// stand in for canonical URIs (one stub-boundary cast, like `fireClose`).
|
|
174
|
+
const sessions = new ClientSessionRegistry();
|
|
175
|
+
const key = (uri: string): CanonicalUri => uri as CanonicalUri;
|
|
176
|
+
const documentReleased = new Emitter<DocumentReleasedEvent>();
|
|
177
|
+
const baselines = new Map<string, string | undefined>();
|
|
178
|
+
const created = new Set<string>();
|
|
179
|
+
const openedVersions = new Map<string, number>();
|
|
180
|
+
const dirty = new Set<string>();
|
|
181
|
+
const dirtyChanged = new Emitter<DocumentDirtyChangedEvent>();
|
|
182
|
+
// As the real store: dirty while held with text other than the baseline,
|
|
183
|
+
// announced only when the answer changes.
|
|
184
|
+
const refreshDirty = (uri: string): void => {
|
|
185
|
+
const held = docs.get(uri);
|
|
186
|
+
const now = held !== undefined && held.text !== baselines.get(uri);
|
|
187
|
+
if (now !== dirty.has(uri)) {
|
|
188
|
+
if (now) {
|
|
189
|
+
dirty.add(uri);
|
|
190
|
+
} else {
|
|
191
|
+
dirty.delete(uri);
|
|
192
|
+
}
|
|
193
|
+
// No build behind the stub, so a document no longer held is announced without text.
|
|
194
|
+
dirtyChanged.fire(
|
|
195
|
+
held === undefined
|
|
196
|
+
? { uri: key(uri) }
|
|
197
|
+
: { uri: key(uri), text: { version: held.version, hash: textHash(held.text), dirty: now } }
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
128
201
|
|
|
129
|
-
|
|
202
|
+
const stub: StubHydraniumTextDocuments = {
|
|
130
203
|
get changes() {
|
|
131
204
|
return changes;
|
|
132
205
|
},
|
|
@@ -146,6 +219,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
146
219
|
version(uri) {
|
|
147
220
|
return docs.get(uri)?.version ?? 0;
|
|
148
221
|
},
|
|
222
|
+
openedVersion(uri) {
|
|
223
|
+
return docs.has(uri) ? openedVersions.get(uri) : undefined;
|
|
224
|
+
},
|
|
225
|
+
textState(uri) {
|
|
226
|
+
const held = docs.get(uri);
|
|
227
|
+
return held && { version: held.version, hash: textHash(held.text), dirty: dirty.has(uri) };
|
|
228
|
+
},
|
|
149
229
|
notifyDidChangeTextDocument(event, clientId = LANGUAGE_CLIENT_ID) {
|
|
150
230
|
const existing = docs.get(event.textDocument.uri);
|
|
151
231
|
const next: StubTextDocumentEntry = {
|
|
@@ -159,6 +239,7 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
159
239
|
}
|
|
160
240
|
docs.set(event.textDocument.uri, next);
|
|
161
241
|
changes.push(next);
|
|
242
|
+
refreshDirty(event.textDocument.uri);
|
|
162
243
|
},
|
|
163
244
|
applyContentChange(uri, text, clientId) {
|
|
164
245
|
const existing = docs.get(uri);
|
|
@@ -172,9 +253,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
172
253
|
const next: StubTextDocumentEntry = changed ? { uri, version: existing.version + 1, text, clientId } : existing;
|
|
173
254
|
docs.set(uri, next);
|
|
174
255
|
changes.push({ uri, version: next.version, text, clientId });
|
|
256
|
+
refreshDirty(uri);
|
|
175
257
|
return next.version;
|
|
176
258
|
},
|
|
177
259
|
notifyDidSaveTextDocument(event, clientId) {
|
|
260
|
+
if (event.text !== undefined) {
|
|
261
|
+
stub.setDiskBaseline(event.textDocument.uri, event.text);
|
|
262
|
+
}
|
|
178
263
|
saves.push({ uri: event.textDocument.uri, clientId });
|
|
179
264
|
for (const listener of saveListeners.slice()) {
|
|
180
265
|
listener({ document: { uri: event.textDocument.uri }, clientId });
|
|
@@ -207,26 +292,74 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
207
292
|
isOpenInAnyClient(uri) {
|
|
208
293
|
return docs.has(uri) || languageClientOpen.has(uri);
|
|
209
294
|
},
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
295
|
+
isOpenInClient(uri, clientId) {
|
|
296
|
+
return sessions.isOpenIn(key(uri), clientId);
|
|
297
|
+
},
|
|
298
|
+
isReleaseDeferred() {
|
|
299
|
+
// The stub keeps no release grace.
|
|
300
|
+
return false;
|
|
301
|
+
},
|
|
302
|
+
attachClient(uri, clientId) {
|
|
303
|
+
return docs.has(uri) && sessions.addOpen(key(uri), clientId);
|
|
304
|
+
},
|
|
305
|
+
registerSession(clientId) {
|
|
306
|
+
sessions.register(clientId);
|
|
307
|
+
},
|
|
308
|
+
closeSession(clientId, cause) {
|
|
309
|
+
if (!sessions.isRegistered(clientId)) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
try {
|
|
313
|
+
for (const uri of sessions.beginClose(clientId)) {
|
|
314
|
+
stub.fireClose(uri, clientId);
|
|
315
|
+
}
|
|
316
|
+
} finally {
|
|
317
|
+
sessions.unregister(clientId, cause);
|
|
216
318
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
319
|
+
},
|
|
320
|
+
get onDidCloseSession() {
|
|
321
|
+
return sessions.onDidCloseSession;
|
|
322
|
+
},
|
|
323
|
+
get onDidReleaseDocument() {
|
|
324
|
+
return documentReleased.event;
|
|
325
|
+
},
|
|
326
|
+
isDirty(uri) {
|
|
327
|
+
return dirty.has(uri);
|
|
328
|
+
},
|
|
329
|
+
get onDidChangeDirty() {
|
|
330
|
+
return dirtyChanged.event;
|
|
331
|
+
},
|
|
332
|
+
setDiskBaseline(uri, text) {
|
|
333
|
+
if (docs.has(uri)) {
|
|
334
|
+
baselines.set(uri, text);
|
|
335
|
+
if (text !== undefined) {
|
|
336
|
+
created.delete(uri);
|
|
337
|
+
}
|
|
338
|
+
refreshDirty(uri);
|
|
221
339
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
340
|
+
},
|
|
341
|
+
markCreated(uri) {
|
|
342
|
+
if (docs.has(uri)) {
|
|
343
|
+
baselines.set(uri, undefined);
|
|
344
|
+
created.add(uri);
|
|
345
|
+
refreshDirty(uri);
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
isUnsavedCreation(uri) {
|
|
349
|
+
return created.has(uri);
|
|
350
|
+
},
|
|
351
|
+
openDocuments() {
|
|
352
|
+
// From the registry that also answers `isOpenInClient`, which both
|
|
353
|
+
// seeding channels feed, so the two never disagree about an open.
|
|
354
|
+
return sessions.openDocuments();
|
|
225
355
|
},
|
|
226
356
|
setApplyEditHandler(handler) {
|
|
227
357
|
applyEditHandler = handler;
|
|
228
358
|
},
|
|
229
359
|
async applyEditToLanguageClient(uri, newText, options): Promise<ApplyWorkspaceEditResult | undefined> {
|
|
360
|
+
if (!languageClientOpen.has(uri)) {
|
|
361
|
+
return undefined;
|
|
362
|
+
}
|
|
230
363
|
appliedEdits.push({ uri, text: newText, label: options?.label });
|
|
231
364
|
return applyEditHandler(uri, newText);
|
|
232
365
|
},
|
|
@@ -234,9 +367,14 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
234
367
|
staged.push({ uri, text });
|
|
235
368
|
},
|
|
236
369
|
seedOpen(uri, text, clientId) {
|
|
370
|
+
sessions.addOpen(key(uri), clientId);
|
|
237
371
|
docs.set(uri, { uri, version: 1, text, clientId });
|
|
372
|
+
openedVersions.set(uri, 1);
|
|
373
|
+
baselines.set(uri, text);
|
|
374
|
+
created.delete(uri);
|
|
238
375
|
},
|
|
239
376
|
seedOpenInLanguageClient(uri) {
|
|
377
|
+
sessions.addOpen(key(uri), LANGUAGE_CLIENT_ID);
|
|
240
378
|
languageClientOpen.add(uri);
|
|
241
379
|
},
|
|
242
380
|
fireClose(uri, clientId) {
|
|
@@ -244,9 +382,12 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
244
382
|
// class: listeners detect the last-close transition by consulting
|
|
245
383
|
// `isOpenInAnyClient`, which reads the already-decremented state.
|
|
246
384
|
const holder = docs.get(uri);
|
|
247
|
-
|
|
385
|
+
const dropped = holder !== undefined && holder.clientId === clientId;
|
|
386
|
+
if (dropped) {
|
|
248
387
|
docs.delete(uri);
|
|
388
|
+
created.delete(uri);
|
|
249
389
|
}
|
|
390
|
+
const removed = sessions.removeOpen(key(uri), clientId);
|
|
250
391
|
if (clientId === LANGUAGE_CLIENT_ID) {
|
|
251
392
|
languageClientOpen.delete(uri);
|
|
252
393
|
}
|
|
@@ -254,6 +395,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
254
395
|
for (const listener of closeListeners.slice()) {
|
|
255
396
|
listener(event);
|
|
256
397
|
}
|
|
398
|
+
if (removed && !sessions.isOpen(key(uri))) {
|
|
399
|
+
documentReleased.fire({ uri: key(uri) });
|
|
400
|
+
}
|
|
401
|
+
// After the release event, in the order the real store announces them.
|
|
402
|
+
if (dropped) {
|
|
403
|
+
refreshDirty(uri);
|
|
404
|
+
}
|
|
257
405
|
},
|
|
258
406
|
reset() {
|
|
259
407
|
docs.clear();
|
|
@@ -262,9 +410,18 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
|
|
|
262
410
|
languageClientOpen.clear();
|
|
263
411
|
appliedEdits.length = 0;
|
|
264
412
|
staged.length = 0;
|
|
413
|
+
baselines.clear();
|
|
414
|
+
created.clear();
|
|
415
|
+
openedVersions.clear();
|
|
416
|
+
dirty.clear();
|
|
265
417
|
saveListeners.length = 0;
|
|
266
418
|
closeListeners.length = 0;
|
|
267
419
|
applyEditHandler = () => ({ applied: true });
|
|
420
|
+
// Cleared in place rather than replaced: a model service built on the
|
|
421
|
+
// stub subscribed to `onDidCloseSession` once, and a new registry would
|
|
422
|
+
// leave that subscription on one nothing fires.
|
|
423
|
+
sessions.clear();
|
|
268
424
|
}
|
|
269
425
|
};
|
|
426
|
+
return stub;
|
|
270
427
|
}
|
|
@@ -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,16 +53,16 @@ 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
|
-
* surface is {@link
|
|
60
|
-
* subclass {@link
|
|
60
|
+
* surface is {@link DefaultModelService.rewriteModel} alongside `serialize` —
|
|
61
|
+
* should subclass {@link DefaultModelService} directly instead.
|
|
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,8 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import type { URI } from '@hydranium/langium';
|
|
11
|
-
import
|
|
11
|
+
import { SystemClock } from '@hydranium/protocol';
|
|
12
|
+
import type { WritableFileSystemProvider } from '../langium/workspace/file-system-provider.js';
|
|
12
13
|
import type { StubSelfSaveRegistry } from './stub-self-save-registry.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
@@ -49,7 +50,7 @@ export function makeStubWritableFileSystem(selfSaveRegistry?: StubSelfSaveRegist
|
|
|
49
50
|
readDirectory: async () => [],
|
|
50
51
|
async writeFile(uri: URI, content: string) {
|
|
51
52
|
writes.push({ uri: uri.toString(), content });
|
|
52
|
-
selfSaveRegistry?.register(uri.fsPath,
|
|
53
|
+
selfSaveRegistry?.register(uri.fsPath, new SystemClock().now());
|
|
53
54
|
},
|
|
54
55
|
reset() {
|
|
55
56
|
writes.length = 0;
|
|
@@ -7,41 +7,106 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
+
import { describeError } from '@hydranium/protocol';
|
|
11
|
+
|
|
10
12
|
/**
|
|
11
|
-
* Phrases
|
|
12
|
-
*
|
|
13
|
+
* Phrases that mean a call lost its connection. Matched on the message because
|
|
14
|
+
* the condition surfaces in shapes that share no discriminator:
|
|
13
15
|
*
|
|
14
16
|
* - a **throw** from `throwIfClosedOrDisposed` (`Connection is disposed.` /
|
|
15
17
|
* `Connection is closed.`), a `ConnectionError` raised synchronously by
|
|
16
18
|
* `sendRequest` / `sendNotification` and by `RemoteConsole.send`;
|
|
17
19
|
* - a **rejection** of an already-issued request (`Pending response rejected
|
|
18
20
|
* since connection got disposed`), a `ResponseError` produced when the
|
|
19
|
-
* pending-response map is drained on teardown
|
|
21
|
+
* pending-response map is drained on teardown;
|
|
22
|
+
* - a **write into a destroyed transport** (`Cannot call write after a stream
|
|
23
|
+
* was destroyed`), Node's own error for a message the writer queued before
|
|
24
|
+
* the connection was disposed and flushed after its stream was destroyed.
|
|
25
|
+
* A notification rejects with Node's error itself, which
|
|
26
|
+
* {@link isDestroyedStreamError} catches by its code; a request rejects with
|
|
27
|
+
* a `ResponseError` that copies only the message, so the phrase is needed
|
|
28
|
+
* too.
|
|
20
29
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
30
|
+
* The typed errors come from different classes carrying codes from different
|
|
31
|
+
* enums, so no single code check covers them. Kept lowercase-normalised and
|
|
32
|
+
* anchored on `connection` or `stream` so an unrelated "disposed" message
|
|
33
|
+
* cannot match.
|
|
25
34
|
*/
|
|
26
|
-
const CONNECTION_GONE_PATTERNS = [
|
|
35
|
+
const CONNECTION_GONE_PATTERNS = [
|
|
36
|
+
/connection is disposed/,
|
|
37
|
+
/connection is closed/,
|
|
38
|
+
/connection got disposed/,
|
|
39
|
+
/connection got closed/,
|
|
40
|
+
/after a stream was destroyed/
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const DESTROYED_STREAM_CODE = 'ERR_STREAM_DESTROYED';
|
|
44
|
+
|
|
45
|
+
function isDestroyedStreamError(err: unknown): boolean {
|
|
46
|
+
return errorCode(err) === DESTROYED_STREAM_CODE;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** `err.code` where `err` is an `Error`, or `undefined` where reading it throws, as a getter or a revoked proxy can. */
|
|
50
|
+
function errorCode(err: unknown): unknown {
|
|
51
|
+
try {
|
|
52
|
+
return err instanceof Error && 'code' in err ? err.code : undefined;
|
|
53
|
+
} catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
27
57
|
|
|
28
58
|
/**
|
|
29
59
|
* Whether `err` means "the peer is gone", as opposed to a genuine failure of
|
|
30
60
|
* the operation.
|
|
31
61
|
*
|
|
32
|
-
* The
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
62
|
+
* The two are indistinguishable at the call site otherwise, and callers act on
|
|
63
|
+
* the answer: a gone peer is logged at `debug` or dropped, a genuine failure is
|
|
64
|
+
* logged at `error` or re-raised as an unhandled rejection. Pushing an edit to
|
|
65
|
+
* a language client that has already disconnected is a no-op, not a fault — it
|
|
66
|
+
* happens on every ordinary shutdown — so a `false` here turns routine teardown
|
|
67
|
+
* into errors that look like they need investigation. A `true` for a real
|
|
68
|
+
* `applyEdit` failure (the client refused, the request malformed) hides it.
|
|
69
|
+
*
|
|
70
|
+
* Never throws, nor does {@link isClientGoneError}: a caller classifying a
|
|
71
|
+
* failure would otherwise lose it to a getter or proxy trap of the error.
|
|
38
72
|
*
|
|
39
73
|
* Callers that only need to *survive* a dead connection rather than classify it
|
|
40
74
|
* should just catch — see `LspLogger.emit`, whose fallback path does exactly
|
|
41
75
|
* that, since a logger has nowhere to report a logging failure anyway.
|
|
42
76
|
*/
|
|
43
77
|
export function isConnectionGoneError(err: unknown): boolean {
|
|
44
|
-
|
|
78
|
+
if (isDestroyedStreamError(err)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
const message = describeError(err);
|
|
45
82
|
const normalized = message.toLowerCase();
|
|
46
83
|
return CONNECTION_GONE_PATTERNS.some(pattern => pattern.test(normalized));
|
|
47
84
|
}
|
|
85
|
+
|
|
86
|
+
const SOCKET_GONE_CODES = new Set(['EPIPE', 'ECONNRESET']);
|
|
87
|
+
|
|
88
|
+
/** `write EPIPE` / `read ECONNRESET`, as a request's `ResponseError` copies the message. */
|
|
89
|
+
const SOCKET_GONE_PATTERN = /\b(epipe|econnreset)\b/;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Whether `err` means the client a connection serves has gone: what
|
|
93
|
+
* {@link isConnectionGoneError} recognises, or a write to a socket the client
|
|
94
|
+
* closed (`EPIPE`, `ECONNRESET`), matched by code or, for a request, by the
|
|
95
|
+
* code's name in the message.
|
|
96
|
+
*
|
|
97
|
+
* Only for a call whose errors can come from that connection alone. A socket
|
|
98
|
+
* error names no peer, so where a file system or another socket can fail the
|
|
99
|
+
* same call, it is a genuine failure and {@link isConnectionGoneError} is the
|
|
100
|
+
* one to ask.
|
|
101
|
+
*/
|
|
102
|
+
export function isClientGoneError(err: unknown): boolean {
|
|
103
|
+
if (isConnectionGoneError(err)) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
const code = errorCode(err);
|
|
107
|
+
if (typeof code === 'string' && SOCKET_GONE_CODES.has(code)) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
const message = describeError(err);
|
|
111
|
+
return SOCKET_GONE_PATTERN.test(message.toLowerCase());
|
|
112
|
+
}
|
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
|
|
@@ -57,6 +65,20 @@ export function onProcessEvent(event: ProcessEvent, handler: (...args: unknown[]
|
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Whether a Node-like `process` exposes a writable standard error. A stricter
|
|
70
|
+
* test for Node than {@link processEnv}, since a bundler can shim
|
|
71
|
+
* `process.env` into a browser build without a writable stderr. `false`
|
|
72
|
+
* where reading the stderr throws, as a shim's getter can.
|
|
73
|
+
*/
|
|
74
|
+
export function hasProcessStderr(): boolean {
|
|
75
|
+
try {
|
|
76
|
+
return typeof process !== 'undefined' && !!process.stderr && typeof process.stderr.write === 'function';
|
|
77
|
+
} catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
60
82
|
/**
|
|
61
83
|
* Write already-formatted text to the process's standard error, when a
|
|
62
84
|
* Node-like `process` exposes one. Returns `true` when the text was written and
|
|
@@ -69,7 +91,7 @@ export function onProcessEvent(event: ProcessEvent, handler: (...args: unknown[]
|
|
|
69
91
|
* process inherits when it spawns a head as a child.
|
|
70
92
|
*/
|
|
71
93
|
export function writeStderr(text: string): boolean {
|
|
72
|
-
if (
|
|
94
|
+
if (!hasProcessStderr()) {
|
|
73
95
|
return false;
|
|
74
96
|
}
|
|
75
97
|
process.stderr.write(text);
|