@hydranium/core 1.0.0-next.38 → 1.0.0-next.380
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 +78 -82
- package/lib/browser/host-heads-in-worker.d.ts +77 -0
- package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
- package/lib/browser/host-heads-in-worker.js +169 -0
- package/lib/browser/host-heads-in-worker.js.map +1 -0
- package/lib/browser/index.d.ts +12 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +17 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
- package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
- package/lib/browser/indexeddb-file-system-store.js +181 -0
- package/lib/browser/indexeddb-file-system-store.js.map +1 -0
- package/lib/browser/start-language-server-in-worker.d.ts +32 -0
- package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
- package/lib/browser/start-language-server-in-worker.js +40 -0
- package/lib/browser/start-language-server-in-worker.js.map +1 -0
- package/lib/documents/ast-document-manager.d.ts +254 -140
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +311 -127
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +5 -19
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +5 -19
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +15 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +15 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +146 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +207 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/dirty-state-tracker.d.ts +101 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +85 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +204 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +317 -0
- package/lib/documents/document-release-handler.js.map +1 -0
- package/lib/documents/document-release-scheduler.d.ts +67 -0
- package/lib/documents/document-release-scheduler.d.ts.map +1 -0
- package/lib/documents/document-release-scheduler.js +80 -0
- package/lib/documents/document-release-scheduler.js.map +1 -0
- package/lib/documents/file-system-task-queue.d.ts +52 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +37 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +445 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +903 -504
- 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 +234 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +306 -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 +145 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +177 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js +45 -19
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +25 -9
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +49 -36
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +75 -36
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
- 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 +25 -16
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
- package/lib/langium/build-phase-pass/build-phase-pass.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/console-tee.d.ts +27 -0
- package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
- package/lib/langium/diagnostics/console-tee.js +141 -0
- package/lib/langium/diagnostics/console-tee.js.map +1 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/log-preamble.js +1 -1
- package/lib/langium/diagnostics/log-preamble.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +25 -6
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +49 -17
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +81 -46
- 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 +43 -30
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +6 -5
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js +5 -5
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +355 -39
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +578 -102
- 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 +39 -23
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +7 -4
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +22 -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 +104 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +319 -65
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +3 -2
- package/lib/langium/keys/containment.d.ts.map +1 -1
- package/lib/langium/keys/containment.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +24 -12
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/positional-key-provider.js.map +1 -1
- package/lib/langium/labeling/label-provider.d.ts.map +1 -1
- package/lib/langium/labeling/label-provider.js.map +1 -1
- package/lib/langium/language-module.d.ts +30 -5
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +21 -5
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +405 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +479 -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 +68 -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 +441 -323
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +602 -397
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +96 -37
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +39 -27
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +32 -7
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +10 -4
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts +184 -13
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +336 -16
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +22 -3
- package/lib/langium/project/project-change-event.d.ts.map +1 -1
- package/lib/langium/project/project-manager.d.ts +28 -2
- package/lib/langium/project/project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.d.ts +7 -1
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js +12 -0
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +81 -44
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +142 -46
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js +88 -15
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/built-local-symbols.d.ts +12 -0
- package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
- package/lib/langium/scope/built-local-symbols.js +11 -0
- package/lib/langium/scope/built-local-symbols.js.map +1 -0
- package/lib/langium/scope/fallback-scope.d.ts +27 -0
- package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
- package/lib/langium/scope/fallback-scope.js +35 -0
- package/lib/langium/scope/fallback-scope.js.map +1 -0
- package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js +38 -39
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +122 -32
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +217 -39
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/index.d.ts +1 -0
- package/lib/langium/scope/index.d.ts.map +1 -1
- package/lib/langium/scope/index.js +1 -0
- package/lib/langium/scope/index.js.map +1 -1
- package/lib/langium/scope/reference-builder.d.ts.map +1 -1
- package/lib/langium/scope/reference-builder.js.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js +3 -2
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts +69 -37
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js +102 -29
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
- package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.js +1 -3
- package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +54 -30
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +8 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js +13 -3
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/serializer.d.ts +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js +24 -4
- 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 +10 -4
- 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 +60 -39
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +35 -24
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +543 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +1165 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +62 -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 +52 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +168 -23
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +264 -26
- 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/ast-node-locator.d.ts +24 -0
- package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
- package/lib/langium/workspace/ast-node-locator.js +32 -0
- package/lib/langium/workspace/ast-node-locator.js.map +1 -0
- package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +22 -13
- 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 +167 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +115 -13
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +35 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +77 -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 +105 -21
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +186 -31
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/index.d.ts +3 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +3 -0
- package/lib/langium/workspace/index.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +68 -3
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +7 -0
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +18 -1
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/{documents → langium/workspace}/self-save-registry.d.ts +7 -9
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +9 -11
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/syntax-errors.d.ts +23 -0
- package/lib/langium/workspace/syntax-errors.d.ts.map +1 -0
- package/lib/langium/workspace/syntax-errors.js +29 -0
- package/lib/langium/workspace/syntax-errors.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +55 -21
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +87 -24
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +15 -5
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/launcher/integrated-server.d.ts +3 -1
- package/lib/launcher/integrated-server.d.ts.map +1 -1
- package/lib/locale/server-locale.d.ts +6 -6
- package/lib/locale/server-locale.d.ts.map +1 -1
- package/lib/locale/server-locale.js.map +1 -1
- 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/edit-requests-guard.d.ts +31 -0
- package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
- package/lib/lsp/edit-requests-guard.js +125 -0
- package/lib/lsp/edit-requests-guard.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +234 -101
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +6 -2
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +6 -2
- 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/save-text-document.d.ts +31 -0
- package/lib/lsp/save-text-document.d.ts.map +1 -0
- package/lib/lsp/save-text-document.js +52 -0
- package/lib/lsp/save-text-document.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +58 -2
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +98 -9
- 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 +12 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +21 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +4 -6
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +4 -6
- package/lib/messages/carriers.js.map +1 -1
- package/lib/messages/index.d.ts +2 -2
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +2 -2
- package/lib/messages/index.js.map +1 -1
- package/lib/messages/renderer.d.ts +10 -4
- package/lib/messages/renderer.d.ts.map +1 -1
- package/lib/messages/renderer.js +6 -0
- package/lib/messages/renderer.js.map +1 -1
- package/lib/node/event-loop-monitor.d.ts.map +1 -1
- package/lib/node/event-loop-monitor.js +2 -1
- package/lib/node/event-loop-monitor.js.map +1 -1
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +5 -1
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/lint-grammar.js.map +1 -1
- package/lib/node/log-file-sink.d.ts +3 -2
- package/lib/node/log-file-sink.d.ts.map +1 -1
- package/lib/node/log-file-sink.js +6 -2
- package/lib/node/log-file-sink.js.map +1 -1
- package/lib/node/log-preamble-node.d.ts +5 -3
- package/lib/node/log-preamble-node.d.ts.map +1 -1
- package/lib/node/log-preamble-node.js +13 -10
- package/lib/node/log-preamble-node.js.map +1 -1
- package/lib/node/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +5 -4
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.d.ts +2 -2
- package/lib/node/memory-monitor.d.ts.map +1 -1
- package/lib/node/memory-monitor.js +9 -10
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +67 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +198 -53
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +12 -4
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +8 -6
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +13 -3
- package/lib/node/profiling-run.d.ts.map +1 -1
- package/lib/node/profiling-run.js +17 -8
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +61 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +80 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/server-diagnostics.js +1 -1
- package/lib/node/server-diagnostics.js.map +1 -1
- package/lib/node/server-state-snapshot.d.ts +1 -2
- package/lib/node/server-state-snapshot.d.ts.map +1 -1
- package/lib/node/server-state-snapshot.js +4 -4
- package/lib/node/server-state-snapshot.js.map +1 -1
- package/lib/node/socket-launcher.d.ts +43 -7
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +42 -7
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/startup-cpu-profile.d.ts +29 -0
- package/lib/node/startup-cpu-profile.d.ts.map +1 -0
- package/lib/node/startup-cpu-profile.js +91 -0
- package/lib/node/startup-cpu-profile.js.map +1 -0
- package/lib/node/stdio-launcher.d.ts +13 -13
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +21 -11
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/node/validate-workspace.d.ts +1 -1
- package/lib/node/validate-workspace.d.ts.map +1 -1
- package/lib/node/validate-workspace.js +5 -1
- package/lib/node/validate-workspace.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js +1 -1
- package/lib/testing/document-uri-policy-conformance.js.map +1 -1
- package/lib/testing/fake-description.js.map +1 -1
- package/lib/testing/fake-document.d.ts +2 -1
- package/lib/testing/fake-document.d.ts.map +1 -1
- 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.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +45 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +23 -7
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/make-test-tracer.d.ts +12 -0
- package/lib/testing/make-test-tracer.d.ts.map +1 -1
- package/lib/testing/make-test-tracer.js +13 -0
- package/lib/testing/make-test-tracer.js.map +1 -1
- package/lib/testing/node/applied-edit-capture.d.ts +29 -0
- package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
- package/lib/testing/node/applied-edit-capture.js +117 -0
- package/lib/testing/node/applied-edit-capture.js.map +1 -0
- package/lib/testing/node/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +21 -6
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +49 -106
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +30 -1
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +39 -2
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/node/unhandled-rejections.d.ts +20 -0
- package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
- package/lib/testing/node/unhandled-rejections.js +32 -0
- package/lib/testing/node/unhandled-rejections.js.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
- package/lib/testing/playwright/e2e-profiling.js.map +1 -1
- package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.js +164 -0
- package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +1 -0
- package/lib/testing/playwright/index.d.ts.map +1 -1
- package/lib/testing/playwright/index.js +1 -0
- package/lib/testing/playwright/index.js.map +1 -1
- package/lib/testing/playwright/server-log-capture.d.ts +46 -16
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +111 -40
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
- package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-fixture.js +25 -6
- package/lib/testing/playwright/server-log-fixture.js.map +1 -1
- package/lib/testing/playwright/server-log-region.d.ts +15 -0
- package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-region.js +30 -0
- package/lib/testing/playwright/server-log-region.js.map +1 -0
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +8 -5
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/run-update-pipeline.js.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +11 -51
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +31 -59
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +33 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +110 -5
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +132 -16
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +8 -7
- 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.d.ts.map +1 -1
- package/lib/testing/stub-project-manager.js +10 -0
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-self-save-registry.d.ts +1 -1
- package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
- package/lib/testing/stub-service-registry.d.ts +1 -1
- package/lib/testing/stub-service-registry.js.map +1 -1
- package/lib/testing/stub-writable-file-system.d.ts +1 -1
- package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
- package/lib/testing/stub-writable-file-system.js +2 -1
- package/lib/testing/stub-writable-file-system.js.map +1 -1
- package/lib/util/connection-liveness.d.ts +22 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +75 -15
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts +7 -0
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js +15 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +41 -60
- package/src/browser/host-heads-in-worker.ts +218 -0
- package/src/browser/index.ts +17 -0
- package/src/browser/indexeddb-file-system-store.ts +192 -0
- package/src/browser/start-language-server-in-worker.ts +56 -0
- package/src/documents/ast-document-manager.ts +477 -249
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +26 -0
- package/src/documents/client-session-registry.ts +262 -0
- package/src/documents/dirty-state-tracker.ts +167 -0
- package/src/documents/document-release-handler.ts +404 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +74 -0
- package/src/documents/hydranium-text-documents.ts +1029 -616
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +501 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +289 -0
- package/src/index.ts +3 -0
- package/src/langium/ast-extension/ast-extension-service.ts +77 -41
- package/src/langium/ast-extension/ast-node-builder.ts +35 -13
- package/src/langium/bootstrap.ts +79 -43
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
- package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
- 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/console-tee.ts +150 -0
- package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
- package/src/langium/diagnostics/log-preamble.ts +1 -1
- package/src/langium/diagnostics/logger.ts +51 -17
- package/src/langium/diagnostics/lsp-logger.ts +83 -45
- package/src/langium/document-builder/build-pipeline-integration.ts +57 -32
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +709 -105
- package/src/langium/integration-services.ts +58 -27
- package/src/langium/integrity/integrity-rule.ts +22 -8
- package/src/langium/integrity/integrity-service.ts +348 -71
- package/src/langium/keys/containment.ts +3 -2
- package/src/langium/keys/name-based-key-provider.ts +24 -12
- package/src/langium/language-module.ts +52 -9
- package/src/langium/model-service/client-session.ts +769 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +82 -0
- package/src/langium/model-service/model-service.ts +885 -522
- package/src/langium/module.ts +139 -63
- package/src/langium/naming/name-provider.ts +34 -8
- package/src/langium/project/abstract-project-manager.ts +409 -20
- package/src/langium/project/project-change-event.ts +25 -3
- package/src/langium/project/project-manager.ts +31 -2
- package/src/langium/project/single-project-manager.ts +16 -1
- package/src/langium/residency/cst-residency-service.ts +197 -73
- package/src/langium/scope/ast-node-description-provider.ts +111 -16
- package/src/langium/scope/built-local-symbols.ts +13 -0
- package/src/langium/scope/fallback-scope.ts +38 -0
- package/src/langium/scope/hydranium-scope-computation.ts +45 -44
- package/src/langium/scope/hydranium-scope-provider.ts +245 -41
- package/src/langium/scope/index.ts +1 -0
- package/src/langium/scope/reference-candidate-provider.ts +6 -5
- package/src/langium/scope/scope-extension-service.ts +148 -56
- package/src/langium/scope/scoped-ast-node-description.ts +1 -3
- package/src/langium/serialization/abstract-serializer.ts +57 -41
- package/src/langium/serialization/json-serializer.ts +14 -3
- package/src/langium/serialization/serializer.ts +1 -1
- package/src/langium/serialization/yaml-serializer.ts +26 -4
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +13 -4
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +76 -50
- package/src/langium/trivia/comment-preserver.ts +1410 -0
- package/src/langium/trivia/document-ending-preserver.ts +71 -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 +56 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +312 -31
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/ast-node-locator.ts +33 -0
- package/src/langium/workspace/document-uri-policy.ts +32 -18
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +258 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +107 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +214 -35
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +3 -0
- package/src/langium/workspace/initialize-workspace.ts +96 -4
- package/src/langium/workspace/langium-documents.ts +19 -1
- package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
- package/src/{documents → langium/workspace}/self-save-registry.ts +12 -14
- package/src/langium/workspace/syntax-errors.ts +34 -0
- package/src/langium/workspace/virtual-document.ts +106 -25
- package/src/langium/workspace/write-lock-scope.ts +27 -12
- package/src/launcher/integrated-server.ts +3 -1
- package/src/locale/server-locale.ts +6 -6
- 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/edit-requests-guard.ts +152 -0
- package/src/lsp/hydranium-document-update-handler.ts +284 -110
- package/src/lsp/index.ts +6 -2
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/save-text-document.ts +63 -0
- package/src/lsp/semantic-token-provider.ts +146 -8
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +21 -7
- package/src/messages/carriers.ts +4 -6
- package/src/messages/index.ts +11 -2
- package/src/messages/renderer.ts +11 -3
- package/src/node/event-loop-monitor.ts +2 -1
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +5 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/log-file-sink.ts +6 -2
- package/src/node/log-preamble-node.ts +20 -10
- package/src/node/measure-memory.ts +5 -4
- package/src/node/memory-monitor.ts +10 -10
- package/src/node/node-file-system-provider.ts +214 -57
- package/src/node/profile-capture.ts +16 -15
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +94 -0
- package/src/node/server-diagnostics.ts +1 -1
- package/src/node/server-state-snapshot.ts +6 -7
- package/src/node/socket-launcher.ts +78 -14
- package/src/node/startup-cpu-profile.ts +94 -0
- package/src/node/stdio-launcher.ts +29 -19
- package/src/node/validate-workspace.ts +8 -2
- package/src/testing/document-uri-policy-conformance.ts +1 -1
- package/src/testing/fake-document.ts +2 -1
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-test-services.ts +83 -31
- package/src/testing/make-test-tracer.ts +26 -0
- package/src/testing/node/applied-edit-capture.ts +141 -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 +83 -119
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +57 -3
- package/src/testing/node/unhandled-rejections.ts +31 -0
- package/src/testing/parse-semantic-root.ts +1 -1
- package/src/testing/playwright/flaky-network-proxy.ts +240 -0
- package/src/testing/playwright/index.ts +1 -0
- package/src/testing/playwright/server-log-capture.ts +137 -47
- package/src/testing/playwright/server-log-fixture.ts +46 -6
- package/src/testing/playwright/server-log-region.ts +32 -0
- package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
- package/src/testing/run-update-pipeline.ts +8 -5
- package/src/testing/stub-ast-document-manager.ts +47 -123
- package/src/testing/stub-document-builder.ts +155 -18
- package/src/testing/stub-hydranium-text-documents.ts +184 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +9 -8
- package/src/testing/stub-project-manager.ts +10 -0
- package/src/testing/stub-self-save-registry.ts +1 -1
- package/src/testing/stub-service-registry.ts +1 -1
- package/src/testing/stub-writable-file-system.ts +3 -2
- package/src/util/connection-liveness.ts +81 -15
- package/src/util/environment.ts +24 -2
- package/lib/documents/language-client-text-shadow.d.ts +0 -124
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -190
- 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 -211
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -7,11 +7,16 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { asMutable, type Clock, Debouncer, Format, type Tracer } from '@hydranium/protocol';
|
|
10
|
+
import { asMutable, type Clock, Debouncer, Format, type Tracer, UNRECORDED_VERSION } from '@hydranium/protocol';
|
|
11
11
|
import {
|
|
12
12
|
type AstNode,
|
|
13
|
+
type AstReflection,
|
|
13
14
|
AstUtils,
|
|
14
15
|
DocumentState,
|
|
16
|
+
isAstNode,
|
|
17
|
+
isMultiReference,
|
|
18
|
+
isReference,
|
|
19
|
+
type ReferenceInfo,
|
|
15
20
|
type LangiumDocument,
|
|
16
21
|
type LangiumDocumentFactory,
|
|
17
22
|
type LangiumDocuments,
|
|
@@ -45,8 +50,12 @@ export const CST_RESIDENCY_PASS_PRIORITY = 1_000_000;
|
|
|
45
50
|
* "off" toggle.
|
|
46
51
|
* - `{ kind: 'shed-closed-when-idle', idleMs }`: shed a closed document's CST
|
|
47
52
|
* once it has been idle (not in any build) for `idleMs`, keeping the AST
|
|
48
|
-
* resident. Open documents are always kept.
|
|
49
|
-
* document
|
|
53
|
+
* resident. Open documents are always kept. The timer starts when a build
|
|
54
|
+
* includes the document, so `idleMs: 0` sheds a closed document on the tick
|
|
55
|
+
* after each such build. A shed document that re-enters a build has its CST
|
|
56
|
+
* grafted back, which parses its text, so a window shorter than the gap
|
|
57
|
+
* between a document's builds parses a closed document on every build it
|
|
58
|
+
* rides in.
|
|
50
59
|
*/
|
|
51
60
|
export type CstResidencyStrategy = { readonly kind: 'always-keep' } | { readonly kind: 'shed-closed-when-idle'; readonly idleMs: number };
|
|
52
61
|
|
|
@@ -69,13 +78,14 @@ export interface CstResidencyOptions extends LogNameOptions {
|
|
|
69
78
|
}
|
|
70
79
|
|
|
71
80
|
/**
|
|
72
|
-
* The build state a shed document
|
|
73
|
-
* and rebuilds its CST — and every
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
81
|
+
* The build state a shed document is reset to when the identity-preserving graft
|
|
82
|
+
* fails, so the next build re-parses it and rebuilds its CST — and every
|
|
83
|
+
* `reference.$refNode` — before it is relinked or re-indexed. It is
|
|
84
|
+
* `DocumentState.Changed` by necessity: the only state below `Parsed`, hence
|
|
85
|
+
* the only one that forces a re-parse rather than an in-place relink. Exposed
|
|
86
|
+
* as a named landmark of the residency feature (cf.
|
|
87
|
+
* `IntegrityService.SettledState`) so the document builder references the
|
|
88
|
+
* feature's declared recovery contract instead of a bare enum value.
|
|
79
89
|
*/
|
|
80
90
|
export const CST_REHYDRATION_RESET_STATE: DocumentState = DocumentState.Changed;
|
|
81
91
|
|
|
@@ -96,8 +106,8 @@ export function isCstShed(document: LangiumDocument): boolean {
|
|
|
96
106
|
}
|
|
97
107
|
|
|
98
108
|
/**
|
|
99
|
-
* Reattach a CST to a shed document **on demand**, without a rebuild
|
|
100
|
-
* read
|
|
109
|
+
* Reattach a CST to a shed document **on demand**, without a rebuild. Both the
|
|
110
|
+
* read side and the build-side rehydrate-on-re-entry seam use it. Re-parses
|
|
101
111
|
* the document's retained text into a throwaway document, then **grafts** the
|
|
102
112
|
* fresh CST onto the already-built, resident AST nodes — preserving AST node
|
|
103
113
|
* identity, so every cross-reference *into* this document (resolved to a resident
|
|
@@ -124,10 +134,12 @@ export function isCstShed(document: LangiumDocument): boolean {
|
|
|
124
134
|
* `reference.$refNode` is restored the same way (paired over
|
|
125
135
|
* {@link AstUtils.streamReferences}).
|
|
126
136
|
*
|
|
127
|
-
* **Safe degrade.** If the re-parse diverges
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
137
|
+
* **Safe degrade.** If the re-parse diverges from the resident AST (a
|
|
138
|
+
* different node count, or a different type, container slot, reference slots
|
|
139
|
+
* or grammar value on any node — should not happen for unchanged text, but a
|
|
140
|
+
* guard against an AST changed in place) the graft is abandoned before any
|
|
141
|
+
* write and the document stays shed. A read-side caller degrades as it did
|
|
142
|
+
* before (no wrong attachment), and the build re-parses.
|
|
131
143
|
*
|
|
132
144
|
* **Module-private mechanism.** The public entry points are
|
|
133
145
|
* {@link CstResidencyService.rehydrateNode} / {@link CstResidencyService.rehydrate},
|
|
@@ -139,7 +151,7 @@ export function isCstShed(document: LangiumDocument): boolean {
|
|
|
139
151
|
* @returns `true` if the document now has a resident CST (already-resident is a
|
|
140
152
|
* no-op `true`); `false` if the text is unrecoverable or the re-parse diverged.
|
|
141
153
|
*/
|
|
142
|
-
function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory): boolean {
|
|
154
|
+
function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory, reflection: AstReflection): boolean {
|
|
143
155
|
const root = document.parseResult?.value;
|
|
144
156
|
if (root === undefined) {
|
|
145
157
|
return false;
|
|
@@ -155,9 +167,31 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
|
|
|
155
167
|
const fresh = factory.fromString(text, document.uri);
|
|
156
168
|
const existingNodes = [...AstUtils.streamAst(root)];
|
|
157
169
|
const freshNodes = [...AstUtils.streamAst(fresh.parseResult.value)];
|
|
158
|
-
|
|
170
|
+
// Pre-order follows property order, so a property re-added in place would
|
|
171
|
+
// pair siblings of one type crosswise. Their container slots tell them
|
|
172
|
+
// apart, and their grammar values tell apart siblings that traded slots too.
|
|
173
|
+
const pairsDiffer = (node: AstNode, freshNode: AstNode): boolean =>
|
|
174
|
+
node.$type !== freshNode.$type ||
|
|
175
|
+
node.$containerProperty !== freshNode.$containerProperty ||
|
|
176
|
+
node.$containerIndex !== freshNode.$containerIndex ||
|
|
177
|
+
Object.keys(reflection.getTypeMetaData(node.$type).properties).some(
|
|
178
|
+
property => !sameGrammarValue(Reflect.get(node, property), Reflect.get(freshNode, property))
|
|
179
|
+
);
|
|
180
|
+
if (existingNodes.length !== freshNodes.length || existingNodes.some((node, index) => pairsDiffer(node, freshNodes[index]))) {
|
|
159
181
|
return false; // structural divergence — stay shed rather than mis-attach
|
|
160
182
|
}
|
|
183
|
+
// `streamReferences` yields a node's *own* cross-references only (not its
|
|
184
|
+
// descendants'), in property enumeration order, which a property re-added
|
|
185
|
+
// in place changes. So each pair must hold one property and array index.
|
|
186
|
+
// Checked before any write, so a divergence leaves the document shed rather
|
|
187
|
+
// than half grafted.
|
|
188
|
+
const residentRefs = existingNodes.map(node => [...AstUtils.streamReferences(node)]);
|
|
189
|
+
const freshRefs = freshNodes.map(node => [...AstUtils.streamReferences(node)]);
|
|
190
|
+
const refsDiffer = (refs: ReferenceInfo[], fresh: ReferenceInfo[]): boolean =>
|
|
191
|
+
refs.length !== fresh.length || refs.some((ref, index) => ref.property !== fresh[index].property || ref.index !== fresh[index].index);
|
|
192
|
+
if (residentRefs.some((refs, index) => refsDiffer(refs, freshRefs[index]))) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
161
195
|
for (let index = 0; index < existingNodes.length; index++) {
|
|
162
196
|
const residentNode = existingNodes[index];
|
|
163
197
|
const freshNode = freshNodes[index];
|
|
@@ -169,28 +203,53 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
|
|
|
169
203
|
// at the resident node so CST→AST navigation reaches the linked AST.
|
|
170
204
|
asMutable(freshCst).astNode = residentNode;
|
|
171
205
|
}
|
|
172
|
-
// Restore each reference's `$refNode` from the fresh parse.
|
|
173
|
-
//
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
const freshRefs = [...AstUtils.streamReferences(freshNode)];
|
|
178
|
-
if (residentRefs.length === freshRefs.length) {
|
|
179
|
-
for (let refIndex = 0; refIndex < residentRefs.length; refIndex++) {
|
|
180
|
-
asMutable(residentRefs[refIndex].reference).$refNode = freshRefs[refIndex].reference.$refNode;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
206
|
+
// Restore each reference's `$refNode` from the fresh parse. The resolved
|
|
207
|
+
// `.ref` link is untouched (still resident).
|
|
208
|
+
residentRefs[index].forEach((resident, refIndex) => {
|
|
209
|
+
asMutable(resident.reference).$refNode = freshRefs[index][refIndex].reference.$refNode;
|
|
210
|
+
});
|
|
183
211
|
}
|
|
184
212
|
return true;
|
|
185
213
|
}
|
|
186
214
|
|
|
187
215
|
/**
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
216
|
+
* Whether two values of one grammar property match. Child nodes are paired on
|
|
217
|
+
* their own, so a reference counts by its text. A converter's `Date` counts by
|
|
218
|
+
* its time, and any other object as equal, since its equality is unknown.
|
|
219
|
+
*/
|
|
220
|
+
function sameGrammarValue(value: unknown, freshValue: unknown): boolean {
|
|
221
|
+
if (Array.isArray(value)) {
|
|
222
|
+
return (
|
|
223
|
+
Array.isArray(freshValue) &&
|
|
224
|
+
value.length === freshValue.length &&
|
|
225
|
+
value.every((item, index) => sameGrammarValue(item, freshValue[index]))
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
if (isReference(value) || isMultiReference(value)) {
|
|
229
|
+
return (isReference(freshValue) || isMultiReference(freshValue)) && value.$refText === freshValue.$refText;
|
|
230
|
+
}
|
|
231
|
+
if (isAstNode(value)) {
|
|
232
|
+
return isAstNode(freshValue);
|
|
233
|
+
}
|
|
234
|
+
if (value instanceof Date) {
|
|
235
|
+
return freshValue instanceof Date && value.getTime() === freshValue.getTime();
|
|
236
|
+
}
|
|
237
|
+
if (typeof value === 'object' && value !== null) {
|
|
238
|
+
return typeof freshValue === 'object' && freshValue !== null;
|
|
239
|
+
}
|
|
240
|
+
return Object.is(value, freshValue);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Keeps a document's CST available to the readers that need one, shedding it
|
|
245
|
+
* for documents that have gone idle and re-grafting on demand.
|
|
246
|
+
*
|
|
247
|
+
* Each build refreshes the idle window of the documents in its batch. When a
|
|
248
|
+
* closed, sheddable document's window elapses, every AST node's `$cstNode` and
|
|
249
|
+
* every reference's `$refNode` are nulled, and the CST becomes unreachable with
|
|
250
|
+
* the `Range`s and `Position`s only it holds. The reference index's segments, and a
|
|
251
|
+
* description's segments once read, share the CST's `Range` objects, so
|
|
252
|
+
* those stay.
|
|
194
253
|
*
|
|
195
254
|
* **Terminology.** *Residency* is the state axis (is the CST in memory? —
|
|
196
255
|
* `resident` vs `shed`); *shed* is both the act and the policy vocabulary (drop
|
|
@@ -200,21 +259,25 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
|
|
|
200
259
|
* retained source text and graft it back, identity-preserving — deliberately not
|
|
201
260
|
* "reload", which would suggest bytes coming back unchanged).
|
|
202
261
|
*
|
|
203
|
-
* **Re-entry is safe.** A shed document that later re-enters a build
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
262
|
+
* **Re-entry is safe.** A shed document that later re-enters a build has its
|
|
263
|
+
* CST and every `$refNode` grafted back first ("rehydrate-on-re-entry"),
|
|
264
|
+
* keeping its AST nodes so dependents outside the build stay linked to them.
|
|
265
|
+
* `HydraniumDocumentBuilder.rehydrateShedDocuments` grafts a document that is
|
|
266
|
+
* relinked or re-validated, before the build's phases, and
|
|
267
|
+
* `HydraniumLangiumDocumentFactory.update` one reset to `Changed` whose text
|
|
268
|
+
* has not changed. An edited document is re-parsed, and so is one whose graft
|
|
269
|
+
* is refused or diverges, and a build after it relinks its dependents. That
|
|
207
270
|
* matters because Langium derives the reference index — and thus
|
|
208
|
-
* `IndexManager.isAffected` and the `segment` used by rename /
|
|
209
|
-
* from `$refNode
|
|
210
|
-
* document's cross-references and
|
|
271
|
+
* `IndexManager.isAffected` and the `segment` used by rename /
|
|
272
|
+
* find-references — from `$refNode`. Without rehydration a re-index would
|
|
273
|
+
* silently drop the document's cross-references, and it would no longer be
|
|
274
|
+
* relinked when its targets change.
|
|
211
275
|
*
|
|
212
276
|
* Constructed with `(services, options)` and self-registers a `Validated`
|
|
213
|
-
* `BuildPhasePass`, which
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
* slot with a shedding strategy.
|
|
277
|
+
* `BuildPhasePass`, which is why the framework constructs it eagerly — the pass
|
|
278
|
+
* must be registered before the first build. Shedding itself is opt-in: the
|
|
279
|
+
* bound default strategy is `always-keep`, so the pass runs and sheds nothing
|
|
280
|
+
* until an adopter rebinds the slot with a shedding strategy.
|
|
218
281
|
*
|
|
219
282
|
* **Read-side navigation under a shedding strategy.** Read-only LSP requests do
|
|
220
283
|
* not run a build, so they do not trigger the build-side rehydrate. Features that
|
|
@@ -231,22 +294,21 @@ function rehydrateCst(document: LangiumDocument, factory: LangiumDocumentFactory
|
|
|
231
294
|
* `NameProvider.getNameNode` chokepoint, the comment provider, and
|
|
232
295
|
* `HydraniumLangiumDocuments.getOrCreateDocument`.
|
|
233
296
|
*/
|
|
234
|
-
/**
|
|
235
|
-
* Keeps a document's CST available to the readers that need one, shedding it
|
|
236
|
-
* for documents that have gone idle and re-grafting on demand.
|
|
237
|
-
*/
|
|
238
297
|
export interface CstResidencyService {
|
|
239
298
|
/**
|
|
240
|
-
* Ensure `document` has a CST, re-parsing its retained text if it was shed
|
|
241
|
-
*
|
|
242
|
-
* a hot path and safe to
|
|
299
|
+
* Ensure `document` has a CST, re-parsing its retained text if it was shed
|
|
300
|
+
* and that text is the one its AST was parsed from. A resident document is
|
|
301
|
+
* left exactly as it is, so this is safe to call on a hot path and safe to
|
|
302
|
+
* call twice. A document whose graft diverged is not attempted again on the
|
|
303
|
+
* same text.
|
|
243
304
|
*/
|
|
244
305
|
rehydrate(document: LangiumDocument): void;
|
|
245
306
|
|
|
246
307
|
/**
|
|
247
308
|
* Node-level convenience over {@link rehydrate}, cheap enough for an
|
|
248
309
|
* unconditional call: a node whose `$cstNode` is already set returns
|
|
249
|
-
* without resolving its document
|
|
310
|
+
* without resolving its document, and a node outside any document, such as
|
|
311
|
+
* a detached synthetic node, has nothing to restore and returns too.
|
|
250
312
|
*/
|
|
251
313
|
rehydrateNode(node: AstNode): void;
|
|
252
314
|
}
|
|
@@ -267,6 +329,14 @@ export class DefaultCstResidencyService implements CstResidencyService {
|
|
|
267
329
|
* cycles, and all cancelled by {@link dispose}.
|
|
268
330
|
*/
|
|
269
331
|
protected readonly idleTimers = new Map<string, Debouncer>();
|
|
332
|
+
/**
|
|
333
|
+
* The text each document's graft diverged on. Until its text changes, the
|
|
334
|
+
* document is not shed again: an AST the build keeps mutating away from its
|
|
335
|
+
* text would otherwise cost a graft, a re-parse and a build on every
|
|
336
|
+
* re-entry. Keyed by document, because the re-parse after a divergence
|
|
337
|
+
* replaces the root.
|
|
338
|
+
*/
|
|
339
|
+
protected readonly diverged = new WeakMap<LangiumDocument, string>();
|
|
270
340
|
protected shedTotal = 0;
|
|
271
341
|
|
|
272
342
|
constructor(
|
|
@@ -281,7 +351,7 @@ export class DefaultCstResidencyService implements CstResidencyService {
|
|
|
281
351
|
this.langiumDocs = services.workspace.LangiumDocuments;
|
|
282
352
|
services.workspace.BuildPhasePassService.register({
|
|
283
353
|
id: 'framework:cst-residency:shed',
|
|
284
|
-
|
|
354
|
+
phase: DocumentState.Validated,
|
|
285
355
|
priority: options.priority ?? CST_RESIDENCY_PASS_PRIORITY,
|
|
286
356
|
run: documents => this.onBuild(documents)
|
|
287
357
|
});
|
|
@@ -289,8 +359,8 @@ export class DefaultCstResidencyService implements CstResidencyService {
|
|
|
289
359
|
|
|
290
360
|
/**
|
|
291
361
|
* Restore `document`'s shed CST on demand — the ergonomic entry point over
|
|
292
|
-
* {@link rehydrateCst} (resolves the document factory itself).
|
|
293
|
-
*
|
|
362
|
+
* {@link rehydrateCst} (resolves the document factory itself). A no-op when
|
|
363
|
+
* the CST is resident, so read-side seams call it unconditionally.
|
|
294
364
|
*
|
|
295
365
|
* **Residency note (deliberate).** Rehydration does NOT count as a "use" for
|
|
296
366
|
* the `shed-closed-when-idle` idle timer (which is refreshed only by build
|
|
@@ -302,20 +372,39 @@ export class DefaultCstResidencyService implements CstResidencyService {
|
|
|
302
372
|
* method is where that hook goes.
|
|
303
373
|
*/
|
|
304
374
|
rehydrate(document: LangiumDocument): void {
|
|
305
|
-
|
|
375
|
+
const root = document.parseResult?.value;
|
|
376
|
+
// A graft from other text would attach its CST to nodes it does not
|
|
377
|
+
// describe. `shed` records the text the AST was parsed from.
|
|
378
|
+
// A diverged graft diverges again on the same text, so it is not parsed twice.
|
|
379
|
+
const parsedFrom = root === undefined ? undefined : this.services.workspace.ModelLedger.textOf(root);
|
|
380
|
+
if (
|
|
381
|
+
root === undefined ||
|
|
382
|
+
root.$cstNode !== undefined ||
|
|
383
|
+
parsedFrom === undefined ||
|
|
384
|
+
parsedFrom !== document.textDocument?.getText() ||
|
|
385
|
+
this.hasDiverged(document)
|
|
386
|
+
) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
if (!rehydrateCst(document, this.services.workspace.LangiumDocumentFactory, this.services.AstReflection)) {
|
|
390
|
+
this.diverged.set(document, parsedFrom);
|
|
391
|
+
}
|
|
306
392
|
}
|
|
307
393
|
|
|
308
394
|
/**
|
|
309
395
|
* Node-level convenience over {@link rehydrate}: a resident node (its
|
|
310
396
|
* `$cstNode` is set — true for every node of a non-shed document) returns
|
|
311
|
-
*
|
|
397
|
+
* without even resolving the document, so hot read paths
|
|
312
398
|
* (`getNameNode`, comment lookup) call this unconditionally.
|
|
313
399
|
*/
|
|
314
400
|
rehydrateNode(node: AstNode): void {
|
|
315
401
|
if (node.$cstNode !== undefined) {
|
|
316
402
|
return;
|
|
317
403
|
}
|
|
318
|
-
|
|
404
|
+
const document = AstUtils.findRootNode(node).$document;
|
|
405
|
+
if (document) {
|
|
406
|
+
this.rehydrate(document);
|
|
407
|
+
}
|
|
319
408
|
}
|
|
320
409
|
|
|
321
410
|
/**
|
|
@@ -333,13 +422,10 @@ export class DefaultCstResidencyService implements CstResidencyService {
|
|
|
333
422
|
}
|
|
334
423
|
for (const document of documents) {
|
|
335
424
|
const uri = document.uri.toString();
|
|
336
|
-
if (this.textDocuments.isOpenInAnyClient(uri)) {
|
|
425
|
+
if (this.textDocuments.isOpenInAnyClient(uri) || !this.canShed(document) || !this.isSheddable(document)) {
|
|
337
426
|
this.idleTimers.get(uri)?.cancel();
|
|
338
427
|
continue;
|
|
339
428
|
}
|
|
340
|
-
if (!this.isSheddable(document)) {
|
|
341
|
-
continue;
|
|
342
|
-
}
|
|
343
429
|
this.idleTimerFor(uri).schedule();
|
|
344
430
|
}
|
|
345
431
|
}
|
|
@@ -364,14 +450,17 @@ export class DefaultCstResidencyService implements CstResidencyService {
|
|
|
364
450
|
* Idle-timer fire: shed the document's CST if it is still closed and resident.
|
|
365
451
|
* Re-checks open-state (a reopen within the window cancels the timer, but guard
|
|
366
452
|
* anyway) and resolves the current document by URI (it may have been deleted,
|
|
367
|
-
* or its object replaced by a rebuild).
|
|
453
|
+
* or its object replaced by a rebuild). Re-checks {@link canShed} and
|
|
454
|
+
* {@link isSheddable} too. The timer was armed by an earlier build, and the
|
|
455
|
+
* document may since be mid-rebuild or have gained an unresolved reference
|
|
456
|
+
* in a cancelled build.
|
|
368
457
|
*/
|
|
369
458
|
protected onIdle(uri: string): void {
|
|
370
459
|
if (this.textDocuments.isOpenInAnyClient(uri)) {
|
|
371
460
|
return;
|
|
372
461
|
}
|
|
373
462
|
const document = this.langiumDocs.getDocument(URI.parse(uri));
|
|
374
|
-
if (document === undefined) {
|
|
463
|
+
if (document === undefined || !this.canShed(document) || !this.isSheddable(document)) {
|
|
375
464
|
return;
|
|
376
465
|
}
|
|
377
466
|
this.shedTotal += this.shed(document);
|
|
@@ -385,16 +474,42 @@ export class DefaultCstResidencyService implements CstResidencyService {
|
|
|
385
474
|
this.idleTimers.clear();
|
|
386
475
|
}
|
|
387
476
|
|
|
477
|
+
/** Whether `document`'s graft diverged on the text its root was parsed from. */
|
|
478
|
+
protected hasDiverged(document: LangiumDocument): boolean {
|
|
479
|
+
const text = this.diverged.get(document);
|
|
480
|
+
return text !== undefined && text === this.services.workspace.ModelLedger.textOf(document.parseResult.value);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Whether `document` can be shed without losing its AST identity or its
|
|
485
|
+
* references. Only a `Validated` document qualifies: the idle timer can fire
|
|
486
|
+
* while a build waits between documents, and a build that indexes a
|
|
487
|
+
* document's references without their CST drops them from the reference
|
|
488
|
+
* index. Its root needs a recorded version, because `shed` then records no
|
|
489
|
+
* text and the graft refuses it. A document whose graft diverged on its
|
|
490
|
+
* current text would cost a parse on every re-entry. Checked before
|
|
491
|
+
* {@link isSheddable}, so an override of that policy keeps these guards.
|
|
492
|
+
*/
|
|
493
|
+
protected canShed(document: LangiumDocument): boolean {
|
|
494
|
+
return (
|
|
495
|
+
document.state === DocumentState.Validated &&
|
|
496
|
+
!this.hasDiverged(document) &&
|
|
497
|
+
this.services.workspace.ModelLedger.versionOf(document.parseResult.value) !== UNRECORDED_VERSION
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
|
|
388
501
|
/**
|
|
389
502
|
* Whether a closed document may have its CST shed. Only documents whose text
|
|
390
|
-
* a re-parse
|
|
391
|
-
*
|
|
392
|
-
* documents — e.g. built-in definitions
|
|
393
|
-
*
|
|
394
|
-
*
|
|
503
|
+
* a re-parse can recover are sheddable, because a re-entry whose graft
|
|
504
|
+
* diverges re-parses from disk. The default admits `file`-scheme documents
|
|
505
|
+
* and excludes synthetic / in-memory documents — e.g. built-in definitions
|
|
506
|
+
* registered under a custom URI scheme — for which that re-parse would
|
|
507
|
+
* `readFile` a non-existent path. A document with an unresolved
|
|
508
|
+
* reference stays resident too: Langium relinks it on every update, so a shed
|
|
509
|
+
* would only buy a re-graft each time. Adopters override to refine.
|
|
395
510
|
*/
|
|
396
511
|
protected isSheddable(document: LangiumDocument): boolean {
|
|
397
|
-
return document.uri.scheme === 'file';
|
|
512
|
+
return document.uri.scheme === 'file' && !document.references.some(reference => reference.error !== undefined);
|
|
398
513
|
}
|
|
399
514
|
|
|
400
515
|
/**
|
|
@@ -407,6 +522,15 @@ export class DefaultCstResidencyService implements CstResidencyService {
|
|
|
407
522
|
if (root === undefined || root.$cstNode === undefined) {
|
|
408
523
|
return 0;
|
|
409
524
|
}
|
|
525
|
+
// Readers of the parsed text, the `'text-diagnostics'` fingerprint among
|
|
526
|
+
// them, otherwise see none once the CST is gone. Recorded in the ledger
|
|
527
|
+
// directly: no root is produced, and reconciling it with the store would
|
|
528
|
+
// step a closed document's sequence for a root behind its text.
|
|
529
|
+
const ledger = this.services.workspace.ModelLedger;
|
|
530
|
+
const version = ledger.versionOf(root);
|
|
531
|
+
if (version !== UNRECORDED_VERSION) {
|
|
532
|
+
ledger.record(root, version, ledger.textOf(root));
|
|
533
|
+
}
|
|
410
534
|
let cleared = 0;
|
|
411
535
|
for (const node of AstUtils.streamAst(root)) {
|
|
412
536
|
if (node.$cstNode) {
|
|
@@ -8,7 +8,15 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { type Tracer } from '@hydranium/protocol';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
type AstNode,
|
|
13
|
+
AstUtils,
|
|
14
|
+
CstUtils,
|
|
15
|
+
DefaultAstNodeDescriptionProvider,
|
|
16
|
+
type DocumentSegment,
|
|
17
|
+
type LangiumDocument,
|
|
18
|
+
type URI
|
|
19
|
+
} from '@hydranium/langium';
|
|
12
20
|
import type { LogNameOptions } from '../diagnostics/logger.js';
|
|
13
21
|
import type { HydraniumLanguageServices } from '../language-module.js';
|
|
14
22
|
import { type DescriptionTier, type TieredAstNodeDescription } from './scoped-ast-node-description.js';
|
|
@@ -32,9 +40,11 @@ import { type DescriptionTier, type TieredAstNodeDescription } from './scoped-as
|
|
|
32
40
|
*/
|
|
33
41
|
export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescriptionProvider {
|
|
34
42
|
protected readonly tracer: Tracer;
|
|
43
|
+
protected readonly services: HydraniumLanguageServices;
|
|
35
44
|
|
|
36
45
|
constructor(services: HydraniumLanguageServices, options: LogNameOptions = {}) {
|
|
37
46
|
super(services);
|
|
47
|
+
this.services = services;
|
|
38
48
|
this.tracer = services.shared.Tracer.for(options.logName ?? 'AstNodeDescriptionProvider').trace('instantiated');
|
|
39
49
|
}
|
|
40
50
|
|
|
@@ -44,12 +54,11 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
|
|
|
44
54
|
* filter pipeline. Callers that need a different tier must use
|
|
45
55
|
* {@link createProject}, {@link createPublic}, or {@link createUniversal}.
|
|
46
56
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* correct tier — so there is no create-then-overwrite cost.
|
|
57
|
+
* Langium's own `createDescription` is not called: every factory builds
|
|
58
|
+
* through {@link createTiered}.
|
|
50
59
|
*/
|
|
51
|
-
override createDescription(node: AstNode, name: string, document
|
|
52
|
-
return this.
|
|
60
|
+
override createDescription(node: AstNode, name: string | undefined, document?: LangiumDocument): TieredAstNodeDescription {
|
|
61
|
+
return this.createTiered(node, name, document, 'local');
|
|
53
62
|
}
|
|
54
63
|
|
|
55
64
|
/**
|
|
@@ -62,7 +71,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
|
|
|
62
71
|
* never sees them, so a project tag would be unused.
|
|
63
72
|
*/
|
|
64
73
|
createLocal(options: { readonly node: AstNode; readonly name: string; readonly document: LangiumDocument }): TieredAstNodeDescription {
|
|
65
|
-
return this.
|
|
74
|
+
return this.createTiered(options.node, options.name, options.document, 'local');
|
|
66
75
|
}
|
|
67
76
|
|
|
68
77
|
/**
|
|
@@ -84,7 +93,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
|
|
|
84
93
|
readonly document: LangiumDocument;
|
|
85
94
|
readonly projectId: string;
|
|
86
95
|
}): TieredAstNodeDescription {
|
|
87
|
-
return this.
|
|
96
|
+
return this.createTiered(options.node, options.name, options.document, 'project', options.projectId);
|
|
88
97
|
}
|
|
89
98
|
|
|
90
99
|
/**
|
|
@@ -108,7 +117,7 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
|
|
|
108
117
|
readonly document: LangiumDocument;
|
|
109
118
|
readonly projectId: string;
|
|
110
119
|
}): TieredAstNodeDescription {
|
|
111
|
-
return this.
|
|
120
|
+
return this.createTiered(options.node, options.name, options.document, 'public', options.projectId);
|
|
112
121
|
}
|
|
113
122
|
|
|
114
123
|
/**
|
|
@@ -126,16 +135,102 @@ export class HydraniumAstNodeDescriptionProvider extends DefaultAstNodeDescripti
|
|
|
126
135
|
readonly name: string;
|
|
127
136
|
readonly document: LangiumDocument;
|
|
128
137
|
}): TieredAstNodeDescription {
|
|
129
|
-
return this.
|
|
138
|
+
return this.createTiered(options.node, options.name, options.document, 'universal');
|
|
130
139
|
}
|
|
131
140
|
|
|
132
141
|
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* just-constructed and not aliased elsewhere.
|
|
142
|
+
* Resolve the fields of the description every factory returns and build it
|
|
143
|
+
* through {@link newDescription}. Mirrors Langium's `createDescription`:
|
|
144
|
+
* the name defaults to the name provider's, and a node without one throws.
|
|
137
145
|
*/
|
|
138
|
-
protected
|
|
139
|
-
|
|
146
|
+
protected createTiered(
|
|
147
|
+
node: AstNode,
|
|
148
|
+
name: string | undefined,
|
|
149
|
+
document: LangiumDocument | undefined,
|
|
150
|
+
tier: DescriptionTier,
|
|
151
|
+
projectId?: string
|
|
152
|
+
): TieredAstNodeDescription {
|
|
153
|
+
const path = this.astNodeLocator.getAstNodePath(node);
|
|
154
|
+
const resolvedName = name ?? this.nameProvider.getName(node);
|
|
155
|
+
if (!resolvedName) {
|
|
156
|
+
throw new Error(`Node at path ${path} has no name.`);
|
|
157
|
+
}
|
|
158
|
+
const documentUri = (document ?? AstUtils.getDocument(node)).uri;
|
|
159
|
+
return this.newDescription(node, resolvedName, documentUri, path, tier, projectId);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Construct the description from resolved fields; override to build a subclass of {@link DefaultTieredAstNodeDescription}. */
|
|
163
|
+
protected newDescription(
|
|
164
|
+
node: AstNode,
|
|
165
|
+
name: string,
|
|
166
|
+
documentUri: URI,
|
|
167
|
+
path: string,
|
|
168
|
+
tier: DescriptionTier,
|
|
169
|
+
projectId: string | undefined
|
|
170
|
+
): TieredAstNodeDescription {
|
|
171
|
+
return new DefaultTieredAstNodeDescription(this, node, name, documentUri, path, tier, projectId);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* The segment of `node`'s name, or of the whole node when the name
|
|
176
|
+
* provider finds no name node, restoring a shed CST first: a name provider
|
|
177
|
+
* need not restore it, and an absent segment is not computed again.
|
|
178
|
+
*/
|
|
179
|
+
nameSegmentOf(node: AstNode): DocumentSegment | undefined {
|
|
180
|
+
this.services.shared.workspace.CstResidencyService.rehydrateNode(node);
|
|
181
|
+
return CstUtils.toDocumentSegment(this.nameProvider.getNameNode(node) ?? node.$cstNode);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** The segment of the whole node, restoring a shed CST first. */
|
|
185
|
+
selectionSegmentOf(node: AstNode): DocumentSegment | undefined {
|
|
186
|
+
this.services.shared.workspace.CstResidencyService.rehydrateNode(node);
|
|
187
|
+
return CstUtils.toDocumentSegment(node.$cstNode);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* The description {@link HydraniumAstNodeDescriptionProvider} builds. Every
|
|
193
|
+
* field is set in the constructor, so all descriptions share one V8 hidden
|
|
194
|
+
* class; Langium's object literal with a `nameSegment` accessor is kept in
|
|
195
|
+
* dictionary mode and carries two closures, several times the bytes.
|
|
196
|
+
*
|
|
197
|
+
* `nameSegment` and `selectionSegment` are prototype getters, not own
|
|
198
|
+
* properties: a spread, `Object.keys`, a JSON round trip or `structuredClone`
|
|
199
|
+
* of a description drops them. Each is computed on its first read, from the
|
|
200
|
+
* node the description was built for, restoring a shed CST first; an eager
|
|
201
|
+
* `selectionSegment` would keep a segment per description that nothing reads.
|
|
202
|
+
*/
|
|
203
|
+
export class DefaultTieredAstNodeDescription implements TieredAstNodeDescription {
|
|
204
|
+
readonly type: string;
|
|
205
|
+
// `null` records a segment computed while the node had no CST. It is
|
|
206
|
+
// recomputed only once the node has one again: retrying without one would
|
|
207
|
+
// attempt a restore, a re-parse, on every read.
|
|
208
|
+
protected nameSegmentCache: DocumentSegment | null | undefined;
|
|
209
|
+
protected selectionSegmentCache: DocumentSegment | null | undefined;
|
|
210
|
+
|
|
211
|
+
constructor(
|
|
212
|
+
protected readonly provider: HydraniumAstNodeDescriptionProvider,
|
|
213
|
+
readonly node: AstNode,
|
|
214
|
+
readonly name: string,
|
|
215
|
+
readonly documentUri: URI,
|
|
216
|
+
readonly path: string,
|
|
217
|
+
readonly tier: DescriptionTier,
|
|
218
|
+
readonly projectId: string | undefined
|
|
219
|
+
) {
|
|
220
|
+
this.type = node.$type;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
get nameSegment(): DocumentSegment | undefined {
|
|
224
|
+
if (this.nameSegmentCache === undefined || (this.nameSegmentCache === null && this.node.$cstNode !== undefined)) {
|
|
225
|
+
this.nameSegmentCache = this.provider.nameSegmentOf(this.node) ?? null;
|
|
226
|
+
}
|
|
227
|
+
return this.nameSegmentCache ?? undefined;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
get selectionSegment(): DocumentSegment | undefined {
|
|
231
|
+
if (this.selectionSegmentCache === undefined || (this.selectionSegmentCache === null && this.node.$cstNode !== undefined)) {
|
|
232
|
+
this.selectionSegmentCache = this.provider.selectionSegmentOf(this.node) ?? null;
|
|
233
|
+
}
|
|
234
|
+
return this.selectionSegmentCache ?? undefined;
|
|
140
235
|
}
|
|
141
236
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
|
|
10
|
+
import type { AstNode, LocalSymbols } from '@hydranium/langium';
|
|
11
|
+
|
|
12
|
+
/** The local symbols each build computed, by the root it computed them for. */
|
|
13
|
+
export const builtLocalSymbols = new WeakMap<AstNode, LocalSymbols>();
|