@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,7 +7,7 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Format } from '@hydranium/protocol';
|
|
10
|
+
import { Format, type Stopwatch, SystemClock } from '@hydranium/protocol';
|
|
11
11
|
import { DocumentState, type LangiumDocuments } from '@hydranium/langium';
|
|
12
12
|
import { isCstShed } from '../langium/residency/cst-residency-service.js';
|
|
13
13
|
import { performance } from 'node:perf_hooks';
|
|
@@ -15,7 +15,7 @@ import * as v8 from 'node:v8';
|
|
|
15
15
|
|
|
16
16
|
/** Cumulative samples kept across calls so each snapshot can report deltas. */
|
|
17
17
|
interface DeltaState {
|
|
18
|
-
|
|
18
|
+
sinceSample: Stopwatch;
|
|
19
19
|
cpu: NodeJS.CpuUsage;
|
|
20
20
|
elu: { idle: number; active: number };
|
|
21
21
|
}
|
|
@@ -42,8 +42,7 @@ export interface ServerStateSnapshotOptions {
|
|
|
42
42
|
* `HydraniumTextDocuments.openDocuments()`). When set, the snapshot lists
|
|
43
43
|
* them — the observable for client-release bugs: a document that lingers
|
|
44
44
|
* here after its editor closed names the client that failed to close it,
|
|
45
|
-
* and under a shedding policy
|
|
46
|
-
* shedding.
|
|
45
|
+
* and under a shedding policy no shed starts for any of them.
|
|
47
46
|
*/
|
|
48
47
|
readonly openDocuments?: readonly OpenDocumentEntry[];
|
|
49
48
|
/**
|
|
@@ -62,7 +61,7 @@ export interface ServerStateSnapshotOptions {
|
|
|
62
61
|
* requested via `options` ({@link ServerStateSnapshotOptions}).
|
|
63
62
|
*/
|
|
64
63
|
export function formatServerState(documents?: LangiumDocuments, label?: string, options?: ServerStateSnapshotOptions): string {
|
|
65
|
-
const
|
|
64
|
+
const sinceSample = new SystemClock().stopwatch();
|
|
66
65
|
const mem = process.memoryUsage();
|
|
67
66
|
const heap = v8.getHeapStatistics();
|
|
68
67
|
const cpu = process.cpuUsage();
|
|
@@ -87,7 +86,7 @@ export function formatServerState(documents?: LangiumDocuments, label?: string,
|
|
|
87
86
|
`native contexts ${heap.number_of_native_contexts}, detached contexts ${heap.number_of_detached_contexts}`
|
|
88
87
|
);
|
|
89
88
|
if (lastSample) {
|
|
90
|
-
const wallMs =
|
|
89
|
+
const wallMs = lastSample.sinceSample.elapsedMs;
|
|
91
90
|
const userMs = (cpu.user - lastSample.cpu.user) / 1000;
|
|
92
91
|
const systemMs = (cpu.system - lastSample.cpu.system) / 1000;
|
|
93
92
|
const cpuPct = wallMs > 0 ? Math.round(((userMs + systemMs) / wallMs) * 100) : 0;
|
|
@@ -138,7 +137,7 @@ export function formatServerState(documents?: LangiumDocuments, label?: string,
|
|
|
138
137
|
}
|
|
139
138
|
}
|
|
140
139
|
|
|
141
|
-
lastSample = {
|
|
140
|
+
lastSample = { sinceSample, cpu, elu };
|
|
142
141
|
return lines.join('\n');
|
|
143
142
|
}
|
|
144
143
|
|
|
@@ -7,17 +7,30 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Deferred } from '@hydranium/langium';
|
|
11
10
|
import * as net from 'node:net';
|
|
12
|
-
import type
|
|
11
|
+
import { Deferred, describeError, describeErrorWithStack, type Disposable, type Logger } from '@hydranium/protocol';
|
|
13
12
|
import { createMessageConnection, SocketMessageReader, SocketMessageWriter } from 'vscode-jsonrpc/node';
|
|
14
13
|
import type { MessageConnection } from 'vscode-jsonrpc';
|
|
15
14
|
import type { IntegratedServer } from '../launcher/integrated-server.js';
|
|
15
|
+
import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
|
|
16
|
+
import { initializeWorkspaceWithoutLsp, type WorkspaceFolderInput } from '../langium/workspace/initialize-workspace.js';
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* Construction-time options for {@link startSocketServer}.
|
|
19
20
|
*/
|
|
20
21
|
export interface SocketServerOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Shared services tree the head serves from. Without an LSP head the
|
|
24
|
+
* launcher brings its workspace up before listening, so a client never
|
|
25
|
+
* reaches a workspace that is not up.
|
|
26
|
+
*/
|
|
27
|
+
readonly shared: ServerSharedServicesMinimal;
|
|
28
|
+
/**
|
|
29
|
+
* Workspace root(s) to initialize — a filesystem path or a `URI`. Required
|
|
30
|
+
* when no LSP head is composed, refused beside one: see
|
|
31
|
+
* {@link initializeWorkspaceWithoutLsp}.
|
|
32
|
+
*/
|
|
33
|
+
readonly workspace?: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>;
|
|
21
34
|
/**
|
|
22
35
|
* Port to bind. Default `0` — OS-assigned ephemeral. Resolve the
|
|
23
36
|
* actual port off {@link StartedSocketServer.port} once `started`
|
|
@@ -25,9 +38,25 @@ export interface SocketServerOptions {
|
|
|
25
38
|
*/
|
|
26
39
|
readonly port?: number;
|
|
27
40
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
41
|
+
* Interface to bind. Default `'127.0.0.1'` (LOCAL ONLY) — a head whose
|
|
42
|
+
* port is OS-assigned and announced over the LSP connection is
|
|
43
|
+
* reachable only by a client on the same machine anyway, so a wider
|
|
44
|
+
* binding exposes a port nothing off-box can address. Matches
|
|
45
|
+
* `startGlspServer`'s default, so the two socket heads agree.
|
|
46
|
+
*
|
|
47
|
+
* Pass `'::'` for every interface: that is the dual-stack any-address,
|
|
48
|
+
* so both IPv4 and IPv6 clients connect. `'0.0.0.0'` is NOT the same —
|
|
49
|
+
* it takes IPv4 only and refuses `::1`.
|
|
50
|
+
*
|
|
51
|
+
* An address no local interface holds fails the bind, so `started`
|
|
52
|
+
* rejects with `EADDRNOTAVAIL` rather than falling back to a wider one.
|
|
53
|
+
*/
|
|
54
|
+
readonly host?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Optional logger for lifecycle lines and each connection's protocol
|
|
57
|
+
* faults. If omitted, the launcher runs silently — the adopter is expected
|
|
58
|
+
* to surface lifecycle events through their own logging in
|
|
59
|
+
* {@link OnClientConnection} if needed.
|
|
31
60
|
*/
|
|
32
61
|
readonly logger?: Logger;
|
|
33
62
|
/** Tag included in lifecycle log lines. Default `"SocketServer"`. */
|
|
@@ -56,10 +85,12 @@ export type OnClientConnection = (connection: MessageConnection) => Disposable;
|
|
|
56
85
|
/**
|
|
57
86
|
* Live socket server handle returned by {@link startSocketServer}.
|
|
58
87
|
*
|
|
59
|
-
* - {@link IntegratedServer.started} resolves once
|
|
60
|
-
* AND `port` is
|
|
88
|
+
* - {@link IntegratedServer.started} resolves once the workspace is up,
|
|
89
|
+
* where the launcher brings it up, AND `listen` resolves AND `port` is
|
|
90
|
+
* populated. It rejects, and nothing listens, when the bring-up fails.
|
|
61
91
|
* - {@link IntegratedServer.stopped} resolves when the underlying
|
|
62
|
-
* `net.Server` emits `close
|
|
92
|
+
* `net.Server` emits `close`, or once a failed bring-up has rejected
|
|
93
|
+
* `started`.
|
|
63
94
|
* - {@link port} is undefined until `started` resolves.
|
|
64
95
|
* - {@link close} triggers shutdown: disposes all active client
|
|
65
96
|
* connections and closes the underlying `net.Server`.
|
|
@@ -82,12 +113,17 @@ export interface StartedSocketServer extends IntegratedServer {
|
|
|
82
113
|
* close / server shutdown. Adopters keep per-client instance creation
|
|
83
114
|
* (their server objects) but don't re-implement the tracking machinery.
|
|
84
115
|
*
|
|
116
|
+
* **Without an LSP head the launcher brings the workspace up, then
|
|
117
|
+
* listens**, as `startStdioServer` does: a request served before the
|
|
118
|
+
* bring-up starts keeps its cross-file references unresolved for good.
|
|
119
|
+
*
|
|
85
120
|
* The port is only known once {@link StartedSocketServer.started} has
|
|
86
121
|
* resolved, so announcing it — via {@link publishPortOnLspConnection} —
|
|
87
122
|
* belongs after that await, not beside the call.
|
|
88
123
|
*/
|
|
89
124
|
export function startSocketServer(options: SocketServerOptions, onClientConnection: OnClientConnection): StartedSocketServer {
|
|
90
125
|
const port = options.port ?? 0;
|
|
126
|
+
const host = options.host ?? '127.0.0.1';
|
|
91
127
|
const logger = options.logger;
|
|
92
128
|
const tag = options.logTag ?? 'SocketServer';
|
|
93
129
|
const started = new Deferred<void>();
|
|
@@ -100,7 +136,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
100
136
|
const activeConnections: Array<{ connection: MessageConnection; adopterDisposable: Disposable }> = [];
|
|
101
137
|
|
|
102
138
|
const netServer = net.createServer(socket => {
|
|
103
|
-
const connection = createMessageConnection(new SocketMessageReader(socket), new SocketMessageWriter(socket));
|
|
139
|
+
const connection = createMessageConnection(new SocketMessageReader(socket), new SocketMessageWriter(socket), logger?.with(tag));
|
|
104
140
|
const adopterDisposable = onClientConnection(connection);
|
|
105
141
|
const entry = { connection, adopterDisposable };
|
|
106
142
|
activeConnections.push(entry);
|
|
@@ -115,7 +151,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
115
151
|
try {
|
|
116
152
|
adopterDisposable.dispose();
|
|
117
153
|
} catch (err) {
|
|
118
|
-
logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${(err
|
|
154
|
+
logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${describeErrorWithStack(err)}`);
|
|
119
155
|
}
|
|
120
156
|
connection.dispose();
|
|
121
157
|
const idx = activeConnections.indexOf(entry);
|
|
@@ -128,7 +164,34 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
128
164
|
connection.listen();
|
|
129
165
|
});
|
|
130
166
|
|
|
131
|
-
|
|
167
|
+
// The workspace manager logs a failed initialization itself; a refused
|
|
168
|
+
// `workspace` throws before `initializing` is set.
|
|
169
|
+
let initializing = false;
|
|
170
|
+
let closed = false;
|
|
171
|
+
const begin = async (): Promise<void> => {
|
|
172
|
+
const initialization = initializeWorkspaceWithoutLsp(options.shared, options.workspace);
|
|
173
|
+
initializing = true;
|
|
174
|
+
await initialization;
|
|
175
|
+
initializing = false;
|
|
176
|
+
// A `close` during the bring-up has resolved `stopped` already.
|
|
177
|
+
if (closed) {
|
|
178
|
+
started.reject(new Error(`${tag} was closed before it listened`));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
netServer.listen(port, host);
|
|
182
|
+
};
|
|
183
|
+
begin().catch((err: unknown) => {
|
|
184
|
+
if (initializing) {
|
|
185
|
+
logger?.debug(`[${tag}] Startup failed: the workspace did not initialize. ${describeError(err)}`);
|
|
186
|
+
} else {
|
|
187
|
+
logger?.error(`[${tag}] Startup failed: ${describeErrorWithStack(err)}`);
|
|
188
|
+
}
|
|
189
|
+
started.reject(err);
|
|
190
|
+
stopped.resolve();
|
|
191
|
+
});
|
|
192
|
+
// `started` is always observed internally, as `startStdioServer`'s is, so a
|
|
193
|
+
// caller that closes early and ignores it cannot crash the process.
|
|
194
|
+
void started.promise.catch(() => undefined);
|
|
132
195
|
netServer.on('listening', () => {
|
|
133
196
|
const addressInfo = netServer.address();
|
|
134
197
|
if (!addressInfo) {
|
|
@@ -144,11 +207,11 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
144
207
|
return;
|
|
145
208
|
}
|
|
146
209
|
handle.port = addressInfo.port;
|
|
147
|
-
logger?.info(`[${tag}] Ready to accept new client requests on port: ${addressInfo.port}`);
|
|
210
|
+
logger?.info(`[${tag}] Ready to accept new client requests on ${addressInfo.address} port: ${addressInfo.port}`);
|
|
148
211
|
started.resolve();
|
|
149
212
|
});
|
|
150
213
|
netServer.on('error', err => {
|
|
151
|
-
logger?.error(`[${tag}] Error: ${err
|
|
214
|
+
logger?.error(`[${tag}] Error: ${describeErrorWithStack(err)}`);
|
|
152
215
|
started.reject(err);
|
|
153
216
|
});
|
|
154
217
|
netServer.on('close', () => {
|
|
@@ -158,7 +221,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
158
221
|
try {
|
|
159
222
|
entry.adopterDisposable.dispose();
|
|
160
223
|
} catch (err) {
|
|
161
|
-
logger?.warn(`[${tag}] Adopter disposable threw on shutdown: ${(err
|
|
224
|
+
logger?.warn(`[${tag}] Adopter disposable threw on shutdown: ${describeErrorWithStack(err)}`);
|
|
162
225
|
}
|
|
163
226
|
entry.connection.dispose();
|
|
164
227
|
}
|
|
@@ -173,6 +236,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
173
236
|
started: started.promise,
|
|
174
237
|
stopped: stopped.promise,
|
|
175
238
|
close(): void {
|
|
239
|
+
closed = true;
|
|
176
240
|
netServer.close();
|
|
177
241
|
}
|
|
178
242
|
};
|
|
@@ -0,0 +1,94 @@
|
|
|
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 { DEFAULT_CPU_PROFILE_FILE_ENV } from '@hydranium/protocol';
|
|
11
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { Session } from 'node:inspector';
|
|
13
|
+
import { dirname } from 'node:path';
|
|
14
|
+
import { isMainThread } from 'node:worker_threads';
|
|
15
|
+
import { expandLogFilePlaceholders } from '../langium/diagnostics/logger.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Marks the profile started on `globalThis` rather than in this module, since
|
|
19
|
+
* a second installed copy of the package loads its own module and would start
|
|
20
|
+
* a second session writing a profile of its own.
|
|
21
|
+
*/
|
|
22
|
+
const CPU_PROFILE_STARTED: unique symbol = Symbol.for('@hydranium/core#startupCpuProfileStarted');
|
|
23
|
+
const processGlobal = globalThis as typeof globalThis & { [CPU_PROFILE_STARTED]?: true };
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Start profiling this process when {@link DEFAULT_CPU_PROFILE_FILE_ENV} is
|
|
27
|
+
* set, and write the profile once, on `exit` or on SIGTERM. Called when
|
|
28
|
+
* `@hydranium/core/node` loads, so every Node head is profiled from before its
|
|
29
|
+
* workspace load; a no-op on a second call, from any copy of the package, and
|
|
30
|
+
* in a `worker_threads` worker.
|
|
31
|
+
*
|
|
32
|
+
* `--cpu-prof` is no substitute: it writes only on a normal exit, and SIGTERM
|
|
33
|
+
* ends a process without one. The SIGTERM listener re-raises the signal when it
|
|
34
|
+
* is the only one, so the process still ends by it; another listener keeps
|
|
35
|
+
* control of the ending. Samples accumulate for the life of the process, so
|
|
36
|
+
* this is for test runs, not a production server.
|
|
37
|
+
*
|
|
38
|
+
* A head in a worker is not profiled: a worker's session would write the main
|
|
39
|
+
* thread's file, since threads share the pid, no signal reaches it, and its
|
|
40
|
+
* `exit` listeners run neither when it is terminated nor when the process ends.
|
|
41
|
+
*
|
|
42
|
+
* A `ProfileCapture` window runs beside it in its own inspector session.
|
|
43
|
+
*/
|
|
44
|
+
export function startCpuProfileFromEnv(): void {
|
|
45
|
+
const template = process.env[DEFAULT_CPU_PROFILE_FILE_ENV];
|
|
46
|
+
if (!template || !isMainThread || processGlobal[CPU_PROFILE_STARTED]) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
processGlobal[CPU_PROFILE_STARTED] = true;
|
|
50
|
+
const session = new Session();
|
|
51
|
+
session.connect();
|
|
52
|
+
session.post('Profiler.enable');
|
|
53
|
+
session.post('Profiler.start');
|
|
54
|
+
let written = false;
|
|
55
|
+
// Synchronous throughout: an in-process session answers `post` before it
|
|
56
|
+
// returns, and nothing asynchronous runs after `exit`. The session is
|
|
57
|
+
// disconnected from the answer, so nothing here depends on that order.
|
|
58
|
+
const write = (): void => {
|
|
59
|
+
if (written) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
written = true;
|
|
63
|
+
const file = expandLogFilePlaceholders(template);
|
|
64
|
+
session.post('Profiler.stop', (error, result) => {
|
|
65
|
+
try {
|
|
66
|
+
if (error) {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
70
|
+
writeFileSync(file, JSON.stringify(result.profile));
|
|
71
|
+
} catch (err: unknown) {
|
|
72
|
+
process.stderr.write(
|
|
73
|
+
`[hydranium] Could not write the CPU profile to ${file}: ${err instanceof Error ? err.message : String(err)}\n`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
session.disconnect();
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
process.once('exit', write);
|
|
80
|
+
// Registered until the write is done, not `once`: a `once` listener is gone
|
|
81
|
+
// before it runs, and with no listener left the default action ends the
|
|
82
|
+
// process on a second SIGTERM, which a host ending its process tree sends
|
|
83
|
+
// while the write is still running. Prepended: a `once` listener ahead of
|
|
84
|
+
// this one has removed itself by the time this counts, which would re-raise
|
|
85
|
+
// into its unfinished shutdown.
|
|
86
|
+
const writeOnSigterm = (): void => {
|
|
87
|
+
write();
|
|
88
|
+
process.removeListener('SIGTERM', writeOnSigterm);
|
|
89
|
+
if (process.listenerCount('SIGTERM') === 0) {
|
|
90
|
+
process.kill(process.pid, 'SIGTERM');
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
process.prependListener('SIGTERM', writeOnSigterm);
|
|
94
|
+
}
|
|
@@ -7,13 +7,12 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Deferred } from '@hydranium/
|
|
11
|
-
import type { Disposable, Logger } from '@hydranium/protocol';
|
|
10
|
+
import { Deferred, type Disposable, type Logger, describeError, describeErrorWithStack } from '@hydranium/protocol';
|
|
12
11
|
import type { MessageConnection } from 'vscode-jsonrpc';
|
|
13
12
|
import { createMessageConnection, StreamMessageReader, StreamMessageWriter } from 'vscode-jsonrpc/node';
|
|
14
13
|
import type { IntegratedServer } from '../launcher/integrated-server.js';
|
|
15
14
|
import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
|
|
16
|
-
import {
|
|
15
|
+
import { initializeWorkspaceWithoutLsp, type WorkspaceFolderInput } from '../langium/workspace/initialize-workspace.js';
|
|
17
16
|
|
|
18
17
|
/** Construction-time options for {@link startStdioServer}. */
|
|
19
18
|
export interface StdioServerOptions {
|
|
@@ -24,16 +23,17 @@ export interface StdioServerOptions {
|
|
|
24
23
|
*/
|
|
25
24
|
readonly shared: ServerSharedServicesMinimal;
|
|
26
25
|
/**
|
|
27
|
-
* Workspace root(s) to initialize — a filesystem path or a `URI`.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* Workspace root(s) to initialize — a filesystem path or a `URI`. Required
|
|
27
|
+
* when no LSP head is composed, refused beside one: see
|
|
28
|
+
* {@link initializeWorkspaceWithoutLsp}.
|
|
30
29
|
*/
|
|
31
30
|
readonly workspace?: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>;
|
|
32
31
|
/**
|
|
33
|
-
* Optional logger for lifecycle lines
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
32
|
+
* Optional logger for lifecycle lines and the connection's protocol
|
|
33
|
+
* faults. Omitted means silent — note that a logger writing to **stdout**
|
|
34
|
+
* would corrupt this head's protocol stream, so anything passed here must
|
|
35
|
+
* sink elsewhere. The framework's own `LspLogger` writes to stderr when no
|
|
36
|
+
* LSP connection is bound, which is correct here.
|
|
37
37
|
*/
|
|
38
38
|
readonly logger?: Logger;
|
|
39
39
|
/** Tag included in lifecycle log lines. Default `"StdioServer"`. */
|
|
@@ -66,11 +66,10 @@ export interface StartedStdioServer extends IntegratedServer {
|
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* Start a **stdio**-based protocol head — the transport `hydranium-cli` speaks,
|
|
69
|
-
* since
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* a launcher rather than four lines in each adopter's entry.
|
|
69
|
+
* since its data-server subcommands spawn a server command and drive JSON-RPC
|
|
70
|
+
* over its stdin/stdout. The socket counterpart is `startSocketServer`; the two
|
|
71
|
+
* differ more than the transport swap suggests, and the differences are the
|
|
72
|
+
* reason this is a launcher rather than four lines in each adopter's entry.
|
|
74
73
|
*
|
|
75
74
|
* **One client, not N.** A socket head accepts arbitrarily many connections and
|
|
76
75
|
* tracks them; a stdio head has exactly one peer — the process that spawned it
|
|
@@ -101,7 +100,8 @@ export function startStdioServer(
|
|
|
101
100
|
|
|
102
101
|
const connection = createMessageConnection(
|
|
103
102
|
new StreamMessageReader(options.input ?? process.stdin),
|
|
104
|
-
new StreamMessageWriter(options.output ?? process.stdout)
|
|
103
|
+
new StreamMessageWriter(options.output ?? process.stdout),
|
|
104
|
+
logger?.with(tag)
|
|
105
105
|
);
|
|
106
106
|
const adopterDisposable = onConnection(connection);
|
|
107
107
|
|
|
@@ -114,18 +114,24 @@ export function startStdioServer(
|
|
|
114
114
|
try {
|
|
115
115
|
adopterDisposable.dispose();
|
|
116
116
|
} catch (err: unknown) {
|
|
117
|
-
logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${
|
|
117
|
+
logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${describeErrorWithStack(err)}`);
|
|
118
118
|
}
|
|
119
119
|
connection.dispose();
|
|
120
120
|
stopped.resolve();
|
|
121
121
|
};
|
|
122
122
|
connection.onClose(() => close());
|
|
123
123
|
|
|
124
|
+
// The workspace manager logs a failed initialization itself; a refused
|
|
125
|
+
// `workspace` throws before `initializing` is set.
|
|
126
|
+
let initializing = false;
|
|
124
127
|
const begin = async (): Promise<void> => {
|
|
128
|
+
const initialization = initializeWorkspaceWithoutLsp(options.shared, options.workspace);
|
|
129
|
+
initializing = true;
|
|
125
130
|
if (options.workspace !== undefined) {
|
|
126
131
|
logger?.info(`[${tag}] Initializing workspace`);
|
|
127
|
-
await initializeWorkspaceProgrammatically(options.shared, options.workspace);
|
|
128
132
|
}
|
|
133
|
+
await initialization;
|
|
134
|
+
initializing = false;
|
|
129
135
|
// Only now attach the reader — see the ordering note in the doc above.
|
|
130
136
|
connection.listen();
|
|
131
137
|
logger?.info(`[${tag}] Listening on stdio`);
|
|
@@ -137,7 +143,11 @@ export function startStdioServer(
|
|
|
137
143
|
// A failed startup must not leave a half-live head: report it on
|
|
138
144
|
// `started` and tear the connection down rather than listening over an
|
|
139
145
|
// uninitialized workspace.
|
|
140
|
-
|
|
146
|
+
if (initializing) {
|
|
147
|
+
logger?.debug(`[${tag}] Startup failed: the workspace did not initialize. ${describeError(err)}`);
|
|
148
|
+
} else {
|
|
149
|
+
logger?.error(`[${tag}] Startup failed: ${describeErrorWithStack(err)}`);
|
|
150
|
+
}
|
|
141
151
|
started.reject(err);
|
|
142
152
|
close();
|
|
143
153
|
}
|
|
@@ -48,7 +48,7 @@ export interface ValidationCounts {
|
|
|
48
48
|
export interface WorkspaceValidationResult {
|
|
49
49
|
/** Number of `LangiumDocument`s in the built workspace. */
|
|
50
50
|
documents: number;
|
|
51
|
-
/** Every problem found, grouped contiguously by document, in the order the documents were given. */
|
|
51
|
+
/** Every problem found, grouped contiguously by document, in the order the documents were given, and by position within one. */
|
|
52
52
|
findings: ValidationFinding[];
|
|
53
53
|
/** Per-severity totals over {@link findings}. */
|
|
54
54
|
counts: ValidationCounts;
|
|
@@ -94,7 +94,13 @@ export function collectValidationResult(
|
|
|
94
94
|
const counts: ValidationCounts = { error: 0, warning: 0, info: 0, hint: 0 };
|
|
95
95
|
for (const document of documents) {
|
|
96
96
|
const relativeUri = wsRelativePath(document.uri);
|
|
97
|
-
|
|
97
|
+
// Langium appends the lexer, parser, linker and validator diagnostics phase after phase,
|
|
98
|
+
// so a reader scanning a file top to bottom needs them sorted. The sort is stable, so
|
|
99
|
+
// diagnostics at one position keep the order their phases produced them in.
|
|
100
|
+
const diagnostics = [...((document.diagnostics ?? []) as Diagnostic[])].sort(
|
|
101
|
+
(a, b) => a.range.start.line - b.range.start.line || a.range.start.character - b.range.start.character
|
|
102
|
+
);
|
|
103
|
+
for (const diagnostic of diagnostics) {
|
|
98
104
|
const severity = severityLabel(diagnostic.severity);
|
|
99
105
|
counts[severity] += 1;
|
|
100
106
|
findings.push({
|
|
@@ -96,7 +96,7 @@ export function documentUriPolicyConformance(
|
|
|
96
96
|
// Computed here rather than tallied from the assertions above, so the
|
|
97
97
|
// guard does not depend on the runner executing tests in declaration
|
|
98
98
|
// order (a `--shuffle` run would otherwise read it as zero).
|
|
99
|
-
it(`at least one sample URI is loadable
|
|
99
|
+
it(`at least one sample URI is loadable among ${sampleUris.join(', ')}`, () => {
|
|
100
100
|
const loadable = sampleUris.filter(uri => makePolicy().loadUri(uri) !== undefined);
|
|
101
101
|
expect(loadable.length > 0).toBe(true);
|
|
102
102
|
});
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { DocumentState, type AstNode, type AstReflection, type LangiumDocument, UriUtils, type URI } from '@hydranium/langium';
|
|
11
11
|
import { buildAstNode } from '../langium/ast-extension/ast-node-builder.js';
|
|
12
|
+
import { type AstDiagnostic } from '../langium/validation/document-validator.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Build a typed AST-node fixture for unit tests.
|
|
@@ -104,7 +105,7 @@ function stringifyFakeRoot(root: unknown): string {
|
|
|
104
105
|
* staging. Override via `options.state` for tests that gate on earlier
|
|
105
106
|
* phases.
|
|
106
107
|
*/
|
|
107
|
-
export function makeFakeDocument<TAst extends AstNode = AstNode, TDiagnostic =
|
|
108
|
+
export function makeFakeDocument<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(
|
|
108
109
|
uri: string | URI,
|
|
109
110
|
root: TAst,
|
|
110
111
|
options: FakeDocumentOptions<TAst, TDiagnostic> = {}
|
package/src/testing/index.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* builders, the snapshot and URI-policy conformance primitives, the
|
|
15
15
|
* structured-write pipeline driver, and a re-export of `langium/test`.
|
|
16
16
|
*
|
|
17
|
-
* Neutrality is gated (`scripts/check-neutral-bundles.
|
|
17
|
+
* Neutrality is gated (`scripts/check-neutral-bundles.mts`). The test support
|
|
18
18
|
* that needs a real filesystem or a Node stream transport — the scratch
|
|
19
19
|
* workspace, the golden corpus, the LSP transport and its harness — lives at
|
|
20
20
|
* `@hydranium/core/testing/node`, on the same rule the package surface uses:
|
|
@@ -26,6 +26,7 @@ export * from './document-uri-policy-conformance.js';
|
|
|
26
26
|
export * from './fake-description.js';
|
|
27
27
|
export * from './fake-document.js';
|
|
28
28
|
export * from './fake-reflection.js';
|
|
29
|
+
// oxlint-disable-next-line import/export -- misreads export * from an npm package: https://github.com/oxc-project/oxc/pull/26872
|
|
29
30
|
export * from './langium-test-helpers.js';
|
|
30
31
|
export * from './make-noop-language-services.js';
|
|
31
32
|
export * from './make-noop-shared-services.js';
|
|
@@ -23,4 +23,5 @@
|
|
|
23
23
|
* contracts stays Langium upstream, so a rename there surfaces here rather than
|
|
24
24
|
* being absorbed by a hand-maintained list.
|
|
25
25
|
*/
|
|
26
|
+
// oxlint-disable-next-line import/export -- misreads export * from an npm package: https://github.com/oxc-project/oxc/pull/26872
|
|
26
27
|
export * from '@hydranium/langium/test';
|