@hydranium/core 1.0.0-next.27 → 1.0.0-next.271
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 +219 -122
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +242 -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 +86 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +72 -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 +401 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +827 -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 +34 -25
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +77 -37
- 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 +61 -19
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +10 -5
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +16 -8
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +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 +343 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +428 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +2 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +2 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-events.d.ts +61 -0
- package/lib/langium/model-service/model-events.d.ts.map +1 -0
- package/lib/langium/model-service/model-events.js +10 -0
- package/lib/langium/model-service/model-events.js.map +1 -0
- package/lib/langium/model-service/model-service.d.ts +433 -282
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +537 -441
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +151 -36
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +48 -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 +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/serializer.d.ts +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +29 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +37 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +23 -6
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/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 +88 -36
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +46 -24
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +423 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +906 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +48 -0
- package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
- package/lib/langium/trivia/index.d.ts +14 -0
- package/lib/langium/trivia/index.d.ts.map +1 -0
- package/lib/langium/trivia/index.js +14 -0
- package/lib/langium/trivia/index.js.map +1 -0
- package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
- package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-contribution.js +10 -0
- package/lib/langium/trivia/trivia-contribution.js.map +1 -0
- package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts +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 +147 -9
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +97 -14
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +129 -12
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +22 -7
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +36 -19
- 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 +1 -8
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +2 -8
- 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 +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/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 +92 -81
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +155 -101
- 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 +54 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +141 -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 +6 -5
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +13 -4
- 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 +24 -65
- 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 +115 -16
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +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 +383 -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 +140 -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 +944 -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 +77 -37
- 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 +83 -24
- 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 +661 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +75 -0
- package/src/langium/model-service/model-service.ts +824 -471
- package/src/langium/module.ts +201 -66
- 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 +13 -32
- package/src/langium/serialization/serializer.ts +1 -1
- 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 +115 -47
- 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 +221 -17
- package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +155 -16
- package/src/langium/workspace/in-memory-file-system-provider.ts +41 -20
- 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 +3 -9
- package/src/langium/workspace/self-save-registry.ts +118 -0
- package/src/langium/workspace/virtual-document.ts +96 -19
- package/src/langium/workspace/write-lock-scope.ts +24 -11
- 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 +197 -110
- 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 +157 -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 +18 -9
- 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 +36 -138
- package/src/testing/stub-document-builder.ts +133 -18
- package/src/testing/stub-hydranium-text-documents.ts +165 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +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,28 @@
|
|
|
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
|
+
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';
|
|
18
|
-
import type { WritableFileSystemProvider } from '
|
|
27
|
+
import type { WritableFileSystemProvider } from './file-system-provider.js';
|
|
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.
|
|
@@ -59,7 +69,7 @@ export function handleProcessUnhandledRejection(reason: unknown, logger: Logger)
|
|
|
59
69
|
if (typeof reason === 'symbol' && String(reason) === 'Symbol(OperationCancelled)') {
|
|
60
70
|
return;
|
|
61
71
|
}
|
|
62
|
-
logger.error('Unhandled promise rejection: ' + (reason
|
|
72
|
+
logger.error('Unhandled promise rejection: ' + describeErrorWithStack(reason));
|
|
63
73
|
}
|
|
64
74
|
|
|
65
75
|
/**
|
|
@@ -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,21 @@ 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
|
+
if (isOperationCancelled(error) || isConnectionGoneError(error)) {
|
|
511
|
+
this.tracer.debug(`Initial workspace build did not complete: ${describeError(error)}`);
|
|
512
|
+
} else {
|
|
513
|
+
this.tracer.error(`Initial workspace build failed: ${describeErrorWithStack(error)}`);
|
|
514
|
+
}
|
|
376
515
|
this.workspaceInitializedDeferred.reject(error);
|
|
377
516
|
throw error;
|
|
378
517
|
}
|
|
@@ -380,9 +519,9 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
380
519
|
|
|
381
520
|
/**
|
|
382
521
|
* 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.
|
|
522
|
+
* and resets each to {@link DocumentState.Changed} so the build of the update
|
|
523
|
+
* that changed the descriptor re-runs the pipeline (parse → link → validate)
|
|
524
|
+
* under the new project visibility scope.
|
|
386
525
|
*
|
|
387
526
|
* Subclasses can override for additional behaviour (e.g. logging,
|
|
388
527
|
* telemetry, custom rebuild policies); call `super` to preserve the
|
|
@@ -9,21 +9,40 @@
|
|
|
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
|
+
|
|
27
46
|
/**
|
|
28
47
|
* File content keyed by path, for seeding an {@link InMemoryFileSystemProvider}.
|
|
29
48
|
*
|
|
@@ -126,32 +145,34 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
|
|
|
126
145
|
this.setFile(uri, content);
|
|
127
146
|
}
|
|
128
147
|
|
|
129
|
-
|
|
130
|
-
|
|
148
|
+
// `async` on each read whose sync twin can throw, rather than
|
|
149
|
+
// `Promise.resolve(this.<x>Sync(uri))`. That form evaluates the sync call
|
|
150
|
+
// FIRST, so a miss throws before `Promise.resolve` is ever reached — and a
|
|
151
|
+
// synchronous throw escapes the promise chain: `.catch()` never attaches and
|
|
152
|
+
// `Promise.all` dies while its argument array is still being built, so a
|
|
153
|
+
// caller reading several URIs cannot handle the miss it asked about.
|
|
154
|
+
async readFile(uri: URI): Promise<string> {
|
|
155
|
+
return this.readFileSync(uri);
|
|
131
156
|
}
|
|
132
157
|
|
|
133
158
|
readFileSync(uri: URI): string {
|
|
134
|
-
const served = serveVirtualDocument(this.services, uri);
|
|
135
|
-
if (served !== undefined) {
|
|
136
|
-
return served;
|
|
137
|
-
}
|
|
138
159
|
const content = this.files.get(normalize(uri));
|
|
139
160
|
if (content === undefined) {
|
|
140
|
-
throw
|
|
161
|
+
throw notFound(NO_SUCH_FILE.format({ uri: uri.toString() }), uri);
|
|
141
162
|
}
|
|
142
163
|
return content;
|
|
143
164
|
}
|
|
144
165
|
|
|
145
|
-
readBinary(uri: URI): Promise<Uint8Array> {
|
|
146
|
-
return
|
|
166
|
+
async readBinary(uri: URI): Promise<Uint8Array> {
|
|
167
|
+
return this.readBinarySync(uri);
|
|
147
168
|
}
|
|
148
169
|
|
|
149
170
|
readBinarySync(uri: URI): Uint8Array {
|
|
150
171
|
return new TextEncoder().encode(this.readFileSync(uri));
|
|
151
172
|
}
|
|
152
173
|
|
|
153
|
-
stat(uri: URI): Promise<FileSystemNode> {
|
|
154
|
-
return
|
|
174
|
+
async stat(uri: URI): Promise<FileSystemNode> {
|
|
175
|
+
return this.statSync(uri);
|
|
155
176
|
}
|
|
156
177
|
|
|
157
178
|
statSync(uri: URI): FileSystemNode {
|
|
@@ -162,7 +183,7 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
|
|
|
162
183
|
if (this.hasChildren(path)) {
|
|
163
184
|
return { isFile: false, isDirectory: true, uri };
|
|
164
185
|
}
|
|
165
|
-
throw
|
|
186
|
+
throw notFound(NO_SUCH_PATH.format({ uri: uri.toString() }), uri);
|
|
166
187
|
}
|
|
167
188
|
|
|
168
189
|
exists(uri: URI): Promise<boolean> {
|
|
@@ -239,8 +260,8 @@ function normalize(uri: URI | string): string {
|
|
|
239
260
|
* services context exactly where a Node host spreads `NodeFileSystem`.
|
|
240
261
|
*
|
|
241
262
|
* A host that needs to reach the provider afterwards — to seed or mutate it
|
|
242
|
-
* mid-test —
|
|
243
|
-
* slot owns construction.
|
|
263
|
+
* mid-test — narrows `shared.workspace.FileSystemProvider.host` to this
|
|
264
|
+
* class, since the slot owns construction.
|
|
244
265
|
*/
|
|
245
266
|
export function inMemoryFileSystem(options: InMemoryFileSystemOptions = {}): {
|
|
246
267
|
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
|
}
|
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { type AstNode, DefaultLangiumDocuments, type LangiumDocument, type LangiumDocuments, type URI } from '@hydranium/langium';
|
|
10
|
+
import { type AstNode, DefaultLangiumDocuments, type LangiumDocument, type LangiumDocuments, type URI, UriUtils } from '@hydranium/langium';
|
|
11
11
|
import { defineMessage } from '@hydranium/protocol';
|
|
12
12
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
13
13
|
import { type DocumentUriPolicy } from './document-uri-policy.js';
|
|
14
|
+
import { type HydraniumLangiumDocumentFactory } from './hydranium-langium-document-factory.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* The document a caller asked to load is not there.
|
|
@@ -22,6 +23,19 @@ import { type DocumentUriPolicy } from './document-uri-policy.js';
|
|
|
22
23
|
*/
|
|
23
24
|
export const NO_LOADABLE_CONTENT = defineMessage('hydranium/core/no-loadable-content', 'No loadable content for {uri}');
|
|
24
25
|
|
|
26
|
+
/**
|
|
27
|
+
* A stand-in was asked for at a URI that routes to no grammar, and no language
|
|
28
|
+
* id was given to route it instead.
|
|
29
|
+
*
|
|
30
|
+
* User-facing, and raised BEFORE the parse: left to Langium's ladder the same
|
|
31
|
+
* condition surfaces as `no services for the extension ''`, which names neither
|
|
32
|
+
* the URI nor the argument that would have answered.
|
|
33
|
+
*/
|
|
34
|
+
export const NO_LANGUAGE_FOR_STAND_IN = defineMessage(
|
|
35
|
+
'hydranium/core/no-language-for-stand-in',
|
|
36
|
+
'No grammar routes {uri}; pass a languageId to say which one the stand-in should parse with'
|
|
37
|
+
);
|
|
38
|
+
|
|
25
39
|
/**
|
|
26
40
|
* The registry surface the framework adds on top of Langium's
|
|
27
41
|
* {@link LangiumDocuments}. Declared separately from the implementing class so
|
|
@@ -30,7 +44,7 @@ export const NO_LOADABLE_CONTENT = defineMessage('hydranium/core/no-loadable-con
|
|
|
30
44
|
* depend on itself.
|
|
31
45
|
*/
|
|
32
46
|
export interface HydraniumDocumentRegistry extends LangiumDocuments {
|
|
33
|
-
createEmptyDocument(uri: URI): LangiumDocument<AstNode>;
|
|
47
|
+
createEmptyDocument(uri: URI, languageId?: string): LangiumDocument<AstNode>;
|
|
34
48
|
}
|
|
35
49
|
|
|
36
50
|
/**
|
|
@@ -58,6 +72,13 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
58
72
|
/** Document-identity seam, shared with the text store, event filters, and builder. */
|
|
59
73
|
protected readonly uriPolicy: DocumentUriPolicy;
|
|
60
74
|
|
|
75
|
+
/**
|
|
76
|
+
* Narrows the inherited Langium factory field to the framework's, so the
|
|
77
|
+
* language-explicit `fromStringInLanguage` below needs no cast. The
|
|
78
|
+
* framework's shared module binds that class.
|
|
79
|
+
*/
|
|
80
|
+
declare protected readonly langiumDocumentFactory: HydraniumLangiumDocumentFactory;
|
|
81
|
+
|
|
61
82
|
constructor(protected override readonly services: ServerSharedServicesMinimal) {
|
|
62
83
|
super(services);
|
|
63
84
|
this.uriPolicy = services.workspace.DocumentUriPolicy;
|
|
@@ -65,8 +86,9 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
65
86
|
|
|
66
87
|
/**
|
|
67
88
|
* Build a transient document for `uri` by parsing empty text with the
|
|
68
|
-
* grammar `
|
|
69
|
-
* every containment
|
|
89
|
+
* grammar `languageId` names, or the one `uri` routes to when it is
|
|
90
|
+
* omitted, so the root is that language's entry type with every containment
|
|
91
|
+
* list initialised.
|
|
70
92
|
*
|
|
71
93
|
* For callers that need a document at a URI with no content on disk — the
|
|
72
94
|
* scope provider querying before a file exists is the case it was added for.
|
|
@@ -75,6 +97,15 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
75
97
|
* that silently is not the file, whereas calling this is a caller saying it
|
|
76
98
|
* wants a stand-in.
|
|
77
99
|
*
|
|
100
|
+
* **Pass `languageId` whenever the URI names no file.** The create-element
|
|
101
|
+
* flow this exists for asks at the DIRECTORY a file is about to be written
|
|
102
|
+
* into, and a directory URI has no extension for the routing ladder to end
|
|
103
|
+
* on — so omitting the id there fails inside the parse, on an empty
|
|
104
|
+
* extension rather than on the URI. A caller in that position always knows
|
|
105
|
+
* its language: {@link HydraniumScopeProvider} is bound per grammar, and a
|
|
106
|
+
* request that names no document at all still carries the AST type
|
|
107
|
+
* `ExtendedServiceRegistry.soleServicesByType` routes on.
|
|
108
|
+
*
|
|
78
109
|
* The result is not registered, so nothing downstream can see it, and
|
|
79
110
|
* `LangiumDocumentFactory.update` would read from disk. It is a probe, not a
|
|
80
111
|
* document under construction; content that must survive belongs in a
|
|
@@ -86,12 +117,32 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
86
117
|
* and it is kept: `AstReflection.isComplete` is `false` for such a root
|
|
87
118
|
* however it is built, so the error states the same thing.
|
|
88
119
|
*/
|
|
89
|
-
createEmptyDocument(uri: URI): LangiumDocument<AstNode> {
|
|
120
|
+
createEmptyDocument(uri: URI, languageId?: string): LangiumDocument<AstNode> {
|
|
121
|
+
if (languageId !== undefined) {
|
|
122
|
+
return this.langiumDocumentFactory.fromStringInLanguage('', uri, languageId);
|
|
123
|
+
}
|
|
124
|
+
if (!this.services.ServiceRegistry.getServicesFor(uri)) {
|
|
125
|
+
// Reported here rather than left to the parse, which ends on the empty
|
|
126
|
+
// extension and so names neither the URI nor the id that would have
|
|
127
|
+
// answered.
|
|
128
|
+
throw new Error(NO_LANGUAGE_FOR_STAND_IN.format({ uri: uri.toString() }));
|
|
129
|
+
}
|
|
90
130
|
// The two-argument overload is synchronous; passing a cancellation token
|
|
91
131
|
// selects the promise-returning one, which this contract cannot await.
|
|
92
132
|
return this.langiumDocumentFactory.fromString('', uri);
|
|
93
133
|
}
|
|
94
134
|
|
|
135
|
+
/**
|
|
136
|
+
* Registers `document`, then reports it to `VersionSyncService.modelProduced`:
|
|
137
|
+
* a first load parses outside the build, so no build's re-parse reports it.
|
|
138
|
+
* That marks one below `Parsed`, such as the builder's placeholder for a new
|
|
139
|
+
* file, as a placeholder. A rejected duplicate is not reported.
|
|
140
|
+
*/
|
|
141
|
+
override addDocument(document: LangiumDocument): void {
|
|
142
|
+
super.addDocument(document);
|
|
143
|
+
this.services.workspace.VersionSyncService.modelProduced(document);
|
|
144
|
+
}
|
|
145
|
+
|
|
95
146
|
override async getOrCreateDocument(uri: URI): Promise<LangiumDocument<AstNode>> {
|
|
96
147
|
const resolved = this.uriPolicy.loadUri(uri);
|
|
97
148
|
if (resolved) {
|
|
@@ -120,6 +171,13 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
120
171
|
throw error;
|
|
121
172
|
}
|
|
122
173
|
}
|
|
174
|
+
// No file, but possibly a document: one created and not yet saved is
|
|
175
|
+
// built from its text and registered under its canonical URI.
|
|
176
|
+
const created = this.getDocument(UriUtils.toUri(this.uriPolicy.canonicalUri(uri)));
|
|
177
|
+
if (created) {
|
|
178
|
+
this.services.workspace.CstResidencyService.rehydrate(created);
|
|
179
|
+
return created;
|
|
180
|
+
}
|
|
123
181
|
// The seam reports no loadable content, so there is nothing to read and
|
|
124
182
|
// no error from a read to carry.
|
|
125
183
|
throw new Error(NO_LOADABLE_CONTENT.format({ uri: uri.toString() }));
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { URI } from '@hydranium/langium';
|
|
11
|
-
import {
|
|
11
|
+
import { describeErrorWithStack } from '@hydranium/protocol';
|
|
12
|
+
import { type WritableFileSystemProvider } from './file-system-provider.js';
|
|
12
13
|
import { serverSharedFactory, type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
13
14
|
import { type FileSystemSeed, InMemoryFileSystemProvider, type InMemoryFileSystemOptions } from './in-memory-file-system-provider.js';
|
|
14
15
|
|
|
@@ -125,13 +126,6 @@ export interface PersistentFileSystemOptions extends InMemoryFileSystemOptions {
|
|
|
125
126
|
* restored as deleted, which is why the marker is NUL-wrapped and text a grammar
|
|
126
127
|
* can parse is not.
|
|
127
128
|
*
|
|
128
|
-
* # A registered virtual document still wins
|
|
129
|
-
*
|
|
130
|
-
* `readFileSync` consults the virtual-document seam before the map, so a stdlib
|
|
131
|
-
* contributed in code keeps answering for its URI whether or not the store holds
|
|
132
|
-
* one. The store cannot shadow it, which is what keeps a rebuild that re-reads
|
|
133
|
-
* that URI from losing the stdlib.
|
|
134
|
-
*
|
|
135
129
|
* # What it deliberately does not answer
|
|
136
130
|
*
|
|
137
131
|
* The store is scoped to the ORIGIN, not to the page: two pages on the same
|
|
@@ -257,7 +251,7 @@ export class PersistentFileSystemProvider extends InMemoryFileSystemProvider {
|
|
|
257
251
|
}
|
|
258
252
|
|
|
259
253
|
protected reportStoreFailure(operation: string, uri: URI, error: unknown): void {
|
|
260
|
-
this.tracer.error(`Failed to ${operation} ${uri.toString()}: ${
|
|
254
|
+
this.tracer.error(`Failed to ${operation} ${uri.toString()}: ${describeErrorWithStack(error)}`);
|
|
261
255
|
}
|
|
262
256
|
}
|
|
263
257
|
|