@hydranium/core 1.0.0-next.24 → 1.0.0-next.241
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 +22 -17
- 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 +241 -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 +79 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +69 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +179 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +283 -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 +399 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +816 -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 +283 -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 +134 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +171 -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.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 +23 -16
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +66 -28
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/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.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.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 +57 -16
- 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.map +1 -1
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +294 -33
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +477 -61
- 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 +81 -24
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +264 -57
- 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 +29 -4
- 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 +411 -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 +432 -282
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +504 -438
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +150 -35
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +47 -35
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +25 -4
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +2 -1
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts +23 -0
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/naming/name-separator-validation.js +30 -1
- package/lib/langium/naming/name-separator-validation.js.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +9 -2
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +2 -2
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +30 -10
- 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/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +56 -20
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/reference-builder.d.ts.map +1 -1
- package/lib/langium/scope/reference-builder.js.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +12 -21
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +1 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +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 +21 -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 +77 -26
- 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.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 +448 -5
- 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 +135 -9
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +93 -14
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +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 +128 -10
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/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 +46 -4
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +60 -5
- 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 +0 -7
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
- 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/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 +153 -99
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +3 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +3 -1
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +34 -1
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +55 -8
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +8 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +13 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +54 -0
- package/lib/messages/carriers.d.ts.map +1 -0
- package/lib/messages/carriers.js +62 -0
- package/lib/messages/carriers.js.map +1 -0
- package/lib/messages/index.d.ts +25 -0
- package/lib/messages/index.d.ts.map +1 -0
- package/lib/messages/index.js +25 -0
- package/lib/messages/index.js.map +1 -0
- package/lib/messages/renderer.d.ts +142 -0
- package/lib/messages/renderer.d.ts.map +1 -0
- package/lib/messages/renderer.js +165 -0
- package/lib/messages/renderer.js.map +1 -0
- package/lib/node/event-loop-monitor.js.map +1 -1
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -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/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +1 -0
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +41 -6
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +109 -49
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +8 -2
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +1 -1
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +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 +52 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +66 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/socket-launcher.d.ts +20 -4
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +5 -4
- 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 +2 -2
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js.map +1 -1
- package/lib/testing/fake-description.js.map +1 -1
- package/lib/testing/fake-document.d.ts +16 -4
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js +18 -3
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/index.d.ts +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/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +11 -3
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +43 -10
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +14 -0
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +34 -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 +24 -8
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +27 -6
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +4 -4
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +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 +26 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +78 -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 +7 -6
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +4 -4
- package/lib/testing/stub-model-service.js.map +1 -1
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-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/util/connection-liveness.d.ts +7 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +35 -14
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +32 -48
- package/src/documents/ast-document-manager.ts +379 -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 +130 -0
- package/src/documents/document-release-handler.ts +365 -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 +931 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +451 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +267 -0
- package/src/index.ts +8 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +66 -28
- 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/logger.ts +12 -5
- package/src/langium/diagnostics/lsp-logger.ts +59 -15
- package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
- package/src/langium/document-builder/document-builder.ts +565 -59
- package/src/langium/integration-services.ts +83 -24
- package/src/langium/integrity/integrity-rule.ts +16 -8
- package/src/langium/integrity/integrity-service.ts +287 -62
- 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 +48 -7
- package/src/langium/model-service/client-session.ts +644 -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 +790 -468
- package/src/langium/module.ts +199 -64
- package/src/langium/naming/name-provider.ts +27 -5
- package/src/langium/naming/name-separator-validation.ts +34 -5
- package/src/langium/project/abstract-project-manager.ts +9 -1
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +45 -14
- package/src/langium/scope/hydranium-scope-provider.ts +60 -22
- package/src/langium/serialization/abstract-serializer.ts +13 -32
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +21 -6
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +104 -37
- package/src/langium/trivia/comment-preserver.ts +1100 -0
- package/src/langium/trivia/document-ending-preserver.ts +55 -0
- package/src/langium/trivia/index.ts +14 -0
- package/src/langium/trivia/trivia-contribution.ts +39 -0
- package/src/langium/trivia/trivia-preserver.ts +54 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +523 -10
- 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 +205 -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 +154 -14
- package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
- package/src/langium/workspace/index.ts +1 -0
- package/src/langium/workspace/initialize-workspace.ts +43 -5
- package/src/langium/workspace/langium-documents.ts +75 -6
- package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
- package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
- package/src/langium/workspace/virtual-document.ts +96 -19
- package/src/langium/workspace/write-lock-scope.ts +24 -11
- package/src/locale/index.ts +10 -0
- package/src/locale/server-locale.ts +86 -0
- package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
- package/src/lsp/connection-features.ts +67 -0
- package/src/lsp/diagnostics-connection.ts +56 -0
- package/src/lsp/hydranium-document-update-handler.ts +187 -108
- package/src/lsp/index.ts +3 -1
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/semantic-token-provider.ts +74 -7
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +13 -7
- package/src/messages/carriers.ts +78 -0
- package/src/messages/index.ts +36 -0
- package/src/messages/renderer.ts +212 -0
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +1 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/measure-memory.ts +1 -0
- package/src/node/node-file-system-provider.ts +124 -53
- package/src/node/profile-capture.ts +9 -3
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +78 -0
- package/src/node/socket-launcher.ts +24 -8
- package/src/node/stdio-launcher.ts +8 -7
- 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/index.ts +1 -0
- package/src/testing/node/lsp-harness.ts +2 -0
- package/src/testing/node/lsp-server-connection.ts +66 -12
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +36 -2
- 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 +45 -11
- package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
- package/src/testing/run-update-pipeline.ts +4 -4
- package/src/testing/stub-ast-document-manager.ts +36 -138
- package/src/testing/stub-document-builder.ts +102 -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 +9 -8
- 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 +1 -1
- package/src/util/connection-liveness.ts +37 -14
- 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.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/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -8,17 +8,27 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { Deferred, type Logger, type Tracer } from '@hydranium/protocol';
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
DefaultWorkspaceManager,
|
|
13
|
+
DocumentState,
|
|
14
|
+
isOperationCancelled,
|
|
15
|
+
type LangiumDocument,
|
|
16
|
+
type Stream,
|
|
17
|
+
UriUtils,
|
|
18
|
+
type URI
|
|
19
|
+
} from '@hydranium/langium';
|
|
20
|
+
import { type CancellationToken, type InitializeParams } from 'vscode-languageserver';
|
|
13
21
|
import type { WorkspaceFolder } from 'vscode-languageserver-types';
|
|
14
22
|
import { type LogNameOptions, resolveLogFilePlaceholder, toLogFileWorkspaceToken } from '../diagnostics/logger.js';
|
|
23
|
+
import type { ServerLocale } from '../../locale/server-locale.js';
|
|
15
24
|
import type { ProjectChangeEvent } from '../project/project-change-event.js';
|
|
16
25
|
import type { ProjectManager } from '../project/project-manager.js';
|
|
17
26
|
import type { ServerSharedServicesMinimal } from '../shared-services.js';
|
|
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.
|
|
@@ -92,6 +102,18 @@ export function installOperationCancelledSuppression(logger: Logger): void {
|
|
|
92
102
|
});
|
|
93
103
|
}
|
|
94
104
|
|
|
105
|
+
/** Options for {@link HydraniumWorkspaceManager}. */
|
|
106
|
+
export interface HydraniumWorkspaceManagerOptions extends LogNameOptions {
|
|
107
|
+
/**
|
|
108
|
+
* Whether startup warns about seeded documents the bound
|
|
109
|
+
* `FileSystemProvider` cannot serve (see
|
|
110
|
+
* {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved}). Defaults to
|
|
111
|
+
* `true`; turn it off for a host that drops such documents at their last
|
|
112
|
+
* close on purpose.
|
|
113
|
+
*/
|
|
114
|
+
warnUnservedDocuments?: boolean;
|
|
115
|
+
}
|
|
116
|
+
|
|
95
117
|
/**
|
|
96
118
|
* Framework {@link DefaultWorkspaceManager} subclass that integrates the
|
|
97
119
|
* project tier with Langium's workspace startup.
|
|
@@ -124,8 +146,8 @@ export function installOperationCancelledSuppression(logger: Logger): void {
|
|
|
124
146
|
* URIs (its own members plus any transitive dependents per the
|
|
125
147
|
* `getAffectedProjects` hook). This manager re-runs
|
|
126
148
|
* `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
|
|
127
|
-
* affected document so the
|
|
128
|
-
* visibility scope.
|
|
149
|
+
* affected document so the build of the update that changed the descriptor
|
|
150
|
+
* re-links them with the new visibility scope.
|
|
129
151
|
*
|
|
130
152
|
* Descriptor URIs that triggered the cycle are intentionally excluded
|
|
131
153
|
* from the affected set by `AbstractProjectManager.onBuildUpdate` —
|
|
@@ -156,19 +178,27 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
156
178
|
readonly workspaceInitialized: Promise<unknown> = this.workspaceInitializedDeferred.promise;
|
|
157
179
|
|
|
158
180
|
protected readonly uriPolicy: DocumentUriPolicy;
|
|
181
|
+
/** Handed the client's locale at init; read by whoever renders in it. */
|
|
182
|
+
protected readonly serverLocale: ServerLocale;
|
|
159
183
|
protected readonly writableFileSystemProvider: WritableFileSystemProvider;
|
|
160
184
|
protected readonly additionalDocuments: Record<string, AdditionalDocumentContribution>;
|
|
161
185
|
/** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
|
|
162
186
|
protected readonly languageRegistry: ServerSharedServicesMinimal['ServiceRegistry'];
|
|
187
|
+
/** Whether startup runs {@link warnIfDocumentsUnserved}. */
|
|
188
|
+
protected readonly warnUnservedDocuments: boolean;
|
|
189
|
+
/** URIs of the documents the running startup's file traversal loaded; see {@link loadWorkspaceDocuments}. */
|
|
190
|
+
protected readonly traversedUris = new Set<string>();
|
|
163
191
|
|
|
164
|
-
constructor(services: ServerSharedServicesMinimal, options:
|
|
192
|
+
constructor(services: ServerSharedServicesMinimal, options: HydraniumWorkspaceManagerOptions = {}) {
|
|
165
193
|
super(services);
|
|
166
194
|
this.projectManager = services.workspace.ProjectManager;
|
|
167
195
|
this.projectManager.onProjectsChanged(event => this.onProjectsChanged(event));
|
|
168
196
|
this.uriPolicy = services.workspace.DocumentUriPolicy;
|
|
197
|
+
this.serverLocale = services.ServerLocale;
|
|
169
198
|
this.writableFileSystemProvider = services.workspace.FileSystemProvider;
|
|
170
199
|
this.additionalDocuments = services.additionalDocuments;
|
|
171
200
|
this.languageRegistry = services.ServiceRegistry;
|
|
201
|
+
this.warnUnservedDocuments = options.warnUnservedDocuments ?? true;
|
|
172
202
|
this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceManager').trace('instantiated');
|
|
173
203
|
installOperationCancelledSuppression(this.tracer);
|
|
174
204
|
}
|
|
@@ -197,16 +227,16 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
197
227
|
// seeded. `tags` is read at the done-emit, so the document count pushed
|
|
198
228
|
// inside the callback appears in the log line.
|
|
199
229
|
const tags: string[] = [`${contributions.length} contributions`];
|
|
200
|
-
|
|
230
|
+
const seeded: LangiumDocument[] = [];
|
|
201
231
|
await this.tracer.time(
|
|
202
232
|
'Load additional documents',
|
|
203
233
|
async () => {
|
|
204
234
|
await collectAdditionalDocuments(this.additionalDocuments, folders, document => {
|
|
205
|
-
|
|
235
|
+
seeded.push(document);
|
|
206
236
|
this.warnIfUnroutable(document);
|
|
207
237
|
collector(document);
|
|
208
238
|
});
|
|
209
|
-
tags.push(`${
|
|
239
|
+
tags.push(`${seeded.length} documents`);
|
|
210
240
|
},
|
|
211
241
|
'info',
|
|
212
242
|
{ logAfterMs: 0, tags }
|
|
@@ -268,11 +298,86 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
268
298
|
discovered.push(document);
|
|
269
299
|
}
|
|
270
300
|
}
|
|
271
|
-
|
|
301
|
+
this.traversedUris.clear();
|
|
302
|
+
let documents: LangiumDocument[];
|
|
303
|
+
try {
|
|
304
|
+
documents = await super.performStartup(folders);
|
|
305
|
+
if (this.warnUnservedDocuments) {
|
|
306
|
+
await this.warnIfDocumentsUnserved(documents.filter(document => !this.traversedUris.has(document.uri.toString())));
|
|
307
|
+
}
|
|
308
|
+
} finally {
|
|
309
|
+
this.traversedUris.clear();
|
|
310
|
+
}
|
|
272
311
|
this.probePathDivergence(folders);
|
|
273
312
|
return this.withDiscoveredDescriptors(documents, discovered);
|
|
274
313
|
}
|
|
275
314
|
|
|
315
|
+
/**
|
|
316
|
+
* Record each document the file traversal loads, so startup can tell them
|
|
317
|
+
* from the documents `loadAdditionalDocuments` seeded, through the
|
|
318
|
+
* `additionalDocuments` group or an override of its own.
|
|
319
|
+
*
|
|
320
|
+
* The traversal found each of its documents through the provider, so asking
|
|
321
|
+
* it again whether they exist costs one call per workspace file and cannot
|
|
322
|
+
* come out false. Telling them apart by scheme does not work either: the
|
|
323
|
+
* registry's host answers every scheme no other provider claims, a seeded
|
|
324
|
+
* scheme nobody serves included. An override that loads documents without
|
|
325
|
+
* delegating here leaves them unrecorded, so startup asks the provider
|
|
326
|
+
* about each of them.
|
|
327
|
+
*/
|
|
328
|
+
protected override async loadWorkspaceDocuments(uris: Stream<URI>, collector: (document: LangiumDocument) => void): Promise<void> {
|
|
329
|
+
await super.loadWorkspaceDocuments(uris, document => {
|
|
330
|
+
this.traversedUris.add(document.uri.toString());
|
|
331
|
+
collector(document);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Warn once when the bound `FileSystemProvider` cannot serve a seeded
|
|
337
|
+
* document, naming each such document's scheme.
|
|
338
|
+
*
|
|
339
|
+
* The last close keeps a document only if the provider says it `exists`, so
|
|
340
|
+
* each such document leaves the workspace the first time an editor closes
|
|
341
|
+
* it, and whatever resolved against it breaks. The framework's registry
|
|
342
|
+
* serves `virtual:` through the `fileSystemProviders` group and every other
|
|
343
|
+
* scheme through its host, which knows nothing of a scheme an adopter
|
|
344
|
+
* invented for its seeded documents, and nothing else reports the loss. A
|
|
345
|
+
* provider that throws counts as not serving the document, since a startup
|
|
346
|
+
* that failed on a diagnostic would be worse than the loss.
|
|
347
|
+
*
|
|
348
|
+
* Runs over every document startup collected outside the file traversal,
|
|
349
|
+
* which is what `loadAdditionalDocuments` seeded, through the
|
|
350
|
+
* `additionalDocuments` group or an override of that method, once startup
|
|
351
|
+
* has added them to the workspace, unless `warnUnservedDocuments` is
|
|
352
|
+
* `false`.
|
|
353
|
+
*/
|
|
354
|
+
protected async warnIfDocumentsUnserved(documents: readonly LangiumDocument[]): Promise<void> {
|
|
355
|
+
const unserved: URI[] = [];
|
|
356
|
+
for (const document of documents) {
|
|
357
|
+
let served = false;
|
|
358
|
+
try {
|
|
359
|
+
served = await this.writableFileSystemProvider.exists(document.uri);
|
|
360
|
+
} catch {
|
|
361
|
+
// Counted as unserved, below.
|
|
362
|
+
}
|
|
363
|
+
if (!served) {
|
|
364
|
+
unserved.push(document.uri);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (unserved.length === 0) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const schemes = [...new Set(unserved.map(uri => uri.scheme))];
|
|
371
|
+
const named = unserved.slice(0, 3).map(uri => uri.toString());
|
|
372
|
+
this.tracer.warn(
|
|
373
|
+
`${unserved.length} seeded document(s) under ${schemes.map(scheme => `${scheme}:`).join(', ')} cannot be served by the bound workspace.FileSystemProvider ` +
|
|
374
|
+
`(${named.join(', ')}${unserved.length > 3 ? ', …' : ''}), so each leaves the workspace at its ` +
|
|
375
|
+
`last close. Register a provider under the key ${schemes.map(scheme => `'${scheme}'`).join(', ')} in the shared ` +
|
|
376
|
+
'fileSystemProviders group, or serve the scheme from the host provider; set warnUnservedDocuments: false ' +
|
|
377
|
+
'to accept the loss.'
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
|
|
276
381
|
/**
|
|
277
382
|
* Add back the documents project discovery created that Langium's file
|
|
278
383
|
* traversal then filtered out.
|
|
@@ -360,6 +465,31 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
360
465
|
}
|
|
361
466
|
}
|
|
362
467
|
|
|
468
|
+
/**
|
|
469
|
+
* Forward the locale the client declared, then Langium's own read of the
|
|
470
|
+
* params. `DefaultWorkspaceManager.initialize` reads `workspaceFolders`
|
|
471
|
+
* alone, so `params.locale` would otherwise be discarded — and this is the
|
|
472
|
+
* only place it arrives, which the headless init seams route through too.
|
|
473
|
+
*
|
|
474
|
+
* **The ABSENT case is reported from here rather than from `ServerLocale`,
|
|
475
|
+
* because this is the only end that can see it.** `accept` is not called
|
|
476
|
+
* when no locale was declared — nor should it be, since `''` is a claim
|
|
477
|
+
* about a language rather than the absence of one — so a log written there
|
|
478
|
+
* covers one of the two outcomes and leaves the other looking like a server
|
|
479
|
+
* that never reached init. Both lines are at `info` for the reason `accept`
|
|
480
|
+
* gives: the framework ships no catalogue, so an undeclared locale and an
|
|
481
|
+
* untranslated code produce the same English and the log is what separates
|
|
482
|
+
* them.
|
|
483
|
+
*/
|
|
484
|
+
override initialize(params: InitializeParams): void {
|
|
485
|
+
if (params.locale) {
|
|
486
|
+
this.serverLocale.accept(params.locale);
|
|
487
|
+
} else {
|
|
488
|
+
this.tracer.info("no locale declared at init — rendering messages in the framework's English");
|
|
489
|
+
}
|
|
490
|
+
super.initialize(params);
|
|
491
|
+
}
|
|
492
|
+
|
|
363
493
|
/**
|
|
364
494
|
* Override of Langium's workspace setup to resolve / reject
|
|
365
495
|
* {@link workspaceInitializedDeferred} once setup completes. Adopters with
|
|
@@ -367,12 +497,22 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
367
497
|
* and either delegate to `super.initializeWorkspace(...)` (preserving the
|
|
368
498
|
* default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
|
|
369
499
|
* themselves after the additional work finishes.
|
|
500
|
+
*
|
|
501
|
+
* A failed setup is logged here, since every framework waiter on
|
|
502
|
+
* {@link workspaceInitialized} discards the rejection; an override that
|
|
503
|
+
* rejects the deferred itself logs its own failure.
|
|
370
504
|
*/
|
|
371
505
|
override async initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void> {
|
|
372
506
|
try {
|
|
373
507
|
await super.initializeWorkspace(folders, cancelToken);
|
|
374
508
|
this.workspaceInitializedDeferred.resolve(undefined);
|
|
375
|
-
} catch (error) {
|
|
509
|
+
} catch (error: unknown) {
|
|
510
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
511
|
+
if (isOperationCancelled(error) || isConnectionGoneError(error)) {
|
|
512
|
+
this.tracer.debug(`Initial workspace build did not complete: ${message}`);
|
|
513
|
+
} else {
|
|
514
|
+
this.tracer.error(`Initial workspace build failed: ${message}`);
|
|
515
|
+
}
|
|
376
516
|
this.workspaceInitializedDeferred.reject(error);
|
|
377
517
|
throw error;
|
|
378
518
|
}
|
|
@@ -380,9 +520,9 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
|
380
520
|
|
|
381
521
|
/**
|
|
382
522
|
* Default cascade-rebuild handler. Iterates {@link ProjectChangeEvent.affectedDocuments}
|
|
383
|
-
* and resets each to {@link DocumentState.Changed} so the
|
|
384
|
-
* re-runs the pipeline (parse → link → validate)
|
|
385
|
-
* visibility scope.
|
|
523
|
+
* and resets each to {@link DocumentState.Changed} so the build of the update
|
|
524
|
+
* that changed the descriptor re-runs the pipeline (parse → link → validate)
|
|
525
|
+
* under the new project visibility scope.
|
|
386
526
|
*
|
|
387
527
|
* Subclasses can override for additional behaviour (e.g. logging,
|
|
388
528
|
* telemetry, custom rebuild policies); call `super` to preserve the
|
|
@@ -8,11 +8,40 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { type FileSystemNode, URI } from '@hydranium/langium';
|
|
11
|
-
import { type Tracer } from '@hydranium/protocol';
|
|
12
|
-
import { type WritableFileSystemProvider } from '
|
|
11
|
+
import { defineMessage, type Tracer } from '@hydranium/protocol';
|
|
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
|
+
|
|
17
|
+
/**
|
|
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.
|
|
23
|
+
*/
|
|
24
|
+
export const NO_SUCH_FILE = defineMessage('hydranium/core/no-such-file', 'No such file: {uri}');
|
|
25
|
+
|
|
26
|
+
/** The same for a node of any kind, so it also covers a directory. */
|
|
27
|
+
export const NO_SUCH_PATH = defineMessage('hydranium/core/no-such-path', 'No such file or directory: {uri}');
|
|
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
|
+
);
|
|
16
45
|
|
|
17
46
|
/**
|
|
18
47
|
* File content keyed by path, for seeding an {@link InMemoryFileSystemProvider}.
|
|
@@ -116,32 +145,34 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
|
|
|
116
145
|
this.setFile(uri, content);
|
|
117
146
|
}
|
|
118
147
|
|
|
119
|
-
|
|
120
|
-
|
|
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);
|
|
121
156
|
}
|
|
122
157
|
|
|
123
158
|
readFileSync(uri: URI): string {
|
|
124
|
-
const served = serveVirtualDocument(this.services, uri);
|
|
125
|
-
if (served !== undefined) {
|
|
126
|
-
return served;
|
|
127
|
-
}
|
|
128
159
|
const content = this.files.get(normalize(uri));
|
|
129
160
|
if (content === undefined) {
|
|
130
|
-
throw
|
|
161
|
+
throw notFound(NO_SUCH_FILE.format({ uri: uri.toString() }), uri);
|
|
131
162
|
}
|
|
132
163
|
return content;
|
|
133
164
|
}
|
|
134
165
|
|
|
135
|
-
readBinary(uri: URI): Promise<Uint8Array> {
|
|
136
|
-
return
|
|
166
|
+
async readBinary(uri: URI): Promise<Uint8Array> {
|
|
167
|
+
return this.readBinarySync(uri);
|
|
137
168
|
}
|
|
138
169
|
|
|
139
170
|
readBinarySync(uri: URI): Uint8Array {
|
|
140
171
|
return new TextEncoder().encode(this.readFileSync(uri));
|
|
141
172
|
}
|
|
142
173
|
|
|
143
|
-
stat(uri: URI): Promise<FileSystemNode> {
|
|
144
|
-
return
|
|
174
|
+
async stat(uri: URI): Promise<FileSystemNode> {
|
|
175
|
+
return this.statSync(uri);
|
|
145
176
|
}
|
|
146
177
|
|
|
147
178
|
statSync(uri: URI): FileSystemNode {
|
|
@@ -152,7 +183,7 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
|
|
|
152
183
|
if (this.hasChildren(path)) {
|
|
153
184
|
return { isFile: false, isDirectory: true, uri };
|
|
154
185
|
}
|
|
155
|
-
throw
|
|
186
|
+
throw notFound(NO_SUCH_PATH.format({ uri: uri.toString() }), uri);
|
|
156
187
|
}
|
|
157
188
|
|
|
158
189
|
exists(uri: URI): Promise<boolean> {
|
|
@@ -229,8 +260,8 @@ function normalize(uri: URI | string): string {
|
|
|
229
260
|
* services context exactly where a Node host spreads `NodeFileSystem`.
|
|
230
261
|
*
|
|
231
262
|
* A host that needs to reach the provider afterwards — to seed or mutate it
|
|
232
|
-
* mid-test —
|
|
233
|
-
* slot owns construction.
|
|
263
|
+
* mid-test — narrows `shared.workspace.FileSystemProvider.host` to this
|
|
264
|
+
* class, since the slot owns construction.
|
|
234
265
|
*/
|
|
235
266
|
export function inMemoryFileSystem(options: InMemoryFileSystemOptions = {}): {
|
|
236
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,9 +7,34 @@
|
|
|
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
|
+
import { defineMessage } from '@hydranium/protocol';
|
|
11
12
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
12
13
|
import { type DocumentUriPolicy } from './document-uri-policy.js';
|
|
14
|
+
import { type HydraniumLangiumDocumentFactory } from './hydranium-langium-document-factory.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The document a caller asked to load is not there.
|
|
18
|
+
*
|
|
19
|
+
* User-facing, and the Node host's spelling of it: `loadUri` returns `undefined`
|
|
20
|
+
* exactly when the URI policy's `realpath` reports the path absent. A host whose
|
|
21
|
+
* provider has no `realpath` never reaches this — the miss surfaces from the
|
|
22
|
+
* provider instead, so the same condition has one declaration per host.
|
|
23
|
+
*/
|
|
24
|
+
export const NO_LOADABLE_CONTENT = defineMessage('hydranium/core/no-loadable-content', 'No loadable content for {uri}');
|
|
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
|
+
);
|
|
13
38
|
|
|
14
39
|
/**
|
|
15
40
|
* The registry surface the framework adds on top of Langium's
|
|
@@ -19,7 +44,7 @@ import { type DocumentUriPolicy } from './document-uri-policy.js';
|
|
|
19
44
|
* depend on itself.
|
|
20
45
|
*/
|
|
21
46
|
export interface HydraniumDocumentRegistry extends LangiumDocuments {
|
|
22
|
-
createEmptyDocument(uri: URI): LangiumDocument<AstNode>;
|
|
47
|
+
createEmptyDocument(uri: URI, languageId?: string): LangiumDocument<AstNode>;
|
|
23
48
|
}
|
|
24
49
|
|
|
25
50
|
/**
|
|
@@ -47,6 +72,13 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
47
72
|
/** Document-identity seam, shared with the text store, event filters, and builder. */
|
|
48
73
|
protected readonly uriPolicy: DocumentUriPolicy;
|
|
49
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
|
+
|
|
50
82
|
constructor(protected override readonly services: ServerSharedServicesMinimal) {
|
|
51
83
|
super(services);
|
|
52
84
|
this.uriPolicy = services.workspace.DocumentUriPolicy;
|
|
@@ -54,8 +86,9 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
54
86
|
|
|
55
87
|
/**
|
|
56
88
|
* Build a transient document for `uri` by parsing empty text with the
|
|
57
|
-
* grammar `
|
|
58
|
-
* 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.
|
|
59
92
|
*
|
|
60
93
|
* For callers that need a document at a URI with no content on disk — the
|
|
61
94
|
* scope provider querying before a file exists is the case it was added for.
|
|
@@ -64,6 +97,15 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
64
97
|
* that silently is not the file, whereas calling this is a caller saying it
|
|
65
98
|
* wants a stand-in.
|
|
66
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
|
+
*
|
|
67
109
|
* The result is not registered, so nothing downstream can see it, and
|
|
68
110
|
* `LangiumDocumentFactory.update` would read from disk. It is a probe, not a
|
|
69
111
|
* document under construction; content that must survive belongs in a
|
|
@@ -75,12 +117,32 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
75
117
|
* and it is kept: `AstReflection.isComplete` is `false` for such a root
|
|
76
118
|
* however it is built, so the error states the same thing.
|
|
77
119
|
*/
|
|
78
|
-
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
|
+
}
|
|
79
130
|
// The two-argument overload is synchronous; passing a cancellation token
|
|
80
131
|
// selects the promise-returning one, which this contract cannot await.
|
|
81
132
|
return this.langiumDocumentFactory.fromString('', uri);
|
|
82
133
|
}
|
|
83
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
|
+
|
|
84
146
|
override async getOrCreateDocument(uri: URI): Promise<LangiumDocument<AstNode>> {
|
|
85
147
|
const resolved = this.uriPolicy.loadUri(uri);
|
|
86
148
|
if (resolved) {
|
|
@@ -109,8 +171,15 @@ export class HydraniumLangiumDocuments extends DefaultLangiumDocuments implement
|
|
|
109
171
|
throw error;
|
|
110
172
|
}
|
|
111
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
|
+
}
|
|
112
181
|
// The seam reports no loadable content, so there is nothing to read and
|
|
113
182
|
// no error from a read to carry.
|
|
114
|
-
throw new Error(
|
|
183
|
+
throw new Error(NO_LOADABLE_CONTENT.format({ uri: uri.toString() }));
|
|
115
184
|
}
|
|
116
185
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { URI } from '@hydranium/langium';
|
|
11
|
-
import { type WritableFileSystemProvider } from '
|
|
11
|
+
import { type WritableFileSystemProvider } from './file-system-provider.js';
|
|
12
12
|
import { serverSharedFactory, type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
13
13
|
import { type FileSystemSeed, InMemoryFileSystemProvider, type InMemoryFileSystemOptions } from './in-memory-file-system-provider.js';
|
|
14
14
|
|
|
@@ -125,13 +125,6 @@ export interface PersistentFileSystemOptions extends InMemoryFileSystemOptions {
|
|
|
125
125
|
* restored as deleted, which is why the marker is NUL-wrapped and text a grammar
|
|
126
126
|
* can parse is not.
|
|
127
127
|
*
|
|
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
128
|
* # What it deliberately does not answer
|
|
136
129
|
*
|
|
137
130
|
* The store is scoped to the ORIGIN, not to the page: two pages on the same
|