@hydranium/core 1.0.0-next.18 → 1.0.0-next.181
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 +5 -1
- package/lib/documents/ast-document-manager.d.ts +190 -30
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +236 -40
- 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 +138 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +187 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/file-system-task-queue.d.ts +49 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +34 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +447 -82
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +780 -160
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +3 -0
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +3 -0
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-text-shadow.d.ts +41 -9
- package/lib/documents/language-client-text-shadow.d.ts.map +1 -1
- package/lib/documents/language-client-text-shadow.js +56 -11
- package/lib/documents/language-client-text-shadow.js.map +1 -1
- package/lib/documents/self-save-registry.d.ts +37 -6
- package/lib/documents/self-save-registry.d.ts.map +1 -1
- package/lib/documents/self-save-registry.js +28 -15
- package/lib/documents/self-save-registry.js.map +1 -1
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +60 -22
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +16 -9
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/config/configuration-provider.d.ts +81 -0
- package/lib/langium/config/configuration-provider.d.ts.map +1 -0
- package/lib/langium/config/configuration-provider.js +112 -0
- package/lib/langium/config/configuration-provider.js.map +1 -0
- package/lib/langium/config/index.d.ts +1 -0
- package/lib/langium/config/index.d.ts.map +1 -1
- package/lib/langium/config/index.js +1 -0
- package/lib/langium/config/index.js.map +1 -1
- package/lib/langium/config/settings.js.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +40 -6
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
- package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
- package/lib/langium/diagnostics/server-tracer.js.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +93 -0
- package/lib/langium/document-builder/build-session.d.ts.map +1 -0
- package/lib/langium/document-builder/build-session.js +72 -0
- package/lib/langium/document-builder/build-session.js.map +1 -0
- package/lib/langium/document-builder/document-builder.d.ts +368 -21
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +641 -47
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/document-builder/index.d.ts +1 -0
- package/lib/langium/document-builder/index.d.ts.map +1 -1
- package/lib/langium/document-builder/index.js +1 -0
- package/lib/langium/document-builder/index.js.map +1 -1
- package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
- package/lib/langium/documentation/comment-provider.js.map +1 -1
- package/lib/langium/integration-services.d.ts +45 -1
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +10 -5
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +13 -5
- 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 +58 -13
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +213 -29
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +64 -0
- package/lib/langium/keys/containment.d.ts.map +1 -0
- package/lib/langium/keys/containment.js +53 -0
- package/lib/langium/keys/containment.js.map +1 -0
- package/lib/langium/keys/index.d.ts +1 -0
- package/lib/langium/keys/index.d.ts.map +1 -1
- package/lib/langium/keys/index.js +1 -0
- package/lib/langium/keys/index.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +4 -0
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/positional-key-provider.js.map +1 -1
- package/lib/langium/labeling/label-provider.d.ts.map +1 -1
- package/lib/langium/labeling/label-provider.js.map +1 -1
- package/lib/langium/language-module.d.ts +27 -2
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +16 -2
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +307 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +395 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +1 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +1 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-service.d.ts +276 -226
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +251 -375
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +144 -35
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +46 -35
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +25 -4
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +2 -1
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts +23 -0
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/naming/name-separator-validation.js +30 -1
- package/lib/langium/naming/name-separator-validation.js.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +9 -2
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +2 -2
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +31 -11
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +13 -56
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +56 -20
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/reference-builder.d.ts.map +1 -1
- package/lib/langium/scope/reference-builder.js.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +12 -21
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +1 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +15 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +16 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +15 -2
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/transfer/transfer-encoder.d.ts +60 -17
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +38 -16
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +423 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +906 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +48 -0
- package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
- package/lib/langium/trivia/index.d.ts +14 -0
- package/lib/langium/trivia/index.d.ts.map +1 -0
- package/lib/langium/trivia/index.js +14 -0
- package/lib/langium/trivia/index.js.map +1 -0
- package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
- package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-contribution.js +10 -0
- package/lib/langium/trivia/trivia-contribution.js.map +1 -0
- package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +294 -10
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +448 -5
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
- package/lib/langium/workspace/document-uri-policy.d.ts +17 -12
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +10 -9
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +17 -0
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
- package/lib/langium/workspace/file-not-found.js +20 -0
- package/lib/langium/workspace/file-not-found.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +84 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +93 -14
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +25 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +25 -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 +81 -8
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +25 -2
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +13 -5
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +79 -17
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +91 -29
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +0 -7
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/virtual-document.d.ts +48 -15
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +78 -18
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +12 -4
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/locale/index.d.ts +10 -0
- package/lib/locale/index.d.ts.map +1 -0
- package/lib/locale/index.js +10 -0
- package/lib/locale/index.js.map +1 -0
- package/lib/locale/server-locale.d.ts +73 -0
- package/lib/locale/server-locale.d.ts.map +1 -0
- package/lib/locale/server-locale.js +61 -0
- package/lib/locale/server-locale.js.map +1 -0
- package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
- package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
- package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
- package/lib/lsp/connection-features.d.ts +23 -0
- package/lib/lsp/connection-features.d.ts.map +1 -0
- package/lib/lsp/connection-features.js +60 -0
- package/lib/lsp/connection-features.js.map +1 -0
- package/lib/lsp/diagnostics-connection.d.ts +27 -0
- package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
- package/lib/lsp/diagnostics-connection.js +53 -0
- package/lib/lsp/diagnostics-connection.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +90 -79
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +152 -99
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +3 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +3 -1
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +34 -1
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +55 -8
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +8 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +13 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +54 -0
- package/lib/messages/carriers.d.ts.map +1 -0
- package/lib/messages/carriers.js +62 -0
- package/lib/messages/carriers.js.map +1 -0
- package/lib/messages/index.d.ts +25 -0
- package/lib/messages/index.d.ts.map +1 -0
- package/lib/messages/index.js +25 -0
- package/lib/messages/index.js.map +1 -0
- package/lib/messages/renderer.d.ts +142 -0
- package/lib/messages/renderer.d.ts.map +1 -0
- package/lib/messages/renderer.js +165 -0
- package/lib/messages/renderer.js.map +1 -0
- package/lib/node/event-loop-monitor.js.map +1 -1
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -0
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +1 -0
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/lint-grammar.js.map +1 -1
- package/lib/node/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +1 -0
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +39 -4
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +109 -49
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/process-memory.js.map +1 -1
- package/lib/node/profile-capture.d.ts +8 -2
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +2 -2
- package/lib/node/profiling-run.d.ts.map +1 -1
- package/lib/node/profiling-run.js +1 -1
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +52 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +66 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/socket-launcher.d.ts +16 -1
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +4 -3
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/stdio-launcher.d.ts +1 -1
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +1 -1
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js.map +1 -1
- package/lib/testing/fake-description.js.map +1 -1
- package/lib/testing/fake-document.d.ts +16 -4
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js +18 -3
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/index.d.ts.map +1 -1
- package/lib/testing/index.js +1 -0
- package/lib/testing/index.js.map +1 -1
- package/lib/testing/langium-test-helpers.d.ts.map +1 -1
- package/lib/testing/langium-test-helpers.js +1 -0
- package/lib/testing/langium-test-helpers.js.map +1 -1
- package/lib/testing/make-noop-language-services.js.map +1 -1
- package/lib/testing/make-noop-shared-services.d.ts +14 -0
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +28 -2
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +62 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +30 -9
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/make-test-tracer.js.map +1 -1
- package/lib/testing/node/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +11 -3
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +42 -9
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +14 -0
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +33 -1
- 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 +14 -4
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +21 -4
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +4 -4
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +10 -9
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +17 -9
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +26 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +57 -4
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +22 -7
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +92 -15
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +7 -6
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +4 -4
- package/lib/testing/stub-model-service.js.map +1 -1
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-service-registry.js.map +1 -1
- package/lib/util/connection-liveness.d.ts +7 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +35 -14
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +35 -26
- package/src/documents/ast-document-manager.ts +349 -65
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +24 -0
- package/src/documents/client-session-registry.ts +240 -0
- package/src/documents/file-system-task-queue.ts +68 -0
- package/src/documents/hydranium-text-documents.ts +973 -202
- package/src/documents/index.ts +3 -0
- package/src/documents/language-client-text-shadow.ts +59 -11
- package/src/documents/self-save-registry.ts +52 -13
- package/src/index.ts +6 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +16 -9
- package/src/langium/config/configuration-provider.ts +119 -0
- package/src/langium/config/index.ts +1 -0
- package/src/langium/diagnostics/lsp-logger.ts +41 -6
- package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
- package/src/langium/document-builder/build-session.ts +87 -0
- package/src/langium/document-builder/document-builder.ts +724 -46
- package/src/langium/document-builder/index.ts +1 -0
- package/src/langium/integration-services.ts +67 -6
- package/src/langium/integrity/integrity-rule.ts +13 -5
- package/src/langium/integrity/integrity-service.ts +229 -30
- package/src/langium/keys/containment.ts +87 -0
- package/src/langium/keys/index.ts +1 -0
- package/src/langium/keys/name-based-key-provider.ts +4 -0
- package/src/langium/language-module.ts +42 -4
- package/src/langium/model-service/client-session.ts +606 -0
- package/src/langium/model-service/index.ts +1 -0
- package/src/langium/model-service/model-service.ts +418 -399
- package/src/langium/module.ts +193 -64
- package/src/langium/naming/name-provider.ts +27 -5
- package/src/langium/naming/name-separator-validation.ts +34 -5
- package/src/langium/project/abstract-project-manager.ts +9 -1
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +36 -14
- package/src/langium/scope/hydranium-scope-provider.ts +60 -22
- package/src/langium/serialization/abstract-serializer.ts +13 -32
- package/src/langium/service-registry.ts +19 -2
- package/src/langium/shared-services.ts +19 -2
- package/src/langium/transfer/transfer-encoder.ts +85 -24
- package/src/langium/trivia/comment-preserver.ts +1100 -0
- package/src/langium/trivia/document-ending-preserver.ts +55 -0
- package/src/langium/trivia/index.ts +14 -0
- package/src/langium/trivia/trivia-contribution.ts +39 -0
- package/src/langium/trivia/trivia-preserver.ts +54 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +537 -11
- package/src/langium/workspace/document-uri-policy.ts +17 -12
- package/src/langium/workspace/file-not-found.ts +23 -0
- package/src/langium/workspace/file-system-provider.ts +153 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +34 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +153 -13
- package/src/langium/workspace/in-memory-file-system-provider.ts +47 -16
- package/src/langium/workspace/initialize-workspace.ts +43 -5
- package/src/langium/workspace/langium-documents.ts +113 -33
- package/src/langium/workspace/persistent-file-system-provider.ts +0 -7
- package/src/langium/workspace/virtual-document.ts +96 -19
- package/src/langium/workspace/write-lock-scope.ts +24 -11
- package/src/locale/index.ts +10 -0
- package/src/locale/server-locale.ts +86 -0
- package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
- package/src/lsp/connection-features.ts +67 -0
- package/src/lsp/diagnostics-connection.ts +56 -0
- package/src/lsp/hydranium-document-update-handler.ts +182 -106
- package/src/lsp/index.ts +3 -1
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/semantic-token-provider.ts +74 -7
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +13 -7
- package/src/messages/carriers.ts +78 -0
- package/src/messages/index.ts +36 -0
- package/src/messages/renderer.ts +212 -0
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +1 -0
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/measure-memory.ts +1 -0
- package/src/node/node-file-system-provider.ts +122 -51
- package/src/node/profile-capture.ts +8 -2
- package/src/node/profiling-run.ts +3 -3
- package/src/node/rename-over-open-readers.ts +78 -0
- package/src/node/socket-launcher.ts +19 -4
- package/src/node/stdio-launcher.ts +1 -2
- package/src/testing/fake-document.ts +24 -5
- package/src/testing/index.ts +1 -0
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-noop-shared-services.ts +50 -2
- package/src/testing/make-test-services.ts +106 -30
- 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 +61 -11
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +35 -1
- package/src/testing/node/unhandled-rejections.ts +31 -0
- 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 +24 -5
- package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
- package/src/testing/run-update-pipeline.ts +4 -4
- package/src/testing/stub-ast-document-manager.ts +28 -21
- package/src/testing/stub-document-builder.ts +83 -17
- package/src/testing/stub-hydranium-text-documents.ts +127 -22
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +9 -8
- package/src/util/connection-liveness.ts +37 -14
- package/src/util/environment.ts +9 -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/src/lsp/instrument-connection.ts +0 -66
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 CrossBreeze, EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
|
|
10
|
+
import { type URI } from '@hydranium/langium';
|
|
11
|
+
|
|
12
|
+
// Not re-exported from the workspace barrel: the framework's providers share
|
|
13
|
+
// it, and it is no API of theirs.
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A missing-file error shaped as a Node file system raises it, with code
|
|
17
|
+
* `ENOENT` and the path: callers tell a missing file from any other failure by
|
|
18
|
+
* those two fields, whichever provider is bound. The last close relies on it to
|
|
19
|
+
* tell a document gone meanwhile from any other failed rebuild.
|
|
20
|
+
*/
|
|
21
|
+
export function notFound(message: string, uri: URI): Error {
|
|
22
|
+
return Object.assign(new Error(message), { code: 'ENOENT', path: uri.fsPath });
|
|
23
|
+
}
|
|
@@ -9,18 +9,18 @@
|
|
|
9
9
|
|
|
10
10
|
import { type Tracer } from '@hydranium/protocol';
|
|
11
11
|
import { EmptyFileSystemProvider } from '@hydranium/langium';
|
|
12
|
-
import type { URI } from '@hydranium/langium';
|
|
12
|
+
import type { FileSystemNode, URI } from '@hydranium/langium';
|
|
13
13
|
import { type WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
|
|
14
14
|
import { type LogNameOptions } from '../diagnostics/logger.js';
|
|
15
15
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
16
|
-
import { serveVirtualDocument } from './virtual-document.js';
|
|
17
16
|
|
|
18
17
|
/**
|
|
19
|
-
* Empty-filesystem
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* Node-backed
|
|
23
|
-
* lives in `@hydranium/core/node` (it pulls
|
|
18
|
+
* Empty-filesystem {@link WritableFileSystemProvider}. For browser / test / CLI
|
|
19
|
+
* hosts that don't have a real filesystem. All writes are no-ops. On the
|
|
20
|
+
* portable `.` entry it is the {@link FileSystemProviderRegistry.host} when
|
|
21
|
+
* `context.fileSystemProvider` gives no writable provider; the Node-backed
|
|
22
|
+
* `DefaultFileSystemProvider` lives in `@hydranium/core/node` (it pulls
|
|
23
|
+
* `node:fs`).
|
|
24
24
|
*/
|
|
25
25
|
export class DefaultEmptyFileSystemProvider extends EmptyFileSystemProvider implements WritableFileSystemProvider {
|
|
26
26
|
protected readonly tracer: Tracer;
|
|
@@ -37,16 +37,153 @@ export class DefaultEmptyFileSystemProvider extends EmptyFileSystemProvider impl
|
|
|
37
37
|
// no-op
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
// `async` so the base's refusal becomes a rejection: it throws
|
|
41
|
+
// SYNCHRONOUSLY from a method declared to return a promise, and a
|
|
42
|
+
// synchronous throw escapes the promise chain — `.catch()` never attaches
|
|
43
|
+
// and `Promise.all` dies while its argument array is still being built, so
|
|
44
|
+
// a caller reading several URIs cannot handle the miss it asked about. The
|
|
45
|
+
// base declares `readFile` and `readBinary` param-less, so the param is
|
|
46
|
+
// optional there.
|
|
47
|
+
override async readFile(_uri?: URI): Promise<string> {
|
|
48
|
+
return super.readFile();
|
|
46
49
|
}
|
|
47
50
|
|
|
48
|
-
override
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
override async readBinary(_uri?: URI): Promise<Uint8Array> {
|
|
52
|
+
return super.readBinary();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
override async stat(uri: URI): Promise<FileSystemNode> {
|
|
56
|
+
return super.stat(uri);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The provider bound on `workspace.FileSystemProvider`: it dispatches each call
|
|
62
|
+
* by the URI's scheme to the provider registered for it in the shared
|
|
63
|
+
* `fileSystemProviders` group, and to the {@link host} for any scheme without
|
|
64
|
+
* one.
|
|
65
|
+
*
|
|
66
|
+
* So one provider answers for each scheme, and a host's provider needs to know
|
|
67
|
+
* only its own: the framework registers `virtual:` there, and an adopter adds a
|
|
68
|
+
* scheme by contributing to the group. The host takes every unclaimed scheme
|
|
69
|
+
* rather than `file:` alone, which keeps an in-memory workspace under `memory:`
|
|
70
|
+
* or any other scheme on the host's provider.
|
|
71
|
+
*
|
|
72
|
+
* `THost` types the host, so an adopter whose own provider has more members
|
|
73
|
+
* than the base declares the slot as `FileSystemProviderRegistry<MyProvider>`,
|
|
74
|
+
* binds a {@link DefaultFileSystemProviderRegistry} with that host, and reads
|
|
75
|
+
* those members through `services.workspace.FileSystemProvider.host`.
|
|
76
|
+
*/
|
|
77
|
+
export interface FileSystemProviderRegistry<
|
|
78
|
+
THost extends WritableFileSystemProvider = WritableFileSystemProvider
|
|
79
|
+
> extends WritableFileSystemProvider {
|
|
80
|
+
/** The provider for every scheme no entry of `fileSystemProviders` claims. */
|
|
81
|
+
readonly host: THost;
|
|
82
|
+
/** The provider that answers for `uri`. */
|
|
83
|
+
providerFor(uri: URI): WritableFileSystemProvider;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Options for {@link DefaultFileSystemProviderRegistry}. */
|
|
87
|
+
export interface FileSystemProviderRegistryOptions<
|
|
88
|
+
THost extends WritableFileSystemProvider = WritableFileSystemProvider
|
|
89
|
+
> extends LogNameOptions {
|
|
90
|
+
/**
|
|
91
|
+
* The provider for every scheme no entry of `fileSystemProviders` claims.
|
|
92
|
+
* The framework passes the provider `context.fileSystemProvider` returns,
|
|
93
|
+
* or a {@link DefaultEmptyFileSystemProvider} when that is not writable.
|
|
94
|
+
*/
|
|
95
|
+
host: THost;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The framework's {@link FileSystemProviderRegistry}.
|
|
100
|
+
*
|
|
101
|
+
* A directory is listed by the provider of its own scheme, so a workspace
|
|
102
|
+
* root's tree comes from that provider alone.
|
|
103
|
+
*
|
|
104
|
+
* `realpath` and `mtimeMs` are always present and forward to the scheme's
|
|
105
|
+
* provider. Where that provider lacks one, `realpath` returns the URI unchanged
|
|
106
|
+
* and `mtimeMs` returns `undefined`: the answers `RealpathDocumentUriPolicy`
|
|
107
|
+
* and the self-save filter already give a provider without them.
|
|
108
|
+
*/
|
|
109
|
+
export class DefaultFileSystemProviderRegistry<
|
|
110
|
+
THost extends WritableFileSystemProvider = WritableFileSystemProvider
|
|
111
|
+
> implements FileSystemProviderRegistry<THost> {
|
|
112
|
+
readonly host: THost;
|
|
113
|
+
protected readonly tracer: Tracer;
|
|
114
|
+
|
|
115
|
+
constructor(
|
|
116
|
+
protected readonly services: ServerSharedServicesMinimal & { fileSystemProviders: Record<string, WritableFileSystemProvider> },
|
|
117
|
+
options: FileSystemProviderRegistryOptions<THost>
|
|
118
|
+
) {
|
|
119
|
+
this.host = options.host;
|
|
120
|
+
this.tracer = services.Tracer.for(options.logName ?? this.constructor.name).trace('instantiated');
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* The group is read per call, not in the constructor, so a registered
|
|
125
|
+
* provider is built on first use and may read slots that reach back to this
|
|
126
|
+
* one. Only an OWN key of the group counts: the DI container resolves any
|
|
127
|
+
* key found on the prototype chain, so a scheme such as `constructor` would
|
|
128
|
+
* otherwise dispatch to a function.
|
|
129
|
+
*/
|
|
130
|
+
providerFor(uri: URI): WritableFileSystemProvider {
|
|
131
|
+
const providers = this.services.fileSystemProviders;
|
|
132
|
+
return Object.hasOwn(providers, uri.scheme) ? providers[uri.scheme] : this.host;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// The async methods are `async` so a provider that throws synchronously from
|
|
136
|
+
// one still rejects, for the reason `DefaultEmptyFileSystemProvider` gives.
|
|
137
|
+
async writeFile(uri: URI, content: string): Promise<void> {
|
|
138
|
+
return this.providerFor(uri).writeFile(uri, content);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async mtimeMs(uri: URI): Promise<number | undefined> {
|
|
142
|
+
return this.providerFor(uri).mtimeMs?.(uri);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
realpath(uri: URI): URI | undefined {
|
|
146
|
+
const provider = this.providerFor(uri);
|
|
147
|
+
return provider.realpath ? provider.realpath(uri) : uri;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async stat(uri: URI): Promise<FileSystemNode> {
|
|
151
|
+
return this.providerFor(uri).stat(uri);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
statSync(uri: URI): FileSystemNode {
|
|
155
|
+
return this.providerFor(uri).statSync(uri);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async exists(uri: URI): Promise<boolean> {
|
|
159
|
+
return this.providerFor(uri).exists(uri);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
existsSync(uri: URI): boolean {
|
|
163
|
+
return this.providerFor(uri).existsSync(uri);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
async readBinary(uri: URI): Promise<Uint8Array> {
|
|
167
|
+
return this.providerFor(uri).readBinary(uri);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
readBinarySync(uri: URI): Uint8Array {
|
|
171
|
+
return this.providerFor(uri).readBinarySync(uri);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async readFile(uri: URI): Promise<string> {
|
|
175
|
+
return this.providerFor(uri).readFile(uri);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
readFileSync(uri: URI): string {
|
|
179
|
+
return this.providerFor(uri).readFileSync(uri);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async readDirectory(uri: URI): Promise<FileSystemNode[]> {
|
|
183
|
+
return this.providerFor(uri).readDirectory(uri);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
readDirectorySync(uri: URI): FileSystemNode[] {
|
|
187
|
+
return this.providerFor(uri).readDirectorySync(uri);
|
|
51
188
|
}
|
|
52
189
|
}
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
type ParseResult,
|
|
16
16
|
type URI
|
|
17
17
|
} from '@hydranium/langium';
|
|
18
|
+
import { type ExtendedServiceRegistry } from '../service-registry.js';
|
|
18
19
|
import { type Serializer } from '../serialization/serializer.js';
|
|
19
20
|
|
|
20
21
|
/** Structural view of the per-language serializer slot on the resolved services. */
|
|
@@ -49,6 +50,39 @@ interface WithSerializer {
|
|
|
49
50
|
* node identity is preserved.
|
|
50
51
|
*/
|
|
51
52
|
export class HydraniumLangiumDocumentFactory extends DefaultLangiumDocumentFactory {
|
|
53
|
+
/**
|
|
54
|
+
* Narrows the inherited Langium `ServiceRegistry` field to the framework's
|
|
55
|
+
* {@link ExtendedServiceRegistry}, so the by-id lookup below needs no
|
|
56
|
+
* per-callsite cast. The framework's shared module binds that class.
|
|
57
|
+
*/
|
|
58
|
+
declare protected readonly serviceRegistry: ExtendedServiceRegistry;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Parse `text` for `uri` under the grammar `languageId` names, instead of
|
|
62
|
+
* the one `uri` routes to.
|
|
63
|
+
*
|
|
64
|
+
* For a URI that routes to no grammar at all: a directory, or any other URI
|
|
65
|
+
* that names no file and so carries no extension. Langium's ladder ends at
|
|
66
|
+
* the extension, so it reports `no services for the extension ''` from
|
|
67
|
+
* inside the parse — naming neither the URI nor the caller that could have
|
|
68
|
+
* said which grammar it meant.
|
|
69
|
+
*
|
|
70
|
+
* The caller supplies the language because nothing else can. A URI with no
|
|
71
|
+
* extension carries no routing signal, and choosing on its behalf would be a
|
|
72
|
+
* guess the moment a second grammar is registered — which is why this takes
|
|
73
|
+
* the id rather than falling back to a sole registered language.
|
|
74
|
+
*
|
|
75
|
+
* @throws when `languageId` names no registered grammar.
|
|
76
|
+
*/
|
|
77
|
+
fromStringInLanguage<T extends AstNode = AstNode>(text: string, uri: URI, languageId: string): LangiumDocument<T> {
|
|
78
|
+
const services = this.serviceRegistry.getServicesById(languageId);
|
|
79
|
+
if (!services) {
|
|
80
|
+
throw new Error(`No grammar is registered for the language id '${languageId}' (parsing ${uri.toString()}).`);
|
|
81
|
+
}
|
|
82
|
+
const parseResult: ParseResult<T> = services.parser.LangiumParser.parse<T>(text);
|
|
83
|
+
return this.createLangiumDocument<T>(parseResult, uri, undefined, text);
|
|
84
|
+
}
|
|
85
|
+
|
|
52
86
|
override fromModel<T extends AstNode = AstNode>(model: T, uri: URI): LangiumDocument<T> {
|
|
53
87
|
// Make the code-built AST as structurally complete as a parsed one — the
|
|
54
88
|
// parser links containers, `fromModel` does not. In place (identity kept).
|
|
@@ -7,10 +7,31 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
+
import { type Clock, type Tracer } from '@hydranium/protocol';
|
|
10
11
|
import { DefaultWorkspaceLock, type MaybePromise } from '@hydranium/langium';
|
|
11
|
-
import { type CancellationToken } from 'vscode-languageserver-protocol';
|
|
12
|
+
import { type CancellationToken, type Disposable } from 'vscode-languageserver-protocol';
|
|
13
|
+
import { type LogNameOptions } from '../diagnostics/logger.js';
|
|
14
|
+
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
12
15
|
import { runInWriteLockScope } from './write-lock-scope.js';
|
|
13
16
|
|
|
17
|
+
/** Constructor options for {@link HydraniumWorkspaceLock}. */
|
|
18
|
+
export interface HydraniumWorkspaceLockOptions extends LogNameOptions {
|
|
19
|
+
/**
|
|
20
|
+
* How long a write may keep running after a later write cancelled it before
|
|
21
|
+
* the lock logs an error. Every write and read waits behind it meanwhile, so
|
|
22
|
+
* one that never ends stops the server. Defaults to 10 s; `0` turns the
|
|
23
|
+
* check off.
|
|
24
|
+
*/
|
|
25
|
+
readonly stalledWriteWarnMs?: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const DEFAULT_STALLED_WRITE_WARN_MS = 10_000;
|
|
29
|
+
|
|
30
|
+
/** The write action a {@link HydraniumWorkspaceLock} is running, with the timer its cancellation started. */
|
|
31
|
+
export interface RunningWrite {
|
|
32
|
+
stallTimer?: Disposable;
|
|
33
|
+
}
|
|
34
|
+
|
|
14
35
|
/**
|
|
15
36
|
* Langium's {@link DefaultWorkspaceLock} with the write action marked as a
|
|
16
37
|
* write-lock scope, so anything it reaches can be asked whether the lock is
|
|
@@ -29,7 +50,70 @@ import { runInWriteLockScope } from './write-lock-scope.js';
|
|
|
29
50
|
* would turn ordinary read-then-write sequences into false positives.
|
|
30
51
|
*/
|
|
31
52
|
export class HydraniumWorkspaceLock extends DefaultWorkspaceLock {
|
|
53
|
+
/** Backs {@link writeCancellations}. */
|
|
54
|
+
protected cancelledWriteCount = 0;
|
|
55
|
+
protected readonly clock: Clock;
|
|
56
|
+
protected readonly tracer: Tracer;
|
|
57
|
+
protected readonly stalledWriteWarnMs: number;
|
|
58
|
+
protected runningWrite?: RunningWrite;
|
|
59
|
+
|
|
60
|
+
constructor(services: Pick<ServerSharedServicesMinimal, 'Clock' | 'Tracer'>, options: HydraniumWorkspaceLockOptions = {}) {
|
|
61
|
+
super();
|
|
62
|
+
this.clock = services.Clock;
|
|
63
|
+
this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceLock');
|
|
64
|
+
this.stalledWriteWarnMs = options.stalledWriteWarnMs ?? DEFAULT_STALLED_WRITE_WARN_MS;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* How many calls have cancelled the lock's latest write: every `write`,
|
|
69
|
+
* which cancels the write before it, and every `cancelWrite`. A caller that
|
|
70
|
+
* reads this right after queuing a write, and reads the same number later,
|
|
71
|
+
* holds a write nothing has cancelled, whether it is still queued or
|
|
72
|
+
* already running. Its token answers that only once the write runs, since
|
|
73
|
+
* a queued write has not been handed it yet.
|
|
74
|
+
*/
|
|
75
|
+
get writeCancellations(): number {
|
|
76
|
+
return this.cancelledWriteCount;
|
|
77
|
+
}
|
|
78
|
+
|
|
32
79
|
override write(action: (token: CancellationToken) => MaybePromise<void>): Promise<void> {
|
|
33
|
-
return super.write(token => runInWriteLockScope(() => action
|
|
80
|
+
return super.write(token => runInWriteLockScope(() => this.runWrite(action, token)));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Run `action` as {@link runningWrite}, so a cancellation while it runs can time it. */
|
|
84
|
+
protected async runWrite(action: (token: CancellationToken) => MaybePromise<void>, token: CancellationToken): Promise<void> {
|
|
85
|
+
const running: RunningWrite = {};
|
|
86
|
+
this.runningWrite = running;
|
|
87
|
+
try {
|
|
88
|
+
await action(token);
|
|
89
|
+
} finally {
|
|
90
|
+
running.stallTimer?.dispose();
|
|
91
|
+
if (this.runningWrite === running) {
|
|
92
|
+
this.runningWrite = undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Counted here rather than in {@link write}, because Langium's `write` cancels
|
|
99
|
+
* through this method too. A write running when this is called has been
|
|
100
|
+
* cancelled, by this call or an earlier one, so its timer starts here.
|
|
101
|
+
*/
|
|
102
|
+
override cancelWrite(): void {
|
|
103
|
+
this.cancelledWriteCount++;
|
|
104
|
+
const running = this.runningWrite;
|
|
105
|
+
if (running && !running.stallTimer && this.stalledWriteWarnMs > 0) {
|
|
106
|
+
running.stallTimer = this.clock.setTimer(() => this.reportStalledWrite(), this.stalledWriteWarnMs);
|
|
107
|
+
}
|
|
108
|
+
super.cancelWrite();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
protected reportStalledWrite(): void {
|
|
112
|
+
this.tracer.error(
|
|
113
|
+
`A write is still running ${this.stalledWriteWarnMs} ms after it was cancelled, and every write and read waits behind it. ` +
|
|
114
|
+
'Likely causes: a model-service write or rebuild from inside a build in a host with no write-lock scope tracker, ' +
|
|
115
|
+
'which waits for the build it runs in, or a write action that ignores its cancellation token. ' +
|
|
116
|
+
'See https://github.com/eclipse-emfcloud/hydranium/issues/245.'
|
|
117
|
+
);
|
|
34
118
|
}
|
|
35
119
|
}
|
|
@@ -8,10 +8,19 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { Deferred, type Logger, type Tracer } from '@hydranium/protocol';
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
DefaultWorkspaceManager,
|
|
13
|
+
DocumentState,
|
|
14
|
+
isOperationCancelled,
|
|
15
|
+
type LangiumDocument,
|
|
16
|
+
type Stream,
|
|
17
|
+
UriUtils,
|
|
18
|
+
type URI
|
|
19
|
+
} from '@hydranium/langium';
|
|
20
|
+
import { type CancellationToken, type InitializeParams } from 'vscode-languageserver';
|
|
13
21
|
import type { WorkspaceFolder } from 'vscode-languageserver-types';
|
|
14
22
|
import { type LogNameOptions, resolveLogFilePlaceholder, toLogFileWorkspaceToken } from '../diagnostics/logger.js';
|
|
23
|
+
import type { ServerLocale } from '../../locale/server-locale.js';
|
|
15
24
|
import type { ProjectChangeEvent } from '../project/project-change-event.js';
|
|
16
25
|
import type { ProjectManager } from '../project/project-manager.js';
|
|
17
26
|
import type { ServerSharedServicesMinimal } from '../shared-services.js';
|
|
@@ -19,6 +28,7 @@ import type { WritableFileSystemProvider } from '../../documents/ast-document-ma
|
|
|
19
28
|
import { type DocumentUriPolicy, findRealpathDivergence } from './document-uri-policy.js';
|
|
20
29
|
import { type AdditionalDocumentContribution, collectAdditionalDocuments } from './additional-document-contribution.js';
|
|
21
30
|
import { onProcessEvent } from '../../util/environment.js';
|
|
31
|
+
import { isConnectionGoneError } from '../../util/connection-liveness.js';
|
|
22
32
|
|
|
23
33
|
/**
|
|
24
34
|
* Module-level guard so repeated workspace-manager construction (e.g.
|
|
@@ -92,6 +102,18 @@ export function installOperationCancelledSuppression(logger: Logger): void {
|
|
|
92
102
|
});
|
|
93
103
|
}
|
|
94
104
|
|
|
105
|
+
/** Options for {@link HydraniumWorkspaceManager}. */
|
|
106
|
+
export interface HydraniumWorkspaceManagerOptions extends LogNameOptions {
|
|
107
|
+
/**
|
|
108
|
+
* Whether startup warns about seeded documents the bound
|
|
109
|
+
* `FileSystemProvider` cannot serve (see
|
|
110
|
+
* {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved}). Defaults to
|
|
111
|
+
* `true`; turn it off for a host that drops such documents at their last
|
|
112
|
+
* close on purpose.
|
|
113
|
+
*/
|
|
114
|
+
warnUnservedDocuments?: boolean;
|
|
115
|
+
}
|
|
116
|
+
|
|
95
117
|
/**
|
|
96
118
|
* Framework {@link DefaultWorkspaceManager} subclass that integrates the
|
|
97
119
|
* project tier with Langium's workspace startup.
|
|
@@ -124,8 +146,8 @@ export function installOperationCancelledSuppression(logger: Logger): void {
|
|
|
124
146
|
* URIs (its own members plus any transitive dependents per the
|
|
125
147
|
* `getAffectedProjects` hook). This manager re-runs
|
|
126
148
|
* `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
|
|
127
|
-
* affected document so the
|
|
128
|
-
* visibility scope.
|
|
149
|
+
* affected document so the build of the update that changed the descriptor
|
|
150
|
+
* re-links them with the new visibility scope.
|
|
129
151
|
*
|
|
130
152
|
* Descriptor URIs that triggered the cycle are intentionally excluded
|
|
131
153
|
* from the affected set by `AbstractProjectManager.onBuildUpdate` —
|
|
@@ -156,19 +178,27 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
156
178
|
readonly workspaceInitialized: Promise<unknown> = this.workspaceInitializedDeferred.promise;
|
|
157
179
|
|
|
158
180
|
protected readonly uriPolicy: DocumentUriPolicy;
|
|
181
|
+
/** Handed the client's locale at init; read by whoever renders in it. */
|
|
182
|
+
protected readonly serverLocale: ServerLocale;
|
|
159
183
|
protected readonly writableFileSystemProvider: WritableFileSystemProvider;
|
|
160
184
|
protected readonly additionalDocuments: Record<string, AdditionalDocumentContribution>;
|
|
161
185
|
/** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
|
|
162
186
|
protected readonly languageRegistry: ServerSharedServicesMinimal['ServiceRegistry'];
|
|
187
|
+
/** Whether startup runs {@link warnIfDocumentsUnserved}. */
|
|
188
|
+
protected readonly warnUnservedDocuments: boolean;
|
|
189
|
+
/** URIs of the documents the running startup's file traversal loaded; see {@link loadWorkspaceDocuments}. */
|
|
190
|
+
protected readonly traversedUris = new Set<string>();
|
|
163
191
|
|
|
164
|
-
constructor(services: ServerSharedServicesMinimal, options:
|
|
192
|
+
constructor(services: ServerSharedServicesMinimal, options: HydraniumWorkspaceManagerOptions = {}) {
|
|
165
193
|
super(services);
|
|
166
194
|
this.projectManager = services.workspace.ProjectManager;
|
|
167
195
|
this.projectManager.onProjectsChanged(event => this.onProjectsChanged(event));
|
|
168
196
|
this.uriPolicy = services.workspace.DocumentUriPolicy;
|
|
197
|
+
this.serverLocale = services.ServerLocale;
|
|
169
198
|
this.writableFileSystemProvider = services.workspace.FileSystemProvider;
|
|
170
199
|
this.additionalDocuments = services.additionalDocuments;
|
|
171
200
|
this.languageRegistry = services.ServiceRegistry;
|
|
201
|
+
this.warnUnservedDocuments = options.warnUnservedDocuments ?? true;
|
|
172
202
|
this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceManager').trace('instantiated');
|
|
173
203
|
installOperationCancelledSuppression(this.tracer);
|
|
174
204
|
}
|
|
@@ -197,16 +227,16 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
197
227
|
// seeded. `tags` is read at the done-emit, so the document count pushed
|
|
198
228
|
// inside the callback appears in the log line.
|
|
199
229
|
const tags: string[] = [`${contributions.length} contributions`];
|
|
200
|
-
|
|
230
|
+
const seeded: LangiumDocument[] = [];
|
|
201
231
|
await this.tracer.time(
|
|
202
232
|
'Load additional documents',
|
|
203
233
|
async () => {
|
|
204
234
|
await collectAdditionalDocuments(this.additionalDocuments, folders, document => {
|
|
205
|
-
|
|
235
|
+
seeded.push(document);
|
|
206
236
|
this.warnIfUnroutable(document);
|
|
207
237
|
collector(document);
|
|
208
238
|
});
|
|
209
|
-
tags.push(`${
|
|
239
|
+
tags.push(`${seeded.length} documents`);
|
|
210
240
|
},
|
|
211
241
|
'info',
|
|
212
242
|
{ logAfterMs: 0, tags }
|
|
@@ -268,11 +298,86 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
268
298
|
discovered.push(document);
|
|
269
299
|
}
|
|
270
300
|
}
|
|
271
|
-
|
|
301
|
+
this.traversedUris.clear();
|
|
302
|
+
let documents: LangiumDocument[];
|
|
303
|
+
try {
|
|
304
|
+
documents = await super.performStartup(folders);
|
|
305
|
+
if (this.warnUnservedDocuments) {
|
|
306
|
+
await this.warnIfDocumentsUnserved(documents.filter(document => !this.traversedUris.has(document.uri.toString())));
|
|
307
|
+
}
|
|
308
|
+
} finally {
|
|
309
|
+
this.traversedUris.clear();
|
|
310
|
+
}
|
|
272
311
|
this.probePathDivergence(folders);
|
|
273
312
|
return this.withDiscoveredDescriptors(documents, discovered);
|
|
274
313
|
}
|
|
275
314
|
|
|
315
|
+
/**
|
|
316
|
+
* Record each document the file traversal loads, so startup can tell them
|
|
317
|
+
* from the documents `loadAdditionalDocuments` seeded, through the
|
|
318
|
+
* `additionalDocuments` group or an override of its own.
|
|
319
|
+
*
|
|
320
|
+
* The traversal found each of its documents through the provider, so asking
|
|
321
|
+
* it again whether they exist costs one call per workspace file and cannot
|
|
322
|
+
* come out false. Telling them apart by scheme does not work either: the
|
|
323
|
+
* registry's host answers every scheme no other provider claims, a seeded
|
|
324
|
+
* scheme nobody serves included. An override that loads documents without
|
|
325
|
+
* delegating here leaves them unrecorded, so startup asks the provider
|
|
326
|
+
* about each of them.
|
|
327
|
+
*/
|
|
328
|
+
protected override async loadWorkspaceDocuments(uris: Stream<URI>, collector: (document: LangiumDocument) => void): Promise<void> {
|
|
329
|
+
await super.loadWorkspaceDocuments(uris, document => {
|
|
330
|
+
this.traversedUris.add(document.uri.toString());
|
|
331
|
+
collector(document);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Warn once when the bound `FileSystemProvider` cannot serve a seeded
|
|
337
|
+
* document, naming each such document's scheme.
|
|
338
|
+
*
|
|
339
|
+
* The last close keeps a document only if the provider says it `exists`, so
|
|
340
|
+
* each such document leaves the workspace the first time an editor closes
|
|
341
|
+
* it, and whatever resolved against it breaks. The framework's registry
|
|
342
|
+
* serves `virtual:` through the `fileSystemProviders` group and every other
|
|
343
|
+
* scheme through its host, which knows nothing of a scheme an adopter
|
|
344
|
+
* invented for its seeded documents, and nothing else reports the loss. A
|
|
345
|
+
* provider that throws counts as not serving the document, since a startup
|
|
346
|
+
* that failed on a diagnostic would be worse than the loss.
|
|
347
|
+
*
|
|
348
|
+
* Runs over every document startup collected outside the file traversal,
|
|
349
|
+
* which is what `loadAdditionalDocuments` seeded, through the
|
|
350
|
+
* `additionalDocuments` group or an override of that method, once startup
|
|
351
|
+
* has added them to the workspace, unless `warnUnservedDocuments` is
|
|
352
|
+
* `false`.
|
|
353
|
+
*/
|
|
354
|
+
protected async warnIfDocumentsUnserved(documents: readonly LangiumDocument[]): Promise<void> {
|
|
355
|
+
const unserved: URI[] = [];
|
|
356
|
+
for (const document of documents) {
|
|
357
|
+
let served = false;
|
|
358
|
+
try {
|
|
359
|
+
served = await this.writableFileSystemProvider.exists(document.uri);
|
|
360
|
+
} catch {
|
|
361
|
+
// Counted as unserved, below.
|
|
362
|
+
}
|
|
363
|
+
if (!served) {
|
|
364
|
+
unserved.push(document.uri);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (unserved.length === 0) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const schemes = [...new Set(unserved.map(uri => uri.scheme))];
|
|
371
|
+
const named = unserved.slice(0, 3).map(uri => uri.toString());
|
|
372
|
+
this.tracer.warn(
|
|
373
|
+
`${unserved.length} seeded document(s) under ${schemes.map(scheme => `${scheme}:`).join(', ')} cannot be served by the bound workspace.FileSystemProvider ` +
|
|
374
|
+
`(${named.join(', ')}${unserved.length > 3 ? ', …' : ''}), so each leaves the workspace at its ` +
|
|
375
|
+
`last close. Register a provider under the key ${schemes.map(scheme => `'${scheme}'`).join(', ')} in the shared ` +
|
|
376
|
+
'fileSystemProviders group, or serve the scheme from the host provider; set warnUnservedDocuments: false ' +
|
|
377
|
+
'to accept the loss.'
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
|
|
276
381
|
/**
|
|
277
382
|
* Add back the documents project discovery created that Langium's file
|
|
278
383
|
* traversal then filtered out.
|
|
@@ -360,6 +465,31 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
360
465
|
}
|
|
361
466
|
}
|
|
362
467
|
|
|
468
|
+
/**
|
|
469
|
+
* Forward the locale the client declared, then Langium's own read of the
|
|
470
|
+
* params. `DefaultWorkspaceManager.initialize` reads `workspaceFolders`
|
|
471
|
+
* alone, so `params.locale` would otherwise be discarded — and this is the
|
|
472
|
+
* only place it arrives, which the headless init seams route through too.
|
|
473
|
+
*
|
|
474
|
+
* **The ABSENT case is reported from here rather than from `ServerLocale`,
|
|
475
|
+
* because this is the only end that can see it.** `accept` is not called
|
|
476
|
+
* when no locale was declared — nor should it be, since `''` is a claim
|
|
477
|
+
* about a language rather than the absence of one — so a log written there
|
|
478
|
+
* covers one of the two outcomes and leaves the other looking like a server
|
|
479
|
+
* that never reached init. Both lines are at `info` for the reason `accept`
|
|
480
|
+
* gives: the framework ships no catalogue, so an undeclared locale and an
|
|
481
|
+
* untranslated code produce the same English and the log is what separates
|
|
482
|
+
* them.
|
|
483
|
+
*/
|
|
484
|
+
override initialize(params: InitializeParams): void {
|
|
485
|
+
if (params.locale) {
|
|
486
|
+
this.serverLocale.accept(params.locale);
|
|
487
|
+
} else {
|
|
488
|
+
this.tracer.info("no locale declared at init — rendering messages in the framework's English");
|
|
489
|
+
}
|
|
490
|
+
super.initialize(params);
|
|
491
|
+
}
|
|
492
|
+
|
|
363
493
|
/**
|
|
364
494
|
* Override of Langium's workspace setup to resolve / reject
|
|
365
495
|
* {@link workspaceInitializedDeferred} once setup completes. Adopters with
|
|
@@ -367,12 +497,22 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
367
497
|
* and either delegate to `super.initializeWorkspace(...)` (preserving the
|
|
368
498
|
* default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
|
|
369
499
|
* themselves after the additional work finishes.
|
|
500
|
+
*
|
|
501
|
+
* A failed setup is logged here, since every framework waiter on
|
|
502
|
+
* {@link workspaceInitialized} discards the rejection; an override that
|
|
503
|
+
* rejects the deferred itself logs its own failure.
|
|
370
504
|
*/
|
|
371
505
|
override async initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void> {
|
|
372
506
|
try {
|
|
373
507
|
await super.initializeWorkspace(folders, cancelToken);
|
|
374
508
|
this.workspaceInitializedDeferred.resolve(undefined);
|
|
375
|
-
} catch (error) {
|
|
509
|
+
} catch (error: unknown) {
|
|
510
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
511
|
+
if (isOperationCancelled(error) || isConnectionGoneError(error)) {
|
|
512
|
+
this.tracer.debug(`Initial workspace build did not complete: ${message}`);
|
|
513
|
+
} else {
|
|
514
|
+
this.tracer.error(`Initial workspace build failed: ${message}`);
|
|
515
|
+
}
|
|
376
516
|
this.workspaceInitializedDeferred.reject(error);
|
|
377
517
|
throw error;
|
|
378
518
|
}
|
|
@@ -380,9 +520,9 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
380
520
|
|
|
381
521
|
/**
|
|
382
522
|
* Default cascade-rebuild handler. Iterates {@link ProjectChangeEvent.affectedDocuments}
|
|
383
|
-
* and resets each to {@link DocumentState.Changed} so the
|
|
384
|
-
* re-runs the pipeline (parse → link → validate)
|
|
385
|
-
* visibility scope.
|
|
523
|
+
* and resets each to {@link DocumentState.Changed} so the build of the update
|
|
524
|
+
* that changed the descriptor re-runs the pipeline (parse → link → validate)
|
|
525
|
+
* under the new project visibility scope.
|
|
386
526
|
*
|
|
387
527
|
* Subclasses can override for additional behaviour (e.g. logging,
|
|
388
528
|
* telemetry, custom rebuild policies); call `super` to preserve the
|