@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
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
|
|
10
|
+
import { type CanonicalUri, type TextVersion, textHash } from '@hydranium/protocol';
|
|
11
|
+
import { type TextDocument } from 'vscode-languageserver-textdocument';
|
|
12
|
+
|
|
13
|
+
/** What {@link TextLedger} holds for a document: where its version sequence stands, kept across closes and reopens. */
|
|
14
|
+
export interface TextRecord {
|
|
15
|
+
readonly version: TextVersion;
|
|
16
|
+
/** {@link textHash} of the text at that version. */
|
|
17
|
+
readonly hash: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Where each document's {@link TextVersion} sequence stands, and who authored
|
|
22
|
+
* each version; the text-side counterpart of `ModelLedger`.
|
|
23
|
+
*
|
|
24
|
+
* A record survives the document's release and is never pruned, not even when
|
|
25
|
+
* the file is deleted: a sequence that restarts lets a write based on the old
|
|
26
|
+
* text pass the base-version gate. Authors last only until the release.
|
|
27
|
+
*/
|
|
28
|
+
export interface TextLedger {
|
|
29
|
+
/**
|
|
30
|
+
* The version a first open of `key` with `text` starts at: the record's
|
|
31
|
+
* version when the text is unchanged, one step on when it changed;
|
|
32
|
+
* `undefined` without a record.
|
|
33
|
+
*/
|
|
34
|
+
openingVersion(key: CanonicalUri, text: string): TextVersion | undefined;
|
|
35
|
+
/** Keep where the sequence of the released `document` stands. */
|
|
36
|
+
record(key: CanonicalUri, document: TextDocument): void;
|
|
37
|
+
recordOf(key: CanonicalUri): TextRecord | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Text reached the closed document `key` outside the store's write paths.
|
|
40
|
+
* Steps the record iff `text` differs from it, and starts one at `0` when
|
|
41
|
+
* there is none.
|
|
42
|
+
*/
|
|
43
|
+
reconcile(key: CanonicalUri, text: string): TextVersion;
|
|
44
|
+
/** {@link textHash} of `document`'s text, taken once per version. */
|
|
45
|
+
hashOf(document: TextDocument): string;
|
|
46
|
+
setAuthor(key: CanonicalUri, version: TextVersion, author: string): void;
|
|
47
|
+
/** The author of `version`, or of the latest version when `version` is omitted. */
|
|
48
|
+
authorOf(key: CanonicalUri, version?: TextVersion): string | undefined;
|
|
49
|
+
clearAuthors(key: CanonicalUri): void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class DefaultTextLedger implements TextLedger {
|
|
53
|
+
protected readonly records = new Map<CanonicalUri, TextRecord>();
|
|
54
|
+
protected readonly authors = new Map<CanonicalUri, string[]>();
|
|
55
|
+
protected readonly hashes = new WeakMap<TextDocument, { readonly version: number; readonly hash: string }>();
|
|
56
|
+
|
|
57
|
+
openingVersion(key: CanonicalUri, text: string): TextVersion | undefined {
|
|
58
|
+
const recorded = this.records.get(key);
|
|
59
|
+
if (recorded === undefined) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
return recorded.hash === textHash(text) ? recorded.version : recorded.version + 1;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
record(key: CanonicalUri, document: TextDocument): void {
|
|
66
|
+
this.records.set(key, { version: document.version, hash: this.hashOf(document) });
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
recordOf(key: CanonicalUri): TextRecord | undefined {
|
|
70
|
+
return this.records.get(key);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
reconcile(key: CanonicalUri, text: string): TextVersion {
|
|
74
|
+
const hash = textHash(text);
|
|
75
|
+
const recorded = this.records.get(key);
|
|
76
|
+
if (recorded?.hash === hash) {
|
|
77
|
+
return recorded.version;
|
|
78
|
+
}
|
|
79
|
+
const version = recorded === undefined ? 0 : recorded.version + 1;
|
|
80
|
+
this.records.set(key, { version, hash });
|
|
81
|
+
return version;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
hashOf(document: TextDocument): string {
|
|
85
|
+
const taken = this.hashes.get(document);
|
|
86
|
+
if (taken?.version === document.version) {
|
|
87
|
+
return taken.hash;
|
|
88
|
+
}
|
|
89
|
+
const hash = textHash(document.getText());
|
|
90
|
+
this.hashes.set(document, { version: document.version, hash });
|
|
91
|
+
return hash;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
setAuthor(key: CanonicalUri, version: TextVersion, author: string): void {
|
|
95
|
+
let history = this.authors.get(key);
|
|
96
|
+
if (!history) {
|
|
97
|
+
history = [];
|
|
98
|
+
this.authors.set(key, history);
|
|
99
|
+
}
|
|
100
|
+
history[version] = author;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
authorOf(key: CanonicalUri, version?: TextVersion): string | undefined {
|
|
104
|
+
const history = this.authors.get(key);
|
|
105
|
+
// `!== undefined` so version 0 is not read as "latest".
|
|
106
|
+
return version !== undefined ? history?.[version] : history?.at(-1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
clearAuthors(key: CanonicalUri): void {
|
|
110
|
+
this.authors.delete(key);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
|
|
10
|
+
import { DocumentState, type LangiumDocument, type URI } from '@hydranium/langium';
|
|
11
|
+
import { type Tracer, UNRECORDED_VERSION, describeError, describeErrorWithStack } from '@hydranium/protocol';
|
|
12
|
+
import { Disposable, Emitter, type Event } from 'vscode-languageserver-protocol';
|
|
13
|
+
import { type LogNameOptions } from '../langium/diagnostics/logger.js';
|
|
14
|
+
import { type ServerSharedServices } from '../langium/module.js';
|
|
15
|
+
import { HydraniumWorkspaceLock } from '../langium/workspace/hydranium-workspace-lock.js';
|
|
16
|
+
import { HydraniumTextDocuments } from './hydranium-text-documents.js';
|
|
17
|
+
|
|
18
|
+
/** A build {@link VersionSyncService.requestRecoveryBuild} schedules. */
|
|
19
|
+
export interface RecoveryBuildRequest {
|
|
20
|
+
/** Remove the document instead of building it. */
|
|
21
|
+
readonly deleted?: boolean;
|
|
22
|
+
/** Staged for the build, as `HydraniumDocumentBuilder.scheduleUpdate` takes it. */
|
|
23
|
+
readonly reason?: string;
|
|
24
|
+
/** Asked again inside the lock, where a build that ran meanwhile may have made the request moot. */
|
|
25
|
+
readonly stillNeeded: () => boolean;
|
|
26
|
+
/** Build even while a {@link VersionSyncService.registerDeferredBuilds} check holds the URI back. */
|
|
27
|
+
readonly ignoreDeferred?: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Keeps each workspace root's `ModelLedger` record in step with the
|
|
32
|
+
* text store, and owns every build that syncs a root to its text or recovers
|
|
33
|
+
* one a build left behind.
|
|
34
|
+
*/
|
|
35
|
+
export interface VersionSyncService {
|
|
36
|
+
/**
|
|
37
|
+
* Report a root a factory, registry, integrity repair or other producer
|
|
38
|
+
* made. Below `Parsed` it is marked a placeholder. Otherwise `origin.version`,
|
|
39
|
+
* the store's version read before the parse, is recorded; a registered
|
|
40
|
+
* document is then reconciled with the store, re-versioned and recorded at
|
|
41
|
+
* the store's version of its text, built if behind, and announced on
|
|
42
|
+
* {@link onDidRecordModel}. `origin.text` stands for a root whose CST is not
|
|
43
|
+
* the text it describes.
|
|
44
|
+
*/
|
|
45
|
+
modelProduced(document: LangiumDocument, origin?: { version?: number; text?: string }): void;
|
|
46
|
+
/**
|
|
47
|
+
* Build `uri` from a `WorkspaceLock` read, so the build queues behind a
|
|
48
|
+
* running one rather than cancelling it. Requests made while one for `uri`
|
|
49
|
+
* is pending share its next build. Resolves once a build that carried this
|
|
50
|
+
* request completed, or once a check before a build found it no longer
|
|
51
|
+
* needed or deferred. A build a later write cancelled does not count: the
|
|
52
|
+
* request rides the next one. Rejects with the last build's error once builds
|
|
53
|
+
* carrying this request have failed more often than it may retry, so a
|
|
54
|
+
* caller waiting on the build can stop; the caller ends that failure, and
|
|
55
|
+
* logs it if nothing else reports it.
|
|
56
|
+
*/
|
|
57
|
+
requestRecoveryBuild(uri: URI, request: RecoveryBuildRequest): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Build `uri` unless it is {@link isSyncedTo synced to} `textVersion`, asked
|
|
60
|
+
* again inside the lock. `undefined` when no build is needed, else the
|
|
61
|
+
* {@link requestRecoveryBuild} promise.
|
|
62
|
+
*/
|
|
63
|
+
syncTo(uri: URI, textVersion: number): Promise<void> | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Build `document` through {@link requestRecoveryBuild}, unless it is no
|
|
66
|
+
* longer the document for its URI by then. Nothing waits on the build, so
|
|
67
|
+
* a failure is logged here.
|
|
68
|
+
*/
|
|
69
|
+
rebuildWhileCurrent(document: LangiumDocument): void;
|
|
70
|
+
/**
|
|
71
|
+
* Whether `uri`'s root was parsed from text at `textVersion` or later; requests
|
|
72
|
+
* nothing. A root with no recorded version or a placeholder counts as synced,
|
|
73
|
+
* since no build records a version for it, and so does a URI with no document.
|
|
74
|
+
*/
|
|
75
|
+
isSyncedTo(uri: URI, textVersion: number): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Register `isDeferred`, which answers whether its caller holds back a build
|
|
78
|
+
* of a URI it will request later, as the update handler does for a debounced
|
|
79
|
+
* editor change. A caller that drops a held change has to leave the URI to
|
|
80
|
+
* another build.
|
|
81
|
+
*/
|
|
82
|
+
registerDeferredBuilds(isDeferred: (uri: URI) => boolean): Disposable;
|
|
83
|
+
/**
|
|
84
|
+
* Fires for every reconciled root. A cancel cannot skip it, unlike a
|
|
85
|
+
* `Parsed` phase listener. It can fire inside a build's write lock, so a
|
|
86
|
+
* listener that requests a build must not await it.
|
|
87
|
+
*/
|
|
88
|
+
readonly onDidRecordModel: Event<LangiumDocument>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** A request waiting in {@link PendingRecoveryBuilds}, with the failed builds that carried it. */
|
|
92
|
+
export interface QueuedRecoveryBuild {
|
|
93
|
+
readonly request: RecoveryBuildRequest;
|
|
94
|
+
failures: number;
|
|
95
|
+
/** Settles the request once a build carried it or it was no longer needed. */
|
|
96
|
+
readonly resolve: () => void;
|
|
97
|
+
/** Settles the request once it has used its retries, with the last build's error. */
|
|
98
|
+
readonly reject: (error: unknown) => void;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The requests waiting on one URI's builds in {@link DefaultVersionSyncService}. */
|
|
102
|
+
export interface PendingRecoveryBuilds {
|
|
103
|
+
readonly queued: QueuedRecoveryBuild[];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Collaborators are resolved per call: the registry and its document factory,
|
|
108
|
+
* which construct each other, report roots to this service.
|
|
109
|
+
*/
|
|
110
|
+
export class DefaultVersionSyncService implements VersionSyncService {
|
|
111
|
+
protected readonly tracer: Tracer;
|
|
112
|
+
protected readonly recordedEmitter = new Emitter<LangiumDocument>();
|
|
113
|
+
protected readonly deferredBuildChecks = new Set<(uri: URI) => boolean>();
|
|
114
|
+
protected readonly pendingBuilds = new Map<string, PendingRecoveryBuilds>();
|
|
115
|
+
/** Retries of each request after a failed build before it is rejected. */
|
|
116
|
+
protected readonly maxBuildRetries: number = 1;
|
|
117
|
+
|
|
118
|
+
constructor(
|
|
119
|
+
protected readonly services: ServerSharedServices,
|
|
120
|
+
options: LogNameOptions = {}
|
|
121
|
+
) {
|
|
122
|
+
this.tracer = services.Tracer.for(options.logName ?? 'VersionSyncService').trace('instantiated');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
get onDidRecordModel(): Event<LangiumDocument> {
|
|
126
|
+
return this.recordedEmitter.event;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
modelProduced(document: LangiumDocument, origin: { version?: number; text?: string } = {}): void {
|
|
130
|
+
const workspace = this.services.workspace;
|
|
131
|
+
const ledger = workspace.ModelLedger;
|
|
132
|
+
const root = document.parseResult.value;
|
|
133
|
+
if (document.state < DocumentState.Parsed) {
|
|
134
|
+
ledger.markPlaceholder(root);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (origin.version !== undefined) {
|
|
138
|
+
ledger.record(root, origin.version, origin.text);
|
|
139
|
+
}
|
|
140
|
+
const store = workspace.TextDocuments;
|
|
141
|
+
// Unregistered, it is a probe or a load whose registration reports it again.
|
|
142
|
+
if (!(store instanceof HydraniumTextDocuments) || workspace.LangiumDocuments.getDocument(document.uri) !== document) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const uri = document.uri.toString();
|
|
146
|
+
// Against the parsed text: the text document may already hold a newer edit.
|
|
147
|
+
const version = store.reconcileExternalContent(uri, origin.text ?? this.parsedText(document));
|
|
148
|
+
if (version !== undefined) {
|
|
149
|
+
if (document.textDocument.version !== version) {
|
|
150
|
+
// An empty-changes update only re-stamps the version.
|
|
151
|
+
store.update(document.textDocument, [], version);
|
|
152
|
+
}
|
|
153
|
+
ledger.record(root, version, origin.text);
|
|
154
|
+
}
|
|
155
|
+
// Nothing waits on this build, so its failure ends here.
|
|
156
|
+
this.syncTo(document.uri, store.version(uri))?.catch((error: unknown) =>
|
|
157
|
+
this.tracer.withUri(uri).error(`The build that would sync the root to its text failed. ${describeErrorWithStack(error)}`)
|
|
158
|
+
);
|
|
159
|
+
this.recordedEmitter.fire(document);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
syncTo(uri: URI, textVersion: number): Promise<void> | undefined {
|
|
163
|
+
const behind = (): boolean => !this.isSyncedTo(uri, textVersion);
|
|
164
|
+
return behind() ? this.requestRecoveryBuild(uri, { stillNeeded: behind }) : undefined;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
rebuildWhileCurrent(document: LangiumDocument): void {
|
|
168
|
+
const uri = document.uri;
|
|
169
|
+
this.requestRecoveryBuild(uri, { stillNeeded: () => this.services.workspace.LangiumDocuments.getDocument(uri) === document }).catch(
|
|
170
|
+
(error: unknown) =>
|
|
171
|
+
this.tracer.withUri(uri.toString()).error(`The rebuild of a current document failed. ${describeErrorWithStack(error)}`)
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
requestRecoveryBuild(uri: URI, request: RecoveryBuildRequest): Promise<void> {
|
|
176
|
+
return new Promise<void>((resolve, reject) => {
|
|
177
|
+
const key = uri.toString();
|
|
178
|
+
const queued: QueuedRecoveryBuild = { request, failures: 0, resolve, reject };
|
|
179
|
+
const pending = this.pendingBuilds.get(key);
|
|
180
|
+
if (pending) {
|
|
181
|
+
// Not dropped: the pending build may have read the text before this request's change.
|
|
182
|
+
pending.queued.push(queued);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const entry: PendingRecoveryBuilds = { queued: [queued] };
|
|
186
|
+
this.pendingBuilds.set(key, entry);
|
|
187
|
+
void this.runBuilds(key, uri, entry);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
registerDeferredBuilds(isDeferred: (uri: URI) => boolean): Disposable {
|
|
192
|
+
this.deferredBuildChecks.add(isDeferred);
|
|
193
|
+
return Disposable.create(() => this.deferredBuildChecks.delete(isDeferred));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
isSyncedTo(uri: URI, textVersion: number): boolean {
|
|
197
|
+
const root = this.services.workspace.LangiumDocuments.getDocument(uri)?.parseResult.value;
|
|
198
|
+
if (root === undefined) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
const ledger = this.services.workspace.ModelLedger;
|
|
202
|
+
const recorded = ledger.versionOf(root);
|
|
203
|
+
return recorded === UNRECORDED_VERSION || ledger.isPlaceholder(root) || recorded >= textVersion;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** The text `document`'s root was parsed from, or for a root built without either record or CST, the document's own. */
|
|
207
|
+
protected parsedText(document: LangiumDocument): string {
|
|
208
|
+
return this.services.workspace.ModelLedger.textOf(document.parseResult.value) ?? document.textDocument.getText();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Run `entry`'s requests, one build per batch, until none is queued, and
|
|
213
|
+
* settle each. A request a failed build carried is queued again
|
|
214
|
+
* {@link maxBuildRetries} times, then rejected; one a cancelled
|
|
215
|
+
* build carried is queued again without counting. The entry is dropped
|
|
216
|
+
* in the same tick as the last check of the queue, so no request lands in
|
|
217
|
+
* an entry nothing runs any more.
|
|
218
|
+
*/
|
|
219
|
+
protected async runBuilds(key: string, uri: URI, entry: PendingRecoveryBuilds): Promise<void> {
|
|
220
|
+
const tracer = this.tracer.withUri(key);
|
|
221
|
+
const lock = this.services.workspace.WorkspaceLock;
|
|
222
|
+
// Any other lock resolves a cancelled write as if it had completed, unnoticed.
|
|
223
|
+
const counting = lock instanceof HydraniumWorkspaceLock ? lock : undefined;
|
|
224
|
+
while (entry.queued.length > 0) {
|
|
225
|
+
let carried: QueuedRecoveryBuild[] = [];
|
|
226
|
+
let build: Promise<void> | undefined;
|
|
227
|
+
let cancellations: number | undefined;
|
|
228
|
+
try {
|
|
229
|
+
// The read waits until no write runs or is queued. It must not await
|
|
230
|
+
// the build, a write that queues behind it.
|
|
231
|
+
await lock.read(() => {
|
|
232
|
+
carried = entry.queued.splice(0);
|
|
233
|
+
const needed = carried.filter(queued => this.isStillNeeded(uri, queued.request));
|
|
234
|
+
carried.filter(queued => !needed.includes(queued)).forEach(queued => queued.resolve());
|
|
235
|
+
carried = needed;
|
|
236
|
+
if (needed.length > 0) {
|
|
237
|
+
build = this.scheduleBatch(
|
|
238
|
+
uri,
|
|
239
|
+
needed.map(queued => queued.request)
|
|
240
|
+
);
|
|
241
|
+
// Read after the build is queued, which cancels the write before it.
|
|
242
|
+
cancellations = counting?.writeCancellations;
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
await build;
|
|
246
|
+
// A write cancelled the build, before it ran or while it did.
|
|
247
|
+
if (cancellations !== undefined && counting?.writeCancellations !== cancellations) {
|
|
248
|
+
entry.queued.unshift(...carried);
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
carried.forEach(queued => queued.resolve());
|
|
252
|
+
} catch (err: unknown) {
|
|
253
|
+
const retried = carried.filter(queued => queued.failures++ < this.maxBuildRetries);
|
|
254
|
+
const givenUp = carried.filter(queued => !retried.includes(queued));
|
|
255
|
+
if (retried.length > 0) {
|
|
256
|
+
// The only line about this failure when the retry succeeds.
|
|
257
|
+
tracer.warn(`Requested build failed; retrying. ${describeErrorWithStack(err)}`);
|
|
258
|
+
entry.queued.unshift(...retried);
|
|
259
|
+
}
|
|
260
|
+
if (givenUp.length > 0) {
|
|
261
|
+
// Each requester ends the failure, so the log line is theirs.
|
|
262
|
+
tracer.debug(`Requested build failed again; giving up. ${describeError(err)}`);
|
|
263
|
+
givenUp.forEach(queued => queued.reject(err));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
this.pendingBuilds.delete(key);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/** Whether `request` still needs its build, and no deferral it heeds holds it back. Runs inside the lock read. */
|
|
271
|
+
protected isStillNeeded(uri: URI, request: RecoveryBuildRequest): boolean {
|
|
272
|
+
return request.stillNeeded() && (request.ignoreDeferred === true || !this.isDeferred(uri));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* One build for every request of `batch`, removing the document when the
|
|
277
|
+
* latest of them asks to, as `HydraniumDocumentBuilder.scheduleUpdate`
|
|
278
|
+
* merges a change and a deletion. Runs inside the lock read.
|
|
279
|
+
*/
|
|
280
|
+
protected scheduleBatch(uri: URI, batch: readonly RecoveryBuildRequest[]): Promise<void> {
|
|
281
|
+
const deleted = batch.at(-1)?.deleted === true;
|
|
282
|
+
const reason = batch.find(request => request.reason !== undefined)?.reason;
|
|
283
|
+
return this.services.workspace.DocumentBuilder.scheduleUpdate(deleted ? [] : [uri], deleted ? [uri] : [], reason);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
protected isDeferred(uri: URI): boolean {
|
|
287
|
+
return [...this.deferredBuildChecks].some(isDeferred => isDeferred(uri));
|
|
288
|
+
}
|
|
289
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -28,12 +28,15 @@ export * from './langium/project/index.js';
|
|
|
28
28
|
export * from './langium/residency/index.js';
|
|
29
29
|
export * from './langium/scope/index.js';
|
|
30
30
|
export * from './langium/serialization/index.js';
|
|
31
|
+
export * from './langium/trivia/index.js';
|
|
31
32
|
export * from './langium/transfer/index.js';
|
|
32
33
|
export * from './langium/update-rewrite/index.js';
|
|
33
34
|
export * from './langium/validation/index.js';
|
|
34
35
|
export * from './langium/workspace/index.js';
|
|
35
36
|
export * from './langium/service-registry.js';
|
|
36
37
|
export * from './langium/language-types.js';
|
|
38
|
+
export * from './langium/composite-ast-reflection.js';
|
|
39
|
+
export * from './langium/single-langium-copy.js';
|
|
37
40
|
export * from './launcher/index.js';
|
|
38
41
|
export * from './locale/index.js';
|
|
39
42
|
// The renderer only. The `./messages` subpath additionally enumerates this
|
|
@@ -15,6 +15,35 @@ import { type ServerLanguageServices } from '../language-module.js';
|
|
|
15
15
|
import { Registry, type RegistryItem } from '../../util/registry.js';
|
|
16
16
|
import { type AstExtensionRegistry } from './ast-extension-contribution.js';
|
|
17
17
|
|
|
18
|
+
/**
|
|
19
|
+
* The document-build phases an {@link AstExtension} may fire at. `Changed` has
|
|
20
|
+
* no AST yet, and `IndexedContent` carries the same per-document information
|
|
21
|
+
* as `Parsed`, so neither is one.
|
|
22
|
+
*/
|
|
23
|
+
export type AstExtensionPhase =
|
|
24
|
+
| DocumentState.Parsed
|
|
25
|
+
| DocumentState.ComputedScopes
|
|
26
|
+
| DocumentState.Linked
|
|
27
|
+
| DocumentState.IndexedReferences
|
|
28
|
+
| DocumentState.Validated;
|
|
29
|
+
|
|
30
|
+
export namespace AstExtensionPhase {
|
|
31
|
+
/**
|
|
32
|
+
* Every {@link AstExtensionPhase}, in build order. `BuildPipelineIntegration`
|
|
33
|
+
* wires one `onDocumentPhase` listener per entry and `register` refuses a
|
|
34
|
+
* phase outside it, so the two cannot drift apart. A fresh array each call.
|
|
35
|
+
*/
|
|
36
|
+
export function all(): readonly AstExtensionPhase[] {
|
|
37
|
+
return [
|
|
38
|
+
DocumentState.Parsed,
|
|
39
|
+
DocumentState.ComputedScopes,
|
|
40
|
+
DocumentState.Linked,
|
|
41
|
+
DocumentState.IndexedReferences,
|
|
42
|
+
DocumentState.Validated
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
18
47
|
/**
|
|
19
48
|
* A registration that derives data from an AST node and attaches it to the
|
|
20
49
|
* node at a declared document-build phase.
|
|
@@ -29,20 +58,23 @@ import { type AstExtensionRegistry } from './ast-extension-contribution.js';
|
|
|
29
58
|
* are stored as non-enumerable own properties. Otherwise symbol providers,
|
|
30
59
|
* folding, semantic tokens, and validators will treat them as real children.
|
|
31
60
|
*
|
|
32
|
-
* **Phase semantics:** {@link
|
|
61
|
+
* **Phase semantics:** {@link phase} declares the single phase at which
|
|
33
62
|
* {@link compute} fires. The framework wires one `onDocumentPhase` listener per
|
|
34
|
-
*
|
|
35
|
-
* registrations declare — so
|
|
36
|
-
* adding one is a framework change, not a registration-time choice.
|
|
63
|
+
* {@link AstExtensionPhase} unconditionally, rather than deriving the set from
|
|
64
|
+
* the phases registrations declare — so `register` refuses any other phase,
|
|
65
|
+
* and adding one is a framework change, not a registration-time choice.
|
|
37
66
|
*
|
|
38
|
-
* **`.ref`-dependent derivations: declare `
|
|
67
|
+
* **`.ref`-dependent derivations: declare `phase: ComputedScopes`, not `Linked`.**
|
|
39
68
|
* Lazy reference resolution is available from `ComputedScopes` onward — the
|
|
40
69
|
* global scope is built by `IndexedContent` (which runs before
|
|
41
70
|
* `ComputedScopes`), so reading a reference's `.ref` inside a `ComputedScopes`
|
|
42
71
|
* callback triggers Langium's lazy lookup and returns the resolved target node.
|
|
72
|
+
* A cascade rebuild does not re-run such a derivation unless
|
|
73
|
+
* {@link DocumentBuilderOptions.refreshCrossDocumentComputedScopes} is set, so
|
|
74
|
+
* one that reads another document's node goes stale when that node changes.
|
|
43
75
|
*
|
|
44
|
-
* **DO NOT** stage a `
|
|
45
|
-
* via a separate `
|
|
76
|
+
* **DO NOT** stage a `phase: ComputedScopes` placeholder hoping to refine it
|
|
77
|
+
* via a separate `phase: Linked` registration when a downstream consumer
|
|
46
78
|
* (typically a `ScopeExtension.addDescriptions` firing during link)
|
|
47
79
|
* iterates the derived value to build a scope: `onDocumentPhase(Linked)` fires
|
|
48
80
|
* AFTER Langium's `Linker.link()` has already walked the document, by which
|
|
@@ -60,32 +92,26 @@ export interface AstExtension<T extends AstNode = AstNode> extends RegistryItem
|
|
|
60
92
|
/**
|
|
61
93
|
* Per-document early-out. When set, the framework only invokes the
|
|
62
94
|
* registration's callback for documents the filter accepts. If every
|
|
63
|
-
* registration at a given
|
|
95
|
+
* registration at a given phase rejects the document, the framework skips
|
|
64
96
|
* the `streamAllContents` walk entirely — important for large workspaces
|
|
65
97
|
* where most documents carry none of the AST shapes a given extension
|
|
66
98
|
* targets.
|
|
67
99
|
*
|
|
68
|
-
* Default: no filter (registration applies to every document at its
|
|
100
|
+
* Default: no filter (registration applies to every document at its phase).
|
|
69
101
|
*/
|
|
70
102
|
documentFilter?: (document: LangiumDocument) => boolean;
|
|
71
103
|
/**
|
|
72
|
-
* The single document-build
|
|
104
|
+
* The single document-build phase at which {@link compute} fires.
|
|
73
105
|
*
|
|
74
|
-
* Useful values:
|
|
75
106
|
* - `Parsed` — derivations from AST shape only, no `.ref` reads.
|
|
76
|
-
* - `ComputedScopes` — lazy `.ref` resolution available; the most common
|
|
107
|
+
* - `ComputedScopes` — lazy `.ref` resolution available; the most common.
|
|
77
108
|
* - `Linked` — derivations needing fully resolved cross-references.
|
|
78
109
|
* - `IndexedReferences` — cross-document reverse-lookup derivations.
|
|
79
110
|
* - `Validated` — derivations depending on diagnostics (rare).
|
|
80
|
-
*
|
|
81
|
-
* Any other state type-checks but never fires: the framework wires a
|
|
82
|
-
* listener only for the states above. `Changed` has no AST yet, and
|
|
83
|
-
* `IndexedContent` carries the same per-document information as `Parsed`,
|
|
84
|
-
* so neither is wired.
|
|
85
111
|
*/
|
|
86
|
-
|
|
112
|
+
phase: AstExtensionPhase;
|
|
87
113
|
/**
|
|
88
|
-
* Mutate `node` for this registration at {@link
|
|
114
|
+
* Mutate `node` for this registration at {@link phase}. The framework hands
|
|
89
115
|
* `node` typed as {@link Mutable} so computed / synthetic property
|
|
90
116
|
* assignments (`node._foo = ...`) compile without per-callback
|
|
91
117
|
* `asMutable(...)` casts.
|
|
@@ -109,18 +135,18 @@ export interface AstExtension<T extends AstNode = AstNode> extends RegistryItem
|
|
|
109
135
|
*
|
|
110
136
|
* Adopter overrides go through {@link DefaultAstExtensionService}; the
|
|
111
137
|
* interface keeps the public API stable while internals (the bucket-
|
|
112
|
-
* by-
|
|
138
|
+
* by-phase cache) stay `protected` on the default class.
|
|
113
139
|
*/
|
|
114
140
|
export interface AstExtensionService extends AstExtensionRegistry {
|
|
115
141
|
/**
|
|
116
142
|
* Run a single AST node through every registration declaring
|
|
117
|
-
* `phase
|
|
143
|
+
* `phase`. Honours `documentFilter` and `nodeFilter`.
|
|
118
144
|
* Primarily for tests that need to invoke an extension callback without
|
|
119
145
|
* driving Langium's full document-build pipeline.
|
|
120
146
|
*/
|
|
121
147
|
extendNode(node: AstNode, document: LangiumDocument, phase: DocumentState): void;
|
|
122
148
|
/**
|
|
123
|
-
* Re-run all `compute` callbacks declaring `phase`
|
|
149
|
+
* Re-run all `compute` callbacks declaring `phase` against
|
|
124
150
|
* every node in the document. Single-pass. Called by
|
|
125
151
|
* `BuildPipelineIntegration` from an `onDocumentPhase` listener;
|
|
126
152
|
* not for general adopter use.
|
|
@@ -145,18 +171,18 @@ export type AstExtensionServiceOptions = LogNameOptions;
|
|
|
145
171
|
* owns the registry + per-node logic, not the listener lifecycle.
|
|
146
172
|
*
|
|
147
173
|
* **Performance:** `extendDocument` shares a single `streamAllContents` walk
|
|
148
|
-
* per document per wired phase; cost is O(registrations-for-
|
|
149
|
-
* and it early-outs when no registration targets the
|
|
174
|
+
* per document per wired phase; cost is O(registrations-for-phase × nodes),
|
|
175
|
+
* and it early-outs when no registration targets the phase or the document.
|
|
150
176
|
*/
|
|
151
177
|
export class DefaultAstExtensionService implements AstExtensionService {
|
|
152
178
|
protected readonly extensions = new Registry<AstExtension>();
|
|
153
179
|
/**
|
|
154
|
-
* Per-
|
|
180
|
+
* Per-phase bucket of registrations targeting each phase. Rebuilt lazily
|
|
155
181
|
* on the first refresh after a registry mutation — staleness is detected
|
|
156
182
|
* via reference identity of the registry's cached array (see {@link Registry.all}).
|
|
157
183
|
*/
|
|
158
|
-
protected
|
|
159
|
-
protected
|
|
184
|
+
protected phaseBuckets = new Map<DocumentState, readonly AstExtension[]>();
|
|
185
|
+
protected phaseBucketsFor: readonly AstExtension[] | undefined;
|
|
160
186
|
|
|
161
187
|
protected readonly tracer: Tracer;
|
|
162
188
|
|
|
@@ -186,6 +212,16 @@ export class DefaultAstExtensionService implements AstExtensionService {
|
|
|
186
212
|
* which calls {@link extendDocument} for the wired phases.
|
|
187
213
|
*/
|
|
188
214
|
register<T extends AstNode>(extension: AstExtension<T>): Disposable {
|
|
215
|
+
// A phase outside the wired set type-checks only past a cast, and a
|
|
216
|
+
// registration there is accepted and never fires.
|
|
217
|
+
if (!AstExtensionPhase.all().includes(extension.phase)) {
|
|
218
|
+
throw new Error(
|
|
219
|
+
`AST extension '${extension.id}' registered at phase ${DocumentState[extension.phase]} would never fire. ` +
|
|
220
|
+
`Allowed phases are ${AstExtensionPhase.all()
|
|
221
|
+
.map(phase => DocumentState[phase])
|
|
222
|
+
.join(', ')}.`
|
|
223
|
+
);
|
|
224
|
+
}
|
|
189
225
|
// Cast: TypeScript can't see that `T extends AstNode` makes the extension
|
|
190
226
|
// assignable to the default-parameter form. The runtime contract is the same.
|
|
191
227
|
return this.extensions.register(extension as AstExtension);
|
|
@@ -193,10 +229,10 @@ export class DefaultAstExtensionService implements AstExtensionService {
|
|
|
193
229
|
|
|
194
230
|
/**
|
|
195
231
|
* Production code goes through {@link extendDocument} via the
|
|
196
|
-
* `onDocumentPhase(
|
|
232
|
+
* `onDocumentPhase(phase)` listener wired by `BuildPipelineIntegration`.
|
|
197
233
|
*/
|
|
198
234
|
extendNode(node: AstNode, document: LangiumDocument, phase: DocumentState): void {
|
|
199
|
-
const bucket = this.
|
|
235
|
+
const bucket = this.getPhaseBucket(phase);
|
|
200
236
|
for (const extension of bucket) {
|
|
201
237
|
if (extension.documentFilter && !extension.documentFilter(document)) {
|
|
202
238
|
continue;
|
|
@@ -225,7 +261,7 @@ export class DefaultAstExtensionService implements AstExtensionService {
|
|
|
225
261
|
if (cancelToken?.isCancellationRequested) {
|
|
226
262
|
return;
|
|
227
263
|
}
|
|
228
|
-
const bucket = this.
|
|
264
|
+
const bucket = this.getPhaseBucket(phase);
|
|
229
265
|
if (bucket.length === 0) {
|
|
230
266
|
return;
|
|
231
267
|
}
|
|
@@ -258,33 +294,33 @@ export class DefaultAstExtensionService implements AstExtensionService {
|
|
|
258
294
|
}
|
|
259
295
|
|
|
260
296
|
/**
|
|
261
|
-
* Bucket-by-
|
|
297
|
+
* Bucket-by-phase view of {@link extensions}, rebuilt lazily when the
|
|
262
298
|
* registry's cached `all()` reference changes. Replaces per-call allocation
|
|
263
299
|
* on the per-node hot path — for a workspace with many documents at the
|
|
264
|
-
* same
|
|
300
|
+
* same phase, the bucket is computed once and reused until the next
|
|
265
301
|
* register / unregister.
|
|
266
302
|
*/
|
|
267
|
-
protected
|
|
303
|
+
protected getPhaseBucket(phase: DocumentState): readonly AstExtension[] {
|
|
268
304
|
const current = this.extensions.all();
|
|
269
|
-
if (this.
|
|
305
|
+
if (this.phaseBucketsFor !== current) {
|
|
270
306
|
const next = new Map<DocumentState, AstExtension[]>();
|
|
271
307
|
for (const extension of current) {
|
|
272
|
-
let bucket = next.get(extension.
|
|
308
|
+
let bucket = next.get(extension.phase);
|
|
273
309
|
if (!bucket) {
|
|
274
310
|
bucket = [];
|
|
275
|
-
next.set(extension.
|
|
311
|
+
next.set(extension.phase, bucket);
|
|
276
312
|
}
|
|
277
313
|
bucket.push(extension);
|
|
278
314
|
}
|
|
279
|
-
this.
|
|
280
|
-
this.
|
|
315
|
+
this.phaseBuckets = next;
|
|
316
|
+
this.phaseBucketsFor = current;
|
|
281
317
|
}
|
|
282
|
-
return this.
|
|
318
|
+
return this.phaseBuckets.get(phase) ?? EMPTY_PHASE_BUCKET;
|
|
283
319
|
}
|
|
284
320
|
}
|
|
285
321
|
|
|
286
|
-
/** Shared empty result so `
|
|
287
|
-
const
|
|
322
|
+
/** Shared empty result so `getPhaseBucket` doesn't allocate per call on the cold path. */
|
|
323
|
+
const EMPTY_PHASE_BUCKET: readonly AstExtension[] = Object.freeze([]);
|
|
288
324
|
|
|
289
325
|
/**
|
|
290
326
|
* Assign a non-enumerable own property — for synthetic children that must NOT
|