@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
|
@@ -8,15 +8,26 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { isPromiseLike, Logger, type ProfileSession, type Tracer } from '@hydranium/protocol';
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
type AstNode,
|
|
13
|
+
AstUtils,
|
|
14
|
+
DocumentState,
|
|
15
|
+
interruptAndCheck,
|
|
16
|
+
isOperationCancelled,
|
|
17
|
+
type LangiumDocument,
|
|
18
|
+
UriUtils
|
|
19
|
+
} from '@hydranium/langium';
|
|
20
|
+
import { CancellationToken, type Disposable } from 'vscode-languageserver';
|
|
13
21
|
import { type HydraniumDocumentBuilder } from '../document-builder/document-builder.js';
|
|
14
22
|
import { type TextDocument } from 'vscode-languageserver-textdocument';
|
|
15
|
-
import { type WritableFileSystemProvider } from '
|
|
23
|
+
import { type WritableFileSystemProvider } from '../workspace/file-system-provider.js';
|
|
16
24
|
import { type LogNameOptions } from '../diagnostics/logger.js';
|
|
17
25
|
import { type HydraniumTextDocuments } from '../../documents/hydranium-text-documents.js';
|
|
18
26
|
import { Registry } from '../../util/registry.js';
|
|
19
27
|
import { type ServerLanguageServices } from '../language-module.js';
|
|
28
|
+
import { type ServerSharedServices } from '../module.js';
|
|
29
|
+
import { hasSkippedText } from '../workspace/syntax-errors.js';
|
|
30
|
+
import { isVirtualUri } from '../workspace/virtual-document.js';
|
|
20
31
|
import { type IntegrityRuleRegistry } from './integrity-contribution.js';
|
|
21
32
|
import { IntegrityPhase, type IntegrityRule, type IntegritySyncMode } from './integrity-rule.js';
|
|
22
33
|
|
|
@@ -75,6 +86,14 @@ export namespace IntegrityService {
|
|
|
75
86
|
* at `DocumentState.Validated` and delivered separately via `publishDiagnostics`
|
|
76
87
|
* or the `onModelUpdated` event.
|
|
77
88
|
*
|
|
89
|
+
* A document whose parse lacks some of its text reaches this state
|
|
90
|
+
* unrepaired: no rule runs on it until it parses.
|
|
91
|
+
*
|
|
92
|
+
* The AST is what this guarantees, not the text. For a closed document whose
|
|
93
|
+
* repair was STAGED rather than written (`'editor'` sync mode),
|
|
94
|
+
* `textDocument` still mirrors disk — read the repair off the AST, or from
|
|
95
|
+
* the staged content the next open consumes.
|
|
96
|
+
*
|
|
78
97
|
* Invariant: integrity rules only register at Parsed or Linked, so the build
|
|
79
98
|
* is guaranteed post-integrity once it advances past `onBuildPhase(Linked)`
|
|
80
99
|
* into `IndexedReferences`. {@link IntegrityService.register} enforces this at
|
|
@@ -84,6 +103,14 @@ export namespace IntegrityService {
|
|
|
84
103
|
export const SettledState: DocumentState = DocumentState.IndexedReferences;
|
|
85
104
|
}
|
|
86
105
|
|
|
106
|
+
/**
|
|
107
|
+
* The shared services of each server that has logged its first silent
|
|
108
|
+
* write-back. Every language of a server holds the same shared services, so
|
|
109
|
+
* keying on them makes {@link DefaultIntegrityService.noteSilentWrite} report once
|
|
110
|
+
* per server rather than once per language.
|
|
111
|
+
*/
|
|
112
|
+
const silentWriteReported = new WeakSet<ServerSharedServices>();
|
|
113
|
+
|
|
87
114
|
/**
|
|
88
115
|
* Construction options for {@link DefaultIntegrityService}. All fields
|
|
89
116
|
* optional — the defaults reproduce the framework's behaviour exactly.
|
|
@@ -123,15 +150,16 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
123
150
|
protected ruleLoggers = new Map<string, Logger>();
|
|
124
151
|
|
|
125
152
|
/**
|
|
126
|
-
* Rules bucketed by the phase they target,
|
|
127
|
-
*
|
|
128
|
-
* `enforceIntegrity` call after a
|
|
129
|
-
* via reference identity of the
|
|
130
|
-
* {@link Registry.all}). Filtering the rule
|
|
131
|
-
* allocate one transient array per document per
|
|
132
|
-
* whose documents all settle at the same phase pays
|
|
153
|
+
* Rules bucketed by the phase they target, then by each `$type` from
|
|
154
|
+
* {@link nodeTypesFor}, preserving the registry's priority order within
|
|
155
|
+
* each bucket. Rebuilt lazily on the first `enforceIntegrity` call after a
|
|
156
|
+
* registry mutation — staleness is detected via reference identity of the
|
|
157
|
+
* registry's cached array (see {@link Registry.all}). Filtering the rule
|
|
158
|
+
* list per call would instead allocate one transient array per document per
|
|
159
|
+
* phase, which a workspace whose documents all settle at the same phase pays
|
|
160
|
+
* on every build.
|
|
133
161
|
*/
|
|
134
|
-
protected phaseBuckets = new Map<DocumentState, readonly IntegrityRule[]
|
|
162
|
+
protected phaseBuckets = new Map<DocumentState, ReadonlyMap<string, readonly IntegrityRule[]>>();
|
|
135
163
|
protected phaseBucketsFor: readonly IntegrityRule[] | undefined;
|
|
136
164
|
|
|
137
165
|
/** Controls how corrections are persisted for closed files. See {@link IntegritySyncMode}. */
|
|
@@ -142,9 +170,7 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
142
170
|
protected readonly tracer: Tracer;
|
|
143
171
|
/**
|
|
144
172
|
* The framework document builder, used to re-parse + re-link a document in place after a
|
|
145
|
-
* Linked-phase correction (see {@link resyncDocument}).
|
|
146
|
-
* `shared.workspace.DocumentBuilder` to {@link HydraniumDocumentBuilder}; the narrowing
|
|
147
|
-
* cast surfaces its single-document phase runner.
|
|
173
|
+
* Linked-phase correction (see {@link resyncDocument}).
|
|
148
174
|
*/
|
|
149
175
|
protected readonly documentBuilder: HydraniumDocumentBuilder;
|
|
150
176
|
|
|
@@ -155,7 +181,7 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
155
181
|
this.textDocuments = services.shared.workspace.TextDocuments;
|
|
156
182
|
this.fileSystemProvider = services.shared.workspace.FileSystemProvider;
|
|
157
183
|
this.tracer = services.shared.Tracer.for(options.logName ?? 'Integrity').trace('instantiated');
|
|
158
|
-
this.documentBuilder = services.shared.workspace.DocumentBuilder
|
|
184
|
+
this.documentBuilder = services.shared.workspace.DocumentBuilder;
|
|
159
185
|
this.syncMode = options.syncMode ?? 'silent';
|
|
160
186
|
|
|
161
187
|
// Read the language's IntegrityRuleContribution group and let each
|
|
@@ -184,23 +210,28 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
184
210
|
* rule set to completion against a doomed build.
|
|
185
211
|
*/
|
|
186
212
|
async enforceBatch(documents: readonly LangiumDocument[], phase: DocumentState, cancelToken: CancellationToken): Promise<void> {
|
|
187
|
-
const
|
|
213
|
+
const sincePhaseStart = this.services.shared.Clock.stopwatch();
|
|
188
214
|
let mutatedCount = 0;
|
|
189
215
|
// Per-rule self-time profiling is opt-in: only spin up a session when the
|
|
190
216
|
// debug threshold is active, so the production `info` path allocates
|
|
191
217
|
// nothing and the hot rule loop stays a single const-branch off `session`.
|
|
192
218
|
const session = Logger.isLevelEnabled('debug') ? this.tracer.profile(`integrity ${DocumentState[phase]}`) : undefined;
|
|
193
219
|
for (const document of documents) {
|
|
194
|
-
|
|
195
|
-
|
|
220
|
+
if (this.isStructurallyBroken(document)) {
|
|
221
|
+
this.tracer.with(document.uri.toString()).debug('Parse errors: rules skipped until the document parses');
|
|
222
|
+
} else if (await this.enforceIntegrity(document, phase, cancelToken, session)) {
|
|
196
223
|
mutatedCount++;
|
|
197
|
-
|
|
224
|
+
// Not cancellable: see `resyncDocument`.
|
|
225
|
+
await this.resyncDocument(document, CancellationToken.None);
|
|
198
226
|
}
|
|
199
227
|
await interruptAndCheck(cancelToken);
|
|
200
228
|
}
|
|
201
|
-
const totalMs = Math.round(
|
|
202
|
-
|
|
229
|
+
const totalMs = Math.round(sincePhaseStart.elapsedMs);
|
|
230
|
+
// A repair is the operator's to know of; the timing alone is diagnosis.
|
|
231
|
+
if (mutatedCount > 0) {
|
|
203
232
|
this.tracer.info(`enforce ${DocumentState[phase]}: docs=${documents.length}, mutated=${mutatedCount} [${totalMs}ms]`);
|
|
233
|
+
} else if (totalMs >= 25) {
|
|
234
|
+
this.tracer.debug(`enforce ${DocumentState[phase]}: docs=${documents.length}, mutated=${mutatedCount} [${totalMs}ms]`);
|
|
204
235
|
}
|
|
205
236
|
// One line per rule (count + self-% + self-ms), sorted by cost — only when profiling.
|
|
206
237
|
session?.report('debug');
|
|
@@ -219,6 +250,14 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
219
250
|
);
|
|
220
251
|
}
|
|
221
252
|
const disposable = this.rules.register(rule);
|
|
253
|
+
// No parsed node carries a type the reflection does not know, so such a
|
|
254
|
+
// rule never runs. A warning, not a throw: a test reflection may omit the type.
|
|
255
|
+
if (!this.services.shared.AstReflection.getAllTypes().includes(rule.nodeType)) {
|
|
256
|
+
this.tracer.warn(
|
|
257
|
+
`Integrity rule '${this.formatRule(rule)}' is keyed on node type '${rule.nodeType}', ` +
|
|
258
|
+
'which the AST reflection does not know, so no parsed node matches it.'
|
|
259
|
+
);
|
|
260
|
+
}
|
|
222
261
|
this.ruleLoggers.set(rule.id, this.tracer.sub(IntegrityPhase.toString(rule.phase)).sub(rule.label ?? rule.id));
|
|
223
262
|
return {
|
|
224
263
|
dispose: () => {
|
|
@@ -237,6 +276,15 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
237
276
|
return removed;
|
|
238
277
|
}
|
|
239
278
|
|
|
279
|
+
/**
|
|
280
|
+
* Seam: does the parse of `document` lack some of its text? {@link enforceBatch}
|
|
281
|
+
* runs no rule on such a document, because a repair is written back by
|
|
282
|
+
* serializing the AST, and a recovered AST lacks what the parser skipped.
|
|
283
|
+
*/
|
|
284
|
+
protected isStructurallyBroken(document: LangiumDocument): boolean {
|
|
285
|
+
return hasSkippedText(document);
|
|
286
|
+
}
|
|
287
|
+
|
|
240
288
|
/**
|
|
241
289
|
* Run all rules for the given phase against matching AST nodes. Returns
|
|
242
290
|
* `true` if any rule mutated the AST.
|
|
@@ -255,8 +303,10 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
255
303
|
* full rule sweep) — coarser than per (node × rule) to avoid a microtask
|
|
256
304
|
* per inner iteration, finer than per-document so a long-running rule set
|
|
257
305
|
* on a large file can still interrupt mid-stream. Throws
|
|
258
|
-
* `OperationCancelled` when the token is cancelled
|
|
259
|
-
* pipeline absorbs the throw at the lock-holder.
|
|
306
|
+
* `OperationCancelled` when the token is cancelled before any rule mutated
|
|
307
|
+
* the AST; Langium's build pipeline absorbs the throw at the lock-holder.
|
|
308
|
+
* After a mutation it stops the sweep and returns `true` instead, so the
|
|
309
|
+
* caller can resync what was mutated before the cancellation unwinds.
|
|
260
310
|
*/
|
|
261
311
|
async enforceIntegrity(
|
|
262
312
|
document: LangiumDocument,
|
|
@@ -268,29 +318,34 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
268
318
|
return false;
|
|
269
319
|
}
|
|
270
320
|
let changed = false;
|
|
271
|
-
const
|
|
272
|
-
if (
|
|
321
|
+
const rulesByType = this.getPhaseBucket(phase);
|
|
322
|
+
if (rulesByType.size === 0) {
|
|
273
323
|
return false;
|
|
274
324
|
}
|
|
275
325
|
const relativeUri = this.services.shared.workspace.WorkspaceManager.wsRelativePath(document.uri);
|
|
276
326
|
for (const node of AstUtils.streamAst(document.parseResult.value)) {
|
|
277
|
-
for (const rule of
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
ruleLogger.trace(`[${relativeUri}] Mutated ${this.formatNode(node)}`);
|
|
288
|
-
}
|
|
289
|
-
changed = mutated || changed;
|
|
327
|
+
for (const rule of rulesByType.get(node.$type) ?? NO_RULES) {
|
|
328
|
+
const ruleLogger = this.ruleLoggers.get(rule.id)!.with(relativeUri);
|
|
329
|
+
// Scope per rule so the session aggregates self-time by rule id across all
|
|
330
|
+
// nodes; off the profiling path `session` is undefined and we call directly.
|
|
331
|
+
const enforced = session
|
|
332
|
+
? session.scope(rule.id, () => rule.enforce(node, document, ruleLogger))
|
|
333
|
+
: rule.enforce(node, document, ruleLogger);
|
|
334
|
+
const mutated = isPromiseLike(enforced) ? await enforced : enforced;
|
|
335
|
+
if (mutated) {
|
|
336
|
+
ruleLogger.trace(`[${relativeUri}] Mutated ${this.formatNode(node)}`);
|
|
290
337
|
}
|
|
338
|
+
changed = mutated || changed;
|
|
291
339
|
}
|
|
292
340
|
if (cancelToken !== undefined) {
|
|
293
|
-
|
|
341
|
+
try {
|
|
342
|
+
await interruptAndCheck(cancelToken);
|
|
343
|
+
} catch (err: unknown) {
|
|
344
|
+
if (changed && isOperationCancelled(err)) {
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
throw err;
|
|
348
|
+
}
|
|
294
349
|
}
|
|
295
350
|
}
|
|
296
351
|
return changed;
|
|
@@ -300,34 +355,120 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
300
355
|
* Re-serialise the document text after AST mutations, propagate corrections,
|
|
301
356
|
* and re-parse at Parsed phase (safe because linking hasn't occurred yet).
|
|
302
357
|
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
* a natural interruption point.
|
|
358
|
+
* Runs to the end whatever `cancelToken` says: the AST is already mutated,
|
|
359
|
+
* and skipping the resync leaves it against unchanged text that the next
|
|
360
|
+
* build does not re-parse. `cancelToken` reaches only the re-parse.
|
|
307
361
|
*/
|
|
308
362
|
protected async resyncDocument(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void> {
|
|
309
|
-
if (cancelToken?.isCancellationRequested) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
363
|
const root = document.parseResult.value as TRoot;
|
|
313
|
-
|
|
364
|
+
// Extracted while `document` still holds the text being replaced — the
|
|
365
|
+
// resync that follows overwrites it with `newText`. Absent on a test
|
|
366
|
+
// stub that binds no trivia group; `createServerLanguageModule` always
|
|
367
|
+
// provides it, and an empty registry is already the no-op.
|
|
368
|
+
const trivia = this.services.trivia?.TriviaService;
|
|
369
|
+
const extracted = trivia?.extract(document);
|
|
370
|
+
const serialized = await this.services.serializer.Serializer.serializeAst(root);
|
|
371
|
+
const newText =
|
|
372
|
+
extracted === undefined ? serialized : trivia!.apply(serialized, extracted, UriUtils.toUri(document.textDocument.uri));
|
|
314
373
|
|
|
315
374
|
const oldText = document.textDocument.getText();
|
|
316
375
|
if (oldText === newText) {
|
|
317
376
|
return;
|
|
318
377
|
}
|
|
319
378
|
|
|
320
|
-
|
|
321
|
-
//
|
|
322
|
-
//
|
|
323
|
-
|
|
379
|
+
const version = document.textDocument.version;
|
|
380
|
+
// Commit into the store's own document when the URI is open there, rather
|
|
381
|
+
// than into whichever text-document object this build is holding. The two
|
|
382
|
+
// are the same on the LSP path and are NOT when the document was built for
|
|
383
|
+
// an already-open URI through `fromString`: repairing only the build's copy
|
|
384
|
+
// leaves the store — the server's authority on what an open document says —
|
|
385
|
+
// on the unrepaired text, and the reconciling re-parse then redefines
|
|
386
|
+
// `textDocument` onto the store's object and discards the repair with it.
|
|
387
|
+
//
|
|
388
|
+
// Compared against the CST's own text, not against `document.textDocument`.
|
|
389
|
+
// That object IS the store's on the LSP path, so asking it whether the
|
|
390
|
+
// store still agrees compares the store with itself and can only ever say
|
|
391
|
+
// yes — the guard would be vacuous exactly where an editor race can happen.
|
|
392
|
+
// The CST's `fullText` is the text that actually produced this AST, which
|
|
393
|
+
// is the only thing a repair derived from it is valid against. A document
|
|
394
|
+
// with no CST (built from a model rather than parsed) has no better answer
|
|
395
|
+
// than the text it is carrying.
|
|
396
|
+
const parsedFrom = document.parseResult.value.$cstNode?.root.fullText ?? oldText;
|
|
397
|
+
const commit = this.textDocuments.commitRepair(document.textDocument.uri, parsedFrom, newText);
|
|
398
|
+
if (commit.status === 'stale') {
|
|
399
|
+
// An edit landed after the parse this repair came from, so the repair
|
|
400
|
+
// describes text the store has already replaced. Abandon it rather than
|
|
401
|
+
// hand it to `syncCorrections`: an override that persists from there
|
|
402
|
+
// would write a correction over the edit that superseded it. That edit
|
|
403
|
+
// drives a build of its own, which re-runs these rules against what the
|
|
404
|
+
// document actually says.
|
|
405
|
+
//
|
|
406
|
+
// Abandoning the WRITE is only half of it. The build carries on to its
|
|
407
|
+
// settled phase with whatever AST is registered, and every settled
|
|
408
|
+
// consumer reads that AST rather than the store — so leaving the rule's
|
|
409
|
+
// mutation in place would answer questions about this document from a
|
|
410
|
+
// parse of text nobody has. Reconciling discards it by re-reading the
|
|
411
|
+
// store, which is what the document now has to agree with.
|
|
412
|
+
await this.reconcileDocument(document, cancelToken);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// A committed repair is a new version; a document no client has open keeps
|
|
417
|
+
// its number here, and the re-versioning below moves it once the build
|
|
418
|
+
// has reconciled. Through the store's `update`, so the `instanceof
|
|
419
|
+
// FullTextDocument` gate in the bare `TextDocument.update` does not trip
|
|
420
|
+
// on adopter-custom text-document types.
|
|
421
|
+
const textDocument =
|
|
422
|
+
commit.status === 'committed' ? commit.document : this.textDocuments.update(document.textDocument, [{ text: newText }], version);
|
|
324
423
|
|
|
325
|
-
await this.syncCorrections(textDocument);
|
|
424
|
+
await this.syncCorrections(textDocument, parsedFrom);
|
|
425
|
+
|
|
426
|
+
await this.reconcileDocument(document, cancelToken);
|
|
427
|
+
|
|
428
|
+
// Re-version against the REPAIRED text, after either branch. The repair is
|
|
429
|
+
// a content change the store has not seen: whatever reconciliation ran
|
|
430
|
+
// during the re-parse saw the text on disk, which in `'editor'` sync mode
|
|
431
|
+
// is the PRE-repair text. Leave the sequence describing that and the next
|
|
432
|
+
// open hashes the repair, finds a mismatch and steps the version again, so
|
|
433
|
+
// every base version taken from this build is stale before it is used.
|
|
434
|
+
// An open document keeps the store's own version, which is not this
|
|
435
|
+
// method's to move.
|
|
436
|
+
//
|
|
437
|
+
// Deliberately NOT gated on cancellation, unlike the entry to this method:
|
|
438
|
+
// `syncCorrections` has already written or staged the repair by now, so a
|
|
439
|
+
// preempted build that skipped this would leave the sequence describing
|
|
440
|
+
// text that is no longer there.
|
|
441
|
+
if (!this.textDocuments.isOpen(document.textDocument.uri)) {
|
|
442
|
+
// The root describes the repair too; left at the re-parse's number, a
|
|
443
|
+
// syncing read waits for a build nothing requests. The CST is still
|
|
444
|
+
// the unrepaired text, so the repair is reported as the parsed text.
|
|
445
|
+
this.services.shared.workspace.VersionSyncService.modelProduced(document, { text: newText });
|
|
446
|
+
}
|
|
447
|
+
}
|
|
326
448
|
|
|
449
|
+
/**
|
|
450
|
+
* Bring `document` back into agreement with the text it is supposed to
|
|
451
|
+
* describe, after a rule has mutated its AST.
|
|
452
|
+
*
|
|
453
|
+
* Used for a correction that was applied and for one that was abandoned,
|
|
454
|
+
* because the document is left inconsistent either way: applied, the text
|
|
455
|
+
* moved under the CST; abandoned, the AST carries a mutation the text never
|
|
456
|
+
* had. Both are the same question — re-read and re-derive — and the phase is
|
|
457
|
+
* what decides how far that has to go.
|
|
458
|
+
*/
|
|
459
|
+
protected async reconcileDocument(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void> {
|
|
327
460
|
if (document.state <= DocumentState.Parsed) {
|
|
328
461
|
// Parsed-phase correction: re-parse only. The build pipeline still runs
|
|
329
462
|
// IndexedContent → ComputedScopes → Linked → … on the fresh AST afterwards,
|
|
330
463
|
// so the document reconciles naturally with no extra work here.
|
|
464
|
+
//
|
|
465
|
+
// Except for a closed document whose repair did not reach disk — `'editor'`
|
|
466
|
+
// sync mode stages it instead of writing it — where the re-parse is SKIPPED:
|
|
467
|
+
// Langium's factory gates the parse on the CST's `fullText`, which still
|
|
468
|
+
// equals the disk text the same call re-reads and redefines `textDocument`
|
|
469
|
+
// over. So `document.textDocument` is NOT post-integrity for such a
|
|
470
|
+
// document — it mirrors disk, and the AST is the only place the repair is
|
|
471
|
+
// legible, until an open consumes the staging.
|
|
331
472
|
await this.documentBuilder.reparse(document, cancelToken);
|
|
332
473
|
} else {
|
|
333
474
|
// Linked-phase (or later) correction. The rule mutated the AST in place but
|
|
@@ -347,34 +488,149 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
347
488
|
* already in the synced store (in-place in {@link resyncDocument}); this
|
|
348
489
|
* method routes the out-of-band part by document registration:
|
|
349
490
|
*
|
|
350
|
-
* - **Open in the language client** → nothing to push here. The AST
|
|
351
|
-
* rode the current build, so
|
|
352
|
-
*
|
|
353
|
-
*
|
|
354
|
-
*
|
|
491
|
+
* - **Open in the language client** → nothing to push here. The AST
|
|
492
|
+
* mutation rode the current build, so
|
|
493
|
+
* `DefaultModelService.syncToLanguageClient` (the persistent
|
|
494
|
+
* integrity-settled listener) mirrors it to the client by
|
|
495
|
+
* *content* (shadow diff), and the editor shows it as an unsaved change.
|
|
496
|
+
* - **Held only through the data or GLSP head**, or waiting out the release
|
|
497
|
+
* grace after its last client's connection was lost → the store is the
|
|
498
|
+
* authority, and those heads read the correction from the settled build.
|
|
499
|
+
* In silent mode it is also written to disk when the text it was computed
|
|
500
|
+
* from is what disk holds, since the repair is then the only difference;
|
|
501
|
+
* otherwise it waits for the next save. Editor mode always waits, and the
|
|
502
|
+
* repair leaves the document dirty until a save.
|
|
355
503
|
* - **Closed, silent mode** → write to disk directly (disk is authoritative).
|
|
356
|
-
* - **Closed, editor mode** → stage so the next open
|
|
504
|
+
* - **Closed, editor mode** → stage, so the next open takes the correction
|
|
505
|
+
* over the disk text.
|
|
506
|
+
*
|
|
507
|
+
* A held URI is not closed. Writing it as one persists the holder's unsaved
|
|
508
|
+
* edits with the repair, and staging it leaves text no open reads, because
|
|
509
|
+
* only a first open consumes the stage.
|
|
510
|
+
*
|
|
511
|
+
* `parsedFrom` is the text the repaired AST was parsed from. Without it a
|
|
512
|
+
* held URI's repair is left to the next save.
|
|
357
513
|
*/
|
|
358
|
-
protected async syncCorrections(document: TextDocument): Promise<void> {
|
|
359
|
-
//
|
|
360
|
-
//
|
|
361
|
-
//
|
|
362
|
-
// open under a symlinked path still answers `true`.
|
|
514
|
+
protected async syncCorrections(document: TextDocument, parsedFrom?: string): Promise<void> {
|
|
515
|
+
// Only the open/closed question is asked, so no reverse address
|
|
516
|
+
// resolution is needed: a file open under a symlinked path still answers
|
|
517
|
+
// `true`.
|
|
363
518
|
if (this.textDocuments.isOpenInLanguageClient(document.uri)) {
|
|
364
519
|
return;
|
|
365
520
|
}
|
|
366
521
|
|
|
522
|
+
// A virtual document has no disk backing, so neither persisting nor
|
|
523
|
+
// staging applies: there is no file to write and no editor that could open
|
|
524
|
+
// one. `URI.fsPath` yields a path for any scheme, so handing this to the
|
|
525
|
+
// provider would address `<cwd>/<contributor>/<name>` — an unrelated
|
|
526
|
+
// location a disk-backed provider refuses outright, turning a repair that
|
|
527
|
+
// was never persistable into a build failure. The correction is already on
|
|
528
|
+
// the AST and in the text store, which is the whole of where a virtual
|
|
529
|
+
// document lives, so there is nothing further to propagate.
|
|
530
|
+
if (isVirtualUri(document.uri)) {
|
|
531
|
+
this.tracer.with(document.uri).debug('Virtual document: correction kept in memory, nothing to persist');
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// A document waiting out the release grace still holds its lost client's
|
|
536
|
+
// unsaved text, so writing it as a closed file would persist that text.
|
|
537
|
+
if (this.textDocuments.isOpenInAnyClient(document.uri) || this.textDocuments.isReleaseDeferred(document.uri)) {
|
|
538
|
+
if (this.syncMode === 'silent' && parsedFrom !== undefined) {
|
|
539
|
+
await this.persistIfDiskMatches(document, parsedFrom);
|
|
540
|
+
}
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
|
|
367
544
|
// Closed files, silent mode: write to disk directly.
|
|
368
545
|
if (this.syncMode === 'silent') {
|
|
546
|
+
const repaired = document.getText();
|
|
369
547
|
// Async write so the integrity pass does not block the event loop on a slow filesystem.
|
|
370
|
-
|
|
548
|
+
// In the file's task queue, behind any save already queued: written
|
|
549
|
+
// beside one, the older repair can land last and stay on disk.
|
|
550
|
+
await this.services.shared.workspace.FileSystemTaskQueue.enqueue(document.uri, () =>
|
|
551
|
+
this.fileSystemProvider.writeFile(UriUtils.toUri(document.uri), repaired)
|
|
552
|
+
);
|
|
553
|
+
this.noteSilentWrite(document.uri);
|
|
371
554
|
return;
|
|
372
555
|
}
|
|
373
556
|
|
|
374
|
-
// Closed files, editor mode: stage content
|
|
557
|
+
// Closed files, editor mode: stage content for the next open.
|
|
375
558
|
this.textDocuments.stagePendingContent(document.uri, document.getText());
|
|
376
559
|
}
|
|
377
560
|
|
|
561
|
+
/**
|
|
562
|
+
* Write the repair in `document` to disk when disk still holds `parsedFrom`,
|
|
563
|
+
* the text the repair was computed from — so the write carries the repair
|
|
564
|
+
* and nothing a holder could still discard.
|
|
565
|
+
*
|
|
566
|
+
* The read, the compare and the write run as one task in the file's task
|
|
567
|
+
* queue, so no save of the file lands between them. The store is compared
|
|
568
|
+
* again once the read returns, and the write is skipped if it no longer
|
|
569
|
+
* holds the repair: an edit does not wait for the queue, and writing the
|
|
570
|
+
* older repair then puts text on disk that no participant holds. The
|
|
571
|
+
* skipped repair loses nothing: the edit drives a build of its own, and a
|
|
572
|
+
* save writes the store's text. A file that cannot be read is left alone
|
|
573
|
+
* too: there is no evidence it matches. So is a file an editor opened in the
|
|
574
|
+
* meantime: the editor receives the repair as an unsaved change, and writing
|
|
575
|
+
* it would change the file under the editor.
|
|
576
|
+
*/
|
|
577
|
+
protected async persistIfDiskMatches(document: TextDocument, parsedFrom: string): Promise<void> {
|
|
578
|
+
const uri = UriUtils.toUri(document.uri);
|
|
579
|
+
const repaired = document.getText();
|
|
580
|
+
await this.services.shared.workspace.FileSystemTaskQueue.enqueue(document.uri, async () => {
|
|
581
|
+
let onDisk: string;
|
|
582
|
+
try {
|
|
583
|
+
onDisk = await this.fileSystemProvider.readFile(uri);
|
|
584
|
+
} catch (error: unknown) {
|
|
585
|
+
this.tracer.with(document.uri).debug(`Held document unreadable on disk, repair left to the next save: ${String(error)}`);
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
// The file itself, not the store's disk baseline: the baseline moves
|
|
589
|
+
// only when the server hears of a change, so it can still hold the
|
|
590
|
+
// parsed text after another process rewrote the file and before the
|
|
591
|
+
// watcher reports it, and this write would then replace that change.
|
|
592
|
+
if (onDisk !== parsedFrom) {
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
if (this.textDocuments.get(document.uri)?.getText() !== repaired) {
|
|
596
|
+
this.tracer.with(document.uri).debug('Held document changed while disk was read, repair left to that change');
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
if (this.textDocuments.isOpenInLanguageClient(document.uri)) {
|
|
600
|
+
this.tracer.with(document.uri).debug('Editor attached while disk was read, repair left to its save');
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
await this.fileSystemProvider.writeFile(uri, repaired);
|
|
604
|
+
this.textDocuments.setDiskBaseline(document.uri, repaired);
|
|
605
|
+
this.noteSilentWrite(document.uri);
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* Hand the first repair written to disk in `'silent'` sync mode to
|
|
611
|
+
* {@link reportSilentWrite}. Once per server, whichever language writes,
|
|
612
|
+
* rather than per file: a workspace-wide repair pass would otherwise log a
|
|
613
|
+
* line per document.
|
|
614
|
+
*/
|
|
615
|
+
protected noteSilentWrite(uri: string): void {
|
|
616
|
+
if (silentWriteReported.has(this.services.shared)) {
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
silentWriteReported.add(this.services.shared);
|
|
620
|
+
this.reportSilentWrite(uri);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
/**
|
|
624
|
+
* Log a server's first silent write-back, so an adopter learns that
|
|
625
|
+
* integrity rules edit their files and which setting controls it.
|
|
626
|
+
*/
|
|
627
|
+
protected reportSilentWrite(uri: string): void {
|
|
628
|
+
this.tracer.info(
|
|
629
|
+
`Wrote an integrity repair to ${uri}. The integrity service's syncMode option is 'silent', ` +
|
|
630
|
+
"which writes repairs to disk; 'editor' leaves disk alone. Later repairs are written without this line."
|
|
631
|
+
);
|
|
632
|
+
}
|
|
633
|
+
|
|
378
634
|
/**
|
|
379
635
|
* Format a rule's name for inclusion in user-facing diagnostic strings
|
|
380
636
|
* (error messages thrown during registration). Defaults to
|
|
@@ -400,17 +656,37 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
400
656
|
return label ? `${node.$type}('${label}')` : node.$type;
|
|
401
657
|
}
|
|
402
658
|
|
|
403
|
-
|
|
659
|
+
/**
|
|
660
|
+
* The `$type`s `rule` runs on. Defaults to its `nodeType` and every subtype,
|
|
661
|
+
* as Langium's validation registry does: no node carries an abstract or union
|
|
662
|
+
* type as its `$type`, so an exact match never runs a rule keyed on one.
|
|
663
|
+
* Read only when the phase buckets rebuild after a registration change, so an
|
|
664
|
+
* override must not depend on anything else.
|
|
665
|
+
*/
|
|
666
|
+
protected nodeTypesFor(rule: IntegrityRule): Iterable<string> {
|
|
667
|
+
// A type the reflection does not know still matches itself.
|
|
668
|
+
return [rule.nodeType, ...this.services.shared.AstReflection.getAllSubTypes(rule.nodeType)];
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
protected getPhaseBucket(phase: DocumentState): ReadonlyMap<string, readonly IntegrityRule[]> {
|
|
404
672
|
const current = this.rules.all();
|
|
405
673
|
if (this.phaseBucketsFor !== current) {
|
|
406
|
-
const next = new Map<DocumentState, IntegrityRule[]
|
|
674
|
+
const next = new Map<DocumentState, Map<string, IntegrityRule[]>>();
|
|
407
675
|
for (const rule of current) {
|
|
408
676
|
let bucket = next.get(rule.phase);
|
|
409
677
|
if (!bucket) {
|
|
410
|
-
bucket =
|
|
678
|
+
bucket = new Map();
|
|
411
679
|
next.set(rule.phase, bucket);
|
|
412
680
|
}
|
|
413
|
-
|
|
681
|
+
// Deduplicated, or a rule runs twice on a node of its own type.
|
|
682
|
+
for (const nodeType of new Set(this.nodeTypesFor(rule))) {
|
|
683
|
+
let rules = bucket.get(nodeType);
|
|
684
|
+
if (!rules) {
|
|
685
|
+
rules = [];
|
|
686
|
+
bucket.set(nodeType, rules);
|
|
687
|
+
}
|
|
688
|
+
rules.push(rule);
|
|
689
|
+
}
|
|
414
690
|
}
|
|
415
691
|
this.phaseBuckets = next;
|
|
416
692
|
this.phaseBucketsFor = current;
|
|
@@ -419,5 +695,6 @@ export class DefaultIntegrityService<TRoot extends AstNode = AstNode> implements
|
|
|
419
695
|
}
|
|
420
696
|
}
|
|
421
697
|
|
|
422
|
-
|
|
423
|
-
const EMPTY_PHASE_BUCKET: readonly IntegrityRule[] =
|
|
698
|
+
// Shared empty results so neither the cold path nor a node no rule matches allocates.
|
|
699
|
+
const EMPTY_PHASE_BUCKET: ReadonlyMap<string, readonly IntegrityRule[]> = new Map();
|
|
700
|
+
const NO_RULES: readonly IntegrityRule[] = Object.freeze([]);
|
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
*
|
|
14
14
|
* **These live beside the key provider because the constraint is the key
|
|
15
15
|
* provider's.** `NameBasedKeyProvider` keys a node the `NameProvider` gives no
|
|
16
|
-
* name from its position, as `` `${$containerProperty}@${$containerIndex}`
|
|
17
|
-
*
|
|
16
|
+
* name from its position, as `` `${$containerProperty}@${$containerIndex}` ``
|
|
17
|
+
* (`` `${$containerProperty}@` `` in a single-valued property), so a node
|
|
18
|
+
* appended with a bare `array.push` carries neither and
|
|
18
19
|
* `getElementKey` answers `undefined` — the element has no key at all, and the
|
|
19
20
|
* GLSP index cannot address it. Deleting from the middle of such a list must
|
|
20
21
|
* renumber the survivors, or an id derived later in the same command names the
|