@hydranium/core 1.0.0-next.16 → 1.0.0-next.168
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/lib/documents/ast-document-manager.d.ts +190 -29
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +235 -38
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +5 -19
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +5 -19
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +15 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +15 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +138 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +187 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/file-system-task-queue.d.ts +49 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +34 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +439 -82
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +769 -159
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +3 -0
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +3 -0
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-text-shadow.d.ts +41 -9
- package/lib/documents/language-client-text-shadow.d.ts.map +1 -1
- package/lib/documents/language-client-text-shadow.js +56 -11
- package/lib/documents/language-client-text-shadow.js.map +1 -1
- package/lib/documents/self-save-registry.d.ts +37 -6
- package/lib/documents/self-save-registry.d.ts.map +1 -1
- package/lib/documents/self-save-registry.js +28 -15
- package/lib/documents/self-save-registry.js.map +1 -1
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +60 -22
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +16 -9
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/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/diagnostics/lsp-logger.d.ts +17 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +40 -6
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +93 -0
- package/lib/langium/document-builder/build-session.d.ts.map +1 -0
- package/lib/langium/document-builder/build-session.js +72 -0
- package/lib/langium/document-builder/build-session.js.map +1 -0
- package/lib/langium/document-builder/document-builder.d.ts +365 -19
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +637 -44
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/document-builder/index.d.ts +1 -0
- package/lib/langium/document-builder/index.d.ts.map +1 -1
- package/lib/langium/document-builder/index.js +1 -0
- package/lib/langium/document-builder/index.js.map +1 -1
- package/lib/langium/integration-services.d.ts +45 -1
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +10 -5
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +13 -5
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +50 -6
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +193 -17
- 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/language-module.d.ts +27 -2
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +16 -2
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +307 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +395 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +1 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +1 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-service.d.ts +261 -198
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +234 -346
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +144 -35
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +45 -34
- 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/residency/cst-residency-service.d.ts +31 -11
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +13 -56
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/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/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/service-registry.d.ts +15 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +16 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +15 -2
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/transfer/transfer-encoder.d.ts +60 -17
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +38 -16
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +423 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +906 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +48 -0
- package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
- package/lib/langium/trivia/index.d.ts +14 -0
- package/lib/langium/trivia/index.d.ts.map +1 -0
- package/lib/langium/trivia/index.js +14 -0
- package/lib/langium/trivia/index.js.map +1 -0
- package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
- package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-contribution.js +10 -0
- package/lib/langium/trivia/trivia-contribution.js.map +1 -0
- package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +294 -10
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +448 -5
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/workspace/document-uri-policy.d.ts +17 -12
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +10 -9
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +17 -0
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
- package/lib/langium/workspace/file-not-found.js +20 -0
- package/lib/langium/workspace/file-not-found.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +84 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +93 -14
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +25 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +25 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +13 -0
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +18 -0
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +77 -8
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +115 -9
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +25 -2
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +13 -5
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +79 -17
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +91 -29
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +0 -7
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/virtual-document.d.ts +48 -15
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +78 -18
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +4 -3
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +4 -3
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/locale/index.d.ts +10 -0
- package/lib/locale/index.d.ts.map +1 -0
- package/lib/locale/index.js +10 -0
- package/lib/locale/index.js.map +1 -0
- package/lib/locale/server-locale.d.ts +73 -0
- package/lib/locale/server-locale.d.ts.map +1 -0
- package/lib/locale/server-locale.js +61 -0
- package/lib/locale/server-locale.js.map +1 -0
- package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
- package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
- package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
- package/lib/lsp/connection-features.d.ts +23 -0
- package/lib/lsp/connection-features.d.ts.map +1 -0
- package/lib/lsp/connection-features.js +60 -0
- package/lib/lsp/connection-features.js.map +1 -0
- package/lib/lsp/diagnostics-connection.d.ts +27 -0
- package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
- package/lib/lsp/diagnostics-connection.js +53 -0
- package/lib/lsp/diagnostics-connection.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +90 -79
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +152 -99
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +3 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +3 -1
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +34 -1
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +55 -8
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +8 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +13 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +54 -0
- package/lib/messages/carriers.d.ts.map +1 -0
- package/lib/messages/carriers.js +62 -0
- package/lib/messages/carriers.js.map +1 -0
- package/lib/messages/index.d.ts +25 -0
- package/lib/messages/index.d.ts.map +1 -0
- package/lib/messages/index.js +25 -0
- package/lib/messages/index.js.map +1 -0
- package/lib/messages/renderer.d.ts +142 -0
- package/lib/messages/renderer.d.ts.map +1 -0
- package/lib/messages/renderer.js +165 -0
- package/lib/messages/renderer.js.map +1 -0
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -0
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +1 -0
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/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/node-file-system-provider.d.ts +39 -4
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +109 -49
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +8 -2
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profiling-run.d.ts +2 -2
- package/lib/node/profiling-run.js +1 -1
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +52 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +66 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/socket-launcher.d.ts +16 -1
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +4 -3
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/stdio-launcher.d.ts +1 -1
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +1 -1
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/testing/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/make-noop-shared-services.d.ts +14 -0
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +28 -2
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +62 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +27 -6
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +11 -3
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +42 -9
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +14 -0
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +33 -1
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/node/unhandled-rejections.d.ts +20 -0
- package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
- package/lib/testing/node/unhandled-rejections.js +32 -0
- package/lib/testing/node/unhandled-rejections.js.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.js +164 -0
- package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +1 -0
- package/lib/testing/playwright/index.d.ts.map +1 -1
- package/lib/testing/playwright/index.js +1 -0
- package/lib/testing/playwright/index.js.map +1 -1
- package/lib/testing/playwright/server-log-capture.d.ts +14 -4
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +21 -4
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +4 -4
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +10 -9
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +17 -9
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +26 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +57 -4
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +22 -7
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +92 -15
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-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/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/package.json +17 -8
- package/src/documents/ast-document-manager.ts +348 -64
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +24 -0
- package/src/documents/client-session-registry.ts +240 -0
- package/src/documents/file-system-task-queue.ts +68 -0
- package/src/documents/hydranium-text-documents.ts +959 -201
- package/src/documents/index.ts +3 -0
- package/src/documents/language-client-text-shadow.ts +59 -11
- package/src/documents/self-save-registry.ts +52 -13
- package/src/index.ts +6 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +16 -9
- package/src/langium/config/configuration-provider.ts +119 -0
- package/src/langium/config/index.ts +1 -0
- package/src/langium/diagnostics/lsp-logger.ts +41 -6
- package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
- package/src/langium/document-builder/build-session.ts +87 -0
- package/src/langium/document-builder/document-builder.ts +720 -43
- package/src/langium/document-builder/index.ts +1 -0
- package/src/langium/integration-services.ts +67 -6
- package/src/langium/integrity/integrity-rule.ts +13 -5
- package/src/langium/integrity/integrity-service.ts +202 -17
- package/src/langium/keys/containment.ts +87 -0
- package/src/langium/keys/index.ts +1 -0
- package/src/langium/keys/name-based-key-provider.ts +4 -0
- package/src/langium/language-module.ts +42 -4
- package/src/langium/model-service/client-session.ts +606 -0
- package/src/langium/model-service/index.ts +1 -0
- package/src/langium/model-service/model-service.ts +395 -351
- package/src/langium/module.ts +192 -63
- package/src/langium/naming/name-provider.ts +27 -5
- package/src/langium/naming/name-separator-validation.ts +34 -5
- package/src/langium/project/abstract-project-manager.ts +9 -1
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +36 -14
- package/src/langium/scope/hydranium-scope-provider.ts +60 -22
- package/src/langium/serialization/abstract-serializer.ts +13 -32
- package/src/langium/service-registry.ts +19 -2
- package/src/langium/shared-services.ts +19 -2
- package/src/langium/transfer/transfer-encoder.ts +85 -24
- package/src/langium/trivia/comment-preserver.ts +1100 -0
- package/src/langium/trivia/document-ending-preserver.ts +55 -0
- package/src/langium/trivia/index.ts +14 -0
- package/src/langium/trivia/trivia-contribution.ts +39 -0
- package/src/langium/trivia/trivia-preserver.ts +54 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +537 -11
- package/src/langium/workspace/document-uri-policy.ts +17 -12
- package/src/langium/workspace/file-not-found.ts +23 -0
- package/src/langium/workspace/file-system-provider.ts +153 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +34 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +21 -0
- package/src/langium/workspace/hydranium-workspace-manager.ts +133 -12
- package/src/langium/workspace/in-memory-file-system-provider.ts +47 -16
- package/src/langium/workspace/initialize-workspace.ts +43 -5
- package/src/langium/workspace/langium-documents.ts +113 -33
- package/src/langium/workspace/persistent-file-system-provider.ts +0 -7
- package/src/langium/workspace/virtual-document.ts +96 -19
- package/src/langium/workspace/write-lock-scope.ts +4 -3
- package/src/locale/index.ts +10 -0
- package/src/locale/server-locale.ts +86 -0
- package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
- package/src/lsp/connection-features.ts +67 -0
- package/src/lsp/diagnostics-connection.ts +56 -0
- package/src/lsp/hydranium-document-update-handler.ts +182 -106
- package/src/lsp/index.ts +3 -1
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/semantic-token-provider.ts +74 -7
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +13 -7
- package/src/messages/carriers.ts +78 -0
- package/src/messages/index.ts +36 -0
- package/src/messages/renderer.ts +212 -0
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +1 -0
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/measure-memory.ts +1 -0
- package/src/node/node-file-system-provider.ts +122 -51
- package/src/node/profile-capture.ts +8 -2
- package/src/node/profiling-run.ts +3 -3
- package/src/node/rename-over-open-readers.ts +78 -0
- package/src/node/socket-launcher.ts +19 -4
- package/src/node/stdio-launcher.ts +1 -2
- package/src/testing/fake-document.ts +24 -5
- package/src/testing/make-noop-shared-services.ts +50 -2
- package/src/testing/make-test-services.ts +103 -27
- package/src/testing/node/index.ts +1 -0
- package/src/testing/node/lsp-harness.ts +2 -0
- package/src/testing/node/lsp-server-connection.ts +61 -11
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +35 -1
- package/src/testing/node/unhandled-rejections.ts +31 -0
- package/src/testing/playwright/flaky-network-proxy.ts +240 -0
- package/src/testing/playwright/index.ts +1 -0
- package/src/testing/playwright/server-log-capture.ts +24 -5
- package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
- package/src/testing/run-update-pipeline.ts +4 -4
- package/src/testing/stub-ast-document-manager.ts +28 -21
- package/src/testing/stub-document-builder.ts +83 -17
- package/src/testing/stub-hydranium-text-documents.ts +127 -22
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +9 -8
- package/src/util/connection-liveness.ts +37 -14
- package/lib/lsp/instrument-connection.d.ts +0 -36
- package/lib/lsp/instrument-connection.d.ts.map +0 -1
- package/lib/lsp/instrument-connection.js +0 -62
- package/lib/lsp/instrument-connection.js.map +0 -1
- package/src/lsp/instrument-connection.ts +0 -66
package/src/langium/module.ts
CHANGED
|
@@ -8,30 +8,41 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { type Clock, type Logger, type Project, type Tracer, type TransferDiagnostic, NoopLogger, SystemClock } from '@hydranium/protocol';
|
|
11
|
+
import { DefaultServerLocale, type ServerLocale } from '../locale/server-locale.js';
|
|
12
|
+
import { DefaultMessageRenderer, type MessageRenderer } from '../messages/renderer.js';
|
|
11
13
|
import { ServerTracer } from './diagnostics/server-tracer.js';
|
|
12
14
|
import { HydraniumLangiumProfiler } from './diagnostics/hydranium-langium-profiler.js';
|
|
13
15
|
import { type AstNode, type Module } from '@hydranium/langium';
|
|
14
16
|
import { type DefaultSharedModuleContext, type LangiumSharedServices, type PartialLangiumSharedServices } from '@hydranium/langium/lsp';
|
|
15
17
|
import { type TextDocument } from 'vscode-languageserver-textdocument';
|
|
16
|
-
import {
|
|
18
|
+
import { type ClientSessionFactory, DefaultClientSessionFactory } from './model-service/client-session.js';
|
|
19
|
+
import { DefaultModelService, type ModelService } from './model-service/model-service.js';
|
|
17
20
|
import { type ProjectManager } from './project/project-manager.js';
|
|
18
21
|
import { SingleProjectManager } from './project/single-project-manager.js';
|
|
19
|
-
import { TransferEncoder } from './transfer/transfer-encoder.js';
|
|
22
|
+
import { DefaultTransferEncoder, type TransferEncoder } from './transfer/transfer-encoder.js';
|
|
20
23
|
import { HydraniumDocumentBuilder } from './document-builder/document-builder.js';
|
|
21
|
-
import { BuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
|
|
24
|
+
import { DefaultBuildPipelineIntegration, type BuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
|
|
22
25
|
import { type BuildPhasePassContribution } from './build-phase-pass/build-phase-pass.js';
|
|
23
26
|
import { type BuildPhasePassService, DefaultBuildPhasePassService } from './build-phase-pass/build-phase-pass-service.js';
|
|
24
|
-
import { CstResidencyService } from './residency/index.js';
|
|
27
|
+
import { DefaultCstResidencyService, type CstResidencyService } from './residency/index.js';
|
|
28
|
+
import { HydraniumConfigurationProvider } from './config/configuration-provider.js';
|
|
25
29
|
import { HydraniumIndexManager } from './workspace/index-manager.js';
|
|
26
30
|
import { HydraniumWorkspaceManager } from './workspace/hydranium-workspace-manager.js';
|
|
27
31
|
import { HydraniumWorkspaceLock } from './workspace/hydranium-workspace-lock.js';
|
|
28
32
|
import { HydraniumLangiumDocumentFactory } from './workspace/hydranium-langium-document-factory.js';
|
|
33
|
+
import { type HydraniumDocumentRegistry, HydraniumLangiumDocuments } from './workspace/langium-documents.js';
|
|
29
34
|
import { type AdditionalDocumentContribution } from './workspace/additional-document-contribution.js';
|
|
30
35
|
import { DefaultDocumentUriPolicy, type DocumentUriPolicy } from './workspace/document-uri-policy.js';
|
|
31
36
|
import { HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
|
|
32
|
-
import { AstDocumentManager, type WritableFileSystemProvider } from '../documents/ast-document-manager.js';
|
|
33
|
-
import { SelfSaveRegistry } from '../documents/self-save-registry.js';
|
|
34
|
-
import {
|
|
37
|
+
import { DefaultAstDocumentManager, type AstDocumentManager, type WritableFileSystemProvider } from '../documents/ast-document-manager.js';
|
|
38
|
+
import { DefaultSelfSaveRegistry, type SelfSaveRegistry } from '../documents/self-save-registry.js';
|
|
39
|
+
import { DefaultFileSystemTaskQueue, type FileSystemTaskQueue } from '../documents/file-system-task-queue.js';
|
|
40
|
+
import {
|
|
41
|
+
DefaultEmptyFileSystemProvider,
|
|
42
|
+
DefaultFileSystemProviderRegistry,
|
|
43
|
+
type FileSystemProviderRegistry
|
|
44
|
+
} from './workspace/file-system-provider.js';
|
|
45
|
+
import { VIRTUAL_SCHEME, VirtualFileSystemProvider } from './workspace/virtual-document.js';
|
|
35
46
|
import { type ServerLanguageServices } from './language-module.js';
|
|
36
47
|
import { ExtendedServiceRegistry } from './service-registry.js';
|
|
37
48
|
|
|
@@ -43,7 +54,10 @@ import { ExtendedServiceRegistry } from './service-registry.js';
|
|
|
43
54
|
* these shared services; per-head shared bindings, if any, are
|
|
44
55
|
* contributed by additional modules layered after this one.
|
|
45
56
|
*/
|
|
46
|
-
export interface ServerAddedSharedServices<
|
|
57
|
+
export interface ServerAddedSharedServices<
|
|
58
|
+
TProject extends Project = Project,
|
|
59
|
+
TDiagnostic extends TransferDiagnostic = TransferDiagnostic
|
|
60
|
+
> {
|
|
47
61
|
/**
|
|
48
62
|
* Injectable time source. Framework default is {@link SystemClock} (real
|
|
49
63
|
* `Date.now` / `performance.now` / `setTimeout`); tests bind a fake to
|
|
@@ -91,6 +105,24 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
|
|
|
91
105
|
* plain `DefaultTracer` with their own `MemoryReader`.
|
|
92
106
|
*/
|
|
93
107
|
Tracer: Tracer;
|
|
108
|
+
/**
|
|
109
|
+
* Renders each user-facing message once, before the server sends it — so
|
|
110
|
+
* every message is rendered by the side that knows the reading user's
|
|
111
|
+
* language. All three heads inherit one diagnostics pass, which is what
|
|
112
|
+
* makes this the single slot an adopter with i18n rebinds; the same binding
|
|
113
|
+
* serves framework codes and their own `defineMessage` codes alike.
|
|
114
|
+
*
|
|
115
|
+
* The framework ships English only and selects no locale, so the default
|
|
116
|
+
* returns every sentence unchanged. Adopters subclass and override
|
|
117
|
+
* `translationsFor`.
|
|
118
|
+
*/
|
|
119
|
+
MessageRenderer: MessageRenderer;
|
|
120
|
+
/**
|
|
121
|
+
* The locale an init handed the server, for whoever renders in it. Held
|
|
122
|
+
* apart from the renderer so replacing the renderer cannot drop locale
|
|
123
|
+
* handling.
|
|
124
|
+
*/
|
|
125
|
+
ServerLocale: ServerLocale;
|
|
94
126
|
/**
|
|
95
127
|
* LSP-bound slots layered on top of Langium's `LangiumSharedLSPServices`.
|
|
96
128
|
* The framework contributes a single string slot here —
|
|
@@ -113,6 +145,12 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
|
|
|
113
145
|
workspace: {
|
|
114
146
|
/* override */ TextDocuments: HydraniumTextDocuments<TextDocument>;
|
|
115
147
|
/* override */ WorkspaceManager: HydraniumWorkspaceManager;
|
|
148
|
+
/**
|
|
149
|
+
* Narrow Langium's registry slot to the framework surface, which adds
|
|
150
|
+
* `createEmptyDocument` — reachable only through this narrowing, and
|
|
151
|
+
* wanted by a scope provider querying a URI before the file exists.
|
|
152
|
+
*/
|
|
153
|
+
/* override */ LangiumDocuments: HydraniumDocumentRegistry;
|
|
116
154
|
/**
|
|
117
155
|
* Narrow Langium's `IndexManager` slot to the framework subclass, which
|
|
118
156
|
* layers an `elementsByName` map over Langium's index and exposes
|
|
@@ -127,12 +165,11 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
|
|
|
127
165
|
* the `awaitDocumentState` bug-fix, framework-wired phase logs,
|
|
128
166
|
* and the `markNextReason` observability primitive without
|
|
129
167
|
* binding the slot explicitly. The
|
|
130
|
-
* `HydraniumDocumentUpdateHandler`'s `dispatch`
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
* compile-time target.
|
|
168
|
+
* `HydraniumDocumentUpdateHandler`'s `dispatch` and
|
|
169
|
+
* `ModelService.rebuild` build through this slot's
|
|
170
|
+
* `scheduleUpdate`, so narrowing here is a load-bearing contract:
|
|
171
|
+
* a builder without it fails every LSP-driven build, and every
|
|
172
|
+
* session write while `serializeBuilds` is on, at run time.
|
|
136
173
|
*/
|
|
137
174
|
/* override */ DocumentBuilder: HydraniumDocumentBuilder;
|
|
138
175
|
/**
|
|
@@ -146,20 +183,36 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
|
|
|
146
183
|
*/
|
|
147
184
|
/* override */ WorkspaceLock: HydraniumWorkspaceLock;
|
|
148
185
|
/**
|
|
149
|
-
* Tighten Langium's read-only `FileSystemProvider` slot to
|
|
150
|
-
* {@link
|
|
151
|
-
* ({@link AstDocumentManager.save}, integrity
|
|
152
|
-
* `
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
* {@link
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
186
|
+
* Tighten Langium's read-only `FileSystemProvider` slot to a
|
|
187
|
+
* {@link FileSystemProviderRegistry}, which is writable: the
|
|
188
|
+
* framework's save path ({@link AstDocumentManager.save}, integrity
|
|
189
|
+
* corrections, a session's `save`) requires write semantics, and a
|
|
190
|
+
* read-only slot type defers the failure of a read-only
|
|
191
|
+
* implementation to the first save.
|
|
192
|
+
*
|
|
193
|
+
* Bound to {@link DefaultFileSystemProviderRegistry}, which dispatches
|
|
194
|
+
* by scheme to the {@link ServerAddedSharedServices.fileSystemProviders}
|
|
195
|
+
* group and sends every other scheme to its `host`: the provider
|
|
196
|
+
* `context.fileSystemProvider` returns when it is writable, or else
|
|
197
|
+
* `DefaultEmptyFileSystemProvider`, which is what keeps the core
|
|
198
|
+
* barrel free of `node:fs` and therefore browser-bundleable. A Node
|
|
199
|
+
* host passes `@hydranium/core/node`'s Node-backed provider (wired to
|
|
200
|
+
* {@link SelfSaveRegistry}) instead, and adopters pass their own
|
|
160
201
|
* writable implementation when neither fits.
|
|
202
|
+
*
|
|
203
|
+
* To reach the members of its own provider, an adopter declares this
|
|
204
|
+
* slot as `FileSystemProviderRegistry<MyProvider>` through
|
|
205
|
+
* {@link WithServiceOverrides}, binds a
|
|
206
|
+
* `DefaultFileSystemProviderRegistry` with that host from a factory
|
|
207
|
+
* whose return type names the narrowed slot (a module's `DeepPartial`
|
|
208
|
+
* checks no host member otherwise), and reads
|
|
209
|
+
* `FileSystemProvider.host`. A
|
|
210
|
+
* registry that serves a seeded document under none of its providers
|
|
211
|
+
* loses the document at its last close, which
|
|
212
|
+
* {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved} reports
|
|
213
|
+
* once at startup.
|
|
161
214
|
*/
|
|
162
|
-
/* override */ FileSystemProvider:
|
|
215
|
+
/* override */ FileSystemProvider: FileSystemProviderRegistry;
|
|
163
216
|
ProjectManager: ProjectManager<TProject>;
|
|
164
217
|
SelfSaveRegistry: SelfSaveRegistry;
|
|
165
218
|
/**
|
|
@@ -188,7 +241,13 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
|
|
|
188
241
|
* that need to narrow the diagnostic type or override lifecycle
|
|
189
242
|
* behaviour rebind this slot with a subclass.
|
|
190
243
|
*/
|
|
191
|
-
AstDocumentManager: AstDocumentManager<AstNode
|
|
244
|
+
AstDocumentManager: AstDocumentManager<AstNode>;
|
|
245
|
+
/**
|
|
246
|
+
* Orders the server's disk accesses of each file. One slot for every
|
|
247
|
+
* reader and writer: a service given a queue of its own does not order
|
|
248
|
+
* against the others.
|
|
249
|
+
*/
|
|
250
|
+
FileSystemTaskQueue: FileSystemTaskQueue;
|
|
192
251
|
/**
|
|
193
252
|
* Wires the framework's build-time features (integrity, AST
|
|
194
253
|
* enrichment) into Langium's build pipeline: owns the build-phase
|
|
@@ -228,15 +287,25 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
|
|
|
228
287
|
* heads read both slots from shared services rather than constructor
|
|
229
288
|
* arguments.
|
|
230
289
|
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
290
|
+
* `TransferEncoder` is the INTERFACE, not `DefaultTransferEncoder` — an
|
|
291
|
+
* adopter can therefore REPLACE this declaration (see
|
|
292
|
+
* {@link WithServiceOverrides}) rather than intersect with it, which is what
|
|
293
|
+
* keeps slot resolution independent of the order a services type is written
|
|
294
|
+
* in. `ModelService` is an interface for the same reason.
|
|
295
|
+
*
|
|
296
|
+
* A class in a slot costs two things, both measured. Its `protected` members
|
|
297
|
+
* join every assignability check and are compared NOMINALLY, so a subclass
|
|
298
|
+
* declared against a second physical copy of this package cannot satisfy it.
|
|
299
|
+
* And where the class is generic over a map reached through `keyof`, that
|
|
300
|
+
* parameter is measured INVARIANT — instantiations then relate only when
|
|
301
|
+
* their arguments are mutually assignable, which no adopter map is with the
|
|
302
|
+
* framework's. Neither survives on an interface.
|
|
236
303
|
*/
|
|
237
304
|
model: {
|
|
238
|
-
TransferEncoder: TransferEncoder<
|
|
239
|
-
ModelService: ModelService<AstNode
|
|
305
|
+
TransferEncoder: TransferEncoder<TDiagnostic>;
|
|
306
|
+
ModelService: ModelService<AstNode>;
|
|
307
|
+
/** Builds the handle of every session `ModelService.createSession` starts. */
|
|
308
|
+
ClientSessionFactory: ClientSessionFactory;
|
|
240
309
|
};
|
|
241
310
|
/**
|
|
242
311
|
* Shared contribution group for batch-level build-phase passes (see
|
|
@@ -259,6 +328,15 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
|
|
|
259
328
|
* contribute none never touch it.
|
|
260
329
|
*/
|
|
261
330
|
additionalDocuments: Record<string, AdditionalDocumentContribution>;
|
|
331
|
+
/**
|
|
332
|
+
* Shared contribution group of file system providers keyed by the URI
|
|
333
|
+
* scheme each answers for, which {@link FileSystemProviderRegistry}
|
|
334
|
+
* dispatches to. The framework registers {@link VirtualFileSystemProvider}
|
|
335
|
+
* under `virtual`; an adopter deep-merges a provider for a scheme of its
|
|
336
|
+
* own, and an entry under `virtual` replaces the framework's. A scheme with
|
|
337
|
+
* no entry goes to the registry's `host`.
|
|
338
|
+
*/
|
|
339
|
+
fileSystemProviders: Record<string, WritableFileSystemProvider>;
|
|
262
340
|
}
|
|
263
341
|
|
|
264
342
|
/**
|
|
@@ -274,10 +352,57 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
|
|
|
274
352
|
* `ClientTextDocumentChangeEvent` payload (with `clientId`);
|
|
275
353
|
* `ServiceRegistry.getServices(uri)` keeps the
|
|
276
354
|
* {@link ServerLanguageServices} return shape.
|
|
355
|
+
*
|
|
356
|
+
* `TDiagnostic` is the diagnostic the bound `model.TransferEncoder` emits. A
|
|
357
|
+
* head that sends a narrower diagnostic than `TransferDiagnostic` takes
|
|
358
|
+
* services typed with it, so none of its envelopes claims a shape the encoder
|
|
359
|
+
* does not produce.
|
|
277
360
|
*/
|
|
278
|
-
export type ServerSharedServices<TProject extends Project = Project
|
|
361
|
+
export type ServerSharedServices<TProject extends Project = Project, TDiagnostic extends TransferDiagnostic = TransferDiagnostic> = Omit<
|
|
362
|
+
LangiumSharedServices,
|
|
363
|
+
'workspace' | 'ServiceRegistry'
|
|
364
|
+
> & {
|
|
279
365
|
workspace: Omit<LangiumSharedServices['workspace'], 'TextDocuments' | 'DocumentBuilder'>;
|
|
280
|
-
} & ServerAddedSharedServices<TProject>;
|
|
366
|
+
} & ServerAddedSharedServices<TProject, TDiagnostic>;
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* The service-tree namespaces — the keys whose value groups further slots
|
|
370
|
+
* rather than being a slot itself.
|
|
371
|
+
*
|
|
372
|
+
* Consumed by {@link WithServiceOverrides} to know where to merge one level
|
|
373
|
+
* deeper. **Add a namespace to {@link ServerAddedSharedServices} and you must
|
|
374
|
+
* add it here**, and the failure of forgetting is silent in the direction that
|
|
375
|
+
* matters: an unlisted namespace is treated as a leaf, so an adopter overriding
|
|
376
|
+
* one slot inside it replaces the WHOLE namespace and loses the sibling slots
|
|
377
|
+
* with no diagnostic. The reverse mistake — listing a leaf — fails loudly.
|
|
378
|
+
*/
|
|
379
|
+
type ServiceNamespace = 'lsp' | 'workspace' | 'model';
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Compose an adopter's service tree so its declarations REPLACE the framework's
|
|
383
|
+
* rather than intersecting with them.
|
|
384
|
+
*
|
|
385
|
+
* Langium composes services by intersection, which accumulates: two
|
|
386
|
+
* declarations of one slot survive as an overload set, and which one a call
|
|
387
|
+
* resolves to depends on the order the intersection was written in — silently,
|
|
388
|
+
* with no diagnostic at the point a reorder changes it. There is no override
|
|
389
|
+
* operator for intersections, so the framework's declaration has to be removed
|
|
390
|
+
* before the adopter's is added. This does that, one level deep for each
|
|
391
|
+
* {@link ServiceNamespace}, so a narrowed slot replaces its framework twin
|
|
392
|
+
* while its siblings survive.
|
|
393
|
+
*
|
|
394
|
+
* Only slots typed as INTERFACES can be replaced this way. A class-typed slot
|
|
395
|
+
* drags its `protected` members into the assignability check — compared
|
|
396
|
+
* nominally — so an adopter subclass does not satisfy it and the framework's
|
|
397
|
+
* declaration cannot be dropped.
|
|
398
|
+
*/
|
|
399
|
+
export type WithServiceOverrides<TBase, TOverrides> = Omit<TBase, keyof TOverrides> & {
|
|
400
|
+
[K in keyof TOverrides]: K extends ServiceNamespace
|
|
401
|
+
? K extends keyof TBase
|
|
402
|
+
? Omit<TBase[K], keyof TOverrides[K]> & TOverrides[K]
|
|
403
|
+
: TOverrides[K]
|
|
404
|
+
: TOverrides[K];
|
|
405
|
+
};
|
|
281
406
|
|
|
282
407
|
/**
|
|
283
408
|
* Construction context for {@link createServerSharedModule}.
|
|
@@ -327,6 +452,8 @@ export function createServerSharedModule(
|
|
|
327
452
|
ServiceRegistry: services => new ExtendedServiceRegistry<ServerLanguageServices>(services),
|
|
328
453
|
Logger: () => new NoopLogger(),
|
|
329
454
|
Tracer: services => new ServerTracer(services.Logger, services.Clock),
|
|
455
|
+
ServerLocale: services => new DefaultServerLocale(services),
|
|
456
|
+
MessageRenderer: services => new DefaultMessageRenderer(services),
|
|
330
457
|
// Bind Langium's per-grammar-rule / per-`$type` parse/link/validate
|
|
331
458
|
// profiler (the data the framework's own `Tracer`/`ProfileSession` passes
|
|
332
459
|
// cannot produce), routed through our `Logger` and debug-gated. At the
|
|
@@ -388,59 +515,61 @@ export function createServerSharedModule(
|
|
|
388
515
|
TextDocuments: services => new HydraniumTextDocuments(services),
|
|
389
516
|
WorkspaceManager: services => new HydraniumWorkspaceManager(services),
|
|
390
517
|
IndexManager: services => new HydraniumIndexManager(services),
|
|
518
|
+
// Langium's default asks only about sections named after registered
|
|
519
|
+
// language ids, so a section `lsp.configurationRoot` is bound to reads
|
|
520
|
+
// `undefined` forever with no request on the wire.
|
|
521
|
+
ConfigurationProvider: services => new HydraniumConfigurationProvider(services),
|
|
391
522
|
// Override Langium's factory so a `fromModel` (code-built) virtual
|
|
392
523
|
// document retains serialized text via the per-language Serializer,
|
|
393
|
-
// making it re-read-safe through
|
|
524
|
+
// making it re-read-safe through `VirtualFileSystemProvider`.
|
|
394
525
|
LangiumDocumentFactory: services => new HydraniumLangiumDocumentFactory(services),
|
|
526
|
+
// Langium's default routes through no identity seam and treats every
|
|
527
|
+
// failed load alike, so leaving this unbound opts a server out of both
|
|
528
|
+
// with nothing to signal it.
|
|
529
|
+
LangiumDocuments: services => new HydraniumLangiumDocuments(services),
|
|
395
530
|
DocumentBuilder: services => new HydraniumDocumentBuilder(services),
|
|
396
531
|
// The write-lock scope this marks is inert unless a host installs a
|
|
397
532
|
// scope tracker — `@hydranium/core/node` does.
|
|
398
533
|
WorkspaceLock: () => new HydraniumWorkspaceLock(),
|
|
399
534
|
ProjectManager: services => new SingleProjectManager(services),
|
|
400
|
-
SelfSaveRegistry: services => new
|
|
535
|
+
SelfSaveRegistry: services => new DefaultSelfSaveRegistry(services),
|
|
401
536
|
DocumentUriPolicy: () => new DefaultDocumentUriPolicy(),
|
|
402
|
-
//
|
|
403
|
-
//
|
|
404
|
-
//
|
|
405
|
-
//
|
|
406
|
-
// (in-memory, browser, test stub like `DefaultEmptyFileSystemProvider`).
|
|
407
|
-
// - Otherwise — the portable default `DefaultEmptyFileSystemProvider`
|
|
408
|
-
// (no-op writes, no disk access). Node hosts opt into real disk I/O
|
|
409
|
-
// by binding `@hydranium/core/node`'s `DefaultFileSystemProvider`
|
|
410
|
-
// (Node-backed, wired to `SelfSaveRegistry` so framework `writeFile`
|
|
411
|
-
// calls register their mtime and adopters can suppress the
|
|
412
|
-
// `didChangeWatchedFiles` echo) — typically via this same
|
|
413
|
-
// `context.fileSystemProvider` channel or by rebinding
|
|
414
|
-
// the slot. Keeping the `.`-entry default empty is what lets the
|
|
415
|
-
// core barrel stay free of `node:fs` (browser-bundleable); see the
|
|
416
|
-
// `@hydranium/core/node` carve.
|
|
537
|
+
// The host is the provider `context.fileSystemProvider` returns
|
|
538
|
+
// when it is writable (has `writeFile`); anything narrower gets the
|
|
539
|
+
// empty provider, which is what keeps the core barrel free of
|
|
540
|
+
// `node:fs`.
|
|
417
541
|
FileSystemProvider: services => {
|
|
418
542
|
const fromContext = context.fileSystemProvider?.(services);
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
543
|
+
const writable = typeof (fromContext as Partial<WritableFileSystemProvider> | undefined)?.writeFile === 'function';
|
|
544
|
+
return new DefaultFileSystemProviderRegistry(services, {
|
|
545
|
+
host: writable ? (fromContext as WritableFileSystemProvider) : new DefaultEmptyFileSystemProvider(services)
|
|
546
|
+
});
|
|
423
547
|
},
|
|
424
|
-
AstDocumentManager: services => new
|
|
548
|
+
AstDocumentManager: services => new DefaultAstDocumentManager(services),
|
|
549
|
+
FileSystemTaskQueue: services => new DefaultFileSystemTaskQueue(services),
|
|
425
550
|
// Eagerly constructed, so its build-phase listeners attach before the
|
|
426
551
|
// first build.
|
|
427
|
-
BuildPipelineIntegration: services => new
|
|
552
|
+
BuildPipelineIntegration: services => new DefaultBuildPipelineIntegration(services),
|
|
428
553
|
BuildPhasePassService: services => new DefaultBuildPhasePassService(services),
|
|
429
554
|
// Eagerly constructed, so its `Validated` pass registers before the
|
|
430
555
|
// first build.
|
|
431
|
-
CstResidencyService: services => new
|
|
556
|
+
CstResidencyService: services => new DefaultCstResidencyService(services)
|
|
432
557
|
},
|
|
433
558
|
model: {
|
|
434
559
|
// Generic walker — adopters with a typed `$type → wire shape` overlay
|
|
435
560
|
// rebind this slot with a subclass.
|
|
436
|
-
TransferEncoder: services => new
|
|
437
|
-
ModelService: services => new
|
|
561
|
+
TransferEncoder: services => new DefaultTransferEncoder(services),
|
|
562
|
+
ModelService: services => new DefaultModelService(services),
|
|
563
|
+
ClientSessionFactory: services => new DefaultClientSessionFactory(services)
|
|
438
564
|
},
|
|
439
565
|
// Empty default so `services.buildPhasePasses` always resolves (Langium
|
|
440
566
|
// throws on access to an unbound slot). The framework's own integrity /
|
|
441
567
|
// profiler passes self-register imperatively, not here.
|
|
442
568
|
buildPhasePasses: {},
|
|
443
569
|
// Empty default so `services.additionalDocuments` always resolves.
|
|
444
|
-
additionalDocuments: {}
|
|
570
|
+
additionalDocuments: {},
|
|
571
|
+
fileSystemProviders: {
|
|
572
|
+
[VIRTUAL_SCHEME]: services => new VirtualFileSystemProvider(services)
|
|
573
|
+
}
|
|
445
574
|
};
|
|
446
575
|
}
|
|
@@ -59,6 +59,16 @@ export interface NameProviderOptions {
|
|
|
59
59
|
* an `id` field) override explicitly; the explicit override at
|
|
60
60
|
* the adopter side documents the grammar's convention rather than
|
|
61
61
|
* burying it in a framework default.
|
|
62
|
+
*
|
|
63
|
+
* **The override is not optional where `name` is a display LABEL rather
|
|
64
|
+
* than an identifier**, and getting it wrong is quiet at first and then
|
|
65
|
+
* loud. A `name=STRING` holding `"Order.Line"` is legitimate content, but
|
|
66
|
+
* the default reads it as the identifier: `getName` composes a qualified
|
|
67
|
+
* name whose segments cannot be told apart from the label's own dots, and
|
|
68
|
+
* `nameSeparatorCheck` reports `hydranium/core/separator-in-name` on every
|
|
69
|
+
* such node. That diagnostic then names the wrong remedy — it asks for a
|
|
70
|
+
* different character, when the fix is to point this option at the property
|
|
71
|
+
* that really is the identifier.
|
|
62
72
|
*/
|
|
63
73
|
readonly nameProperties?: readonly string[];
|
|
64
74
|
}
|
|
@@ -244,10 +254,21 @@ export interface NameProvider extends LangiumNameProvider {
|
|
|
244
254
|
/**
|
|
245
255
|
* Find a unique name for a new node within `container`, using `base`
|
|
246
256
|
* as a stem. Walks the AST subtree rooted at `container` and avoids
|
|
247
|
-
* names already
|
|
248
|
-
* generates `${base}1`,
|
|
249
|
-
* found. Used by create-element
|
|
250
|
-
* uniqueness scope is one AST subtree.
|
|
257
|
+
* names already held there by nodes of `type` or of any subtype of it,
|
|
258
|
+
* as `AstReflection.isSubtype` reports. Default generates `${base}1`,
|
|
259
|
+
* `${base}2`, ... until an unused value is found. Used by create-element
|
|
260
|
+
* operation handlers when the uniqueness scope is one AST subtree.
|
|
261
|
+
*
|
|
262
|
+
* Subtype-closed rather than `$type`-exact, because a name space shared by
|
|
263
|
+
* several concrete types is named by their common supertype and by no
|
|
264
|
+
* concrete type at all — the shape a cross-reference whose target type is
|
|
265
|
+
* that supertype produces. An exact filter finds no collisions for such a
|
|
266
|
+
* call and returns the proposal unchanged, which a caller cannot tell from
|
|
267
|
+
* a name that was genuinely free.
|
|
268
|
+
* {@link NameProvider.findNextDocumentQualifiedName} and
|
|
269
|
+
* {@link NameProvider.findNextProjectQualifiedName} resolve `type` the same
|
|
270
|
+
* way, through `IndexManager.allElements`, so one type argument does not
|
|
271
|
+
* mean different sets at different tiers.
|
|
251
272
|
*/
|
|
252
273
|
findNextName(type: string, base: string, container: AstNode): string;
|
|
253
274
|
|
|
@@ -486,8 +507,9 @@ export class DefaultNameProvider implements NameProvider {
|
|
|
486
507
|
|
|
487
508
|
findNextName(type: string, base: string, container: AstNode): string {
|
|
488
509
|
const proposal = base.replaceAll(this.nameSeparator, '_');
|
|
510
|
+
const reflection = this.services.shared.AstReflection;
|
|
489
511
|
const knownNames = AstUtils.streamAst(container)
|
|
490
|
-
.filter(node => node.$type
|
|
512
|
+
.filter(node => reflection.isSubtype(node.$type, type))
|
|
491
513
|
.map(node => this.getOwnName(node))
|
|
492
514
|
.nonNullable()
|
|
493
515
|
.toArray();
|
|
@@ -8,10 +8,39 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { type AstNode, type ValidationAcceptor, type ValidationChecks } from '@hydranium/langium';
|
|
11
|
+
import { defineMessage } from '@hydranium/protocol';
|
|
12
|
+
import { acceptMessage } from '../../messages/carriers.js';
|
|
11
13
|
import { type ServerLanguageServices } from '../language-module.js';
|
|
12
14
|
import { type ValidationCheckContribution, type ValidationCheckRegistry } from '../validation/validation-contribution.js';
|
|
13
15
|
import type { NameProvider } from './name-provider.js';
|
|
14
16
|
|
|
17
|
+
/**
|
|
18
|
+
* A name value that collides with the qualified-name separator.
|
|
19
|
+
*
|
|
20
|
+
* **The sentence addresses a MODELLER, and the remedy it names is theirs**:
|
|
21
|
+
* where `name` really is the identifier, a different character is the fix and
|
|
22
|
+
* the only one available to whoever is typing.
|
|
23
|
+
*
|
|
24
|
+
* **The adopter-facing failure is a different one, and this message cannot
|
|
25
|
+
* carry it.** With `nameProperties` left at its default `['name']` over a
|
|
26
|
+
* grammar where `name` is a display LABEL — a `STRING` legitimately holding
|
|
27
|
+
* `"Order.Line"` — this fires on every dotted label at once, and "use a
|
|
28
|
+
* different character" is then advice nobody can act on: the content is
|
|
29
|
+
* correct and the configuration is not. A burst of this diagnostic across
|
|
30
|
+
* unrelated nodes is that misconfiguration, not a naming problem, and the fix
|
|
31
|
+
* is `nameProperties`. Widening the sentence to say both was rejected: a
|
|
32
|
+
* modeller cannot act on a DI option, and naming one in an editor squiggle
|
|
33
|
+
* teaches the wrong audience.
|
|
34
|
+
*
|
|
35
|
+
* Unreachable from a grammar whose identifier charset excludes the separator,
|
|
36
|
+
* which is every example here and the reference adopter — so it reads as dead
|
|
37
|
+
* and is not: it guards the configuration, not the content.
|
|
38
|
+
*/
|
|
39
|
+
export const SEPARATOR_IN_NAME = defineMessage(
|
|
40
|
+
'hydranium/core/separator-in-name',
|
|
41
|
+
"Name '{name}' contains the configured name separator '{separator}', which is reserved for qualified-name composition — use a different character."
|
|
42
|
+
);
|
|
43
|
+
|
|
15
44
|
/**
|
|
16
45
|
* Per-node validation check: flag name-bearing AST nodes whose name
|
|
17
46
|
* value contains the configured name separator. Such values produce
|
|
@@ -38,11 +67,11 @@ export function nameSeparatorCheck(nameProvider: NameProvider): (node: AstNode,
|
|
|
38
67
|
}
|
|
39
68
|
const separator = nameProvider.nameSeparator;
|
|
40
69
|
if (ownName.includes(separator)) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
);
|
|
70
|
+
// `{ node }` rather than `{ node, property: 'name' }`: moving the
|
|
71
|
+
// squiggle onto the name property is a behaviour change to the one
|
|
72
|
+
// diagnostic every adopter receives by default, so it is decided on its
|
|
73
|
+
// own merits rather than carried in by a mechanical migration.
|
|
74
|
+
acceptMessage(accept, 'error', SEPARATOR_IN_NAME, { node }, { name: ownName, separator });
|
|
46
75
|
}
|
|
47
76
|
};
|
|
48
77
|
}
|
|
@@ -12,13 +12,14 @@ import {
|
|
|
12
12
|
type AstNode,
|
|
13
13
|
AstUtils,
|
|
14
14
|
type DocumentBuilder,
|
|
15
|
+
DocumentState,
|
|
15
16
|
type FileSystemProvider,
|
|
16
17
|
type LangiumDocument,
|
|
17
18
|
type LangiumDocuments,
|
|
18
19
|
type URI,
|
|
19
20
|
UriUtils
|
|
20
21
|
} from '@hydranium/langium';
|
|
21
|
-
import { Disposable } from 'vscode-languageserver';
|
|
22
|
+
import { CancellationToken, Disposable } from 'vscode-languageserver';
|
|
22
23
|
import type { WorkspaceFolder } from 'vscode-languageserver-types';
|
|
23
24
|
import type { LogNameOptions } from '../diagnostics/logger.js';
|
|
24
25
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
@@ -377,6 +378,13 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
377
378
|
protected async loadDescriptor(uri: URI): Promise<TProject | undefined> {
|
|
378
379
|
try {
|
|
379
380
|
const document = await this.langiumDocuments.getOrCreateDocument(uri);
|
|
381
|
+
if (document.state < DocumentState.Parsed) {
|
|
382
|
+
// `onUpdate` fires before the build parses, so the AST is still the previous edit's.
|
|
383
|
+
// The state is restored so the build still runs, and notifies, its own parse phase.
|
|
384
|
+
const state = document.state;
|
|
385
|
+
await this.services.workspace.LangiumDocumentFactory.update(document, CancellationToken.None);
|
|
386
|
+
document.state = state;
|
|
387
|
+
}
|
|
380
388
|
const project = await this.parseProjectDescriptor(uri, document);
|
|
381
389
|
if (project) {
|
|
382
390
|
this.projects.set(project.id, project);
|
|
@@ -28,8 +28,8 @@ import type { URI } from '@hydranium/langium';
|
|
|
28
28
|
* - {@link affectedDocuments} lists URIs whose reachable scope changed. The
|
|
29
29
|
* default cascade plumbing in `HydraniumWorkspaceManager` subscribes to
|
|
30
30
|
* this event and re-runs `DocumentBuilder.resetToState` for each entry,
|
|
31
|
-
* which the
|
|
32
|
-
* independently for other reactions.
|
|
31
|
+
* which the build of the update that changed the descriptor picks up.
|
|
32
|
+
* Consumers can subscribe independently for other reactions.
|
|
33
33
|
*/
|
|
34
34
|
export interface ProjectChangeEvent<TProject extends Project = Project> {
|
|
35
35
|
/** Ids of projects newly registered since the last event. */
|
|
@@ -24,9 +24,13 @@ import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
|
24
24
|
/**
|
|
25
25
|
* Default priority of the CST-residency pass. Deliberately very high so it runs
|
|
26
26
|
* *last* among `Validated` build-phase passes (the registry iterates priority
|
|
27
|
-
* ascending)
|
|
28
|
-
*
|
|
29
|
-
*
|
|
27
|
+
* ascending).
|
|
28
|
+
*
|
|
29
|
+
* The ordering is defensive, not load-bearing: the pass only arms or cancels an
|
|
30
|
+
* idle timer, so every pass at `Validated` reads a resident CST whichever order
|
|
31
|
+
* they run in, and lowering it changes nothing observable while that holds. It
|
|
32
|
+
* becomes load-bearing the moment the shed stops being deferred — a pass that
|
|
33
|
+
* frees the CST synchronously has to run after every reader of it.
|
|
30
34
|
*/
|
|
31
35
|
export const CST_RESIDENCY_PASS_PRIORITY = 1_000_000;
|
|
32
36
|
|
|
@@ -181,8 +185,10 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
|
|
|
181
185
|
}
|
|
182
186
|
|
|
183
187
|
/**
|
|
184
|
-
*
|
|
185
|
-
*
|
|
188
|
+
* Keeps a document's CST available to the readers that need one, shedding it
|
|
189
|
+
* for documents that have gone idle and re-grafting on demand.
|
|
190
|
+
*
|
|
191
|
+
* Each build refreshes
|
|
186
192
|
* the idle window of the documents in its batch; when a closed, sheddable
|
|
187
193
|
* document's window elapses, every AST node's `$cstNode` and every reference's
|
|
188
194
|
* `$refNode` are nulled, and the CST root, `Range`s and `Position`s become
|
|
@@ -225,9 +231,25 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
|
|
|
225
231
|
* demand by the identity-preserving graft of {@link rehydrateNode} /
|
|
226
232
|
* {@link rehydrate}, driven transparently from the framework
|
|
227
233
|
* `NameProvider.getNameNode` chokepoint, the comment provider, and
|
|
228
|
-
* `
|
|
234
|
+
* `HydraniumLangiumDocuments.getOrCreateDocument`.
|
|
229
235
|
*/
|
|
230
|
-
export
|
|
236
|
+
export interface CstResidencyService {
|
|
237
|
+
/**
|
|
238
|
+
* Ensure `document` has a CST, re-parsing its retained text if it was shed.
|
|
239
|
+
* A resident document is left exactly as it is, so this is safe to call on
|
|
240
|
+
* a hot path and safe to call twice.
|
|
241
|
+
*/
|
|
242
|
+
rehydrate(document: LangiumDocument): void;
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Node-level convenience over {@link rehydrate}, cheap enough for an
|
|
246
|
+
* unconditional call: a node whose `$cstNode` is already set returns
|
|
247
|
+
* without resolving its document.
|
|
248
|
+
*/
|
|
249
|
+
rehydrateNode(node: AstNode): void;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export class DefaultCstResidencyService implements CstResidencyService {
|
|
231
253
|
protected readonly strategy: CstResidencyStrategy;
|
|
232
254
|
/** Bytes-per-node for the optional reclaim estimate in traces; `0` disables it. */
|
|
233
255
|
protected readonly estimatedBytesPerShedNode: number;
|
|
@@ -277,8 +299,8 @@ export class CstResidencyService {
|
|
|
277
299
|
* until navigation latency on shed files is actually observed to hurt. This
|
|
278
300
|
* method is where that hook goes.
|
|
279
301
|
*/
|
|
280
|
-
rehydrate(document: LangiumDocument):
|
|
281
|
-
|
|
302
|
+
rehydrate(document: LangiumDocument): void {
|
|
303
|
+
rehydrateCst(document, this.services.workspace.LangiumDocumentFactory);
|
|
282
304
|
}
|
|
283
305
|
|
|
284
306
|
/**
|
|
@@ -287,11 +309,11 @@ export class CstResidencyService {
|
|
|
287
309
|
* `true` without even resolving the document, so hot read paths
|
|
288
310
|
* (`getNameNode`, comment lookup) call this unconditionally.
|
|
289
311
|
*/
|
|
290
|
-
rehydrateNode(node: AstNode):
|
|
312
|
+
rehydrateNode(node: AstNode): void {
|
|
291
313
|
if (node.$cstNode !== undefined) {
|
|
292
|
-
return
|
|
314
|
+
return;
|
|
293
315
|
}
|
|
294
|
-
|
|
316
|
+
this.rehydrate(AstUtils.getDocument(node));
|
|
295
317
|
}
|
|
296
318
|
|
|
297
319
|
/**
|
|
@@ -353,8 +375,8 @@ export class CstResidencyService {
|
|
|
353
375
|
this.shedTotal += this.shed(document);
|
|
354
376
|
}
|
|
355
377
|
|
|
356
|
-
/** Cancel
|
|
357
|
-
|
|
378
|
+
/** Cancel every armed shed, so a document that has gone idle keeps its CST. */
|
|
379
|
+
cancelPendingShed(): void {
|
|
358
380
|
for (const timer of this.idleTimers.values()) {
|
|
359
381
|
timer.dispose();
|
|
360
382
|
}
|