@hydranium/core 1.0.0-next.28 → 1.0.0-next.281
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 +64 -82
- package/lib/documents/ast-document-manager.d.ts +252 -122
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +290 -130
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +5 -19
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +5 -19
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +15 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +15 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +146 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +207 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/dirty-state-tracker.d.ts +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 +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 +415 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +849 -483
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +10 -2
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +10 -2
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-shadow.d.ts +218 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +284 -0
- package/lib/documents/language-client-shadow.js.map +1 -0
- package/lib/documents/model-ledger.d.ts +47 -0
- package/lib/documents/model-ledger.d.ts.map +1 -0
- package/lib/documents/model-ledger.js +30 -0
- package/lib/documents/model-ledger.js.map +1 -0
- package/lib/documents/text-ledger.d.ts +64 -0
- package/lib/documents/text-ledger.d.ts.map +1 -0
- package/lib/documents/text-ledger.js +63 -0
- package/lib/documents/text-ledger.js.map +1 -0
- package/lib/documents/version-sync-service.d.ts +138 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +173 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts +3 -0
- 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 +49 -36
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +91 -45
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +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/build-phase-pass/build-phase-pass.d.ts +1 -1
- package/lib/langium/composite-ast-reflection.d.ts +46 -0
- package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
- package/lib/langium/composite-ast-reflection.js +97 -0
- package/lib/langium/composite-ast-reflection.js.map +1 -0
- package/lib/langium/config/configuration-provider.d.ts +81 -0
- package/lib/langium/config/configuration-provider.d.ts.map +1 -0
- package/lib/langium/config/configuration-provider.js +112 -0
- package/lib/langium/config/configuration-provider.js.map +1 -0
- package/lib/langium/config/index.d.ts +1 -0
- package/lib/langium/config/index.d.ts.map +1 -1
- package/lib/langium/config/index.js +1 -0
- package/lib/langium/config/index.js.map +1 -1
- package/lib/langium/config/settings.js.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +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 +10 -3
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +12 -5
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +58 -17
- 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 +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 +309 -35
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +511 -75
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
- package/lib/langium/documentation/comment-provider.js.map +1 -1
- package/lib/langium/integration-services.d.ts +40 -24
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +7 -4
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +16 -8
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +83 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +273 -63
- 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 +30 -5
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +18 -4
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +372 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +446 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +2 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +2 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-events.d.ts +66 -0
- package/lib/langium/model-service/model-events.d.ts.map +1 -0
- package/lib/langium/model-service/model-events.js +10 -0
- package/lib/langium/model-service/model-events.js.map +1 -0
- package/lib/langium/model-service/model-service.d.ts +440 -282
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +542 -446
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +158 -37
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +52 -36
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +27 -6
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +4 -3
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts +23 -1
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/naming/name-separator-validation.js +22 -0
- 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 +13 -6
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +2 -2
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +35 -12
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +23 -57
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/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 +61 -24
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +74 -35
- 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 +41 -37
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js +57 -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 +4 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js +4 -0
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +29 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +37 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +23 -6
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/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 +84 -35
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +34 -23
- 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 +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +280 -9
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +453 -8
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.js +1 -1
- package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
- package/lib/langium/workspace/document-uri-policy.d.ts +15 -10
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +7 -5
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +23 -0
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
- package/lib/langium/workspace/file-not-found.js +31 -0
- package/lib/langium/workspace/file-not-found.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +154 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +102 -13
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +109 -9
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +192 -12
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/index.d.ts +1 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +1 -0
- package/lib/langium/workspace/index.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +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 +37 -4
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +49 -4
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +7 -9
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +14 -13
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/self-save-registry.d.ts +84 -0
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +49 -15
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +81 -18
- 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/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 +106 -82
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +182 -102
- 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 +18 -12
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +22 -13
- package/lib/messages/carriers.js.map +1 -1
- package/lib/messages/index.d.ts +4 -1
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +4 -1
- package/lib/messages/index.js.map +1 -1
- 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.d.ts.map +1 -1
- package/lib/node/event-loop-monitor.js +2 -1
- package/lib/node/event-loop-monitor.js.map +1 -1
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +1 -1
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/lint-grammar.js.map +1 -1
- package/lib/node/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 +60 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +162 -52
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +12 -4
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +8 -6
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +13 -3
- package/lib/node/profiling-run.d.ts.map +1 -1
- package/lib/node/profiling-run.js +17 -8
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +61 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +80 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/server-diagnostics.js +1 -1
- package/lib/node/server-diagnostics.js.map +1 -1
- package/lib/node/server-state-snapshot.js +4 -4
- package/lib/node/server-state-snapshot.js.map +1 -1
- package/lib/node/socket-launcher.d.ts +20 -4
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +8 -7
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/stdio-launcher.d.ts +10 -10
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +17 -9
- package/lib/node/stdio-launcher.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 +16 -4
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js +18 -3
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/index.d.ts +1 -1
- package/lib/testing/index.d.ts.map +1 -1
- package/lib/testing/index.js +2 -1
- package/lib/testing/index.js.map +1 -1
- package/lib/testing/langium-test-helpers.d.ts.map +1 -1
- package/lib/testing/langium-test-helpers.js +1 -0
- package/lib/testing/langium-test-helpers.js.map +1 -1
- package/lib/testing/make-noop-language-services.js.map +1 -1
- package/lib/testing/make-noop-shared-services.d.ts +14 -0
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +28 -2
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +72 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +42 -10
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/make-test-tracer.d.ts +12 -0
- package/lib/testing/make-test-tracer.d.ts.map +1 -1
- package/lib/testing/make-test-tracer.js +13 -0
- package/lib/testing/make-test-tracer.js.map +1 -1
- package/lib/testing/node/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 +115 -0
- package/lib/testing/node/applied-edit-capture.js.map +1 -0
- package/lib/testing/node/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +12 -4
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +45 -106
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +30 -1
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +39 -2
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/node/unhandled-rejections.d.ts +20 -0
- package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
- package/lib/testing/node/unhandled-rejections.js +32 -0
- package/lib/testing/node/unhandled-rejections.js.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
- package/lib/testing/playwright/e2e-profiling.js.map +1 -1
- package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.js +164 -0
- package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +1 -0
- package/lib/testing/playwright/index.d.ts.map +1 -1
- package/lib/testing/playwright/index.js +1 -0
- package/lib/testing/playwright/index.js.map +1 -1
- package/lib/testing/playwright/server-log-capture.d.ts +35 -8
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +39 -6
- 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 +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +6 -5
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/run-update-pipeline.js.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +11 -52
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +31 -62
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +33 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +103 -5
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +132 -16
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +9 -8
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +6 -6
- package/lib/testing/stub-model-service.js.map +1 -1
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-self-save-registry.d.ts +1 -1
- package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
- package/lib/testing/stub-service-registry.d.ts +1 -1
- package/lib/testing/stub-service-registry.js.map +1 -1
- package/lib/testing/stub-writable-file-system.d.ts +1 -1
- package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
- package/lib/testing/stub-writable-file-system.js +2 -1
- package/lib/testing/stub-writable-file-system.js.map +1 -1
- package/lib/util/connection-liveness.d.ts +19 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +61 -15
- 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 +29 -53
- package/src/documents/ast-document-manager.ts +463 -231
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +24 -0
- package/src/documents/client-session-registry.ts +262 -0
- package/src/documents/dirty-state-tracker.ts +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 +68 -0
- package/src/documents/hydranium-text-documents.ts +968 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +452 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +275 -0
- package/src/index.ts +8 -0
- package/src/langium/ast-extension/ast-extension-service.ts +3 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +95 -52
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +1 -1
- package/src/langium/build-phase-pass/build-phase-pass.ts +1 -1
- 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/hydranium-langium-profiler.ts +15 -39
- package/src/langium/diagnostics/log-preamble.ts +1 -1
- package/src/langium/diagnostics/logger.ts +12 -5
- package/src/langium/diagnostics/lsp-logger.ts +61 -16
- package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +616 -73
- package/src/langium/integration-services.ts +59 -28
- package/src/langium/integrity/integrity-rule.ts +16 -8
- package/src/langium/integrity/integrity-service.ts +296 -69
- 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 +49 -8
- package/src/langium/model-service/client-session.ts +702 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +80 -0
- package/src/langium/model-service/model-service.ts +835 -475
- package/src/langium/module.ts +212 -67
- package/src/langium/naming/name-provider.ts +29 -7
- package/src/langium/naming/name-separator-validation.ts +25 -3
- package/src/langium/project/abstract-project-manager.ts +13 -5
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +50 -16
- 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 +89 -38
- 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 +74 -59
- 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 +4 -0
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +26 -6
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +102 -45
- 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-service.ts +1 -1
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +528 -13
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/document-uri-policy.ts +15 -10
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +234 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +221 -16
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +1 -0
- package/src/langium/workspace/initialize-workspace.ts +43 -5
- package/src/langium/workspace/langium-documents.ts +63 -5
- package/src/langium/workspace/persistent-file-system-provider.ts +15 -14
- package/src/langium/workspace/self-save-registry.ts +118 -0
- package/src/langium/workspace/virtual-document.ts +100 -19
- package/src/langium/workspace/write-lock-scope.ts +27 -12
- package/src/launcher/integrated-server.ts +3 -1
- 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 +227 -111
- 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 +23 -15
- package/src/messages/index.ts +13 -1
- package/src/messages/renderer.ts +212 -0
- package/src/node/event-loop-monitor.ts +2 -1
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +1 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/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 +178 -56
- package/src/node/profile-capture.ts +16 -15
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +94 -0
- package/src/node/server-diagnostics.ts +1 -1
- package/src/node/server-state-snapshot.ts +5 -5
- package/src/node/socket-launcher.ts +27 -11
- package/src/node/stdio-launcher.ts +22 -14
- package/src/testing/document-uri-policy-conformance.ts +1 -1
- package/src/testing/fake-document.ts +24 -5
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-noop-shared-services.ts +50 -2
- package/src/testing/make-test-services.ts +125 -31
- package/src/testing/make-test-tracer.ts +26 -0
- package/src/testing/node/applied-edit-capture.ts +139 -0
- package/src/testing/node/index.ts +1 -0
- package/src/testing/node/lsp-harness.ts +2 -0
- package/src/testing/node/lsp-server-connection.ts +74 -117
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +57 -3
- package/src/testing/node/unhandled-rejections.ts +31 -0
- package/src/testing/parse-semantic-root.ts +1 -1
- package/src/testing/playwright/flaky-network-proxy.ts +240 -0
- package/src/testing/playwright/index.ts +1 -0
- package/src/testing/playwright/server-log-capture.ts +63 -11
- 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 +12 -1
- package/src/testing/run-update-pipeline.ts +6 -5
- package/src/testing/stub-ast-document-manager.ts +47 -128
- package/src/testing/stub-document-builder.ts +133 -18
- package/src/testing/stub-hydranium-text-documents.ts +184 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +11 -10
- package/src/testing/stub-self-save-registry.ts +1 -1
- package/src/testing/stub-service-registry.ts +1 -1
- package/src/testing/stub-writable-file-system.ts +3 -2
- package/src/util/connection-liveness.ts +67 -15
- package/src/util/environment.ts +9 -1
- package/lib/documents/language-client-text-shadow.d.ts +0 -101
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -156
- package/lib/documents/language-client-text-shadow.js.map +0 -1
- package/lib/documents/self-save-registry.d.ts +0 -55
- package/lib/documents/self-save-registry.d.ts.map +0 -1
- package/lib/documents/self-save-registry.js.map +0 -1
- package/lib/lsp/instrument-connection.d.ts +0 -36
- package/lib/lsp/instrument-connection.d.ts.map +0 -1
- package/lib/lsp/instrument-connection.js +0 -62
- package/lib/lsp/instrument-connection.js.map +0 -1
- package/lib/node/process-memory.d.ts +0 -66
- package/lib/node/process-memory.d.ts.map +0 -1
- package/lib/node/process-memory.js +0 -252
- package/lib/node/process-memory.js.map +0 -1
- package/src/documents/language-client-text-shadow.ts +0 -175
- package/src/documents/self-save-registry.ts +0 -81
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -7,18 +7,29 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Deferred, type Logger, type Tracer } from '@hydranium/protocol';
|
|
11
|
-
import {
|
|
12
|
-
|
|
10
|
+
import { Deferred, type Logger, type Tracer, describeError, describeErrorWithStack } from '@hydranium/protocol';
|
|
11
|
+
import {
|
|
12
|
+
DefaultWorkspaceManager,
|
|
13
|
+
DocumentState,
|
|
14
|
+
interruptAndCheck,
|
|
15
|
+
isOperationCancelled,
|
|
16
|
+
type LangiumDocument,
|
|
17
|
+
type Stream,
|
|
18
|
+
UriUtils,
|
|
19
|
+
type URI
|
|
20
|
+
} from '@hydranium/langium';
|
|
21
|
+
import { type CancellationToken, CancellationTokenSource, type InitializeParams } from 'vscode-languageserver';
|
|
13
22
|
import type { WorkspaceFolder } from 'vscode-languageserver-types';
|
|
14
23
|
import { type LogNameOptions, resolveLogFilePlaceholder, toLogFileWorkspaceToken } from '../diagnostics/logger.js';
|
|
24
|
+
import type { ServerLocale } from '../../locale/server-locale.js';
|
|
15
25
|
import type { ProjectChangeEvent } from '../project/project-change-event.js';
|
|
16
26
|
import type { ProjectManager } from '../project/project-manager.js';
|
|
17
27
|
import type { ServerSharedServicesMinimal } from '../shared-services.js';
|
|
18
|
-
import type { WritableFileSystemProvider } from '
|
|
28
|
+
import type { WritableFileSystemProvider } from './file-system-provider.js';
|
|
19
29
|
import { type DocumentUriPolicy, findRealpathDivergence } from './document-uri-policy.js';
|
|
20
30
|
import { type AdditionalDocumentContribution, collectAdditionalDocuments } from './additional-document-contribution.js';
|
|
21
31
|
import { onProcessEvent } from '../../util/environment.js';
|
|
32
|
+
import { isConnectionGoneError } from '../../util/connection-liveness.js';
|
|
22
33
|
|
|
23
34
|
/**
|
|
24
35
|
* Module-level guard so repeated workspace-manager construction (e.g.
|
|
@@ -36,6 +47,13 @@ let operationCancelledSuppressionInstalled = false;
|
|
|
36
47
|
*/
|
|
37
48
|
let operationCancelledSuppressionLogger: Logger | undefined;
|
|
38
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Never cancelled: `interruptAndCheck` yields only for a token other than
|
|
52
|
+
* `CancellationToken.None`, and the load must not stop part-way, since Langium
|
|
53
|
+
* checks for cancellation once every document exists.
|
|
54
|
+
*/
|
|
55
|
+
const LOAD_YIELD_TOKEN = new CancellationTokenSource().token;
|
|
56
|
+
|
|
39
57
|
/**
|
|
40
58
|
* Decide what to do with a process-level unhandled promise rejection.
|
|
41
59
|
*
|
|
@@ -59,7 +77,7 @@ export function handleProcessUnhandledRejection(reason: unknown, logger: Logger)
|
|
|
59
77
|
if (typeof reason === 'symbol' && String(reason) === 'Symbol(OperationCancelled)') {
|
|
60
78
|
return;
|
|
61
79
|
}
|
|
62
|
-
logger.error('Unhandled promise rejection: ' + (reason
|
|
80
|
+
logger.error('Unhandled promise rejection: ' + describeErrorWithStack(reason));
|
|
63
81
|
}
|
|
64
82
|
|
|
65
83
|
/**
|
|
@@ -92,6 +110,18 @@ export function installOperationCancelledSuppression(logger: Logger): void {
|
|
|
92
110
|
});
|
|
93
111
|
}
|
|
94
112
|
|
|
113
|
+
/** Options for {@link HydraniumWorkspaceManager}. */
|
|
114
|
+
export interface HydraniumWorkspaceManagerOptions extends LogNameOptions {
|
|
115
|
+
/**
|
|
116
|
+
* Whether startup warns about seeded documents the bound
|
|
117
|
+
* `FileSystemProvider` cannot serve (see
|
|
118
|
+
* {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved}). Defaults to
|
|
119
|
+
* `true`; turn it off for a host that drops such documents at their last
|
|
120
|
+
* close on purpose.
|
|
121
|
+
*/
|
|
122
|
+
warnUnservedDocuments?: boolean;
|
|
123
|
+
}
|
|
124
|
+
|
|
95
125
|
/**
|
|
96
126
|
* Framework {@link DefaultWorkspaceManager} subclass that integrates the
|
|
97
127
|
* project tier with Langium's workspace startup.
|
|
@@ -124,8 +154,8 @@ export function installOperationCancelledSuppression(logger: Logger): void {
|
|
|
124
154
|
* URIs (its own members plus any transitive dependents per the
|
|
125
155
|
* `getAffectedProjects` hook). This manager re-runs
|
|
126
156
|
* `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
|
|
127
|
-
* affected document so the
|
|
128
|
-
* visibility scope.
|
|
157
|
+
* affected document so the build of the update that changed the descriptor
|
|
158
|
+
* re-links them with the new visibility scope.
|
|
129
159
|
*
|
|
130
160
|
* Descriptor URIs that triggered the cycle are intentionally excluded
|
|
131
161
|
* from the affected set by `AbstractProjectManager.onBuildUpdate` —
|
|
@@ -156,19 +186,29 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
156
186
|
readonly workspaceInitialized: Promise<unknown> = this.workspaceInitializedDeferred.promise;
|
|
157
187
|
|
|
158
188
|
protected readonly uriPolicy: DocumentUriPolicy;
|
|
189
|
+
/** Handed the client's locale at init; read by whoever renders in it. */
|
|
190
|
+
protected readonly serverLocale: ServerLocale;
|
|
159
191
|
protected readonly writableFileSystemProvider: WritableFileSystemProvider;
|
|
160
192
|
protected readonly additionalDocuments: Record<string, AdditionalDocumentContribution>;
|
|
161
193
|
/** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
|
|
162
194
|
protected readonly languageRegistry: ServerSharedServicesMinimal['ServiceRegistry'];
|
|
195
|
+
/** Whether startup runs {@link warnIfDocumentsUnserved}. */
|
|
196
|
+
protected readonly warnUnservedDocuments: boolean;
|
|
197
|
+
/** URIs of the documents the running startup's file traversal loaded; see {@link loadWorkspaceDocuments}. */
|
|
198
|
+
protected readonly traversedUris = new Set<string>();
|
|
199
|
+
/** How many documents {@link loadWorkspaceDocuments} reads and parses before it may yield; below 1 counts as 1. */
|
|
200
|
+
protected readonly loadChunkSize: number = 10;
|
|
163
201
|
|
|
164
|
-
constructor(services: ServerSharedServicesMinimal, options:
|
|
202
|
+
constructor(services: ServerSharedServicesMinimal, options: HydraniumWorkspaceManagerOptions = {}) {
|
|
165
203
|
super(services);
|
|
166
204
|
this.projectManager = services.workspace.ProjectManager;
|
|
167
205
|
this.projectManager.onProjectsChanged(event => this.onProjectsChanged(event));
|
|
168
206
|
this.uriPolicy = services.workspace.DocumentUriPolicy;
|
|
207
|
+
this.serverLocale = services.ServerLocale;
|
|
169
208
|
this.writableFileSystemProvider = services.workspace.FileSystemProvider;
|
|
170
209
|
this.additionalDocuments = services.additionalDocuments;
|
|
171
210
|
this.languageRegistry = services.ServiceRegistry;
|
|
211
|
+
this.warnUnservedDocuments = options.warnUnservedDocuments ?? true;
|
|
172
212
|
this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceManager').trace('instantiated');
|
|
173
213
|
installOperationCancelledSuppression(this.tracer);
|
|
174
214
|
}
|
|
@@ -197,16 +237,16 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
197
237
|
// seeded. `tags` is read at the done-emit, so the document count pushed
|
|
198
238
|
// inside the callback appears in the log line.
|
|
199
239
|
const tags: string[] = [`${contributions.length} contributions`];
|
|
200
|
-
|
|
240
|
+
const seeded: LangiumDocument[] = [];
|
|
201
241
|
await this.tracer.time(
|
|
202
242
|
'Load additional documents',
|
|
203
243
|
async () => {
|
|
204
244
|
await collectAdditionalDocuments(this.additionalDocuments, folders, document => {
|
|
205
|
-
|
|
245
|
+
seeded.push(document);
|
|
206
246
|
this.warnIfUnroutable(document);
|
|
207
247
|
collector(document);
|
|
208
248
|
});
|
|
209
|
-
tags.push(`${
|
|
249
|
+
tags.push(`${seeded.length} documents`);
|
|
210
250
|
},
|
|
211
251
|
'info',
|
|
212
252
|
{ logAfterMs: 0, tags }
|
|
@@ -268,11 +308,136 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
268
308
|
discovered.push(document);
|
|
269
309
|
}
|
|
270
310
|
}
|
|
271
|
-
|
|
311
|
+
this.traversedUris.clear();
|
|
312
|
+
let documents: LangiumDocument[];
|
|
313
|
+
try {
|
|
314
|
+
documents = await super.performStartup(folders);
|
|
315
|
+
if (this.warnUnservedDocuments) {
|
|
316
|
+
await this.warnIfDocumentsUnserved(documents.filter(document => !this.traversedUris.has(document.uri.toString())));
|
|
317
|
+
}
|
|
318
|
+
} finally {
|
|
319
|
+
this.traversedUris.clear();
|
|
320
|
+
}
|
|
272
321
|
this.probePathDivergence(folders);
|
|
273
322
|
return this.withDiscoveredDescriptors(documents, discovered);
|
|
274
323
|
}
|
|
275
324
|
|
|
325
|
+
/**
|
|
326
|
+
* Load the documents the file traversal found through
|
|
327
|
+
* {@link loadTraversedDocument}, {@link loadChunkSize} at a time, yielding
|
|
328
|
+
* between chunks once Langium's interruption period has passed. Langium's
|
|
329
|
+
* own load starts every read at once and parses each as it returns: over a
|
|
330
|
+
* synchronous provider nothing else runs until the last file has parsed, and
|
|
331
|
+
* over the Node provider incoming messages wait through long runs of parses.
|
|
332
|
+
* The cost: at most a chunk of reads is in flight, and each chunk waits for
|
|
333
|
+
* its slowest read, so slow storage takes a round per chunk, not one burst.
|
|
334
|
+
*
|
|
335
|
+
* Each loaded document is recorded, so startup can tell them from the
|
|
336
|
+
* documents `loadAdditionalDocuments` seeded, through the
|
|
337
|
+
* `additionalDocuments` group or an override of its own.
|
|
338
|
+
*
|
|
339
|
+
* The traversal found each of its documents through the provider, so asking
|
|
340
|
+
* it again whether they exist costs one call per workspace file and cannot
|
|
341
|
+
* come out false. Telling them apart by scheme does not work either: the
|
|
342
|
+
* registry's host answers every scheme no other provider claims, a seeded
|
|
343
|
+
* scheme nobody serves included. An override that loads documents without
|
|
344
|
+
* delegating here leaves them unrecorded, so startup asks the provider
|
|
345
|
+
* about each of them.
|
|
346
|
+
*/
|
|
347
|
+
protected override async loadWorkspaceDocuments(uris: Stream<URI>, collector: (document: LangiumDocument) => void): Promise<void> {
|
|
348
|
+
const pending = uris.toArray();
|
|
349
|
+
const chunkSize = Math.max(1, this.loadChunkSize);
|
|
350
|
+
for (let i = 0; i < pending.length; i += chunkSize) {
|
|
351
|
+
if (i > 0) {
|
|
352
|
+
await interruptAndCheck(LOAD_YIELD_TOKEN);
|
|
353
|
+
}
|
|
354
|
+
await Promise.all(
|
|
355
|
+
pending.slice(i, i + chunkSize).map(async uri => {
|
|
356
|
+
const document = await this.loadTraversedDocument(uri);
|
|
357
|
+
if (document) {
|
|
358
|
+
this.traversedUris.add(document.uri.toString());
|
|
359
|
+
collector(document);
|
|
360
|
+
}
|
|
361
|
+
})
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Load one document the file traversal found, or answer `undefined` to
|
|
368
|
+
* leave it out of the workspace.
|
|
369
|
+
*
|
|
370
|
+
* A file whose read fails and that the provider's `existsSettled`, or
|
|
371
|
+
* `exists` for a provider without it, reports gone is left out with a debug
|
|
372
|
+
* line, since it went between the scan and the read. A file still there is
|
|
373
|
+
* read once more, since a replacing rename can hide its name for a moment;
|
|
374
|
+
* that read's failure, and cancellation, fail the startup. A check that
|
|
375
|
+
* throws counts the file as there, since it cannot say the file went. The
|
|
376
|
+
* skip is the startup's only: other callers of `getOrCreateDocument` still
|
|
377
|
+
* get the read error.
|
|
378
|
+
*/
|
|
379
|
+
protected async loadTraversedDocument(uri: URI): Promise<LangiumDocument | undefined> {
|
|
380
|
+
try {
|
|
381
|
+
return await this.langiumDocuments.getOrCreateDocument(uri);
|
|
382
|
+
} catch (error: unknown) {
|
|
383
|
+
if (isOperationCancelled(error)) {
|
|
384
|
+
throw error;
|
|
385
|
+
}
|
|
386
|
+
const fileSystem = this.writableFileSystemProvider;
|
|
387
|
+
if (!(await (fileSystem.existsSettled?.(uri) ?? fileSystem.exists(uri)).catch(() => true))) {
|
|
388
|
+
this.tracer.debug(`Skipped ${uri.toString()}: it was removed between the workspace scan and its load`);
|
|
389
|
+
return undefined;
|
|
390
|
+
}
|
|
391
|
+
return this.langiumDocuments.getOrCreateDocument(uri);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Warn once when the bound `FileSystemProvider` cannot serve a seeded
|
|
397
|
+
* document, naming each such document's scheme.
|
|
398
|
+
*
|
|
399
|
+
* The last close keeps a document only if the provider says it `exists`, so
|
|
400
|
+
* each such document leaves the workspace the first time an editor closes
|
|
401
|
+
* it, and whatever resolved against it breaks. The framework's registry
|
|
402
|
+
* serves `virtual:` through the `fileSystemProviders` group and every other
|
|
403
|
+
* scheme through its host, which knows nothing of a scheme an adopter
|
|
404
|
+
* invented for its seeded documents, and nothing else reports the loss. A
|
|
405
|
+
* provider that throws counts as not serving the document, since a startup
|
|
406
|
+
* that failed on a diagnostic would be worse than the loss.
|
|
407
|
+
*
|
|
408
|
+
* Runs over every document startup collected outside the file traversal,
|
|
409
|
+
* which is what `loadAdditionalDocuments` seeded, through the
|
|
410
|
+
* `additionalDocuments` group or an override of that method, once startup
|
|
411
|
+
* has added them to the workspace, unless `warnUnservedDocuments` is
|
|
412
|
+
* `false`.
|
|
413
|
+
*/
|
|
414
|
+
protected async warnIfDocumentsUnserved(documents: readonly LangiumDocument[]): Promise<void> {
|
|
415
|
+
const unserved: URI[] = [];
|
|
416
|
+
for (const document of documents) {
|
|
417
|
+
let served = false;
|
|
418
|
+
try {
|
|
419
|
+
served = await this.writableFileSystemProvider.exists(document.uri);
|
|
420
|
+
} catch {
|
|
421
|
+
// Counted as unserved, below.
|
|
422
|
+
}
|
|
423
|
+
if (!served) {
|
|
424
|
+
unserved.push(document.uri);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
if (unserved.length === 0) {
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
const schemes = [...new Set(unserved.map(uri => uri.scheme))];
|
|
431
|
+
const named = unserved.slice(0, 3).map(uri => uri.toString());
|
|
432
|
+
this.tracer.warn(
|
|
433
|
+
`${unserved.length} seeded document(s) under ${schemes.map(scheme => `${scheme}:`).join(', ')} cannot be served by the bound workspace.FileSystemProvider ` +
|
|
434
|
+
`(${named.join(', ')}${unserved.length > 3 ? ', …' : ''}), so each leaves the workspace at its ` +
|
|
435
|
+
`last close. Register a provider under the key ${schemes.map(scheme => `'${scheme}'`).join(', ')} in the shared ` +
|
|
436
|
+
'fileSystemProviders group, or serve the scheme from the host provider; set warnUnservedDocuments: false ' +
|
|
437
|
+
'to accept the loss.'
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
|
|
276
441
|
/**
|
|
277
442
|
* Add back the documents project discovery created that Langium's file
|
|
278
443
|
* traversal then filtered out.
|
|
@@ -360,6 +525,31 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
360
525
|
}
|
|
361
526
|
}
|
|
362
527
|
|
|
528
|
+
/**
|
|
529
|
+
* Forward the locale the client declared, then Langium's own read of the
|
|
530
|
+
* params. `DefaultWorkspaceManager.initialize` reads `workspaceFolders`
|
|
531
|
+
* alone, so `params.locale` would otherwise be discarded — and this is the
|
|
532
|
+
* only place it arrives, which the headless init seams route through too.
|
|
533
|
+
*
|
|
534
|
+
* **The ABSENT case is reported from here rather than from `ServerLocale`,
|
|
535
|
+
* because this is the only end that can see it.** `accept` is not called
|
|
536
|
+
* when no locale was declared — nor should it be, since `''` is a claim
|
|
537
|
+
* about a language rather than the absence of one — so a log written there
|
|
538
|
+
* covers one of the two outcomes and leaves the other looking like a server
|
|
539
|
+
* that never reached init. Both lines are at `info` for the reason `accept`
|
|
540
|
+
* gives: the framework ships no catalogue, so an undeclared locale and an
|
|
541
|
+
* untranslated code produce the same English and the log is what separates
|
|
542
|
+
* them.
|
|
543
|
+
*/
|
|
544
|
+
override initialize(params: InitializeParams): void {
|
|
545
|
+
if (params.locale) {
|
|
546
|
+
this.serverLocale.accept(params.locale);
|
|
547
|
+
} else {
|
|
548
|
+
this.tracer.info("no locale declared at init — rendering messages in the framework's English");
|
|
549
|
+
}
|
|
550
|
+
super.initialize(params);
|
|
551
|
+
}
|
|
552
|
+
|
|
363
553
|
/**
|
|
364
554
|
* Override of Langium's workspace setup to resolve / reject
|
|
365
555
|
* {@link workspaceInitializedDeferred} once setup completes. Adopters with
|
|
@@ -367,22 +557,37 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
367
557
|
* and either delegate to `super.initializeWorkspace(...)` (preserving the
|
|
368
558
|
* default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
|
|
369
559
|
* themselves after the additional work finishes.
|
|
560
|
+
*
|
|
561
|
+
* A failed setup is logged here, since every framework waiter on
|
|
562
|
+
* {@link workspaceInitialized} discards the rejection; an override that
|
|
563
|
+
* rejects the deferred itself logs its own failure. A failed startup also
|
|
564
|
+
* rejects `ready`, so its waiters fail rather than wait forever; an override
|
|
565
|
+
* that skips `super` and catches a failed startup rejects `_ready` too.
|
|
370
566
|
*/
|
|
371
567
|
override async initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void> {
|
|
372
568
|
try {
|
|
373
569
|
await super.initializeWorkspace(folders, cancelToken);
|
|
374
570
|
this.workspaceInitializedDeferred.resolve(undefined);
|
|
375
|
-
} catch (error) {
|
|
571
|
+
} catch (error: unknown) {
|
|
572
|
+
if (isOperationCancelled(error) || isConnectionGoneError(error)) {
|
|
573
|
+
this.tracer.debug(`Initial workspace build did not complete: ${describeError(error)}`);
|
|
574
|
+
} else {
|
|
575
|
+
this.tracer.error(`Initial workspace build failed: ${describeErrorWithStack(error)}`);
|
|
576
|
+
}
|
|
376
577
|
this.workspaceInitializedDeferred.reject(error);
|
|
578
|
+
// Langium settles `ready` only after a startup that succeeded. Marked
|
|
579
|
+
// handled, as logged above; a no-op once startup has resolved it.
|
|
580
|
+
this._ready.reject(error);
|
|
581
|
+
this._ready.promise.catch(() => undefined);
|
|
377
582
|
throw error;
|
|
378
583
|
}
|
|
379
584
|
}
|
|
380
585
|
|
|
381
586
|
/**
|
|
382
587
|
* 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.
|
|
588
|
+
* and resets each to {@link DocumentState.Changed} so the build of the update
|
|
589
|
+
* that changed the descriptor re-runs the pipeline (parse → link → validate)
|
|
590
|
+
* under the new project visibility scope.
|
|
386
591
|
*
|
|
387
592
|
* Subclasses can override for additional behaviour (e.g. logging,
|
|
388
593
|
* telemetry, custom rebuild policies); call `super` to preserve the
|
|
@@ -9,21 +9,46 @@
|
|
|
9
9
|
|
|
10
10
|
import { type FileSystemNode, URI } from '@hydranium/langium';
|
|
11
11
|
import { defineMessage, type Tracer } from '@hydranium/protocol';
|
|
12
|
-
import { type WritableFileSystemProvider } from '
|
|
12
|
+
import { type WritableFileSystemProvider } from './file-system-provider.js';
|
|
13
13
|
import { type LogNameOptions } from '../diagnostics/logger.js';
|
|
14
14
|
import { serverSharedFactory, type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
15
|
-
import {
|
|
15
|
+
import { notFound } from './file-not-found.js';
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* A provider's spelling of "the document is not there", raised wherever a read
|
|
19
|
+
* finds no content — this filesystem, or a URI naming no location a disk-backed
|
|
20
|
+
* provider can reach. Distinct from `NO_LOADABLE_CONTENT`, which the URI policy
|
|
21
|
+
* raises when it can settle the question AHEAD of the read; a provider with no
|
|
22
|
+
* `realpath` cannot, so the miss surfaces here instead.
|
|
22
23
|
*/
|
|
23
24
|
export const NO_SUCH_FILE = defineMessage('hydranium/core/no-such-file', 'No such file: {uri}');
|
|
24
25
|
|
|
26
|
+
/** The same for a node of any kind, so it also covers a directory. */
|
|
25
27
|
export const NO_SUCH_PATH = defineMessage('hydranium/core/no-such-path', 'No such file or directory: {uri}');
|
|
26
28
|
|
|
29
|
+
/**
|
|
30
|
+
* A write addressed a URI the provider cannot reach on disk.
|
|
31
|
+
*
|
|
32
|
+
* Deliberately not a not-found code: {@link NO_SUCH_FILE} reports something
|
|
33
|
+
* missing, which a caller may reasonably answer by creating it — exactly the
|
|
34
|
+
* wrong reading here. The destination is not missing; the URI names no disk
|
|
35
|
+
* location at all, and no retry makes it one.
|
|
36
|
+
*
|
|
37
|
+
* Declared here rather than beside the Node provider that raises it, so the
|
|
38
|
+
* message catalog stays reachable from the portable `.` entry — the Node
|
|
39
|
+
* module pulls `node:fs` and is server-only.
|
|
40
|
+
*/
|
|
41
|
+
export const UNSUPPORTED_WRITE = defineMessage(
|
|
42
|
+
'hydranium/core/unsupported-write',
|
|
43
|
+
'Cannot write {uri}: the scheme names no location on disk'
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
/** A delete addressed a URI the provider cannot reach on disk, as {@link UNSUPPORTED_WRITE} a write. */
|
|
47
|
+
export const UNSUPPORTED_DELETE = defineMessage(
|
|
48
|
+
'hydranium/core/unsupported-delete',
|
|
49
|
+
'Cannot delete {uri}: the scheme names no location on disk'
|
|
50
|
+
);
|
|
51
|
+
|
|
27
52
|
/**
|
|
28
53
|
* File content keyed by path, for seeding an {@link InMemoryFileSystemProvider}.
|
|
29
54
|
*
|
|
@@ -117,41 +142,47 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
|
|
|
117
142
|
this.files.set(normalize(uri), content);
|
|
118
143
|
}
|
|
119
144
|
|
|
120
|
-
/** Remove the file at `uri`. A no-op when nothing is there. */
|
|
121
|
-
deleteFile(uri: URI): void {
|
|
122
|
-
|
|
145
|
+
/** Remove the file at `uri`. A no-op when nothing is there; a directory is refused. */
|
|
146
|
+
async deleteFile(uri: URI): Promise<void> {
|
|
147
|
+
const key = normalize(uri);
|
|
148
|
+
if (this.hasChildren(key)) {
|
|
149
|
+
throw new Error(`Cannot delete ${uri.toString()}: it is a directory`);
|
|
150
|
+
}
|
|
151
|
+
this.files.delete(key);
|
|
123
152
|
}
|
|
124
153
|
|
|
125
154
|
async writeFile(uri: URI, content: string): Promise<void> {
|
|
126
155
|
this.setFile(uri, content);
|
|
127
156
|
}
|
|
128
157
|
|
|
129
|
-
|
|
130
|
-
|
|
158
|
+
// `async` on each read whose sync twin can throw, rather than
|
|
159
|
+
// `Promise.resolve(this.<x>Sync(uri))`. That form evaluates the sync call
|
|
160
|
+
// FIRST, so a miss throws before `Promise.resolve` is ever reached — and a
|
|
161
|
+
// synchronous throw escapes the promise chain: `.catch()` never attaches and
|
|
162
|
+
// `Promise.all` dies while its argument array is still being built, so a
|
|
163
|
+
// caller reading several URIs cannot handle the miss it asked about.
|
|
164
|
+
async readFile(uri: URI): Promise<string> {
|
|
165
|
+
return this.readFileSync(uri);
|
|
131
166
|
}
|
|
132
167
|
|
|
133
168
|
readFileSync(uri: URI): string {
|
|
134
|
-
const served = serveVirtualDocument(this.services, uri);
|
|
135
|
-
if (served !== undefined) {
|
|
136
|
-
return served;
|
|
137
|
-
}
|
|
138
169
|
const content = this.files.get(normalize(uri));
|
|
139
170
|
if (content === undefined) {
|
|
140
|
-
throw
|
|
171
|
+
throw notFound(NO_SUCH_FILE.format({ uri: uri.toString() }), uri);
|
|
141
172
|
}
|
|
142
173
|
return content;
|
|
143
174
|
}
|
|
144
175
|
|
|
145
|
-
readBinary(uri: URI): Promise<Uint8Array> {
|
|
146
|
-
return
|
|
176
|
+
async readBinary(uri: URI): Promise<Uint8Array> {
|
|
177
|
+
return this.readBinarySync(uri);
|
|
147
178
|
}
|
|
148
179
|
|
|
149
180
|
readBinarySync(uri: URI): Uint8Array {
|
|
150
181
|
return new TextEncoder().encode(this.readFileSync(uri));
|
|
151
182
|
}
|
|
152
183
|
|
|
153
|
-
stat(uri: URI): Promise<FileSystemNode> {
|
|
154
|
-
return
|
|
184
|
+
async stat(uri: URI): Promise<FileSystemNode> {
|
|
185
|
+
return this.statSync(uri);
|
|
155
186
|
}
|
|
156
187
|
|
|
157
188
|
statSync(uri: URI): FileSystemNode {
|
|
@@ -162,7 +193,7 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
|
|
|
162
193
|
if (this.hasChildren(path)) {
|
|
163
194
|
return { isFile: false, isDirectory: true, uri };
|
|
164
195
|
}
|
|
165
|
-
throw
|
|
196
|
+
throw notFound(NO_SUCH_PATH.format({ uri: uri.toString() }), uri);
|
|
166
197
|
}
|
|
167
198
|
|
|
168
199
|
exists(uri: URI): Promise<boolean> {
|
|
@@ -239,8 +270,8 @@ function normalize(uri: URI | string): string {
|
|
|
239
270
|
* services context exactly where a Node host spreads `NodeFileSystem`.
|
|
240
271
|
*
|
|
241
272
|
* A host that needs to reach the provider afterwards — to seed or mutate it
|
|
242
|
-
* mid-test —
|
|
243
|
-
* slot owns construction.
|
|
273
|
+
* mid-test — narrows `shared.workspace.FileSystemProvider.host` to this
|
|
274
|
+
* class, since the slot owns construction.
|
|
244
275
|
*/
|
|
245
276
|
export function inMemoryFileSystem(options: InMemoryFileSystemOptions = {}): {
|
|
246
277
|
fileSystemProvider: (services: unknown) => WritableFileSystemProvider;
|
|
@@ -11,6 +11,7 @@ export * from './document-uri-policy.js';
|
|
|
11
11
|
export * from './file-system-provider.js';
|
|
12
12
|
export * from './in-memory-file-system-provider.js';
|
|
13
13
|
export * from './persistent-file-system-provider.js';
|
|
14
|
+
export * from './self-save-registry.js';
|
|
14
15
|
export * from './index-manager.js';
|
|
15
16
|
export * from './initialize-workspace.js';
|
|
16
17
|
export * from './langium-documents.js';
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { UriUtils, URI } from '@hydranium/langium';
|
|
11
|
+
import type { Locale } from '@hydranium/protocol';
|
|
11
12
|
// Bare `'path'` (not `node:path`) so a browser bundle can alias it to a POSIX
|
|
12
13
|
// shim — this is the only filesystem-path use left on the portable `.` entry,
|
|
13
14
|
// and it's the headless/CLI string-input convenience of `toWorkspaceFolders`.
|
|
@@ -18,6 +19,33 @@ import type { ServerSharedServicesMinimal } from '../shared-services.js';
|
|
|
18
19
|
/** A workspace folder root accepted by the headless init seams: a filesystem path or a {@link URI}. */
|
|
19
20
|
export type WorkspaceFolderInput = string | URI;
|
|
20
21
|
|
|
22
|
+
/**
|
|
23
|
+
* Options for the headless init seams.
|
|
24
|
+
*
|
|
25
|
+
* **Optional, and the parameter is optional too**, so that no existing caller
|
|
26
|
+
* has to change to gain a field it does not set.
|
|
27
|
+
*/
|
|
28
|
+
export interface ProgrammaticInitOptions {
|
|
29
|
+
/**
|
|
30
|
+
* The locale to render user-facing server messages in — the headless
|
|
31
|
+
* equivalent of LSP `initialize`'s `locale`, for a head with no LSP
|
|
32
|
+
* connection (`startStdioServer`, the CLI subcommands, a test harness).
|
|
33
|
+
*
|
|
34
|
+
* Omitted means no locale, which the default renderer resolves as the
|
|
35
|
+
* framework's English. That is the correct answer for a headless tool: it
|
|
36
|
+
* has no reading user to have a language.
|
|
37
|
+
*
|
|
38
|
+
* **An IETF language tag, hyphenated — `de`, `de-CH`, `zh-Hant-TW` — and
|
|
39
|
+
* not the POSIX or Java spelling.** An LSP client is held to that syntax by
|
|
40
|
+
* the protocol, while a headless caller supplies the string itself and the
|
|
41
|
+
* obvious source is an environment variable holding `de_DE` or
|
|
42
|
+
* `en_US.UTF-8`. Neither is a tag, and the string is passed through
|
|
43
|
+
* unchecked, so a renderer that parses it finds nothing to match and every
|
|
44
|
+
* message renders in English.
|
|
45
|
+
*/
|
|
46
|
+
readonly locale?: Locale;
|
|
47
|
+
}
|
|
48
|
+
|
|
21
49
|
/**
|
|
22
50
|
* Normalize the seam's flexible folder argument to LSP {@link WorkspaceFolder}s.
|
|
23
51
|
* A `string` is resolved to an absolute filesystem path and wrapped as a
|
|
@@ -58,17 +86,25 @@ function toWorkspaceFolders(folders: WorkspaceFolderInput | ReadonlyArray<Worksp
|
|
|
58
86
|
*
|
|
59
87
|
* @param services the shared services tree the workspace manager lives on
|
|
60
88
|
* @param folders one or more workspace roots (filesystem paths or URIs)
|
|
89
|
+
* @param options the message locale, when the caller has one
|
|
61
90
|
*/
|
|
62
91
|
export async function initializeWorkspaceProgrammatically(
|
|
63
92
|
services: ServerSharedServicesMinimal,
|
|
64
|
-
folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput
|
|
93
|
+
folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>,
|
|
94
|
+
options: ProgrammaticInitOptions = {}
|
|
65
95
|
): Promise<void> {
|
|
66
96
|
const workspaceFolders = toWorkspaceFolders(folders);
|
|
67
97
|
const manager = services.workspace.WorkspaceManager;
|
|
68
|
-
// `
|
|
98
|
+
// `locale` goes through the synthesized params rather than a direct
|
|
99
|
+
// `acceptLocale` call, so this seam and a real LSP `initialize` reach the
|
|
100
|
+
// slot by the SAME path — an adopter overriding the capture in
|
|
101
|
+
// `HydraniumWorkspaceManager.initialize` is honoured headlessly too, which a
|
|
102
|
+
// second write site here would silently bypass.
|
|
103
|
+
//
|
|
104
|
+
// `initialize` records the folders (DefaultWorkspaceManager reads only that
|
|
69
105
|
// field); `initialized` runs `mutex.write(initializeWorkspace)` and resolves
|
|
70
106
|
// once discovery + the init build settle, so awaiting it is the ready gate.
|
|
71
|
-
manager.initialize({ workspaceFolders } as InitializeParams);
|
|
107
|
+
manager.initialize({ workspaceFolders, locale: options.locale } as InitializeParams);
|
|
72
108
|
await manager.initialized({} as InitializedParams);
|
|
73
109
|
}
|
|
74
110
|
|
|
@@ -91,12 +127,14 @@ export async function initializeWorkspaceProgrammatically(
|
|
|
91
127
|
*
|
|
92
128
|
* @param services the shared services tree the workspace manager lives on
|
|
93
129
|
* @param folders one or more workspace roots (filesystem paths or URIs)
|
|
130
|
+
* @param options the message locale, when the caller has one
|
|
94
131
|
*/
|
|
95
132
|
export async function buildWorkspaceProgrammatically(
|
|
96
133
|
services: ServerSharedServicesMinimal,
|
|
97
|
-
folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput
|
|
134
|
+
folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>,
|
|
135
|
+
options: ProgrammaticInitOptions = {}
|
|
98
136
|
): Promise<void> {
|
|
99
|
-
await initializeWorkspaceProgrammatically(services, folders);
|
|
137
|
+
await initializeWorkspaceProgrammatically(services, folders, options);
|
|
100
138
|
const documents = services.workspace.LangiumDocuments.all.toArray();
|
|
101
139
|
await services.workspace.DocumentBuilder.build(documents, { validation: true });
|
|
102
140
|
}
|