@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
|
@@ -11,7 +11,7 @@ import { type AstNode, type LangiumDocuments, type URI } from '@hydranium/langiu
|
|
|
11
11
|
import { Disposable } from 'vscode-languageserver';
|
|
12
12
|
import { type LogNameOptions } from '../diagnostics/logger.js';
|
|
13
13
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
14
|
-
import type { ProjectChangeListener } from './project-change-event.js';
|
|
14
|
+
import type { MemberRelinkFinishedListener, MemberRelinkStartedListener, ProjectChangeListener } from './project-change-event.js';
|
|
15
15
|
import type { ProjectManager } from './project-manager.js';
|
|
16
16
|
/**
|
|
17
17
|
* Framework default {@link ProjectManager}. Exposes a single synthetic
|
|
@@ -44,6 +44,12 @@ export declare class SingleProjectManager implements ProjectManager {
|
|
|
44
44
|
discoverProjects(): Promise<void>;
|
|
45
45
|
/** Never fires — `SingleProjectManager` exposes a fixed registry. The returned disposable is a safe no-op. */
|
|
46
46
|
onProjectsChanged(_listener: ProjectChangeListener): Disposable;
|
|
47
|
+
/** Never fires: a fixed registry has no member relink to defer. */
|
|
48
|
+
onMemberRelinkStarted(_listener: MemberRelinkStartedListener): Disposable;
|
|
49
|
+
/** Never fires, as {@link onMemberRelinkStarted} does not. */
|
|
50
|
+
onMemberRelinkFinished(_listener: MemberRelinkFinishedListener): Disposable;
|
|
51
|
+
/** Resolved at once: nothing is ever deferred. */
|
|
52
|
+
memberRelinkSettled(): Promise<void>;
|
|
47
53
|
isProjectDescriptor(_uri: URI | string): boolean;
|
|
48
54
|
/** Always `true` — single-project by definition. */
|
|
49
55
|
isSingleProject(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-project-manager.d.ts","sourceRoot":"","sources":["../../../src/langium/project/single-project-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAiC,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"single-project-manager.d.ts","sourceRoot":"","sources":["../../../src/langium/project/single-project-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAiC,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IAkBrD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,2BAA2B;IAjB3D;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,oBAAoB,gBAAgB;IAEpD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAGjC;IACF,QAAQ,CAAC,KAAK,gBAAqB;IAEnC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACtD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC,YACsB,QAAQ,EAAE,2BAA2B,EACxD,OAAO,GAAE,cAAmB,EAI9B;IAED,mDAAmD;IAC7C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;IAED,8GAA8G;IAC9G,iBAAiB,CAAC,SAAS,EAAE,qBAAqB,GAAG,UAAU,CAE9D;IAED,mEAAmE;IACnE,qBAAqB,CAAC,SAAS,EAAE,2BAA2B,GAAG,UAAU,CAExE;IAED,8DAA8D;IAC9D,sBAAsB,CAAC,SAAS,EAAE,4BAA4B,GAAG,UAAU,CAE1E;IAED,kDAAkD;IAClD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnC;IAED,mBAAmB,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,CAE/C;IAED,oDAAoD;IACpD,eAAe,IAAI,OAAO,CAEzB;IAED;;;;OAIG;IACH,6BAA6B,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,CAEzD;IAED,4DAA4D;IAC5D,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAElD;IAED,6DAA6D;IAC7D,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAErD;IAED,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE9C;IAED,WAAW,IAAI,SAAS,OAAO,EAAE,CAEhC;IAED,oFAAoF;IACpF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,CAKhD;IAED,mGAAmG;IACnG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAEvD;IAED,2FAA2F;IAC3F,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,UAAQ,GAAG,OAAO,CAQxF;CACH"}
|
|
@@ -50,6 +50,18 @@ export class SingleProjectManager {
|
|
|
50
50
|
onProjectsChanged(_listener) {
|
|
51
51
|
return Disposable.create(() => undefined);
|
|
52
52
|
}
|
|
53
|
+
/** Never fires: a fixed registry has no member relink to defer. */
|
|
54
|
+
onMemberRelinkStarted(_listener) {
|
|
55
|
+
return Disposable.create(() => undefined);
|
|
56
|
+
}
|
|
57
|
+
/** Never fires, as {@link onMemberRelinkStarted} does not. */
|
|
58
|
+
onMemberRelinkFinished(_listener) {
|
|
59
|
+
return Disposable.create(() => undefined);
|
|
60
|
+
}
|
|
61
|
+
/** Resolved at once: nothing is ever deferred. */
|
|
62
|
+
memberRelinkSettled() {
|
|
63
|
+
return Promise.resolve();
|
|
64
|
+
}
|
|
53
65
|
isProjectDescriptor(_uri) {
|
|
54
66
|
return false;
|
|
55
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single-project-manager.js","sourceRoot":"","sources":["../../../src/langium/project/single-project-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAA6B,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAE/F,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMnD;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,oBAAoB;IAkBR;
|
|
1
|
+
{"version":3,"file":"single-project-manager.js","sourceRoot":"","sources":["../../../src/langium/project/single-project-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,8 +34,12 @@ export declare const CST_RESIDENCY_PASS_PRIORITY = 1000000;
|
|
|
34
34
|
* "off" toggle.
|
|
35
35
|
* - `{ kind: 'shed-closed-when-idle', idleMs }`: shed a closed document's CST
|
|
36
36
|
* once it has been idle (not in any build) for `idleMs`, keeping the AST
|
|
37
|
-
* resident. Open documents are always kept.
|
|
38
|
-
* document
|
|
37
|
+
* resident. Open documents are always kept. The timer starts when a build
|
|
38
|
+
* includes the document, so `idleMs: 0` sheds a closed document on the tick
|
|
39
|
+
* after each such build. A shed document that re-enters a build has its CST
|
|
40
|
+
* grafted back, which parses its text, so a window shorter than the gap
|
|
41
|
+
* between a document's builds parses a closed document on every build it
|
|
42
|
+
* rides in.
|
|
39
43
|
*/
|
|
40
44
|
export type CstResidencyStrategy = {
|
|
41
45
|
readonly kind: 'always-keep';
|
|
@@ -61,13 +65,14 @@ export interface CstResidencyOptions extends LogNameOptions {
|
|
|
61
65
|
readonly estimatedBytesPerShedNode?: number;
|
|
62
66
|
}
|
|
63
67
|
/**
|
|
64
|
-
* The build state a shed document
|
|
65
|
-
* and rebuilds its CST — and every
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
68
|
+
* The build state a shed document is reset to when the identity-preserving graft
|
|
69
|
+
* fails, so the next build re-parses it and rebuilds its CST — and every
|
|
70
|
+
* `reference.$refNode` — before it is relinked or re-indexed. It is
|
|
71
|
+
* `DocumentState.Changed` by necessity: the only state below `Parsed`, hence
|
|
72
|
+
* the only one that forces a re-parse rather than an in-place relink. Exposed
|
|
73
|
+
* as a named landmark of the residency feature (cf.
|
|
74
|
+
* `IntegrityService.SettledState`) so the document builder references the
|
|
75
|
+
* feature's declared recovery contract instead of a bare enum value.
|
|
71
76
|
*/
|
|
72
77
|
export declare const CST_REHYDRATION_RESET_STATE: DocumentState;
|
|
73
78
|
/**
|
|
@@ -80,12 +85,15 @@ export declare const CST_REHYDRATION_RESET_STATE: DocumentState;
|
|
|
80
85
|
*/
|
|
81
86
|
export declare function isCstShed(document: LangiumDocument): boolean;
|
|
82
87
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
88
|
+
* Keeps a document's CST available to the readers that need one, shedding it
|
|
89
|
+
* for documents that have gone idle and re-grafting on demand.
|
|
90
|
+
*
|
|
91
|
+
* Each build refreshes the idle window of the documents in its batch. When a
|
|
92
|
+
* closed, sheddable document's window elapses, every AST node's `$cstNode` and
|
|
93
|
+
* every reference's `$refNode` are nulled, and the CST becomes unreachable with
|
|
94
|
+
* the `Range`s and `Position`s only it holds. The reference index's segments, and a
|
|
95
|
+
* description's segments once read, share the CST's `Range` objects, so
|
|
96
|
+
* those stay.
|
|
89
97
|
*
|
|
90
98
|
* **Terminology.** *Residency* is the state axis (is the CST in memory? —
|
|
91
99
|
* `resident` vs `shed`); *shed* is both the act and the policy vocabulary (drop
|
|
@@ -95,21 +103,25 @@ export declare function isCstShed(document: LangiumDocument): boolean;
|
|
|
95
103
|
* retained source text and graft it back, identity-preserving — deliberately not
|
|
96
104
|
* "reload", which would suggest bytes coming back unchanged).
|
|
97
105
|
*
|
|
98
|
-
* **Re-entry is safe.** A shed document that later re-enters a build
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
106
|
+
* **Re-entry is safe.** A shed document that later re-enters a build has its
|
|
107
|
+
* CST and every `$refNode` grafted back first ("rehydrate-on-re-entry"),
|
|
108
|
+
* keeping its AST nodes so dependents outside the build stay linked to them.
|
|
109
|
+
* `HydraniumDocumentBuilder.rehydrateShedDocuments` grafts a document that is
|
|
110
|
+
* relinked or re-validated, before the build's phases, and
|
|
111
|
+
* `HydraniumLangiumDocumentFactory.update` one reset to `Changed` whose text
|
|
112
|
+
* has not changed. An edited document is re-parsed, and so is one whose graft
|
|
113
|
+
* is refused or diverges, and a build after it relinks its dependents. That
|
|
102
114
|
* matters because Langium derives the reference index — and thus
|
|
103
|
-
* `IndexManager.isAffected` and the `segment` used by rename /
|
|
104
|
-
* from `$refNode
|
|
105
|
-
* document's cross-references and
|
|
115
|
+
* `IndexManager.isAffected` and the `segment` used by rename /
|
|
116
|
+
* find-references — from `$refNode`. Without rehydration a re-index would
|
|
117
|
+
* silently drop the document's cross-references, and it would no longer be
|
|
118
|
+
* relinked when its targets change.
|
|
106
119
|
*
|
|
107
120
|
* Constructed with `(services, options)` and self-registers a `Validated`
|
|
108
|
-
* `BuildPhasePass`, which
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* slot with a shedding strategy.
|
|
121
|
+
* `BuildPhasePass`, which is why the framework constructs it eagerly — the pass
|
|
122
|
+
* must be registered before the first build. Shedding itself is opt-in: the
|
|
123
|
+
* bound default strategy is `always-keep`, so the pass runs and sheds nothing
|
|
124
|
+
* until an adopter rebinds the slot with a shedding strategy.
|
|
113
125
|
*
|
|
114
126
|
* **Read-side navigation under a shedding strategy.** Read-only LSP requests do
|
|
115
127
|
* not run a build, so they do not trigger the build-side rehydrate. Features that
|
|
@@ -126,21 +138,20 @@ export declare function isCstShed(document: LangiumDocument): boolean;
|
|
|
126
138
|
* `NameProvider.getNameNode` chokepoint, the comment provider, and
|
|
127
139
|
* `HydraniumLangiumDocuments.getOrCreateDocument`.
|
|
128
140
|
*/
|
|
129
|
-
/**
|
|
130
|
-
* Keeps a document's CST available to the readers that need one, shedding it
|
|
131
|
-
* for documents that have gone idle and re-grafting on demand.
|
|
132
|
-
*/
|
|
133
141
|
export interface CstResidencyService {
|
|
134
142
|
/**
|
|
135
|
-
* Ensure `document` has a CST, re-parsing its retained text if it was shed
|
|
136
|
-
*
|
|
137
|
-
* a hot path and safe to
|
|
143
|
+
* Ensure `document` has a CST, re-parsing its retained text if it was shed
|
|
144
|
+
* and that text is the one its AST was parsed from. A resident document is
|
|
145
|
+
* left exactly as it is, so this is safe to call on a hot path and safe to
|
|
146
|
+
* call twice. A document whose graft diverged is not attempted again on the
|
|
147
|
+
* same text.
|
|
138
148
|
*/
|
|
139
149
|
rehydrate(document: LangiumDocument): void;
|
|
140
150
|
/**
|
|
141
151
|
* Node-level convenience over {@link rehydrate}, cheap enough for an
|
|
142
152
|
* unconditional call: a node whose `$cstNode` is already set returns
|
|
143
|
-
* without resolving its document
|
|
153
|
+
* without resolving its document, and a node outside any document, such as
|
|
154
|
+
* a detached synthetic node, has nothing to restore and returns too.
|
|
144
155
|
*/
|
|
145
156
|
rehydrateNode(node: AstNode): void;
|
|
146
157
|
}
|
|
@@ -161,12 +172,20 @@ export declare class DefaultCstResidencyService implements CstResidencyService {
|
|
|
161
172
|
* cycles, and all cancelled by {@link dispose}.
|
|
162
173
|
*/
|
|
163
174
|
protected readonly idleTimers: Map<string, Debouncer>;
|
|
175
|
+
/**
|
|
176
|
+
* The text each document's graft diverged on. Until its text changes, the
|
|
177
|
+
* document is not shed again: an AST the build keeps mutating away from its
|
|
178
|
+
* text would otherwise cost a graft, a re-parse and a build on every
|
|
179
|
+
* re-entry. Keyed by document, because the re-parse after a divergence
|
|
180
|
+
* replaces the root.
|
|
181
|
+
*/
|
|
182
|
+
protected readonly diverged: WeakMap<LangiumDocument<AstNode>, string>;
|
|
164
183
|
protected shedTotal: number;
|
|
165
184
|
constructor(services: ServerSharedServicesMinimal, options?: CstResidencyOptions);
|
|
166
185
|
/**
|
|
167
186
|
* Restore `document`'s shed CST on demand — the ergonomic entry point over
|
|
168
|
-
* {@link rehydrateCst} (resolves the document factory itself).
|
|
169
|
-
*
|
|
187
|
+
* {@link rehydrateCst} (resolves the document factory itself). A no-op when
|
|
188
|
+
* the CST is resident, so read-side seams call it unconditionally.
|
|
170
189
|
*
|
|
171
190
|
* **Residency note (deliberate).** Rehydration does NOT count as a "use" for
|
|
172
191
|
* the `shed-closed-when-idle` idle timer (which is refreshed only by build
|
|
@@ -181,7 +200,7 @@ export declare class DefaultCstResidencyService implements CstResidencyService {
|
|
|
181
200
|
/**
|
|
182
201
|
* Node-level convenience over {@link rehydrate}: a resident node (its
|
|
183
202
|
* `$cstNode` is set — true for every node of a non-shed document) returns
|
|
184
|
-
*
|
|
203
|
+
* without even resolving the document, so hot read paths
|
|
185
204
|
* (`getNameNode`, comment lookup) call this unconditionally.
|
|
186
205
|
*/
|
|
187
206
|
rehydrateNode(node: AstNode): void;
|
|
@@ -206,18 +225,36 @@ export declare class DefaultCstResidencyService implements CstResidencyService {
|
|
|
206
225
|
* Idle-timer fire: shed the document's CST if it is still closed and resident.
|
|
207
226
|
* Re-checks open-state (a reopen within the window cancels the timer, but guard
|
|
208
227
|
* anyway) and resolves the current document by URI (it may have been deleted,
|
|
209
|
-
* or its object replaced by a rebuild).
|
|
228
|
+
* or its object replaced by a rebuild). Re-checks {@link canShed} and
|
|
229
|
+
* {@link isSheddable} too. The timer was armed by an earlier build, and the
|
|
230
|
+
* document may since be mid-rebuild or have gained an unresolved reference
|
|
231
|
+
* in a cancelled build.
|
|
210
232
|
*/
|
|
211
233
|
protected onIdle(uri: string): void;
|
|
212
234
|
/** Cancel every armed shed, so a document that has gone idle keeps its CST. */
|
|
213
235
|
cancelPendingShed(): void;
|
|
236
|
+
/** Whether `document`'s graft diverged on the text its root was parsed from. */
|
|
237
|
+
protected hasDiverged(document: LangiumDocument): boolean;
|
|
238
|
+
/**
|
|
239
|
+
* Whether `document` can be shed without losing its AST identity or its
|
|
240
|
+
* references. Only a `Validated` document qualifies: the idle timer can fire
|
|
241
|
+
* while a build waits between documents, and a build that indexes a
|
|
242
|
+
* document's references without their CST drops them from the reference
|
|
243
|
+
* index. Its root needs a recorded version, because `shed` then records no
|
|
244
|
+
* text and the graft refuses it. A document whose graft diverged on its
|
|
245
|
+
* current text would cost a parse on every re-entry. Checked before
|
|
246
|
+
* {@link isSheddable}, so an override of that policy keeps these guards.
|
|
247
|
+
*/
|
|
248
|
+
protected canShed(document: LangiumDocument): boolean;
|
|
214
249
|
/**
|
|
215
250
|
* Whether a closed document may have its CST shed. Only documents whose text
|
|
216
|
-
* a re-parse
|
|
217
|
-
*
|
|
218
|
-
* documents — e.g. built-in definitions
|
|
219
|
-
*
|
|
220
|
-
*
|
|
251
|
+
* a re-parse can recover are sheddable, because a re-entry whose graft
|
|
252
|
+
* diverges re-parses from disk. The default admits `file`-scheme documents
|
|
253
|
+
* and excludes synthetic / in-memory documents — e.g. built-in definitions
|
|
254
|
+
* registered under a custom URI scheme — for which that re-parse would
|
|
255
|
+
* `readFile` a non-existent path. A document with an unresolved
|
|
256
|
+
* reference stays resident too: Langium relinks it on every update, so a shed
|
|
257
|
+
* would only buy a re-graft each time. Adopters override to refine.
|
|
221
258
|
*/
|
|
222
259
|
protected isSheddable(document: LangiumDocument): boolean;
|
|
223
260
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cst-residency-service.d.ts","sourceRoot":"","sources":["../../../src/langium/residency/cst-residency-service.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAa,KAAK,KAAK,EAAE,SAAS,EAAU,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"cst-residency-service.d.ts","sourceRoot":"","sources":["../../../src/langium/residency/cst-residency-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
|
-
import { asMutable, Debouncer, Format } from '@hydranium/protocol';
|
|
10
|
-
import { AstUtils, DocumentState, URI } from '@hydranium/langium';
|
|
9
|
+
import { asMutable, Debouncer, Format, UNRECORDED_VERSION } from '@hydranium/protocol';
|
|
10
|
+
import { AstUtils, DocumentState, isAstNode, isMultiReference, isReference, URI } from '@hydranium/langium';
|
|
11
11
|
/**
|
|
12
12
|
* Default priority of the CST-residency pass. Deliberately very high so it runs
|
|
13
13
|
* *last* among `Validated` build-phase passes (the registry iterates priority
|
|
@@ -21,13 +21,14 @@ import { AstUtils, DocumentState, URI } from '@hydranium/langium';
|
|
|
21
21
|
*/
|
|
22
22
|
export const CST_RESIDENCY_PASS_PRIORITY = 1_000_000;
|
|
23
23
|
/**
|
|
24
|
-
* The build state a shed document
|
|
25
|
-
* and rebuilds its CST — and every
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
24
|
+
* The build state a shed document is reset to when the identity-preserving graft
|
|
25
|
+
* fails, so the next build re-parses it and rebuilds its CST — and every
|
|
26
|
+
* `reference.$refNode` — before it is relinked or re-indexed. It is
|
|
27
|
+
* `DocumentState.Changed` by necessity: the only state below `Parsed`, hence
|
|
28
|
+
* the only one that forces a re-parse rather than an in-place relink. Exposed
|
|
29
|
+
* as a named landmark of the residency feature (cf.
|
|
30
|
+
* `IntegrityService.SettledState`) so the document builder references the
|
|
31
|
+
* feature's declared recovery contract instead of a bare enum value.
|
|
31
32
|
*/
|
|
32
33
|
export const CST_REHYDRATION_RESET_STATE = DocumentState.Changed;
|
|
33
34
|
/**
|
|
@@ -44,8 +45,8 @@ export function isCstShed(document) {
|
|
|
44
45
|
document.parseResult.value.$cstNode === undefined);
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
|
-
* Reattach a CST to a shed document **on demand**, without a rebuild
|
|
48
|
-
* read
|
|
48
|
+
* Reattach a CST to a shed document **on demand**, without a rebuild. Both the
|
|
49
|
+
* read side and the build-side rehydrate-on-re-entry seam use it. Re-parses
|
|
49
50
|
* the document's retained text into a throwaway document, then **grafts** the
|
|
50
51
|
* fresh CST onto the already-built, resident AST nodes — preserving AST node
|
|
51
52
|
* identity, so every cross-reference *into* this document (resolved to a resident
|
|
@@ -72,10 +73,12 @@ export function isCstShed(document) {
|
|
|
72
73
|
* `reference.$refNode` is restored the same way (paired over
|
|
73
74
|
* {@link AstUtils.streamReferences}).
|
|
74
75
|
*
|
|
75
|
-
* **Safe degrade.** If the re-parse diverges
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
76
|
+
* **Safe degrade.** If the re-parse diverges from the resident AST (a
|
|
77
|
+
* different node count, or a different type, container slot, reference slots
|
|
78
|
+
* or grammar value on any node — should not happen for unchanged text, but a
|
|
79
|
+
* guard against an AST changed in place) the graft is abandoned before any
|
|
80
|
+
* write and the document stays shed. A read-side caller degrades as it did
|
|
81
|
+
* before (no wrong attachment), and the build re-parses.
|
|
79
82
|
*
|
|
80
83
|
* **Module-private mechanism.** The public entry points are
|
|
81
84
|
* {@link CstResidencyService.rehydrateNode} / {@link CstResidencyService.rehydrate},
|
|
@@ -87,7 +90,7 @@ export function isCstShed(document) {
|
|
|
87
90
|
* @returns `true` if the document now has a resident CST (already-resident is a
|
|
88
91
|
* no-op `true`); `false` if the text is unrecoverable or the re-parse diverged.
|
|
89
92
|
*/
|
|
90
|
-
function rehydrateCst(document, factory) {
|
|
93
|
+
function rehydrateCst(document, factory, reflection) {
|
|
91
94
|
const root = document.parseResult?.value;
|
|
92
95
|
if (root === undefined) {
|
|
93
96
|
return false;
|
|
@@ -103,9 +106,27 @@ function rehydrateCst(document, factory) {
|
|
|
103
106
|
const fresh = factory.fromString(text, document.uri);
|
|
104
107
|
const existingNodes = [...AstUtils.streamAst(root)];
|
|
105
108
|
const freshNodes = [...AstUtils.streamAst(fresh.parseResult.value)];
|
|
106
|
-
|
|
109
|
+
// Pre-order follows property order, so a property re-added in place would
|
|
110
|
+
// pair siblings of one type crosswise. Their container slots tell them
|
|
111
|
+
// apart, and their grammar values tell apart siblings that traded slots too.
|
|
112
|
+
const pairsDiffer = (node, freshNode) => node.$type !== freshNode.$type ||
|
|
113
|
+
node.$containerProperty !== freshNode.$containerProperty ||
|
|
114
|
+
node.$containerIndex !== freshNode.$containerIndex ||
|
|
115
|
+
Object.keys(reflection.getTypeMetaData(node.$type).properties).some(property => !sameGrammarValue(Reflect.get(node, property), Reflect.get(freshNode, property)));
|
|
116
|
+
if (existingNodes.length !== freshNodes.length || existingNodes.some((node, index) => pairsDiffer(node, freshNodes[index]))) {
|
|
107
117
|
return false; // structural divergence — stay shed rather than mis-attach
|
|
108
118
|
}
|
|
119
|
+
// `streamReferences` yields a node's *own* cross-references only (not its
|
|
120
|
+
// descendants'), in property enumeration order, which a property re-added
|
|
121
|
+
// in place changes. So each pair must hold one property and array index.
|
|
122
|
+
// Checked before any write, so a divergence leaves the document shed rather
|
|
123
|
+
// than half grafted.
|
|
124
|
+
const residentRefs = existingNodes.map(node => [...AstUtils.streamReferences(node)]);
|
|
125
|
+
const freshRefs = freshNodes.map(node => [...AstUtils.streamReferences(node)]);
|
|
126
|
+
const refsDiffer = (refs, fresh) => refs.length !== fresh.length || refs.some((ref, index) => ref.property !== fresh[index].property || ref.index !== fresh[index].index);
|
|
127
|
+
if (residentRefs.some((refs, index) => refsDiffer(refs, freshRefs[index]))) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
109
130
|
for (let index = 0; index < existingNodes.length; index++) {
|
|
110
131
|
const residentNode = existingNodes[index];
|
|
111
132
|
const freshNode = freshNodes[index];
|
|
@@ -117,20 +138,39 @@ function rehydrateCst(document, factory) {
|
|
|
117
138
|
// at the resident node so CST→AST navigation reaches the linked AST.
|
|
118
139
|
asMutable(freshCst).astNode = residentNode;
|
|
119
140
|
}
|
|
120
|
-
// Restore each reference's `$refNode` from the fresh parse.
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const freshRefs = [...AstUtils.streamReferences(freshNode)];
|
|
126
|
-
if (residentRefs.length === freshRefs.length) {
|
|
127
|
-
for (let refIndex = 0; refIndex < residentRefs.length; refIndex++) {
|
|
128
|
-
asMutable(residentRefs[refIndex].reference).$refNode = freshRefs[refIndex].reference.$refNode;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
141
|
+
// Restore each reference's `$refNode` from the fresh parse. The resolved
|
|
142
|
+
// `.ref` link is untouched (still resident).
|
|
143
|
+
residentRefs[index].forEach((resident, refIndex) => {
|
|
144
|
+
asMutable(resident.reference).$refNode = freshRefs[index][refIndex].reference.$refNode;
|
|
145
|
+
});
|
|
131
146
|
}
|
|
132
147
|
return true;
|
|
133
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Whether two values of one grammar property match. Child nodes are paired on
|
|
151
|
+
* their own, so a reference counts by its text. A converter's `Date` counts by
|
|
152
|
+
* its time, and any other object as equal, since its equality is unknown.
|
|
153
|
+
*/
|
|
154
|
+
function sameGrammarValue(value, freshValue) {
|
|
155
|
+
if (Array.isArray(value)) {
|
|
156
|
+
return (Array.isArray(freshValue) &&
|
|
157
|
+
value.length === freshValue.length &&
|
|
158
|
+
value.every((item, index) => sameGrammarValue(item, freshValue[index])));
|
|
159
|
+
}
|
|
160
|
+
if (isReference(value) || isMultiReference(value)) {
|
|
161
|
+
return (isReference(freshValue) || isMultiReference(freshValue)) && value.$refText === freshValue.$refText;
|
|
162
|
+
}
|
|
163
|
+
if (isAstNode(value)) {
|
|
164
|
+
return isAstNode(freshValue);
|
|
165
|
+
}
|
|
166
|
+
if (value instanceof Date) {
|
|
167
|
+
return freshValue instanceof Date && value.getTime() === freshValue.getTime();
|
|
168
|
+
}
|
|
169
|
+
if (typeof value === 'object' && value !== null) {
|
|
170
|
+
return typeof freshValue === 'object' && freshValue !== null;
|
|
171
|
+
}
|
|
172
|
+
return Object.is(value, freshValue);
|
|
173
|
+
}
|
|
134
174
|
export class DefaultCstResidencyService {
|
|
135
175
|
services;
|
|
136
176
|
strategy;
|
|
@@ -148,6 +188,14 @@ export class DefaultCstResidencyService {
|
|
|
148
188
|
* cycles, and all cancelled by {@link dispose}.
|
|
149
189
|
*/
|
|
150
190
|
idleTimers = new Map();
|
|
191
|
+
/**
|
|
192
|
+
* The text each document's graft diverged on. Until its text changes, the
|
|
193
|
+
* document is not shed again: an AST the build keeps mutating away from its
|
|
194
|
+
* text would otherwise cost a graft, a re-parse and a build on every
|
|
195
|
+
* re-entry. Keyed by document, because the re-parse after a divergence
|
|
196
|
+
* replaces the root.
|
|
197
|
+
*/
|
|
198
|
+
diverged = new WeakMap();
|
|
151
199
|
shedTotal = 0;
|
|
152
200
|
constructor(services, options = {}) {
|
|
153
201
|
this.services = services;
|
|
@@ -159,15 +207,15 @@ export class DefaultCstResidencyService {
|
|
|
159
207
|
this.langiumDocs = services.workspace.LangiumDocuments;
|
|
160
208
|
services.workspace.BuildPhasePassService.register({
|
|
161
209
|
id: 'framework:cst-residency:shed',
|
|
162
|
-
|
|
210
|
+
phase: DocumentState.Validated,
|
|
163
211
|
priority: options.priority ?? CST_RESIDENCY_PASS_PRIORITY,
|
|
164
212
|
run: documents => this.onBuild(documents)
|
|
165
213
|
});
|
|
166
214
|
}
|
|
167
215
|
/**
|
|
168
216
|
* Restore `document`'s shed CST on demand — the ergonomic entry point over
|
|
169
|
-
* {@link rehydrateCst} (resolves the document factory itself).
|
|
170
|
-
*
|
|
217
|
+
* {@link rehydrateCst} (resolves the document factory itself). A no-op when
|
|
218
|
+
* the CST is resident, so read-side seams call it unconditionally.
|
|
171
219
|
*
|
|
172
220
|
* **Residency note (deliberate).** Rehydration does NOT count as a "use" for
|
|
173
221
|
* the `shed-closed-when-idle` idle timer (which is refreshed only by build
|
|
@@ -179,19 +227,36 @@ export class DefaultCstResidencyService {
|
|
|
179
227
|
* method is where that hook goes.
|
|
180
228
|
*/
|
|
181
229
|
rehydrate(document) {
|
|
182
|
-
|
|
230
|
+
const root = document.parseResult?.value;
|
|
231
|
+
// A graft from other text would attach its CST to nodes it does not
|
|
232
|
+
// describe. `shed` records the text the AST was parsed from.
|
|
233
|
+
// A diverged graft diverges again on the same text, so it is not parsed twice.
|
|
234
|
+
const parsedFrom = root === undefined ? undefined : this.services.workspace.ModelLedger.textOf(root);
|
|
235
|
+
if (root === undefined ||
|
|
236
|
+
root.$cstNode !== undefined ||
|
|
237
|
+
parsedFrom === undefined ||
|
|
238
|
+
parsedFrom !== document.textDocument?.getText() ||
|
|
239
|
+
this.hasDiverged(document)) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (!rehydrateCst(document, this.services.workspace.LangiumDocumentFactory, this.services.AstReflection)) {
|
|
243
|
+
this.diverged.set(document, parsedFrom);
|
|
244
|
+
}
|
|
183
245
|
}
|
|
184
246
|
/**
|
|
185
247
|
* Node-level convenience over {@link rehydrate}: a resident node (its
|
|
186
248
|
* `$cstNode` is set — true for every node of a non-shed document) returns
|
|
187
|
-
*
|
|
249
|
+
* without even resolving the document, so hot read paths
|
|
188
250
|
* (`getNameNode`, comment lookup) call this unconditionally.
|
|
189
251
|
*/
|
|
190
252
|
rehydrateNode(node) {
|
|
191
253
|
if (node.$cstNode !== undefined) {
|
|
192
254
|
return;
|
|
193
255
|
}
|
|
194
|
-
|
|
256
|
+
const document = AstUtils.findRootNode(node).$document;
|
|
257
|
+
if (document) {
|
|
258
|
+
this.rehydrate(document);
|
|
259
|
+
}
|
|
195
260
|
}
|
|
196
261
|
/**
|
|
197
262
|
* After each build, refresh the idle timer of every document in the batch: an
|
|
@@ -208,13 +273,10 @@ export class DefaultCstResidencyService {
|
|
|
208
273
|
}
|
|
209
274
|
for (const document of documents) {
|
|
210
275
|
const uri = document.uri.toString();
|
|
211
|
-
if (this.textDocuments.isOpenInAnyClient(uri)) {
|
|
276
|
+
if (this.textDocuments.isOpenInAnyClient(uri) || !this.canShed(document) || !this.isSheddable(document)) {
|
|
212
277
|
this.idleTimers.get(uri)?.cancel();
|
|
213
278
|
continue;
|
|
214
279
|
}
|
|
215
|
-
if (!this.isSheddable(document)) {
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
280
|
this.idleTimerFor(uri).schedule();
|
|
219
281
|
}
|
|
220
282
|
}
|
|
@@ -237,14 +299,17 @@ export class DefaultCstResidencyService {
|
|
|
237
299
|
* Idle-timer fire: shed the document's CST if it is still closed and resident.
|
|
238
300
|
* Re-checks open-state (a reopen within the window cancels the timer, but guard
|
|
239
301
|
* anyway) and resolves the current document by URI (it may have been deleted,
|
|
240
|
-
* or its object replaced by a rebuild).
|
|
302
|
+
* or its object replaced by a rebuild). Re-checks {@link canShed} and
|
|
303
|
+
* {@link isSheddable} too. The timer was armed by an earlier build, and the
|
|
304
|
+
* document may since be mid-rebuild or have gained an unresolved reference
|
|
305
|
+
* in a cancelled build.
|
|
241
306
|
*/
|
|
242
307
|
onIdle(uri) {
|
|
243
308
|
if (this.textDocuments.isOpenInAnyClient(uri)) {
|
|
244
309
|
return;
|
|
245
310
|
}
|
|
246
311
|
const document = this.langiumDocs.getDocument(URI.parse(uri));
|
|
247
|
-
if (document === undefined) {
|
|
312
|
+
if (document === undefined || !this.canShed(document) || !this.isSheddable(document)) {
|
|
248
313
|
return;
|
|
249
314
|
}
|
|
250
315
|
this.shedTotal += this.shed(document);
|
|
@@ -256,16 +321,38 @@ export class DefaultCstResidencyService {
|
|
|
256
321
|
}
|
|
257
322
|
this.idleTimers.clear();
|
|
258
323
|
}
|
|
324
|
+
/** Whether `document`'s graft diverged on the text its root was parsed from. */
|
|
325
|
+
hasDiverged(document) {
|
|
326
|
+
const text = this.diverged.get(document);
|
|
327
|
+
return text !== undefined && text === this.services.workspace.ModelLedger.textOf(document.parseResult.value);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Whether `document` can be shed without losing its AST identity or its
|
|
331
|
+
* references. Only a `Validated` document qualifies: the idle timer can fire
|
|
332
|
+
* while a build waits between documents, and a build that indexes a
|
|
333
|
+
* document's references without their CST drops them from the reference
|
|
334
|
+
* index. Its root needs a recorded version, because `shed` then records no
|
|
335
|
+
* text and the graft refuses it. A document whose graft diverged on its
|
|
336
|
+
* current text would cost a parse on every re-entry. Checked before
|
|
337
|
+
* {@link isSheddable}, so an override of that policy keeps these guards.
|
|
338
|
+
*/
|
|
339
|
+
canShed(document) {
|
|
340
|
+
return (document.state === DocumentState.Validated &&
|
|
341
|
+
!this.hasDiverged(document) &&
|
|
342
|
+
this.services.workspace.ModelLedger.versionOf(document.parseResult.value) !== UNRECORDED_VERSION);
|
|
343
|
+
}
|
|
259
344
|
/**
|
|
260
345
|
* Whether a closed document may have its CST shed. Only documents whose text
|
|
261
|
-
* a re-parse
|
|
262
|
-
*
|
|
263
|
-
* documents — e.g. built-in definitions
|
|
264
|
-
*
|
|
265
|
-
*
|
|
346
|
+
* a re-parse can recover are sheddable, because a re-entry whose graft
|
|
347
|
+
* diverges re-parses from disk. The default admits `file`-scheme documents
|
|
348
|
+
* and excludes synthetic / in-memory documents — e.g. built-in definitions
|
|
349
|
+
* registered under a custom URI scheme — for which that re-parse would
|
|
350
|
+
* `readFile` a non-existent path. A document with an unresolved
|
|
351
|
+
* reference stays resident too: Langium relinks it on every update, so a shed
|
|
352
|
+
* would only buy a re-graft each time. Adopters override to refine.
|
|
266
353
|
*/
|
|
267
354
|
isSheddable(document) {
|
|
268
|
-
return document.uri.scheme === 'file';
|
|
355
|
+
return document.uri.scheme === 'file' && !document.references.some(reference => reference.error !== undefined);
|
|
269
356
|
}
|
|
270
357
|
/**
|
|
271
358
|
* Shed one document's CST: null every AST node's `$cstNode` and every
|
|
@@ -277,6 +364,15 @@ export class DefaultCstResidencyService {
|
|
|
277
364
|
if (root === undefined || root.$cstNode === undefined) {
|
|
278
365
|
return 0;
|
|
279
366
|
}
|
|
367
|
+
// Readers of the parsed text, the `'text-diagnostics'` fingerprint among
|
|
368
|
+
// them, otherwise see none once the CST is gone. Recorded in the ledger
|
|
369
|
+
// directly: no root is produced, and reconciling it with the store would
|
|
370
|
+
// step a closed document's sequence for a root behind its text.
|
|
371
|
+
const ledger = this.services.workspace.ModelLedger;
|
|
372
|
+
const version = ledger.versionOf(root);
|
|
373
|
+
if (version !== UNRECORDED_VERSION) {
|
|
374
|
+
ledger.record(root, version, ledger.textOf(root));
|
|
375
|
+
}
|
|
280
376
|
let cleared = 0;
|
|
281
377
|
for (const node of AstUtils.streamAst(root)) {
|
|
282
378
|
if (node.$cstNode) {
|