@hydranium/core 1.0.0-next.38 → 1.0.0-next.381
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -82
- package/lib/browser/host-heads-in-worker.d.ts +77 -0
- package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
- package/lib/browser/host-heads-in-worker.js +169 -0
- package/lib/browser/host-heads-in-worker.js.map +1 -0
- package/lib/browser/index.d.ts +12 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +17 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
- package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
- package/lib/browser/indexeddb-file-system-store.js +181 -0
- package/lib/browser/indexeddb-file-system-store.js.map +1 -0
- package/lib/browser/start-language-server-in-worker.d.ts +32 -0
- package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
- package/lib/browser/start-language-server-in-worker.js +40 -0
- package/lib/browser/start-language-server-in-worker.js.map +1 -0
- package/lib/documents/ast-document-manager.d.ts +254 -140
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +311 -127
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +5 -19
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +5 -19
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +15 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +15 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +146 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +207 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/dirty-state-tracker.d.ts +101 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +85 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +204 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +317 -0
- package/lib/documents/document-release-handler.js.map +1 -0
- package/lib/documents/document-release-scheduler.d.ts +67 -0
- package/lib/documents/document-release-scheduler.d.ts.map +1 -0
- package/lib/documents/document-release-scheduler.js +80 -0
- package/lib/documents/document-release-scheduler.js.map +1 -0
- package/lib/documents/file-system-task-queue.d.ts +52 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +37 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +445 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +903 -504
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +10 -2
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +10 -2
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-shadow.d.ts +234 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +306 -0
- package/lib/documents/language-client-shadow.js.map +1 -0
- package/lib/documents/model-ledger.d.ts +47 -0
- package/lib/documents/model-ledger.d.ts.map +1 -0
- package/lib/documents/model-ledger.js +30 -0
- package/lib/documents/model-ledger.js.map +1 -0
- package/lib/documents/text-ledger.d.ts +64 -0
- package/lib/documents/text-ledger.d.ts.map +1 -0
- package/lib/documents/text-ledger.js +63 -0
- package/lib/documents/text-ledger.js.map +1 -0
- package/lib/documents/version-sync-service.d.ts +145 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +177 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js +45 -19
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +25 -9
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +49 -36
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +75 -36
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
- package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
- package/lib/langium/composite-ast-reflection.d.ts +46 -0
- package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
- package/lib/langium/composite-ast-reflection.js +97 -0
- package/lib/langium/composite-ast-reflection.js.map +1 -0
- package/lib/langium/config/configuration-provider.d.ts +81 -0
- package/lib/langium/config/configuration-provider.d.ts.map +1 -0
- package/lib/langium/config/configuration-provider.js +112 -0
- package/lib/langium/config/configuration-provider.js.map +1 -0
- package/lib/langium/config/index.d.ts +1 -0
- package/lib/langium/config/index.d.ts.map +1 -1
- package/lib/langium/config/index.js +1 -0
- package/lib/langium/config/index.js.map +1 -1
- package/lib/langium/config/settings.js.map +1 -1
- package/lib/langium/diagnostics/console-tee.d.ts +27 -0
- package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
- package/lib/langium/diagnostics/console-tee.js +141 -0
- package/lib/langium/diagnostics/console-tee.js.map +1 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/log-preamble.js +1 -1
- package/lib/langium/diagnostics/log-preamble.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +25 -6
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +49 -17
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +81 -46
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
- package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
- package/lib/langium/diagnostics/server-tracer.js.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js +43 -30
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +6 -5
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js +5 -5
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +355 -39
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +578 -102
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
- package/lib/langium/documentation/comment-provider.js.map +1 -1
- package/lib/langium/integration-services.d.ts +39 -23
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +7 -4
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +22 -8
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +104 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +319 -65
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +3 -2
- package/lib/langium/keys/containment.d.ts.map +1 -1
- package/lib/langium/keys/containment.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +24 -12
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/positional-key-provider.js.map +1 -1
- package/lib/langium/labeling/label-provider.d.ts.map +1 -1
- package/lib/langium/labeling/label-provider.js.map +1 -1
- package/lib/langium/language-module.d.ts +30 -5
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +21 -5
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +405 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +479 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +2 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +2 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-events.d.ts +68 -0
- package/lib/langium/model-service/model-events.d.ts.map +1 -0
- package/lib/langium/model-service/model-events.js +10 -0
- package/lib/langium/model-service/model-events.js.map +1 -0
- package/lib/langium/model-service/model-service.d.ts +441 -323
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +602 -397
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +96 -37
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +39 -27
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +32 -7
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +10 -4
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts +184 -13
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +336 -16
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +22 -3
- package/lib/langium/project/project-change-event.d.ts.map +1 -1
- package/lib/langium/project/project-manager.d.ts +28 -2
- package/lib/langium/project/project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.d.ts +7 -1
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js +12 -0
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +81 -44
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +142 -46
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js +88 -15
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/built-local-symbols.d.ts +12 -0
- package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
- package/lib/langium/scope/built-local-symbols.js +11 -0
- package/lib/langium/scope/built-local-symbols.js.map +1 -0
- package/lib/langium/scope/fallback-scope.d.ts +27 -0
- package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
- package/lib/langium/scope/fallback-scope.js +35 -0
- package/lib/langium/scope/fallback-scope.js.map +1 -0
- package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js +38 -39
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +122 -32
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +217 -39
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/index.d.ts +1 -0
- package/lib/langium/scope/index.d.ts.map +1 -1
- package/lib/langium/scope/index.js +1 -0
- package/lib/langium/scope/index.js.map +1 -1
- package/lib/langium/scope/reference-builder.d.ts.map +1 -1
- package/lib/langium/scope/reference-builder.js.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js +3 -2
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts +69 -37
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js +102 -29
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
- package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.js +1 -3
- package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +54 -30
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +8 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js +13 -3
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/serializer.d.ts +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js +24 -4
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +29 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +37 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +10 -4
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/single-langium-copy.d.ts +22 -0
- package/lib/langium/single-langium-copy.d.ts.map +1 -0
- package/lib/langium/single-langium-copy.js +36 -0
- package/lib/langium/single-langium-copy.js.map +1 -0
- package/lib/langium/transfer/transfer-encoder.d.ts +60 -39
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +35 -24
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +543 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +1165 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +62 -0
- package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
- package/lib/langium/trivia/index.d.ts +14 -0
- package/lib/langium/trivia/index.d.ts.map +1 -0
- package/lib/langium/trivia/index.js +14 -0
- package/lib/langium/trivia/index.js.map +1 -0
- package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
- package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-contribution.js +10 -0
- package/lib/langium/trivia/trivia-contribution.js.map +1 -0
- package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +168 -23
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +264 -26
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.js +1 -1
- package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
- package/lib/langium/workspace/ast-node-locator.d.ts +24 -0
- package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
- package/lib/langium/workspace/ast-node-locator.js +32 -0
- package/lib/langium/workspace/ast-node-locator.js.map +1 -0
- package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +22 -13
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +23 -0
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
- package/lib/langium/workspace/file-not-found.js +31 -0
- package/lib/langium/workspace/file-not-found.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +167 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +115 -13
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +35 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +77 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +105 -21
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +186 -31
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/index.d.ts +3 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +3 -0
- package/lib/langium/workspace/index.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +68 -3
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +7 -0
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +18 -1
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/{documents → langium/workspace}/self-save-registry.d.ts +7 -9
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +9 -11
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/syntax-errors.d.ts +23 -0
- package/lib/langium/workspace/syntax-errors.d.ts.map +1 -0
- package/lib/langium/workspace/syntax-errors.js +29 -0
- package/lib/langium/workspace/syntax-errors.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +55 -21
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +87 -24
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +15 -5
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/launcher/integrated-server.d.ts +3 -1
- package/lib/launcher/integrated-server.d.ts.map +1 -1
- package/lib/locale/server-locale.d.ts +6 -6
- package/lib/locale/server-locale.d.ts.map +1 -1
- package/lib/locale/server-locale.js.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
- package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
- package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
- package/lib/lsp/connection-features.d.ts +23 -0
- package/lib/lsp/connection-features.d.ts.map +1 -0
- package/lib/lsp/connection-features.js +60 -0
- package/lib/lsp/connection-features.js.map +1 -0
- package/lib/lsp/diagnostics-connection.d.ts +27 -0
- package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
- package/lib/lsp/diagnostics-connection.js +53 -0
- package/lib/lsp/diagnostics-connection.js.map +1 -0
- package/lib/lsp/edit-requests-guard.d.ts +31 -0
- package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
- package/lib/lsp/edit-requests-guard.js +125 -0
- package/lib/lsp/edit-requests-guard.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +234 -101
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +6 -2
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +6 -2
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/save-text-document.d.ts +31 -0
- package/lib/lsp/save-text-document.d.ts.map +1 -0
- package/lib/lsp/save-text-document.js +52 -0
- package/lib/lsp/save-text-document.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +58 -2
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +98 -9
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +12 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +21 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +4 -6
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +4 -6
- package/lib/messages/carriers.js.map +1 -1
- package/lib/messages/index.d.ts +2 -2
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +2 -2
- package/lib/messages/index.js.map +1 -1
- package/lib/messages/renderer.d.ts +10 -4
- package/lib/messages/renderer.d.ts.map +1 -1
- package/lib/messages/renderer.js +6 -0
- package/lib/messages/renderer.js.map +1 -1
- package/lib/node/event-loop-monitor.d.ts.map +1 -1
- package/lib/node/event-loop-monitor.js +2 -1
- package/lib/node/event-loop-monitor.js.map +1 -1
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +5 -1
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/lint-grammar.js.map +1 -1
- package/lib/node/log-file-sink.d.ts +3 -2
- package/lib/node/log-file-sink.d.ts.map +1 -1
- package/lib/node/log-file-sink.js +6 -2
- package/lib/node/log-file-sink.js.map +1 -1
- package/lib/node/log-preamble-node.d.ts +5 -3
- package/lib/node/log-preamble-node.d.ts.map +1 -1
- package/lib/node/log-preamble-node.js +13 -10
- package/lib/node/log-preamble-node.js.map +1 -1
- package/lib/node/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +5 -4
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.d.ts +2 -2
- package/lib/node/memory-monitor.d.ts.map +1 -1
- package/lib/node/memory-monitor.js +9 -10
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +67 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +198 -53
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +12 -4
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +8 -6
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +13 -3
- package/lib/node/profiling-run.d.ts.map +1 -1
- package/lib/node/profiling-run.js +17 -8
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +61 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +80 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/server-diagnostics.js +1 -1
- package/lib/node/server-diagnostics.js.map +1 -1
- package/lib/node/server-state-snapshot.d.ts +1 -2
- package/lib/node/server-state-snapshot.d.ts.map +1 -1
- package/lib/node/server-state-snapshot.js +4 -4
- package/lib/node/server-state-snapshot.js.map +1 -1
- package/lib/node/socket-launcher.d.ts +43 -7
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +42 -7
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/startup-cpu-profile.d.ts +29 -0
- package/lib/node/startup-cpu-profile.d.ts.map +1 -0
- package/lib/node/startup-cpu-profile.js +91 -0
- package/lib/node/startup-cpu-profile.js.map +1 -0
- package/lib/node/stdio-launcher.d.ts +13 -13
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +21 -11
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/node/validate-workspace.d.ts +1 -1
- package/lib/node/validate-workspace.d.ts.map +1 -1
- package/lib/node/validate-workspace.js +5 -1
- package/lib/node/validate-workspace.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js +1 -1
- package/lib/testing/document-uri-policy-conformance.js.map +1 -1
- package/lib/testing/fake-description.js.map +1 -1
- package/lib/testing/fake-document.d.ts +2 -1
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/index.d.ts +1 -1
- package/lib/testing/index.d.ts.map +1 -1
- package/lib/testing/index.js +2 -1
- package/lib/testing/index.js.map +1 -1
- package/lib/testing/langium-test-helpers.d.ts.map +1 -1
- package/lib/testing/langium-test-helpers.js +1 -0
- package/lib/testing/langium-test-helpers.js.map +1 -1
- package/lib/testing/make-noop-language-services.js.map +1 -1
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +45 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +23 -7
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/make-test-tracer.d.ts +12 -0
- package/lib/testing/make-test-tracer.d.ts.map +1 -1
- package/lib/testing/make-test-tracer.js +13 -0
- package/lib/testing/make-test-tracer.js.map +1 -1
- package/lib/testing/node/applied-edit-capture.d.ts +29 -0
- package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
- package/lib/testing/node/applied-edit-capture.js +117 -0
- package/lib/testing/node/applied-edit-capture.js.map +1 -0
- package/lib/testing/node/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +21 -6
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +49 -106
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +30 -1
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +39 -2
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/node/unhandled-rejections.d.ts +20 -0
- package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
- package/lib/testing/node/unhandled-rejections.js +32 -0
- package/lib/testing/node/unhandled-rejections.js.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
- package/lib/testing/playwright/e2e-profiling.js.map +1 -1
- package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.js +164 -0
- package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +1 -0
- package/lib/testing/playwright/index.d.ts.map +1 -1
- package/lib/testing/playwright/index.js +1 -0
- package/lib/testing/playwright/index.js.map +1 -1
- package/lib/testing/playwright/server-log-capture.d.ts +46 -16
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +111 -40
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
- package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-fixture.js +25 -6
- package/lib/testing/playwright/server-log-fixture.js.map +1 -1
- package/lib/testing/playwright/server-log-region.d.ts +15 -0
- package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-region.js +30 -0
- package/lib/testing/playwright/server-log-region.js.map +1 -0
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +8 -5
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/run-update-pipeline.js.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +11 -51
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +31 -59
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +33 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +110 -5
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +132 -16
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +8 -7
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +4 -4
- package/lib/testing/stub-model-service.js.map +1 -1
- package/lib/testing/stub-project-manager.d.ts.map +1 -1
- package/lib/testing/stub-project-manager.js +10 -0
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-self-save-registry.d.ts +1 -1
- package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
- package/lib/testing/stub-service-registry.d.ts +1 -1
- package/lib/testing/stub-service-registry.js.map +1 -1
- package/lib/testing/stub-writable-file-system.d.ts +1 -1
- package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
- package/lib/testing/stub-writable-file-system.js +2 -1
- package/lib/testing/stub-writable-file-system.js.map +1 -1
- package/lib/util/connection-liveness.d.ts +22 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +75 -15
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts +7 -0
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js +15 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +41 -60
- package/src/browser/host-heads-in-worker.ts +218 -0
- package/src/browser/index.ts +17 -0
- package/src/browser/indexeddb-file-system-store.ts +192 -0
- package/src/browser/start-language-server-in-worker.ts +56 -0
- package/src/documents/ast-document-manager.ts +477 -249
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +26 -0
- package/src/documents/client-session-registry.ts +262 -0
- package/src/documents/dirty-state-tracker.ts +167 -0
- package/src/documents/document-release-handler.ts +404 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +74 -0
- package/src/documents/hydranium-text-documents.ts +1029 -616
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +501 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +289 -0
- package/src/index.ts +3 -0
- package/src/langium/ast-extension/ast-extension-service.ts +77 -41
- package/src/langium/ast-extension/ast-node-builder.ts +35 -13
- package/src/langium/bootstrap.ts +79 -43
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
- package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
- package/src/langium/composite-ast-reflection.ts +112 -0
- package/src/langium/config/configuration-provider.ts +119 -0
- package/src/langium/config/index.ts +1 -0
- package/src/langium/diagnostics/console-tee.ts +150 -0
- package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
- package/src/langium/diagnostics/log-preamble.ts +1 -1
- package/src/langium/diagnostics/logger.ts +51 -17
- package/src/langium/diagnostics/lsp-logger.ts +83 -45
- package/src/langium/document-builder/build-pipeline-integration.ts +57 -32
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +709 -105
- package/src/langium/integration-services.ts +58 -27
- package/src/langium/integrity/integrity-rule.ts +22 -8
- package/src/langium/integrity/integrity-service.ts +348 -71
- package/src/langium/keys/containment.ts +3 -2
- package/src/langium/keys/name-based-key-provider.ts +24 -12
- package/src/langium/language-module.ts +52 -9
- package/src/langium/model-service/client-session.ts +769 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +82 -0
- package/src/langium/model-service/model-service.ts +885 -522
- package/src/langium/module.ts +139 -63
- package/src/langium/naming/name-provider.ts +34 -8
- package/src/langium/project/abstract-project-manager.ts +409 -20
- package/src/langium/project/project-change-event.ts +25 -3
- package/src/langium/project/project-manager.ts +31 -2
- package/src/langium/project/single-project-manager.ts +16 -1
- package/src/langium/residency/cst-residency-service.ts +197 -73
- package/src/langium/scope/ast-node-description-provider.ts +111 -16
- package/src/langium/scope/built-local-symbols.ts +13 -0
- package/src/langium/scope/fallback-scope.ts +38 -0
- package/src/langium/scope/hydranium-scope-computation.ts +45 -44
- package/src/langium/scope/hydranium-scope-provider.ts +245 -41
- package/src/langium/scope/index.ts +1 -0
- package/src/langium/scope/reference-candidate-provider.ts +6 -5
- package/src/langium/scope/scope-extension-service.ts +148 -56
- package/src/langium/scope/scoped-ast-node-description.ts +1 -3
- package/src/langium/serialization/abstract-serializer.ts +57 -41
- package/src/langium/serialization/json-serializer.ts +14 -3
- package/src/langium/serialization/serializer.ts +1 -1
- package/src/langium/serialization/yaml-serializer.ts +26 -4
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +13 -4
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +76 -50
- package/src/langium/trivia/comment-preserver.ts +1410 -0
- package/src/langium/trivia/document-ending-preserver.ts +71 -0
- package/src/langium/trivia/index.ts +14 -0
- package/src/langium/trivia/trivia-contribution.ts +39 -0
- package/src/langium/trivia/trivia-preserver.ts +56 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +312 -31
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/ast-node-locator.ts +33 -0
- package/src/langium/workspace/document-uri-policy.ts +32 -18
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +258 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +107 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +214 -35
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +3 -0
- package/src/langium/workspace/initialize-workspace.ts +96 -4
- package/src/langium/workspace/langium-documents.ts +19 -1
- package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
- package/src/{documents → langium/workspace}/self-save-registry.ts +12 -14
- package/src/langium/workspace/syntax-errors.ts +34 -0
- package/src/langium/workspace/virtual-document.ts +106 -25
- package/src/langium/workspace/write-lock-scope.ts +27 -12
- package/src/launcher/integrated-server.ts +3 -1
- package/src/locale/server-locale.ts +6 -6
- package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
- package/src/lsp/connection-features.ts +67 -0
- package/src/lsp/diagnostics-connection.ts +56 -0
- package/src/lsp/edit-requests-guard.ts +152 -0
- package/src/lsp/hydranium-document-update-handler.ts +284 -110
- package/src/lsp/index.ts +6 -2
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/save-text-document.ts +63 -0
- package/src/lsp/semantic-token-provider.ts +146 -8
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +21 -7
- package/src/messages/carriers.ts +4 -6
- package/src/messages/index.ts +11 -2
- package/src/messages/renderer.ts +11 -3
- package/src/node/event-loop-monitor.ts +2 -1
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +5 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/log-file-sink.ts +6 -2
- package/src/node/log-preamble-node.ts +20 -10
- package/src/node/measure-memory.ts +5 -4
- package/src/node/memory-monitor.ts +10 -10
- package/src/node/node-file-system-provider.ts +214 -57
- package/src/node/profile-capture.ts +16 -15
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +94 -0
- package/src/node/server-diagnostics.ts +1 -1
- package/src/node/server-state-snapshot.ts +6 -7
- package/src/node/socket-launcher.ts +78 -14
- package/src/node/startup-cpu-profile.ts +94 -0
- package/src/node/stdio-launcher.ts +29 -19
- package/src/node/validate-workspace.ts +8 -2
- package/src/testing/document-uri-policy-conformance.ts +1 -1
- package/src/testing/fake-document.ts +2 -1
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-test-services.ts +83 -31
- package/src/testing/make-test-tracer.ts +26 -0
- package/src/testing/node/applied-edit-capture.ts +141 -0
- package/src/testing/node/index.ts +1 -0
- package/src/testing/node/lsp-harness.ts +2 -0
- package/src/testing/node/lsp-server-connection.ts +83 -119
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +57 -3
- package/src/testing/node/unhandled-rejections.ts +31 -0
- package/src/testing/parse-semantic-root.ts +1 -1
- package/src/testing/playwright/flaky-network-proxy.ts +240 -0
- package/src/testing/playwright/index.ts +1 -0
- package/src/testing/playwright/server-log-capture.ts +137 -47
- package/src/testing/playwright/server-log-fixture.ts +46 -6
- package/src/testing/playwright/server-log-region.ts +32 -0
- package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
- package/src/testing/run-update-pipeline.ts +8 -5
- package/src/testing/stub-ast-document-manager.ts +47 -123
- package/src/testing/stub-document-builder.ts +155 -18
- package/src/testing/stub-hydranium-text-documents.ts +184 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +9 -8
- package/src/testing/stub-project-manager.ts +10 -0
- package/src/testing/stub-self-save-registry.ts +1 -1
- package/src/testing/stub-service-registry.ts +1 -1
- package/src/testing/stub-writable-file-system.ts +3 -2
- package/src/util/connection-liveness.ts +81 -15
- package/src/util/environment.ts +24 -2
- package/lib/documents/language-client-text-shadow.d.ts +0 -124
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -190
- package/lib/documents/language-client-text-shadow.js.map +0 -1
- package/lib/documents/self-save-registry.d.ts.map +0 -1
- package/lib/documents/self-save-registry.js.map +0 -1
- package/lib/lsp/instrument-connection.d.ts +0 -36
- package/lib/lsp/instrument-connection.d.ts.map +0 -1
- package/lib/lsp/instrument-connection.js +0 -62
- package/lib/lsp/instrument-connection.js.map +0 -1
- package/lib/node/process-memory.d.ts +0 -66
- package/lib/node/process-memory.d.ts.map +0 -1
- package/lib/node/process-memory.js +0 -252
- package/lib/node/process-memory.js.map +0 -1
- package/src/documents/language-client-text-shadow.ts +0 -211
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -7,25 +7,79 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Deferred, type Project, type Tracer, UNQUALIFIED_PROJECT_REFERENCE } from '@hydranium/protocol';
|
|
10
|
+
import { Deferred, type Project, type Tracer, UNQUALIFIED_PROJECT_REFERENCE, describeErrorWithStack } from '@hydranium/protocol';
|
|
11
11
|
import {
|
|
12
12
|
type AstNode,
|
|
13
13
|
AstUtils,
|
|
14
|
-
|
|
14
|
+
DocumentState,
|
|
15
15
|
type FileSystemProvider,
|
|
16
|
+
isOperationCancelled,
|
|
16
17
|
type LangiumDocument,
|
|
17
18
|
type LangiumDocuments,
|
|
19
|
+
OperationCancelled,
|
|
18
20
|
type URI,
|
|
19
|
-
UriUtils
|
|
21
|
+
UriUtils,
|
|
22
|
+
type WorkspaceLock
|
|
20
23
|
} from '@hydranium/langium';
|
|
21
|
-
import { Disposable } from 'vscode-languageserver';
|
|
24
|
+
import { CancellationToken, Disposable } from 'vscode-languageserver';
|
|
22
25
|
import type { WorkspaceFolder } from 'vscode-languageserver-types';
|
|
23
26
|
import type { LogNameOptions } from '../diagnostics/logger.js';
|
|
27
|
+
import { HYDRANIUM_BUILD_REASONS, type HydraniumDocumentBuilder } from '../document-builder/document-builder.js';
|
|
24
28
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
25
29
|
import { isVirtualUri } from '../workspace/virtual-document.js';
|
|
26
|
-
import type {
|
|
30
|
+
import type {
|
|
31
|
+
MemberRelinkFinishedEvent,
|
|
32
|
+
MemberRelinkFinishedListener,
|
|
33
|
+
MemberRelinkStartedListener,
|
|
34
|
+
ProjectChangeEvent,
|
|
35
|
+
ProjectChangeListener
|
|
36
|
+
} from './project-change-event.js';
|
|
27
37
|
import type { ProjectManager } from './project-manager.js';
|
|
28
38
|
|
|
39
|
+
/** Constructor options for {@link AbstractProjectManager}. */
|
|
40
|
+
export interface ProjectManagerOptions extends LogNameOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Relink the member documents a descriptor change affects in a build of
|
|
43
|
+
* their own, queued once the build of the change has ended. The write that
|
|
44
|
+
* changed the descriptor then answers without waiting for them, and they
|
|
45
|
+
* keep the links they had until that build starts. An explicit
|
|
46
|
+
* `DocumentBuilder.build`, such as workspace initialization, keeps them in
|
|
47
|
+
* the build of the change, as without the option. Default `false`.
|
|
48
|
+
*
|
|
49
|
+
* A member already below its last phase stays in the build of the change,
|
|
50
|
+
* which builds it anyway. That includes every member with a linking error,
|
|
51
|
+
* which Langium relinks in every update. So a save that adds a dependency
|
|
52
|
+
* still waits for the members it makes resolve.
|
|
53
|
+
*
|
|
54
|
+
* A write that lands while that build runs cancels it. The write's own
|
|
55
|
+
* build then relinks the members still below `Validated`, since an update
|
|
56
|
+
* builds every such document, and the next follow-up takes the rest. A
|
|
57
|
+
* save made once that build has started therefore waits for part of the
|
|
58
|
+
* relink. The follow-up is queued behind every write, so while writes keep
|
|
59
|
+
* arriving, the members keep the links they had until the writes pause.
|
|
60
|
+
*
|
|
61
|
+
* A test or a teardown awaits {@link ProjectManager.memberRelinkSettled}
|
|
62
|
+
* after a descriptor change, or the relink runs against a workspace already
|
|
63
|
+
* removed.
|
|
64
|
+
*
|
|
65
|
+
* A member counts as relinked only once a build links it, so under
|
|
66
|
+
* Langium's `eagerLinking: false`, which skips that phase, the follow-up
|
|
67
|
+
* builds even a member a later write has built.
|
|
68
|
+
*/
|
|
69
|
+
readonly deferMemberRelink?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Which projects a project's references resolve against:
|
|
72
|
+
* `'transitive'`, the default, is the closure of its
|
|
73
|
+
* {@link Project.dependencies}, and `'direct'` only the projects it names.
|
|
74
|
+
*
|
|
75
|
+
* It decides visibility only. A change still rebuilds every project that
|
|
76
|
+
* reaches the changed one through its dependencies, at any depth, since a
|
|
77
|
+
* rebuild replaces the nodes their references point to, and a project two
|
|
78
|
+
* steps away that is not relinked keeps references to the replaced nodes.
|
|
79
|
+
*/
|
|
80
|
+
readonly visibility?: 'transitive' | 'direct';
|
|
81
|
+
}
|
|
82
|
+
|
|
29
83
|
/**
|
|
30
84
|
* Abstract base for project-aware {@link ProjectManager} implementations.
|
|
31
85
|
* Implements the machinery: registry, auto-subscription to
|
|
@@ -56,7 +110,13 @@ import type { ProjectManager } from './project-manager.js';
|
|
|
56
110
|
* transitively in reverse (projects whose dep closure touches a changed
|
|
57
111
|
* project also rebuild). Override for a different rebuild policy.
|
|
58
112
|
* - {@link getVisibleProjects} — default walks {@link Project.dependencies}
|
|
59
|
-
*
|
|
113
|
+
* as far as {@link ProjectManagerOptions.visibility} reaches. Override for
|
|
114
|
+
* a different visibility model.
|
|
115
|
+
* - {@link shouldDeferMemberRelink} — default follows
|
|
116
|
+
* {@link ProjectManagerOptions.deferMemberRelink}. Override for a different
|
|
117
|
+
* choice of which builds leave the members to a follow-up build.
|
|
118
|
+
* - {@link collectAffectedDocuments} — default collects the affected
|
|
119
|
+
* projects' members. Override to add documents a change affects otherwise.
|
|
60
120
|
* - {@link computeProject} — default uses closest-ancestor-descriptor-folder
|
|
61
121
|
* membership. Override for a different membership model; overriding
|
|
62
122
|
* {@link getProject} instead loses the memoization it wraps.
|
|
@@ -86,20 +146,67 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
86
146
|
|
|
87
147
|
protected readonly fileSystemProvider: FileSystemProvider;
|
|
88
148
|
protected readonly langiumDocuments: LangiumDocuments;
|
|
89
|
-
protected readonly documentBuilder:
|
|
149
|
+
protected readonly documentBuilder: HydraniumDocumentBuilder;
|
|
150
|
+
protected readonly workspaceLock: WorkspaceLock;
|
|
90
151
|
protected readonly tracer: Tracer;
|
|
152
|
+
/** Resolved from {@link ProjectManagerOptions.deferMemberRelink}. */
|
|
153
|
+
protected readonly deferMemberRelink: boolean;
|
|
154
|
+
/** Resolved from {@link ProjectManagerOptions.visibility}. */
|
|
155
|
+
protected readonly visibility: 'transitive' | 'direct';
|
|
156
|
+
|
|
157
|
+
/** Member documents a deferred relink has yet to take, by URI string. */
|
|
158
|
+
protected readonly pendingMemberRelink = new Map<string, URI>();
|
|
159
|
+
/** The keys of {@link pendingMemberRelink} to reset before they are built, whatever their state. */
|
|
160
|
+
protected readonly pendingMemberResets = new Set<string>();
|
|
161
|
+
/**
|
|
162
|
+
* The keys of every queued or taken member that no build has relinked yet.
|
|
163
|
+
* A member leaves once a build links it and then delivers its last phase
|
|
164
|
+
* to every listener, whichever build that is: `Validated`, or
|
|
165
|
+
* `IndexedReferences` when that build does not validate it.
|
|
166
|
+
*/
|
|
167
|
+
protected readonly unrelinkedMembers = new Set<string>();
|
|
168
|
+
/** The keys of {@link unrelinkedMembers} a build has linked since they were queued. */
|
|
169
|
+
protected readonly linkedMembers = new Set<string>();
|
|
170
|
+
/** Set from {@link queueMemberRelink} until {@link runMemberRelink} takes {@link pendingMemberRelink}. */
|
|
171
|
+
protected memberRelinkQueued = false;
|
|
172
|
+
/** Set once {@link registerMemberPhaseListeners} has run. */
|
|
173
|
+
protected memberPhaseListenersRegistered = false;
|
|
174
|
+
/** One per {@link runMemberRelink}, until it ends. */
|
|
175
|
+
protected readonly memberRelinks = new Set<Promise<void>>();
|
|
176
|
+
protected readonly memberRelinkStartedListeners = new Set<MemberRelinkStartedListener>();
|
|
177
|
+
protected readonly memberRelinkFinishedListeners = new Set<MemberRelinkFinishedListener>();
|
|
91
178
|
|
|
92
179
|
constructor(
|
|
93
180
|
protected readonly services: ServerSharedServicesMinimal,
|
|
94
|
-
options:
|
|
181
|
+
options: ProjectManagerOptions = {}
|
|
95
182
|
) {
|
|
96
183
|
this.fileSystemProvider = services.workspace.FileSystemProvider;
|
|
97
184
|
this.langiumDocuments = services.workspace.LangiumDocuments;
|
|
98
185
|
this.documentBuilder = services.workspace.DocumentBuilder;
|
|
186
|
+
this.workspaceLock = services.workspace.WorkspaceLock;
|
|
187
|
+
this.deferMemberRelink = options.deferMemberRelink ?? false;
|
|
188
|
+
this.visibility = options.visibility ?? 'transitive';
|
|
99
189
|
this.tracer = services.Tracer.for(options.logName ?? this.constructor.name).trace('instantiated');
|
|
100
190
|
this.documentBuilder.onUpdate((changed, deleted) => this.onBuildUpdate(changed, deleted));
|
|
101
191
|
}
|
|
102
192
|
|
|
193
|
+
/**
|
|
194
|
+
* Track members through every build from the first deferred relink on.
|
|
195
|
+
* Registered then rather than here, so a manager that never defers adds no
|
|
196
|
+
* listener to each document's phases.
|
|
197
|
+
*/
|
|
198
|
+
protected registerMemberPhaseListeners(): void {
|
|
199
|
+
this.memberPhaseListenersRegistered = true;
|
|
200
|
+
this.documentBuilder.onDocumentPhase(DocumentState.Linked, document => this.onMemberLinked(document.uri));
|
|
201
|
+
for (const phase of [DocumentState.IndexedReferences, DocumentState.Validated]) {
|
|
202
|
+
this.documentBuilder.onDocumentPhaseDelivered(phase, document => {
|
|
203
|
+
if (this.lastPhaseOf(document) === phase) {
|
|
204
|
+
this.onMemberDelivered(document.uri);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
103
210
|
get ready(): Promise<void> {
|
|
104
211
|
return this.readyDeferred.promise;
|
|
105
212
|
}
|
|
@@ -225,7 +332,7 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
225
332
|
try {
|
|
226
333
|
entries = await this.fileSystemProvider.readDirectory(folder);
|
|
227
334
|
} catch (error) {
|
|
228
|
-
this.tracer.warn(`Failed to read directory ${folder.toString()}: ${error}`);
|
|
335
|
+
this.tracer.warn(`Failed to read directory ${folder.toString()}: ${describeErrorWithStack(error)}`);
|
|
229
336
|
return;
|
|
230
337
|
}
|
|
231
338
|
for (const entry of entries) {
|
|
@@ -258,10 +365,10 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
258
365
|
* Compute the set of projects whose member documents need to rebuild
|
|
259
366
|
* given the directly changed projects. Default walks the dependency
|
|
260
367
|
* graph in reverse — any project whose declared {@link Project.dependencies}
|
|
261
|
-
* include a changed id transitively also rebuilds (cycle-safe)
|
|
368
|
+
* include a changed id transitively also rebuilds (cycle-safe), whatever
|
|
369
|
+
* {@link visibility} is (see {@link ProjectManagerOptions.visibility}).
|
|
262
370
|
*
|
|
263
|
-
* Override for a different rebuild policy (
|
|
264
|
-
* reachability, etc.).
|
|
371
|
+
* Override for a different rebuild policy (custom reachability, etc.).
|
|
265
372
|
*/
|
|
266
373
|
protected getAffectedProjects(directlyChanged: readonly string[]): readonly string[] {
|
|
267
374
|
const result = new Set(directlyChanged);
|
|
@@ -304,13 +411,19 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
304
411
|
}
|
|
305
412
|
|
|
306
413
|
/**
|
|
307
|
-
* Default:
|
|
308
|
-
*
|
|
414
|
+
* Default: the source project itself, then the closure of its
|
|
415
|
+
* {@link Project.dependencies}, or only the dependencies it names when
|
|
416
|
+
* {@link visibility} is `'direct'`. A dependency that is not registered is
|
|
417
|
+
* skipped. Override for a different visibility model.
|
|
309
418
|
*/
|
|
310
419
|
getVisibleProjects(projectId: string): readonly string[] {
|
|
311
|
-
|
|
420
|
+
const project = this.projects.get(projectId);
|
|
421
|
+
if (!project) {
|
|
312
422
|
return [];
|
|
313
423
|
}
|
|
424
|
+
if (this.visibility === 'direct') {
|
|
425
|
+
return [...new Set([projectId, ...(project.dependencies ?? []).filter(dep => this.projects.has(dep))])];
|
|
426
|
+
}
|
|
314
427
|
const visited = new Set<string>();
|
|
315
428
|
const ordered: string[] = [];
|
|
316
429
|
this.collectVisibleProjects(projectId, visited, ordered);
|
|
@@ -377,6 +490,13 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
377
490
|
protected async loadDescriptor(uri: URI): Promise<TProject | undefined> {
|
|
378
491
|
try {
|
|
379
492
|
const document = await this.langiumDocuments.getOrCreateDocument(uri);
|
|
493
|
+
if (document.state < DocumentState.Parsed) {
|
|
494
|
+
// `onUpdate` fires before the build parses, so the AST is still the previous edit's.
|
|
495
|
+
// The state is restored so the build still runs, and notifies, its own parse phase.
|
|
496
|
+
const state = document.state;
|
|
497
|
+
await this.services.workspace.LangiumDocumentFactory.update(document, CancellationToken.None);
|
|
498
|
+
document.state = state;
|
|
499
|
+
}
|
|
380
500
|
const project = await this.parseProjectDescriptor(uri, document);
|
|
381
501
|
if (project) {
|
|
382
502
|
this.projects.set(project.id, project);
|
|
@@ -387,7 +507,7 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
387
507
|
}
|
|
388
508
|
return project;
|
|
389
509
|
} catch (error) {
|
|
390
|
-
this.tracer.error(`Failed to parse ${this.conceptName()} descriptor at ${uri.toString()}: ${error}`);
|
|
510
|
+
this.tracer.error(`Failed to parse ${this.conceptName()} descriptor at ${uri.toString()}: ${describeErrorWithStack(error)}`);
|
|
391
511
|
return undefined;
|
|
392
512
|
}
|
|
393
513
|
}
|
|
@@ -403,9 +523,22 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
403
523
|
*
|
|
404
524
|
* Descriptor URIs that triggered the cycle are excluded from
|
|
405
525
|
* {@link ProjectChangeEvent.affectedDocuments} — re-adding them would
|
|
406
|
-
* loop.
|
|
526
|
+
* loop. When {@link shouldDeferMemberRelink} holds, the event carries only
|
|
527
|
+
* the members already below their last phase, which this build builds
|
|
528
|
+
* anyway, and the rest are queued for a follow-up build. The last phase
|
|
529
|
+
* is the one of the build that last carried each member, since this
|
|
530
|
+
* build's phases have not started yet. If validation was turned on since,
|
|
531
|
+
* a member that build left at `IndexedReferences` is deferred, and this
|
|
532
|
+
* build validates it before the follow-up relinks it.
|
|
533
|
+
*
|
|
534
|
+
* An override calls `super` before its first await, since
|
|
535
|
+
* {@link shouldDeferMemberRelink} only answers for the calling build until
|
|
536
|
+
* then.
|
|
407
537
|
*/
|
|
408
538
|
protected async onBuildUpdate(changed: readonly URI[], deleted: readonly URI[]): Promise<void> {
|
|
539
|
+
// Asked before the first await, while the builder still answers for
|
|
540
|
+
// this call.
|
|
541
|
+
const deferRelink = this.shouldDeferMemberRelink();
|
|
409
542
|
const changedDescriptors = changed.filter(uri => this.isDescriptorUri(uri));
|
|
410
543
|
const deletedDescriptors = deleted.filter(uri => this.isDescriptorUri(uri));
|
|
411
544
|
if (changedDescriptors.length === 0 && deletedDescriptors.length === 0) {
|
|
@@ -498,10 +631,44 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
498
631
|
}
|
|
499
632
|
const affectedDocuments = this.collectAffectedDocuments(affectedProjectIds, excluded);
|
|
500
633
|
|
|
501
|
-
|
|
634
|
+
if (deferRelink) {
|
|
635
|
+
// The build of the change already builds what it was given.
|
|
636
|
+
const building = new Set(changed.map(uri => uri.toString()));
|
|
637
|
+
const carried: URI[] = [];
|
|
638
|
+
const deferred: URI[] = [];
|
|
639
|
+
for (const uri of affectedDocuments) {
|
|
640
|
+
if (building.has(uri.toString())) {
|
|
641
|
+
continue;
|
|
642
|
+
}
|
|
643
|
+
const document = this.langiumDocuments.getDocument(uri);
|
|
644
|
+
// Below its last phase, the build of the change builds it anyway.
|
|
645
|
+
(document && document.state < this.lastPhaseOf(document) ? carried : deferred).push(uri);
|
|
646
|
+
}
|
|
647
|
+
this.queueMemberRelink(deferred);
|
|
648
|
+
this.emit({ added, updated, removed, affectedDocuments: carried });
|
|
649
|
+
} else {
|
|
650
|
+
this.emit({ added, updated, removed, affectedDocuments });
|
|
651
|
+
}
|
|
502
652
|
}
|
|
503
653
|
|
|
504
|
-
/**
|
|
654
|
+
/**
|
|
655
|
+
* Whether the build calling {@link onBuildUpdate} leaves the documents a
|
|
656
|
+
* change affects to a follow-up build. Default: under
|
|
657
|
+
* {@link deferMemberRelink}, unless an explicit `build` calls it. Called
|
|
658
|
+
* before the first await of {@link onBuildUpdate}, where
|
|
659
|
+
* `isInsideBuildUpdate` still answers for that call.
|
|
660
|
+
*/
|
|
661
|
+
protected shouldDeferMemberRelink(): boolean {
|
|
662
|
+
return this.deferMemberRelink && !this.documentBuilder.isInsideBuildUpdate();
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/**
|
|
666
|
+
* Iterate the document set once, collecting URIs whose owning project is in
|
|
667
|
+
* the affected set. Override to add documents a change affects otherwise,
|
|
668
|
+
* such as those reached through a project's type, calling `super` to keep
|
|
669
|
+
* the members. What it returns is relinked as the members are, in the
|
|
670
|
+
* build of the change or in the follow-up build.
|
|
671
|
+
*/
|
|
505
672
|
protected collectAffectedDocuments(affectedProjectIds: ReadonlySet<string>, excludedUris: ReadonlySet<string>): URI[] {
|
|
506
673
|
const result: URI[] = [];
|
|
507
674
|
for (const document of this.langiumDocuments.all) {
|
|
@@ -517,6 +684,228 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
517
684
|
return result;
|
|
518
685
|
}
|
|
519
686
|
|
|
687
|
+
// ============================================================
|
|
688
|
+
// Deferred member relink
|
|
689
|
+
// ============================================================
|
|
690
|
+
|
|
691
|
+
/** One that throws is logged and skipped. */
|
|
692
|
+
onMemberRelinkStarted(listener: MemberRelinkStartedListener): Disposable {
|
|
693
|
+
this.memberRelinkStartedListeners.add(listener);
|
|
694
|
+
return Disposable.create(() => this.memberRelinkStartedListeners.delete(listener));
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
/** One that throws is logged and skipped. */
|
|
698
|
+
onMemberRelinkFinished(listener: MemberRelinkFinishedListener): Disposable {
|
|
699
|
+
this.memberRelinkFinishedListeners.add(listener);
|
|
700
|
+
return Disposable.create(() => this.memberRelinkFinishedListeners.delete(listener));
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
async memberRelinkSettled(): Promise<void> {
|
|
704
|
+
while (this.memberRelinks.size > 0) {
|
|
705
|
+
await Promise.all(this.memberRelinks);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/**
|
|
710
|
+
* Add `documents` to {@link pendingMemberRelink}, to be reset before they
|
|
711
|
+
* are built when `reset` holds, and start a {@link runMemberRelink} unless
|
|
712
|
+
* one is already waiting to take them.
|
|
713
|
+
*/
|
|
714
|
+
protected queueMemberRelink(documents: readonly URI[], reset = true): void {
|
|
715
|
+
if (!this.memberPhaseListenersRegistered && documents.length > 0) {
|
|
716
|
+
this.registerMemberPhaseListeners();
|
|
717
|
+
}
|
|
718
|
+
for (const uri of documents) {
|
|
719
|
+
const key = uri.toString();
|
|
720
|
+
this.pendingMemberRelink.set(key, uri);
|
|
721
|
+
this.unrelinkedMembers.add(key);
|
|
722
|
+
if (reset) {
|
|
723
|
+
this.pendingMemberResets.add(key);
|
|
724
|
+
this.linkedMembers.delete(key);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
if (this.memberRelinkQueued || this.pendingMemberRelink.size === 0) {
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
this.memberRelinkQueued = true;
|
|
731
|
+
const settled = this.runMemberRelink();
|
|
732
|
+
this.memberRelinks.add(settled);
|
|
733
|
+
void settled.finally(() => this.memberRelinks.delete(settled));
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* Take {@link pendingMemberRelink} in a lock read and build it in a write
|
|
738
|
+
* queued from there. The read runs once no write runs or is queued, so the
|
|
739
|
+
* write does not cancel the build of the change, as one queued from inside
|
|
740
|
+
* that build would. It still cancels a write another read of the same batch
|
|
741
|
+
* queued before it. If that write is a build that has started, the
|
|
742
|
+
* follow-up builds the documents it reset, since an update builds every
|
|
743
|
+
* document below `Validated`. The read does not await its write, which
|
|
744
|
+
* waits for the read to end.
|
|
745
|
+
*
|
|
746
|
+
* The follow-up waits for any build already running outside the lock to
|
|
747
|
+
* end, so it does not start alongside one. A build started outside the lock
|
|
748
|
+
* after that can still overlap it, as any two such builds can. The wait
|
|
749
|
+
* runs after the read rather than in it, since a wait under the lock would
|
|
750
|
+
* hold back every write, and a write queued outside a read could cancel one
|
|
751
|
+
* already queued, so the read runs again.
|
|
752
|
+
*/
|
|
753
|
+
protected async runMemberRelink(): Promise<void> {
|
|
754
|
+
const next = await this.workspaceLock.read(() => {
|
|
755
|
+
const running = this.documentBuilder.activeBuild;
|
|
756
|
+
if (running) {
|
|
757
|
+
return { running };
|
|
758
|
+
}
|
|
759
|
+
this.memberRelinkQueued = false;
|
|
760
|
+
const uris = [...this.pendingMemberRelink.values()];
|
|
761
|
+
const resets = new Set(this.pendingMemberResets);
|
|
762
|
+
this.pendingMemberRelink.clear();
|
|
763
|
+
this.pendingMemberResets.clear();
|
|
764
|
+
// A write cancels the one queued before it, so none is queued for nothing.
|
|
765
|
+
if (uris.length === 0) {
|
|
766
|
+
return { relink: Promise.resolve() };
|
|
767
|
+
}
|
|
768
|
+
return { relink: this.workspaceLock.write(token => this.relinkMembers(uris, resets, token)) };
|
|
769
|
+
});
|
|
770
|
+
if (next.running) {
|
|
771
|
+
await next.running;
|
|
772
|
+
return this.runMemberRelink();
|
|
773
|
+
}
|
|
774
|
+
return next.relink;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* The write action of a deferred relink: take the documents still loaded
|
|
779
|
+
* that no build has relinked since they were queued, and build them. Those
|
|
780
|
+
* in `resets`, and those already at their last phase, are reset first by a
|
|
781
|
+
* {@link ProjectChangeEvent} that carries only them, so the workspace
|
|
782
|
+
* manager's `onProjectsChanged` resets them as it does without the option.
|
|
783
|
+
* An `update` with no URIs builds what is left below `Validated`, and
|
|
784
|
+
* Langium relinks every document with a linking error too, without
|
|
785
|
+
* reporting the members to `onUpdate` listeners as changed.
|
|
786
|
+
*
|
|
787
|
+
* A write cancelled before it starts is queued again as it was, unannounced.
|
|
788
|
+
* A cancelled build is queued again, without resets, with only the members
|
|
789
|
+
* it did not relink. One a cancel left at its last phase before its
|
|
790
|
+
* listeners all ran is reset then, since Langium does not run them again.
|
|
791
|
+
* If none is left, nothing is built or announced. A build that ends,
|
|
792
|
+
* completed or failed, stops tracking the members it took, except those a
|
|
793
|
+
* change queued again meanwhile. A failed build is not queued again, since
|
|
794
|
+
* it would fail again. Never throws, so {@link memberRelinkSettled} never
|
|
795
|
+
* rejects.
|
|
796
|
+
*/
|
|
797
|
+
protected async relinkMembers(uris: readonly URI[], resets: ReadonlySet<string>, token: CancellationToken): Promise<void> {
|
|
798
|
+
const loaded: URI[] = [];
|
|
799
|
+
for (const uri of uris) {
|
|
800
|
+
const key = uri.toString();
|
|
801
|
+
if (!this.unrelinkedMembers.has(key)) {
|
|
802
|
+
continue;
|
|
803
|
+
}
|
|
804
|
+
if (this.langiumDocuments.getDocument(uri)) {
|
|
805
|
+
loaded.push(uri);
|
|
806
|
+
} else {
|
|
807
|
+
this.forgetMember(key);
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
if (loaded.length === 0) {
|
|
811
|
+
return;
|
|
812
|
+
}
|
|
813
|
+
const forgetTaken = (): void =>
|
|
814
|
+
loaded.filter(uri => !this.pendingMemberRelink.has(uri.toString())).forEach(uri => this.forgetMember(uri.toString()));
|
|
815
|
+
if (token.isCancellationRequested) {
|
|
816
|
+
this.queueMemberRelink(loaded.filter(uri => resets.has(uri.toString())));
|
|
817
|
+
this.queueMemberRelink(
|
|
818
|
+
loaded.filter(uri => !resets.has(uri.toString())),
|
|
819
|
+
false
|
|
820
|
+
);
|
|
821
|
+
return;
|
|
822
|
+
}
|
|
823
|
+
this.notifyMemberRelink(this.memberRelinkStartedListeners, loaded);
|
|
824
|
+
let completed = false;
|
|
825
|
+
try {
|
|
826
|
+
const reset = loaded.filter(uri => {
|
|
827
|
+
const document = this.langiumDocuments.getDocument(uri);
|
|
828
|
+
return document !== undefined && (resets.has(uri.toString()) || document.state >= this.lastPhaseOf(document));
|
|
829
|
+
});
|
|
830
|
+
if (reset.length > 0) {
|
|
831
|
+
reset.forEach(uri => this.linkedMembers.delete(uri.toString()));
|
|
832
|
+
this.emit({ added: [], updated: [], removed: [], affectedDocuments: reset });
|
|
833
|
+
}
|
|
834
|
+
this.documentBuilder.markNextReason(HYDRANIUM_BUILD_REASONS.memberRelink);
|
|
835
|
+
await this.documentBuilder.update([], [], token);
|
|
836
|
+
// A cancel a last-phase listener swallowed can leave `update` resolved.
|
|
837
|
+
if (token.isCancellationRequested) {
|
|
838
|
+
throw OperationCancelled;
|
|
839
|
+
}
|
|
840
|
+
completed = true;
|
|
841
|
+
// Built all the same if no listener saw it linked or delivered.
|
|
842
|
+
forgetTaken();
|
|
843
|
+
} catch (error: unknown) {
|
|
844
|
+
if (isOperationCancelled(error)) {
|
|
845
|
+
// A cancel can skip the Linked listeners, and Langium does not
|
|
846
|
+
// notify that phase again.
|
|
847
|
+
for (const uri of loaded) {
|
|
848
|
+
const document = this.langiumDocuments.getDocument(uri);
|
|
849
|
+
if (document && document.state >= DocumentState.Linked) {
|
|
850
|
+
this.onMemberLinked(uri);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
this.queueMemberRelink(
|
|
854
|
+
loaded.filter(uri => this.unrelinkedMembers.has(uri.toString())),
|
|
855
|
+
false
|
|
856
|
+
);
|
|
857
|
+
} else {
|
|
858
|
+
forgetTaken();
|
|
859
|
+
this.tracer.error(`Relinking ${this.conceptName()} members failed: ${describeErrorWithStack(error)}`);
|
|
860
|
+
}
|
|
861
|
+
} finally {
|
|
862
|
+
this.notifyMemberRelink<MemberRelinkFinishedEvent>(this.memberRelinkFinishedListeners, { completed });
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
/** Record that a build linked `uri`, if it is a member not relinked yet. */
|
|
867
|
+
protected onMemberLinked(uri: URI): void {
|
|
868
|
+
const key = uri.toString();
|
|
869
|
+
if (this.unrelinkedMembers.has(key)) {
|
|
870
|
+
this.linkedMembers.add(key);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
/** The last phase the build that carries `document` takes it to. */
|
|
875
|
+
protected lastPhaseOf(document: LangiumDocument): DocumentState {
|
|
876
|
+
return this.documentBuilder.shouldValidateDocument(document) ? DocumentState.Validated : DocumentState.IndexedReferences;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
/**
|
|
880
|
+
* A member linked since it was queued and now delivered at its last phase
|
|
881
|
+
* is relinked, whichever build did it, so no follow-up builds it again.
|
|
882
|
+
*/
|
|
883
|
+
protected onMemberDelivered(uri: URI): void {
|
|
884
|
+
const key = uri.toString();
|
|
885
|
+
if (this.linkedMembers.has(key)) {
|
|
886
|
+
this.forgetMember(key);
|
|
887
|
+
this.pendingMemberRelink.delete(key);
|
|
888
|
+
this.pendingMemberResets.delete(key);
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
/** Drop `key` from the relink bookkeeping. */
|
|
893
|
+
protected forgetMember(key: string): void {
|
|
894
|
+
this.unrelinkedMembers.delete(key);
|
|
895
|
+
this.linkedMembers.delete(key);
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
/** Call each of `listeners` with `value`, each in isolation. */
|
|
899
|
+
protected notifyMemberRelink<T>(listeners: ReadonlySet<(value: T) => void>, value: T): void {
|
|
900
|
+
for (const listener of [...listeners]) {
|
|
901
|
+
try {
|
|
902
|
+
listener(value);
|
|
903
|
+
} catch (error: unknown) {
|
|
904
|
+
this.tracer.error(`A member relink listener failed: ${describeErrorWithStack(error)}`);
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
|
|
520
909
|
// ============================================================
|
|
521
910
|
// Queries
|
|
522
911
|
// ============================================================
|
|
@@ -612,7 +1001,7 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
|
|
|
612
1001
|
try {
|
|
613
1002
|
listener(event);
|
|
614
1003
|
} catch (error) {
|
|
615
|
-
this.tracer.error(`Project change listener failed: ${error}`);
|
|
1004
|
+
this.tracer.error(`Project change listener failed: ${describeErrorWithStack(error)}`);
|
|
616
1005
|
}
|
|
617
1006
|
}
|
|
618
1007
|
}
|
|
@@ -28,8 +28,12 @@ import type { URI } from '@hydranium/langium';
|
|
|
28
28
|
* - {@link affectedDocuments} lists URIs whose reachable scope changed. The
|
|
29
29
|
* default cascade plumbing in `HydraniumWorkspaceManager` subscribes to
|
|
30
30
|
* this event and re-runs `DocumentBuilder.resetToState` for each entry,
|
|
31
|
-
* which the
|
|
32
|
-
*
|
|
31
|
+
* which the build of the update that changed the descriptor picks up.
|
|
32
|
+
* Empty when the project manager relinks them in a follow-up build of its
|
|
33
|
+
* own instead (`ProjectManagerOptions.deferMemberRelink`). That build
|
|
34
|
+
* emits an event of its own, with no project in it, carrying the members
|
|
35
|
+
* it resets.
|
|
36
|
+
* Consumers can subscribe independently for other reactions.
|
|
33
37
|
*/
|
|
34
38
|
export interface ProjectChangeEvent<TProject extends Project = Project> {
|
|
35
39
|
/** Ids of projects newly registered since the last event. */
|
|
@@ -54,7 +58,8 @@ export interface ProjectChangeEvent<TProject extends Project = Project> {
|
|
|
54
58
|
* rebuild. Includes the changed projects' own member documents plus
|
|
55
59
|
* any transitive dependents according to the concrete
|
|
56
60
|
* `ProjectManager`'s visibility model (see
|
|
57
|
-
* `AbstractProjectManager.getAffectedProjects`).
|
|
61
|
+
* `AbstractProjectManager.getAffectedProjects`). In the event a deferred
|
|
62
|
+
* relink emits, the members it resets.
|
|
58
63
|
*
|
|
59
64
|
* Descriptor URIs themselves are intentionally excluded: they triggered
|
|
60
65
|
* this cycle and re-adding them would loop.
|
|
@@ -64,3 +69,20 @@ export interface ProjectChangeEvent<TProject extends Project = Project> {
|
|
|
64
69
|
|
|
65
70
|
/** Callback shape for `ProjectManager.onProjectsChanged`. */
|
|
66
71
|
export type ProjectChangeListener<TProject extends Project = Project> = (event: ProjectChangeEvent<TProject>) => void;
|
|
72
|
+
|
|
73
|
+
/** Callback shape for `ProjectManager.onMemberRelinkStarted`: the documents the follow-up build relinks. */
|
|
74
|
+
export type MemberRelinkStartedListener = (documents: readonly URI[]) => void;
|
|
75
|
+
|
|
76
|
+
/** What `ProjectManager.onMemberRelinkFinished` tells a listener. */
|
|
77
|
+
export interface MemberRelinkFinishedEvent {
|
|
78
|
+
/**
|
|
79
|
+
* `false` when the follow-up build was cancelled or failed. A cancelled
|
|
80
|
+
* one is queued again, and another started and finished pair follows only
|
|
81
|
+
* if members are left, since the cancelling write may build them all.
|
|
82
|
+
* Await `ProjectManager.memberRelinkSettled` to learn the relink is done.
|
|
83
|
+
*/
|
|
84
|
+
readonly completed: boolean;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Callback shape for `ProjectManager.onMemberRelinkFinished`. */
|
|
88
|
+
export type MemberRelinkFinishedListener = (event: MemberRelinkFinishedEvent) => void;
|
|
@@ -11,7 +11,7 @@ import type { Project } from '@hydranium/protocol';
|
|
|
11
11
|
import type { AstNode, URI } from '@hydranium/langium';
|
|
12
12
|
import type { Disposable } from 'vscode-languageserver';
|
|
13
13
|
import type { WorkspaceFolder } from 'vscode-languageserver-types';
|
|
14
|
-
import type { ProjectChangeListener } from './project-change-event.js';
|
|
14
|
+
import type { MemberRelinkFinishedListener, MemberRelinkStartedListener, ProjectChangeListener } from './project-change-event.js';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Manages the **project tier** sitting between the LSP `WorkspaceFolder`
|
|
@@ -91,6 +91,32 @@ export interface ProjectManager<TProject extends Project = Project> {
|
|
|
91
91
|
*/
|
|
92
92
|
onProjectsChanged(listener: ProjectChangeListener<TProject>): Disposable;
|
|
93
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Subscribe to the start of a follow-up build that relinks a changed
|
|
96
|
+
* project's members, with the documents it relinks. Fires only for a
|
|
97
|
+
* manager that defers that relink (`AbstractProjectManager` under its
|
|
98
|
+
* `deferMemberRelink` option), so an adopter forwards it to show progress.
|
|
99
|
+
*/
|
|
100
|
+
onMemberRelinkStarted(listener: MemberRelinkStartedListener): Disposable;
|
|
101
|
+
|
|
102
|
+
/** Subscribe to the end of each build {@link onMemberRelinkStarted} announced. */
|
|
103
|
+
onMemberRelinkFinished(listener: MemberRelinkFinishedListener): Disposable;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Resolves once no deferred member relink is pending, queued or building,
|
|
107
|
+
* including one queued while this waits. It covers only relinks already
|
|
108
|
+
* queued, so a test awaits the build of the change first. A test that
|
|
109
|
+
* drives a descriptor change awaits it, and so does a teardown, or the
|
|
110
|
+
* relink runs against a workspace already removed. Resolved at once by a
|
|
111
|
+
* manager that never defers.
|
|
112
|
+
*
|
|
113
|
+
* Never await it inside a workspace lock write or read, which includes a
|
|
114
|
+
* request handler that answers under a read: the relink needs a write,
|
|
115
|
+
* which waits for both. Nor in a listener of a build running outside the
|
|
116
|
+
* lock, since the relink waits for that build to end.
|
|
117
|
+
*/
|
|
118
|
+
memberRelinkSettled(): Promise<void>;
|
|
119
|
+
|
|
94
120
|
// ============================================================
|
|
95
121
|
// Queries
|
|
96
122
|
// ============================================================
|
|
@@ -136,7 +162,10 @@ export interface ProjectManager<TProject extends Project = Project> {
|
|
|
136
162
|
*
|
|
137
163
|
* Default behaviour in `AbstractProjectManager` is the **transitive
|
|
138
164
|
* closure** of {@link Project.dependencies}, including the project
|
|
139
|
-
* itself
|
|
165
|
+
* itself, or only the dependencies it names under its `visibility: 'direct'`
|
|
166
|
+
* option, which narrows visibility only: a change still rebuilds every
|
|
167
|
+
* transitive dependent. An adopter can override to use a different
|
|
168
|
+
* visibility model.
|
|
140
169
|
*
|
|
141
170
|
* `SingleProjectManager` returns `[id]` for its synthetic workspace
|
|
142
171
|
* project, which combined with "synthetic project owns every URI"
|
|
@@ -12,7 +12,7 @@ import { type AstNode, type LangiumDocuments, type URI } from '@hydranium/langiu
|
|
|
12
12
|
import { Disposable } from 'vscode-languageserver';
|
|
13
13
|
import { type LogNameOptions } from '../diagnostics/logger.js';
|
|
14
14
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
15
|
-
import type { ProjectChangeListener } from './project-change-event.js';
|
|
15
|
+
import type { MemberRelinkFinishedListener, MemberRelinkStartedListener, ProjectChangeListener } from './project-change-event.js';
|
|
16
16
|
import type { ProjectManager } from './project-manager.js';
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -64,6 +64,21 @@ export class SingleProjectManager implements ProjectManager {
|
|
|
64
64
|
return Disposable.create(() => undefined);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
/** Never fires: a fixed registry has no member relink to defer. */
|
|
68
|
+
onMemberRelinkStarted(_listener: MemberRelinkStartedListener): Disposable {
|
|
69
|
+
return Disposable.create(() => undefined);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Never fires, as {@link onMemberRelinkStarted} does not. */
|
|
73
|
+
onMemberRelinkFinished(_listener: MemberRelinkFinishedListener): Disposable {
|
|
74
|
+
return Disposable.create(() => undefined);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Resolved at once: nothing is ever deferred. */
|
|
78
|
+
memberRelinkSettled(): Promise<void> {
|
|
79
|
+
return Promise.resolve();
|
|
80
|
+
}
|
|
81
|
+
|
|
67
82
|
isProjectDescriptor(_uri: URI | string): boolean {
|
|
68
83
|
return false;
|
|
69
84
|
}
|