@hydranium/core 1.0.0-next.39 → 1.0.0-next.391
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 +254 -140
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +311 -128
- 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 +40 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +453 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +918 -504
- 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 +153 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +186 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -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 +75 -36
- 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 +141 -0
- package/lib/langium/diagnostics/console-tee.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 -46
- 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 +43 -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 +390 -40
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +635 -102
- 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 +20 -23
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +22 -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 +217 -29
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +588 -84
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +3 -2
- package/lib/langium/keys/containment.d.ts.map +1 -1
- package/lib/langium/keys/containment.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +24 -12
- 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 +21 -5
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +405 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +479 -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 +68 -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 +441 -323
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +602 -407
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +96 -37
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +41 -29
- 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 +184 -13
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +336 -16
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +22 -3
- package/lib/langium/project/project-change-event.d.ts.map +1 -1
- package/lib/langium/project/project-manager.d.ts +28 -2
- package/lib/langium/project/project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.d.ts +7 -1
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js +12 -0
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +92 -52
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +154 -58
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js +88 -15
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/built-local-symbols.d.ts +12 -0
- package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
- package/lib/langium/scope/built-local-symbols.js +11 -0
- package/lib/langium/scope/built-local-symbols.js.map +1 -0
- 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 +122 -32
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +217 -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 +10 -4
- 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 +60 -39
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +35 -24
- 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 +1165 -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/ast-node-locator.d.ts +24 -0
- package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
- package/lib/langium/workspace/ast-node-locator.js +32 -0
- package/lib/langium/workspace/ast-node-locator.js.map +1 -0
- 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 +78 -4
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +188 -5
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +50 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +73 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +105 -21
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +186 -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 +3 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +3 -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/{documents → langium/workspace}/self-save-registry.d.ts +7 -9
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +9 -11
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/syntax-errors.d.ts +23 -0
- package/lib/langium/workspace/syntax-errors.d.ts.map +1 -0
- package/lib/langium/workspace/syntax-errors.js +29 -0
- package/lib/langium/workspace/syntax-errors.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 +6 -6
- package/lib/locale/server-locale.d.ts.map +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 +234 -101
- 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 +10 -4
- package/lib/messages/renderer.d.ts.map +1 -1
- package/lib/messages/renderer.js +6 -0
- 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 +3 -2
- 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.d.ts +6 -5
- package/lib/node/server-state-snapshot.d.ts.map +1 -1
- package/lib/node/server-state-snapshot.js +20 -17
- 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.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +45 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +23 -7
- 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 +4 -1
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +4 -1
- 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 +2 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +12 -6
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/settle-server.d.ts +33 -0
- package/lib/testing/node/settle-server.d.ts.map +1 -0
- package/lib/testing/node/settle-server.js +84 -0
- package/lib/testing/node/settle-server.js.map +1 -0
- 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/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 -51
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +31 -59
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +25 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +91 -2
- 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 +8 -7
- 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.d.ts.map +1 -1
- package/lib/testing/stub-project-manager.js +10 -0
- 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 +75 -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 +477 -250
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +26 -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 +77 -0
- package/src/documents/hydranium-text-documents.ts +1044 -615
- 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 +304 -0
- package/src/index.ts +3 -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 +79 -43
- 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 +150 -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 -45
- package/src/langium/document-builder/build-pipeline-integration.ts +57 -32
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +773 -106
- package/src/langium/integration-services.ts +20 -23
- package/src/langium/integrity/integrity-rule.ts +22 -8
- package/src/langium/integrity/integrity-service.ts +656 -90
- package/src/langium/keys/containment.ts +3 -2
- package/src/langium/keys/name-based-key-provider.ts +24 -12
- package/src/langium/language-module.ts +52 -9
- package/src/langium/model-service/client-session.ts +769 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +82 -0
- package/src/langium/model-service/model-service.ts +885 -532
- package/src/langium/module.ts +141 -65
- package/src/langium/naming/name-provider.ts +34 -8
- package/src/langium/project/abstract-project-manager.ts +409 -20
- package/src/langium/project/project-change-event.ts +25 -3
- package/src/langium/project/project-manager.ts +31 -2
- package/src/langium/project/single-project-manager.ts +16 -1
- package/src/langium/residency/cst-residency-service.ts +210 -87
- package/src/langium/scope/ast-node-description-provider.ts +111 -16
- package/src/langium/scope/built-local-symbols.ts +13 -0
- 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 +245 -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 +13 -4
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +76 -50
- package/src/langium/trivia/comment-preserver.ts +1410 -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/ast-node-locator.ts +33 -0
- 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 +239 -4
- package/src/langium/workspace/hydranium-workspace-lock.ts +101 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +214 -35
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +3 -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/{documents → langium/workspace}/self-save-registry.ts +12 -14
- package/src/langium/workspace/syntax-errors.ts +34 -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 +6 -6
- 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 +284 -110
- 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 +11 -3
- package/src/node/event-loop-monitor.ts +3 -4
- 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 +28 -20
- 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-test-services.ts +83 -31
- 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 +4 -1
- 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 +12 -6
- package/src/testing/node/settle-server.ts +89 -0
- package/src/testing/node/spawned-server.ts +57 -3
- 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 -123
- package/src/testing/stub-document-builder.ts +128 -15
- 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 +9 -8
- package/src/testing/stub-project-manager.ts +10 -0
- 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 +81 -15
- package/src/util/environment.ts +24 -2
- package/lib/documents/language-client-text-shadow.d.ts +0 -124
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -190
- 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 -211
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
import { DefaultWorkspaceLock } from '@hydranium/langium';
|
|
10
10
|
import { runInWriteLockScope } from './write-lock-scope.js';
|
|
11
|
+
const DEFAULT_STALLED_WRITE_WARN_MS = 10_000;
|
|
11
12
|
/**
|
|
12
13
|
* Langium's {@link DefaultWorkspaceLock} with the write action marked as a
|
|
13
14
|
* write-lock scope, so anything it reaches can be asked whether the lock is
|
|
@@ -26,8 +27,79 @@ import { runInWriteLockScope } from './write-lock-scope.js';
|
|
|
26
27
|
* would turn ordinary read-then-write sequences into false positives.
|
|
27
28
|
*/
|
|
28
29
|
export class HydraniumWorkspaceLock extends DefaultWorkspaceLock {
|
|
30
|
+
/** Backs {@link writeCancellations}. */
|
|
31
|
+
cancelledWriteCount = 0;
|
|
32
|
+
clock;
|
|
33
|
+
tracer;
|
|
34
|
+
stalledWriteWarnMs;
|
|
35
|
+
runningWrite;
|
|
36
|
+
/** Writes queued and not yet started. */
|
|
37
|
+
queuedWrites = 0;
|
|
38
|
+
constructor(services, options = {}) {
|
|
39
|
+
super();
|
|
40
|
+
this.clock = services.Clock;
|
|
41
|
+
this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceLock');
|
|
42
|
+
this.stalledWriteWarnMs = options.stalledWriteWarnMs ?? DEFAULT_STALLED_WRITE_WARN_MS;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* How many calls to `write` or `cancelWrite` came while a write was still
|
|
46
|
+
* queued or running. A caller that reads this right after queuing a
|
|
47
|
+
* write, and reads the same number later, holds a write nothing has
|
|
48
|
+
* cancelled, whether it is still queued or already running. Its token
|
|
49
|
+
* answers that only once the write runs, since a queued write has not been
|
|
50
|
+
* handed it yet. A different number read after the caller's write ended
|
|
51
|
+
* does not prove that write was cancelled, since a later write that
|
|
52
|
+
* cancels another queued or running write counts too. A caller that
|
|
53
|
+
* retries on it builds once more than it needs to.
|
|
54
|
+
*/
|
|
55
|
+
get writeCancellations() {
|
|
56
|
+
return this.cancelledWriteCount;
|
|
57
|
+
}
|
|
29
58
|
write(action) {
|
|
30
|
-
|
|
59
|
+
const queued = super.write(token => {
|
|
60
|
+
this.queuedWrites--;
|
|
61
|
+
return runInWriteLockScope(() => this.runWrite(action, token));
|
|
62
|
+
});
|
|
63
|
+
// Counted after Langium's `write` has cancelled the write before it, so the new write does not count itself.
|
|
64
|
+
this.queuedWrites++;
|
|
65
|
+
return queued;
|
|
66
|
+
}
|
|
67
|
+
/** Run `action` as {@link runningWrite}, so a cancellation while it runs can time it. */
|
|
68
|
+
async runWrite(action, token) {
|
|
69
|
+
const running = {};
|
|
70
|
+
this.runningWrite = running;
|
|
71
|
+
try {
|
|
72
|
+
await action(token);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
running.stallTimer?.dispose();
|
|
76
|
+
if (this.runningWrite === running) {
|
|
77
|
+
this.runningWrite = undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Counted here rather than in {@link write}, because Langium's `write` cancels
|
|
83
|
+
* through this method too. A write that has ended is not counted, so the
|
|
84
|
+
* next write does not count as cancelling it. A write running when this is
|
|
85
|
+
* called has been cancelled, by this call or an earlier one, so its timer
|
|
86
|
+
* starts here.
|
|
87
|
+
*/
|
|
88
|
+
cancelWrite() {
|
|
89
|
+
if (this.queuedWrites > 0 || this.runningWrite !== undefined) {
|
|
90
|
+
this.cancelledWriteCount++;
|
|
91
|
+
}
|
|
92
|
+
const running = this.runningWrite;
|
|
93
|
+
if (running && !running.stallTimer && this.stalledWriteWarnMs > 0) {
|
|
94
|
+
running.stallTimer = this.clock.setTimer(() => this.reportStalledWrite(), this.stalledWriteWarnMs);
|
|
95
|
+
}
|
|
96
|
+
super.cancelWrite();
|
|
97
|
+
}
|
|
98
|
+
reportStalledWrite() {
|
|
99
|
+
this.tracer.warn(`A write is still running ${this.stalledWriteWarnMs} ms after it was cancelled, and every write and read waits behind it. ` +
|
|
100
|
+
'Likely causes: a model-service write or rebuild from inside a build in a host with no write-lock scope tracker, ' +
|
|
101
|
+
'which waits for the build it runs in, or a write action that ignores its cancellation token. ' +
|
|
102
|
+
'See https://github.com/eclipse-emfcloud/hydranium/issues/245.');
|
|
31
103
|
}
|
|
32
104
|
}
|
|
33
105
|
//# sourceMappingURL=hydranium-workspace-lock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydranium-workspace-lock.js","sourceRoot":"","sources":["../../../src/langium/workspace/hydranium-workspace-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;
|
|
1
|
+
{"version":3,"file":"hydranium-workspace-lock.js","sourceRoot":"","sources":["../../../src/langium/workspace/hydranium-workspace-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAGlF,OAAO,EAAE,oBAAoB,EAAqB,MAAM,oBAAoB,CAAC;AAI7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAa5D,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAO7C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,sBAAuB,SAAQ,oBAAoB;IAC7D,wCAAwC;IAC9B,mBAAmB,GAAG,CAAC,CAAC;IACf,KAAK,CAAQ;IACb,MAAM,CAAS;IACf,kBAAkB,CAAS;IACpC,YAAY,CAAgB;IACtC,yCAAyC;IAC/B,YAAY,GAAG,CAAC,CAAC;IAE3B,YAAY,QAA+D,EAAE,OAAO,GAAkC,EAAE;QACrH,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC;QACtE,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,6BAA6B,CAAC;IACzF,CAAC;IAED;;;;;;;;;;OAUG;IACH,IAAI,kBAAkB;QACnB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACnC,CAAC;IAEQ,KAAK,CAAC,MAAwD;QACpE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAChC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,6GAA6G;QAC7G,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IACjB,CAAC;IAED,yFAAyF;IAC/E,KAAK,CAAC,QAAQ,CAAC,MAAwD,EAAE,KAAwB;QACxG,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC;YACF,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACR,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YACjC,CAAC;QACJ,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACM,WAAW;QACjB,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC5D,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;QAClC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtG,CAAC;QACD,KAAK,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAES,kBAAkB;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CACb,4BAA4B,IAAI,CAAC,kBAAkB,wEAAwE;YACxH,kHAAkH;YAClH,+FAA+F;YAC/F,+DAA+D,CACpE,CAAC;IACL,CAAC;CACH"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
import { Deferred, type Logger, type Tracer } from '@hydranium/protocol';
|
|
10
|
-
import { DefaultWorkspaceManager, type LangiumDocument, type URI } from '@hydranium/langium';
|
|
10
|
+
import { DefaultWorkspaceManager, type LangiumDocument, type Stream, type URI } from '@hydranium/langium';
|
|
11
11
|
import { type CancellationToken, type InitializeParams } from 'vscode-languageserver';
|
|
12
12
|
import type { WorkspaceFolder } from 'vscode-languageserver-types';
|
|
13
13
|
import { type LogNameOptions } from '../diagnostics/logger.js';
|
|
@@ -15,7 +15,7 @@ import type { ServerLocale } from '../../locale/server-locale.js';
|
|
|
15
15
|
import type { ProjectChangeEvent } from '../project/project-change-event.js';
|
|
16
16
|
import type { ProjectManager } from '../project/project-manager.js';
|
|
17
17
|
import type { ServerSharedServicesMinimal } from '../shared-services.js';
|
|
18
|
-
import type { WritableFileSystemProvider } from '
|
|
18
|
+
import type { WritableFileSystemProvider } from './file-system-provider.js';
|
|
19
19
|
import { type DocumentUriPolicy } from './document-uri-policy.js';
|
|
20
20
|
import { type AdditionalDocumentContribution } from './additional-document-contribution.js';
|
|
21
21
|
/**
|
|
@@ -54,6 +54,17 @@ export declare function handleProcessUnhandledRejection(reason: unknown, logger:
|
|
|
54
54
|
* Applies to every Langium-based server that experiences concurrent builds.
|
|
55
55
|
*/
|
|
56
56
|
export declare function installOperationCancelledSuppression(logger: Logger): void;
|
|
57
|
+
/** Options for {@link HydraniumWorkspaceManager}. */
|
|
58
|
+
export interface HydraniumWorkspaceManagerOptions extends LogNameOptions {
|
|
59
|
+
/**
|
|
60
|
+
* Whether startup warns about seeded documents the bound
|
|
61
|
+
* `FileSystemProvider` cannot serve (see
|
|
62
|
+
* {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved}). Defaults to
|
|
63
|
+
* `true`; turn it off for a host that drops such documents at their last
|
|
64
|
+
* close on purpose.
|
|
65
|
+
*/
|
|
66
|
+
warnUnservedDocuments?: boolean;
|
|
67
|
+
}
|
|
57
68
|
/**
|
|
58
69
|
* Framework {@link DefaultWorkspaceManager} subclass that integrates the
|
|
59
70
|
* project tier with Langium's workspace startup.
|
|
@@ -86,8 +97,9 @@ export declare function installOperationCancelledSuppression(logger: Logger): vo
|
|
|
86
97
|
* URIs (its own members plus any transitive dependents per the
|
|
87
98
|
* `getAffectedProjects` hook). This manager re-runs
|
|
88
99
|
* `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
|
|
89
|
-
* affected document so the
|
|
90
|
-
* visibility scope.
|
|
100
|
+
* affected document so the build of the update that changed the descriptor
|
|
101
|
+
* re-links them with the new visibility scope. A project manager that defers
|
|
102
|
+
* the relink emits them from a follow-up build of its own instead.
|
|
91
103
|
*
|
|
92
104
|
* Descriptor URIs that triggered the cycle are intentionally excluded
|
|
93
105
|
* from the affected set by `AbstractProjectManager.onBuildUpdate` —
|
|
@@ -121,7 +133,13 @@ export declare class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
121
133
|
protected readonly additionalDocuments: Record<string, AdditionalDocumentContribution>;
|
|
122
134
|
/** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
|
|
123
135
|
protected readonly languageRegistry: ServerSharedServicesMinimal['ServiceRegistry'];
|
|
124
|
-
|
|
136
|
+
/** Whether startup runs {@link warnIfDocumentsUnserved}. */
|
|
137
|
+
protected readonly warnUnservedDocuments: boolean;
|
|
138
|
+
/** URIs of the documents the running startup's file traversal loaded; see {@link loadWorkspaceDocuments}. */
|
|
139
|
+
protected readonly traversedUris: Set<string>;
|
|
140
|
+
/** How many documents {@link loadWorkspaceDocuments} reads and parses before it may yield; below 1 counts as 1. */
|
|
141
|
+
protected readonly loadChunkSize: number;
|
|
142
|
+
constructor(services: ServerSharedServicesMinimal, options?: HydraniumWorkspaceManagerOptions);
|
|
125
143
|
/**
|
|
126
144
|
* Contribution form of Langium's `loadAdditionalDocuments`. Runs the base
|
|
127
145
|
* behaviour first (a no-op unless a further subclass adds documents), then
|
|
@@ -137,22 +155,80 @@ export declare class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
137
155
|
* Warn when a seeded additional document's URI matches no registered
|
|
138
156
|
* language.
|
|
139
157
|
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
* this: the document exists, so no lookup errors, it is simply inert.
|
|
158
|
+
* Every per-language service is resolved per URI, so the workspace cannot
|
|
159
|
+
* load such a document: adding it throws, and the startup build fails
|
|
160
|
+
* with an error naming only the extension, not the document. This
|
|
161
|
+
* line names the document and the fix first.
|
|
145
162
|
*
|
|
146
|
-
* The usual cause is a `
|
|
147
|
-
* `virtualUri
|
|
148
|
-
* nothing to match on —
|
|
149
|
-
*
|
|
150
|
-
*
|
|
163
|
+
* The usual cause is a `fromModel` or `fromStringInLanguage` document
|
|
164
|
+
* under a `virtualUri` with no file extension: `virtualUri(contributor)`
|
|
165
|
+
* yields `virtual:<contributor>`, and routing has nothing to match on —
|
|
166
|
+
* there is no extension, and a virtual document is never open in
|
|
167
|
+
* `TextDocuments`, so the declared-languageId rung cannot serve it either.
|
|
168
|
+
* A `fromString` document under such a URI never gets here: its parse
|
|
169
|
+
* throws first. The convention is to end the URI with a registered
|
|
151
170
|
* extension by passing it as the last segment,
|
|
152
171
|
* `virtualUri(contributor, 'name.<ext>')`.
|
|
153
172
|
*/
|
|
154
173
|
protected warnIfUnroutable(document: LangiumDocument): void;
|
|
155
174
|
protected performStartup(folders: WorkspaceFolder[]): Promise<LangiumDocument[]>;
|
|
175
|
+
/**
|
|
176
|
+
* Load the documents the file traversal found through
|
|
177
|
+
* {@link loadTraversedDocument}, {@link loadChunkSize} at a time, yielding
|
|
178
|
+
* between chunks once Langium's interruption period has passed. Langium's
|
|
179
|
+
* own load starts every read at once and parses each as it returns: over a
|
|
180
|
+
* synchronous provider nothing else runs until the last file has parsed, and
|
|
181
|
+
* over the Node provider incoming messages wait through long runs of parses.
|
|
182
|
+
* The cost: at most a chunk of reads is in flight, and each chunk waits for
|
|
183
|
+
* its slowest read, so slow storage takes a round per chunk, not one burst.
|
|
184
|
+
*
|
|
185
|
+
* Each loaded document is recorded, so startup can tell them from the
|
|
186
|
+
* documents `loadAdditionalDocuments` seeded, through the
|
|
187
|
+
* `additionalDocuments` group or an override of its own.
|
|
188
|
+
*
|
|
189
|
+
* The traversal found each of its documents through the provider, so asking
|
|
190
|
+
* it again whether they exist costs one call per workspace file and cannot
|
|
191
|
+
* come out false. Telling them apart by scheme does not work either: the
|
|
192
|
+
* registry's host answers every scheme no other provider claims, a seeded
|
|
193
|
+
* scheme nobody serves included. An override that loads documents without
|
|
194
|
+
* delegating here leaves them unrecorded, so startup asks the provider
|
|
195
|
+
* about each of them.
|
|
196
|
+
*/
|
|
197
|
+
protected loadWorkspaceDocuments(uris: Stream<URI>, collector: (document: LangiumDocument) => void): Promise<void>;
|
|
198
|
+
/**
|
|
199
|
+
* Load one document the file traversal found, or answer `undefined` to
|
|
200
|
+
* leave it out of the workspace.
|
|
201
|
+
*
|
|
202
|
+
* A file whose read fails and that the provider's `existsSettled`, or
|
|
203
|
+
* `exists` for a provider without it, reports gone is left out with a debug
|
|
204
|
+
* line, since it went between the scan and the read. A file still there is
|
|
205
|
+
* read once more, since a replacing rename can hide its name for a moment;
|
|
206
|
+
* that read's failure, and cancellation, fail the startup. A check that
|
|
207
|
+
* throws counts the file as there, since it cannot say the file went. The
|
|
208
|
+
* skip is the startup's only: other callers of `getOrCreateDocument` still
|
|
209
|
+
* get the read error.
|
|
210
|
+
*/
|
|
211
|
+
protected loadTraversedDocument(uri: URI): Promise<LangiumDocument | undefined>;
|
|
212
|
+
/**
|
|
213
|
+
* Warn once when the bound `FileSystemProvider` cannot serve a seeded
|
|
214
|
+
* document, naming each such document's scheme.
|
|
215
|
+
*
|
|
216
|
+
* The last close keeps a document only if the provider says it `exists`, so
|
|
217
|
+
* each such document leaves the workspace the first time an editor closes
|
|
218
|
+
* it, and whatever resolved against it breaks. The framework's registry
|
|
219
|
+
* serves `virtual:` through the `fileSystemProviders` group and every other
|
|
220
|
+
* scheme through its host, which knows nothing of a scheme an adopter
|
|
221
|
+
* invented for its seeded documents, and nothing else reports the loss. A
|
|
222
|
+
* provider that throws counts as not serving the document, since a startup
|
|
223
|
+
* that failed on a diagnostic would be worse than the loss.
|
|
224
|
+
*
|
|
225
|
+
* Runs over every document startup collected outside the file traversal,
|
|
226
|
+
* which is what `loadAdditionalDocuments` seeded, through the
|
|
227
|
+
* `additionalDocuments` group or an override of that method, once startup
|
|
228
|
+
* has added them to the workspace, unless `warnUnservedDocuments` is
|
|
229
|
+
* `false`.
|
|
230
|
+
*/
|
|
231
|
+
protected warnIfDocumentsUnserved(documents: readonly LangiumDocument[]): Promise<void>;
|
|
156
232
|
/**
|
|
157
233
|
* Add back the documents project discovery created that Langium's file
|
|
158
234
|
* traversal then filtered out.
|
|
@@ -195,9 +271,10 @@ export declare class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
195
271
|
*/
|
|
196
272
|
protected probePathDivergence(folders: WorkspaceFolder[]): void;
|
|
197
273
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
* target is configured.
|
|
274
|
+
* Supply the `{workspace}` placeholder from the first workspace folder, which
|
|
275
|
+
* the log file-tee and the CPU profile's file name both read, whether or not
|
|
276
|
+
* a log target is configured. No-op when no folder is known. See
|
|
277
|
+
* {@link toLogFileWorkspaceToken} for the token
|
|
201
278
|
* derivation — a log-capturing test harness uses the same function so the
|
|
202
279
|
* server's file name and the harness's correlation key agree.
|
|
203
280
|
*/
|
|
@@ -226,13 +303,20 @@ export declare class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
226
303
|
* and either delegate to `super.initializeWorkspace(...)` (preserving the
|
|
227
304
|
* default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
|
|
228
305
|
* themselves after the additional work finishes.
|
|
306
|
+
*
|
|
307
|
+
* A failed setup is logged here, since every framework waiter on
|
|
308
|
+
* {@link workspaceInitialized} discards the rejection; an override that
|
|
309
|
+
* rejects the deferred itself logs its own failure. A failed startup also
|
|
310
|
+
* rejects `ready`, so its waiters fail rather than wait forever; an override
|
|
311
|
+
* that skips `super` and catches a failed startup rejects `_ready` too.
|
|
229
312
|
*/
|
|
230
313
|
initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void>;
|
|
231
314
|
/**
|
|
232
315
|
* Default cascade-rebuild handler. Iterates {@link ProjectChangeEvent.affectedDocuments}
|
|
233
|
-
* and resets each to {@link DocumentState.Changed} so the
|
|
234
|
-
* re-runs the pipeline (parse → link → validate)
|
|
235
|
-
* visibility scope.
|
|
316
|
+
* and resets each to {@link DocumentState.Changed} so the build of the update
|
|
317
|
+
* that changed the descriptor re-runs the pipeline (parse → link → validate)
|
|
318
|
+
* under the new project visibility scope. Under the project manager's
|
|
319
|
+
* `deferMemberRelink`, its follow-up build emits the members instead.
|
|
236
320
|
*
|
|
237
321
|
* Subclasses can override for additional behaviour (e.g. logging,
|
|
238
322
|
* telemetry, custom rebuild policies); call `super` to preserve the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydranium-workspace-manager.d.ts","sourceRoot":"","sources":["../../../src/langium/workspace/hydranium-workspace-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"hydranium-workspace-manager.d.ts","sourceRoot":"","sources":["../../../src/langium/workspace/hydranium-workspace-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAyC,MAAM,qBAAqB,CAAC;AAChH,OAAO,EACJ,uBAAuB,EAIvB,KAAK,eAAe,EACpB,KAAK,MAAM,EAEX,KAAK,GAAG,EACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,iBAAiB,EAA2B,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,KAAK,cAAc,EAAsD,MAAM,0BAA0B,CAAC;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,KAAK,iBAAiB,EAA0B,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,KAAK,8BAA8B,EAA8B,MAAM,uCAAuC,CAAC;AA2BxH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAKrF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAazE;AAED,qDAAqD;AACrD,MAAM,WAAW,gCAAiC,SAAQ,cAAc;IACrE;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,yBAA0B,SAAQ,uBAAuB;IACnE,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,CAAC,4BAA4B,oBAA2B;IAE1E;;;;;;;OAOG;IACH,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,OAAO,CAAC,CAA6C;IAE5F,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAChD,yEAAyE;IACzE,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,0BAA0B,EAAE,0BAA0B,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;IACvF,wFAAwF;IACxF,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;IACpF,4DAA4D;IAC5D,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IAClD,6GAA6G;IAC7G,SAAS,CAAC,QAAQ,CAAC,aAAa,cAAqB;IACrD,mHAAmH;IACnH,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAM;IAE9C,YAAY,QAAQ,EAAE,2BAA2B,EAAE,OAAO,GAAE,gCAAqC,EAYhG;IAED;;;;;;;;;OASG;IACH,UAAyB,uBAAuB,CAC7C,OAAO,EAAE,eAAe,EAAE,EAC1B,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAC9C,OAAO,CAAC,IAAI,CAAC,CAyBf;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAU1D;IAED,UAAyB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAoC9F;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,UAAyB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhI;IAED;;;;;;;;;;;;OAYG;IACH,UAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAcpF;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB5F;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,SAAS,CAAC,yBAAyB,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,UAAU,EAAE,SAAS,eAAe,EAAE,GAAG,eAAe,EAAE,CAW3H;IAED;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAmB9D;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAKpE;IAED;;;;;;;;;;;;;;;OAeG;IACM,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAOlD;IAED;;;;;;;;;;;;;OAaG;IACY,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,WAAW,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7G;IAED;;;;;;;;;;OAUG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAO3D;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAIhE"}
|
|
@@ -6,12 +6,14 @@
|
|
|
6
6
|
*
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
|
-
import { Deferred } from '@hydranium/protocol';
|
|
10
|
-
import { DefaultWorkspaceManager, DocumentState, UriUtils } from '@hydranium/langium';
|
|
9
|
+
import { Deferred, describeError, describeErrorWithStack } from '@hydranium/protocol';
|
|
10
|
+
import { DefaultWorkspaceManager, DocumentState, interruptAndCheck, isOperationCancelled, UriUtils } from '@hydranium/langium';
|
|
11
|
+
import { CancellationTokenSource } from 'vscode-languageserver';
|
|
11
12
|
import { resolveLogFilePlaceholder, toLogFileWorkspaceToken } from '../diagnostics/logger.js';
|
|
12
13
|
import { findRealpathDivergence } from './document-uri-policy.js';
|
|
13
14
|
import { collectAdditionalDocuments } from './additional-document-contribution.js';
|
|
14
15
|
import { onProcessEvent } from '../../util/environment.js';
|
|
16
|
+
import { isConnectionGoneError } from '../../util/connection-liveness.js';
|
|
15
17
|
/**
|
|
16
18
|
* Module-level guard so repeated workspace-manager construction (e.g.
|
|
17
19
|
* test environments creating multiple instances across files) doesn't
|
|
@@ -26,6 +28,12 @@ let operationCancelledSuppressionInstalled = false;
|
|
|
26
28
|
* every later tree's genuine rejections to a logger nobody is reading.
|
|
27
29
|
*/
|
|
28
30
|
let operationCancelledSuppressionLogger;
|
|
31
|
+
/**
|
|
32
|
+
* Never cancelled: `interruptAndCheck` yields only for a token other than
|
|
33
|
+
* `CancellationToken.None`, and the load must not stop part-way, since Langium
|
|
34
|
+
* checks for cancellation once every document exists.
|
|
35
|
+
*/
|
|
36
|
+
const LOAD_YIELD_TOKEN = new CancellationTokenSource().token;
|
|
29
37
|
/**
|
|
30
38
|
* Decide what to do with a process-level unhandled promise rejection.
|
|
31
39
|
*
|
|
@@ -49,7 +57,7 @@ export function handleProcessUnhandledRejection(reason, logger) {
|
|
|
49
57
|
if (typeof reason === 'symbol' && String(reason) === 'Symbol(OperationCancelled)') {
|
|
50
58
|
return;
|
|
51
59
|
}
|
|
52
|
-
logger.error('Unhandled promise rejection: ' + (reason
|
|
60
|
+
logger.error('Unhandled promise rejection: ' + describeErrorWithStack(reason));
|
|
53
61
|
}
|
|
54
62
|
/**
|
|
55
63
|
* Install a process-level `unhandledRejection` listener that routes every
|
|
@@ -112,8 +120,9 @@ export function installOperationCancelledSuppression(logger) {
|
|
|
112
120
|
* URIs (its own members plus any transitive dependents per the
|
|
113
121
|
* `getAffectedProjects` hook). This manager re-runs
|
|
114
122
|
* `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
|
|
115
|
-
* affected document so the
|
|
116
|
-
* visibility scope.
|
|
123
|
+
* affected document so the build of the update that changed the descriptor
|
|
124
|
+
* re-links them with the new visibility scope. A project manager that defers
|
|
125
|
+
* the relink emits them from a follow-up build of its own instead.
|
|
117
126
|
*
|
|
118
127
|
* Descriptor URIs that triggered the cycle are intentionally excluded
|
|
119
128
|
* from the affected set by `AbstractProjectManager.onBuildUpdate` —
|
|
@@ -147,6 +156,12 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
147
156
|
additionalDocuments;
|
|
148
157
|
/** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
|
|
149
158
|
languageRegistry;
|
|
159
|
+
/** Whether startup runs {@link warnIfDocumentsUnserved}. */
|
|
160
|
+
warnUnservedDocuments;
|
|
161
|
+
/** URIs of the documents the running startup's file traversal loaded; see {@link loadWorkspaceDocuments}. */
|
|
162
|
+
traversedUris = new Set();
|
|
163
|
+
/** How many documents {@link loadWorkspaceDocuments} reads and parses before it may yield; below 1 counts as 1. */
|
|
164
|
+
loadChunkSize = 10;
|
|
150
165
|
constructor(services, options = {}) {
|
|
151
166
|
super(services);
|
|
152
167
|
this.projectManager = services.workspace.ProjectManager;
|
|
@@ -156,6 +171,7 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
156
171
|
this.writableFileSystemProvider = services.workspace.FileSystemProvider;
|
|
157
172
|
this.additionalDocuments = services.additionalDocuments;
|
|
158
173
|
this.languageRegistry = services.ServiceRegistry;
|
|
174
|
+
this.warnUnservedDocuments = options.warnUnservedDocuments ?? true;
|
|
159
175
|
this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceManager').trace('instantiated');
|
|
160
176
|
installOperationCancelledSuppression(this.tracer);
|
|
161
177
|
}
|
|
@@ -180,31 +196,32 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
180
196
|
// seeded. `tags` is read at the done-emit, so the document count pushed
|
|
181
197
|
// inside the callback appears in the log line.
|
|
182
198
|
const tags = [`${contributions.length} contributions`];
|
|
183
|
-
|
|
199
|
+
const seeded = [];
|
|
184
200
|
await this.tracer.time('Load additional documents', async () => {
|
|
185
201
|
await collectAdditionalDocuments(this.additionalDocuments, folders, document => {
|
|
186
|
-
|
|
202
|
+
seeded.push(document);
|
|
187
203
|
this.warnIfUnroutable(document);
|
|
188
204
|
collector(document);
|
|
189
205
|
});
|
|
190
|
-
tags.push(`${
|
|
206
|
+
tags.push(`${seeded.length} documents`);
|
|
191
207
|
}, 'info', { logAfterMs: 0, tags });
|
|
192
208
|
}
|
|
193
209
|
/**
|
|
194
210
|
* Warn when a seeded additional document's URI matches no registered
|
|
195
211
|
* language.
|
|
196
212
|
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
* this: the document exists, so no lookup errors, it is simply inert.
|
|
213
|
+
* Every per-language service is resolved per URI, so the workspace cannot
|
|
214
|
+
* load such a document: adding it throws, and the startup build fails
|
|
215
|
+
* with an error naming only the extension, not the document. This
|
|
216
|
+
* line names the document and the fix first.
|
|
202
217
|
*
|
|
203
|
-
* The usual cause is a `
|
|
204
|
-
* `virtualUri
|
|
205
|
-
* nothing to match on —
|
|
206
|
-
*
|
|
207
|
-
*
|
|
218
|
+
* The usual cause is a `fromModel` or `fromStringInLanguage` document
|
|
219
|
+
* under a `virtualUri` with no file extension: `virtualUri(contributor)`
|
|
220
|
+
* yields `virtual:<contributor>`, and routing has nothing to match on —
|
|
221
|
+
* there is no extension, and a virtual document is never open in
|
|
222
|
+
* `TextDocuments`, so the declared-languageId rung cannot serve it either.
|
|
223
|
+
* A `fromString` document under such a URI never gets here: its parse
|
|
224
|
+
* throws first. The convention is to end the URI with a registered
|
|
208
225
|
* extension by passing it as the last segment,
|
|
209
226
|
* `virtualUri(contributor, 'name.<ext>')`.
|
|
210
227
|
*/
|
|
@@ -213,15 +230,14 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
213
230
|
return;
|
|
214
231
|
}
|
|
215
232
|
const extensions = this.languageRegistry.all.flatMap(language => language.LanguageMetaData.fileExtensions);
|
|
216
|
-
this.tracer.warn(`Additional document '${document.uri.toString()}' matches no registered language, so
|
|
217
|
-
|
|
218
|
-
`contribute nothing to scopes. End its URI with a registered file extension (${extensions.join(', ')}); ` +
|
|
233
|
+
this.tracer.warn(`Additional document '${document.uri.toString()}' matches no registered language, so the workspace ` +
|
|
234
|
+
`cannot load it and the startup build fails. End its URI with a registered file extension (${extensions.join(', ')}); ` +
|
|
219
235
|
'for a virtual document that means passing it as the last segment, `virtualUri(contributor, "name.<ext>")`.');
|
|
220
236
|
}
|
|
221
237
|
async performStartup(folders) {
|
|
222
|
-
//
|
|
223
|
-
//
|
|
224
|
-
//
|
|
238
|
+
// Supply the `{workspace}` placeholder as early as possible — before any
|
|
239
|
+
// build logging — so per-workspace log capture names its file correctly
|
|
240
|
+
// and the buffered startup lines flush; the CPU profile reads it too.
|
|
225
241
|
this.resolveWorkspaceLogTarget(folders);
|
|
226
242
|
// Snapshot the document set around discovery so the descriptor documents
|
|
227
243
|
// it creates can be identified afterwards. Plain iteration rather than
|
|
@@ -242,10 +258,131 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
242
258
|
discovered.push(document);
|
|
243
259
|
}
|
|
244
260
|
}
|
|
245
|
-
|
|
261
|
+
this.traversedUris.clear();
|
|
262
|
+
let documents;
|
|
263
|
+
try {
|
|
264
|
+
documents = await super.performStartup(folders);
|
|
265
|
+
if (this.warnUnservedDocuments) {
|
|
266
|
+
await this.warnIfDocumentsUnserved(documents.filter(document => !this.traversedUris.has(document.uri.toString())));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
this.traversedUris.clear();
|
|
271
|
+
}
|
|
246
272
|
this.probePathDivergence(folders);
|
|
247
273
|
return this.withDiscoveredDescriptors(documents, discovered);
|
|
248
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* Load the documents the file traversal found through
|
|
277
|
+
* {@link loadTraversedDocument}, {@link loadChunkSize} at a time, yielding
|
|
278
|
+
* between chunks once Langium's interruption period has passed. Langium's
|
|
279
|
+
* own load starts every read at once and parses each as it returns: over a
|
|
280
|
+
* synchronous provider nothing else runs until the last file has parsed, and
|
|
281
|
+
* over the Node provider incoming messages wait through long runs of parses.
|
|
282
|
+
* The cost: at most a chunk of reads is in flight, and each chunk waits for
|
|
283
|
+
* its slowest read, so slow storage takes a round per chunk, not one burst.
|
|
284
|
+
*
|
|
285
|
+
* Each loaded document is recorded, so startup can tell them from the
|
|
286
|
+
* documents `loadAdditionalDocuments` seeded, through the
|
|
287
|
+
* `additionalDocuments` group or an override of its own.
|
|
288
|
+
*
|
|
289
|
+
* The traversal found each of its documents through the provider, so asking
|
|
290
|
+
* it again whether they exist costs one call per workspace file and cannot
|
|
291
|
+
* come out false. Telling them apart by scheme does not work either: the
|
|
292
|
+
* registry's host answers every scheme no other provider claims, a seeded
|
|
293
|
+
* scheme nobody serves included. An override that loads documents without
|
|
294
|
+
* delegating here leaves them unrecorded, so startup asks the provider
|
|
295
|
+
* about each of them.
|
|
296
|
+
*/
|
|
297
|
+
async loadWorkspaceDocuments(uris, collector) {
|
|
298
|
+
const pending = uris.toArray();
|
|
299
|
+
const chunkSize = Math.max(1, this.loadChunkSize);
|
|
300
|
+
for (let i = 0; i < pending.length; i += chunkSize) {
|
|
301
|
+
if (i > 0) {
|
|
302
|
+
await interruptAndCheck(LOAD_YIELD_TOKEN);
|
|
303
|
+
}
|
|
304
|
+
await Promise.all(pending.slice(i, i + chunkSize).map(async (uri) => {
|
|
305
|
+
const document = await this.loadTraversedDocument(uri);
|
|
306
|
+
if (document) {
|
|
307
|
+
this.traversedUris.add(document.uri.toString());
|
|
308
|
+
collector(document);
|
|
309
|
+
}
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Load one document the file traversal found, or answer `undefined` to
|
|
315
|
+
* leave it out of the workspace.
|
|
316
|
+
*
|
|
317
|
+
* A file whose read fails and that the provider's `existsSettled`, or
|
|
318
|
+
* `exists` for a provider without it, reports gone is left out with a debug
|
|
319
|
+
* line, since it went between the scan and the read. A file still there is
|
|
320
|
+
* read once more, since a replacing rename can hide its name for a moment;
|
|
321
|
+
* that read's failure, and cancellation, fail the startup. A check that
|
|
322
|
+
* throws counts the file as there, since it cannot say the file went. The
|
|
323
|
+
* skip is the startup's only: other callers of `getOrCreateDocument` still
|
|
324
|
+
* get the read error.
|
|
325
|
+
*/
|
|
326
|
+
async loadTraversedDocument(uri) {
|
|
327
|
+
try {
|
|
328
|
+
return await this.langiumDocuments.getOrCreateDocument(uri);
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
if (isOperationCancelled(error)) {
|
|
332
|
+
throw error;
|
|
333
|
+
}
|
|
334
|
+
const fileSystem = this.writableFileSystemProvider;
|
|
335
|
+
if (!(await (fileSystem.existsSettled?.(uri) ?? fileSystem.exists(uri)).catch(() => true))) {
|
|
336
|
+
this.tracer.debug(`Skipped ${uri.toString()}: it was removed between the workspace scan and its load`);
|
|
337
|
+
return undefined;
|
|
338
|
+
}
|
|
339
|
+
return this.langiumDocuments.getOrCreateDocument(uri);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Warn once when the bound `FileSystemProvider` cannot serve a seeded
|
|
344
|
+
* document, naming each such document's scheme.
|
|
345
|
+
*
|
|
346
|
+
* The last close keeps a document only if the provider says it `exists`, so
|
|
347
|
+
* each such document leaves the workspace the first time an editor closes
|
|
348
|
+
* it, and whatever resolved against it breaks. The framework's registry
|
|
349
|
+
* serves `virtual:` through the `fileSystemProviders` group and every other
|
|
350
|
+
* scheme through its host, which knows nothing of a scheme an adopter
|
|
351
|
+
* invented for its seeded documents, and nothing else reports the loss. A
|
|
352
|
+
* provider that throws counts as not serving the document, since a startup
|
|
353
|
+
* that failed on a diagnostic would be worse than the loss.
|
|
354
|
+
*
|
|
355
|
+
* Runs over every document startup collected outside the file traversal,
|
|
356
|
+
* which is what `loadAdditionalDocuments` seeded, through the
|
|
357
|
+
* `additionalDocuments` group or an override of that method, once startup
|
|
358
|
+
* has added them to the workspace, unless `warnUnservedDocuments` is
|
|
359
|
+
* `false`.
|
|
360
|
+
*/
|
|
361
|
+
async warnIfDocumentsUnserved(documents) {
|
|
362
|
+
const unserved = [];
|
|
363
|
+
for (const document of documents) {
|
|
364
|
+
let served = false;
|
|
365
|
+
try {
|
|
366
|
+
served = await this.writableFileSystemProvider.exists(document.uri);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// Counted as unserved, below.
|
|
370
|
+
}
|
|
371
|
+
if (!served) {
|
|
372
|
+
unserved.push(document.uri);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (unserved.length === 0) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const schemes = [...new Set(unserved.map(uri => uri.scheme))];
|
|
379
|
+
const named = unserved.slice(0, 3).map(uri => uri.toString());
|
|
380
|
+
this.tracer.warn(`${unserved.length} seeded document(s) under ${schemes.map(scheme => `${scheme}:`).join(', ')} cannot be served by the bound workspace.FileSystemProvider ` +
|
|
381
|
+
`(${named.join(', ')}${unserved.length > 3 ? ', …' : ''}), so each leaves the workspace at its ` +
|
|
382
|
+
`last close. Register a provider under the key ${schemes.map(scheme => `'${scheme}'`).join(', ')} in the shared ` +
|
|
383
|
+
'fileSystemProviders group, or serve the scheme from the host provider; set warnUnservedDocuments: false ' +
|
|
384
|
+
'to accept the loss.');
|
|
385
|
+
}
|
|
249
386
|
/**
|
|
250
387
|
* Add back the documents project discovery created that Langium's file
|
|
251
388
|
* traversal then filtered out.
|
|
@@ -316,9 +453,10 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
316
453
|
}
|
|
317
454
|
}
|
|
318
455
|
/**
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
* target is configured.
|
|
456
|
+
* Supply the `{workspace}` placeholder from the first workspace folder, which
|
|
457
|
+
* the log file-tee and the CPU profile's file name both read, whether or not
|
|
458
|
+
* a log target is configured. No-op when no folder is known. See
|
|
459
|
+
* {@link toLogFileWorkspaceToken} for the token
|
|
322
460
|
* derivation — a log-capturing test harness uses the same function so the
|
|
323
461
|
* server's file name and the harness's correlation key agree.
|
|
324
462
|
*/
|
|
@@ -360,6 +498,12 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
360
498
|
* and either delegate to `super.initializeWorkspace(...)` (preserving the
|
|
361
499
|
* default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
|
|
362
500
|
* themselves after the additional work finishes.
|
|
501
|
+
*
|
|
502
|
+
* A failed setup is logged here, since every framework waiter on
|
|
503
|
+
* {@link workspaceInitialized} discards the rejection; an override that
|
|
504
|
+
* rejects the deferred itself logs its own failure. A failed startup also
|
|
505
|
+
* rejects `ready`, so its waiters fail rather than wait forever; an override
|
|
506
|
+
* that skips `super` and catches a failed startup rejects `_ready` too.
|
|
363
507
|
*/
|
|
364
508
|
async initializeWorkspace(folders, cancelToken) {
|
|
365
509
|
try {
|
|
@@ -367,15 +511,26 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
367
511
|
this.workspaceInitializedDeferred.resolve(undefined);
|
|
368
512
|
}
|
|
369
513
|
catch (error) {
|
|
514
|
+
if (isOperationCancelled(error) || isConnectionGoneError(error)) {
|
|
515
|
+
this.tracer.debug(`Initial workspace build did not complete: ${describeError(error)}`);
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
this.tracer.error(`Initial workspace build failed: ${describeErrorWithStack(error)}`);
|
|
519
|
+
}
|
|
370
520
|
this.workspaceInitializedDeferred.reject(error);
|
|
521
|
+
// Langium settles `ready` only after a startup that succeeded. Marked
|
|
522
|
+
// handled, as logged above; a no-op once startup has resolved it.
|
|
523
|
+
this._ready.reject(error);
|
|
524
|
+
this._ready.promise.catch(() => undefined);
|
|
371
525
|
throw error;
|
|
372
526
|
}
|
|
373
527
|
}
|
|
374
528
|
/**
|
|
375
529
|
* Default cascade-rebuild handler. Iterates {@link ProjectChangeEvent.affectedDocuments}
|
|
376
|
-
* and resets each to {@link DocumentState.Changed} so the
|
|
377
|
-
* re-runs the pipeline (parse → link → validate)
|
|
378
|
-
* visibility scope.
|
|
530
|
+
* and resets each to {@link DocumentState.Changed} so the build of the update
|
|
531
|
+
* that changed the descriptor re-runs the pipeline (parse → link → validate)
|
|
532
|
+
* under the new project visibility scope. Under the project manager's
|
|
533
|
+
* `deferMemberRelink`, its follow-up build emits the members instead.
|
|
379
534
|
*
|
|
380
535
|
* Subclasses can override for additional behaviour (e.g. logging,
|
|
381
536
|
* telemetry, custom rebuild policies); call `super` to preserve the
|