@hydranium/core 1.0.0-next.32 → 1.0.0-next.320
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 +256 -124
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +293 -132
- 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 +436 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +886 -483
- 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 +138 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +173 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -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 +83 -44
- 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/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 +19 -4
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +36 -11
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +58 -17
- 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 +28 -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 +283 -41
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +448 -78
- 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 +40 -24
- 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 +17 -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 +95 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +303 -63
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +64 -0
- package/lib/langium/keys/containment.d.ts.map +1 -0
- package/lib/langium/keys/containment.js +53 -0
- package/lib/langium/keys/containment.js.map +1 -0
- package/lib/langium/keys/index.d.ts +1 -0
- package/lib/langium/keys/index.d.ts.map +1 -1
- package/lib/langium/keys/index.js +1 -0
- package/lib/langium/keys/index.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +4 -0
- 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 +18 -4
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +383 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +455 -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 +66 -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 +455 -290
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +571 -458
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +141 -40
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +52 -40
- 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.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +13 -6
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +2 -2
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +38 -14
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +24 -58
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- 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 +29 -11
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +37 -15
- 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 +41 -37
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js +57 -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 +4 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js +4 -0
- 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 +13 -7
- 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 +86 -37
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +36 -25
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +423 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +906 -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 +216 -10
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +353 -8
- 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/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 +31 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -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 +113 -21
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +197 -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 +1 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +1 -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/langium/workspace/self-save-registry.d.ts +84 -0
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
- package/lib/langium/workspace/self-save-registry.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 +29 -5
- package/lib/locale/server-locale.d.ts.map +1 -1
- package/lib/locale/server-locale.js +12 -2
- 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/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 +235 -102
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +4 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +4 -1
- 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 +34 -1
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +55 -8
- 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 +8 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +13 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +11 -6
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +14 -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 +32 -7
- package/lib/messages/renderer.d.ts.map +1 -1
- package/lib/messages/renderer.js +7 -1
- 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-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.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/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.d.ts +4 -4
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +4 -4
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +51 -20
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +29 -13
- 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 -52
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +31 -62
- 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 +103 -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 +9 -8
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +6 -6
- package/lib/testing/stub-model-service.js.map +1 -1
- 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 +19 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +61 -15
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +39 -58
- 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 +467 -233
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +24 -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 +1011 -595
- 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 +275 -0
- package/src/index.ts +7 -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 +87 -51
- 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/hydranium-langium-profiler.ts +15 -39
- package/src/langium/diagnostics/log-preamble.ts +1 -1
- package/src/langium/diagnostics/logger.ts +38 -11
- package/src/langium/diagnostics/lsp-logger.ts +61 -16
- package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +553 -78
- package/src/langium/integration-services.ts +59 -28
- package/src/langium/integrity/integrity-rule.ts +17 -8
- package/src/langium/integrity/integrity-service.ts +332 -69
- package/src/langium/keys/containment.ts +87 -0
- package/src/langium/keys/index.ts +1 -0
- package/src/langium/keys/name-based-key-provider.ts +4 -0
- package/src/langium/language-module.ts +49 -8
- package/src/langium/model-service/client-session.ts +718 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +80 -0
- package/src/langium/model-service/model-service.ts +878 -486
- package/src/langium/module.ts +195 -72
- package/src/langium/naming/name-provider.ts +34 -8
- package/src/langium/project/abstract-project-manager.ts +13 -5
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +54 -19
- 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 +49 -16
- 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 +74 -59
- 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 +4 -0
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +16 -7
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +104 -47
- package/src/langium/trivia/comment-preserver.ts +1100 -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 +411 -12
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- 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 +83 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +224 -35
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +1 -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/langium/workspace/self-save-registry.ts +118 -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 +31 -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/hydranium-document-update-handler.ts +285 -111
- package/src/lsp/index.ts +4 -1
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/save-text-document.ts +63 -0
- package/src/lsp/semantic-token-provider.ts +74 -7
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +13 -7
- package/src/messages/carriers.ts +15 -7
- package/src/messages/index.ts +11 -2
- package/src/messages/renderer.ts +34 -6
- 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-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 +5 -5
- 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/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-noop-shared-services.ts +6 -6
- package/src/testing/make-test-services.ts +93 -41
- 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 -128
- package/src/testing/stub-document-builder.ts +133 -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 +11 -10
- 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 +67 -15
- package/src/util/environment.ts +9 -1
- package/lib/documents/language-client-text-shadow.d.ts +0 -101
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -156
- package/lib/documents/language-client-text-shadow.js.map +0 -1
- package/lib/documents/self-save-registry.d.ts +0 -55
- 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 -175
- package/src/documents/self-save-registry.ts +0 -81
- 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 { AbstractAstReflection, type AstMetaData, type AstReflection, type PropertyMetaData, type TypeMetaData } from '@hydranium/langium';
|
|
11
|
+
import { assertSingleLangiumCopy } from './single-langium-copy.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* One `AstReflection` over the reflections of separately generated language
|
|
15
|
+
* packages. The shared `AstReflection` slot holds a single reflection, so
|
|
16
|
+
* binding each package's generated shared module keeps only the last one's
|
|
17
|
+
* types; bind this over all of them instead.
|
|
18
|
+
*
|
|
19
|
+
* A name several reflections share is taken to be one type, reached through a
|
|
20
|
+
* shared imported grammar, and keeps every super type any of them gives it:
|
|
21
|
+
* each grammar may declare its own union over the type. Only properties that
|
|
22
|
+
* differ in name, reference type or default value throw; two unrelated unions,
|
|
23
|
+
* or same-shaped interfaces, that share a name merge silently, so keep other
|
|
24
|
+
* type names distinct across packages.
|
|
25
|
+
*
|
|
26
|
+
* Only each reflection's `types` is read, so behaviour a reflection overrides
|
|
27
|
+
* is lost. Each package's generated `isX` guards keep using that package's own
|
|
28
|
+
* reflection and answer false for subtypes only another package declares.
|
|
29
|
+
*
|
|
30
|
+
* Each reflection is checked with {@link assertSingleLangiumCopy}, because the
|
|
31
|
+
* composite itself extends the framework copy's base whichever copy they use.
|
|
32
|
+
*
|
|
33
|
+
* The protected merge methods run from the constructor, so an override cannot
|
|
34
|
+
* read its own class's fields.
|
|
35
|
+
*/
|
|
36
|
+
export class CompositeAstReflection extends AbstractAstReflection {
|
|
37
|
+
override readonly types: AstMetaData = {};
|
|
38
|
+
|
|
39
|
+
constructor(reflections: readonly AstReflection[]) {
|
|
40
|
+
super();
|
|
41
|
+
const firstDefinedAt = new Map<string, number>();
|
|
42
|
+
reflections.forEach((reflection, index) => {
|
|
43
|
+
assertSingleLangiumCopy(reflection, () => this.formatReflection(reflections, index));
|
|
44
|
+
for (const [type, metaData] of Object.entries(reflection.types)) {
|
|
45
|
+
const ownerIndex = firstDefinedAt.get(type);
|
|
46
|
+
if (ownerIndex === undefined) {
|
|
47
|
+
this.types[type] = metaData;
|
|
48
|
+
firstDefinedAt.set(type, index);
|
|
49
|
+
} else {
|
|
50
|
+
this.types[type] = this.mergeTypeMetaData(
|
|
51
|
+
this.types[type],
|
|
52
|
+
metaData,
|
|
53
|
+
this.formatReflection(reflections, ownerIndex),
|
|
54
|
+
this.formatReflection(reflections, index)
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
protected mergeTypeMetaData(known: TypeMetaData, added: TypeMetaData, knownFrom: string, addedFrom: string): TypeMetaData {
|
|
62
|
+
const properties: TypeMetaData['properties'] = {};
|
|
63
|
+
const propertyNames = new Set([...Object.keys(known.properties), ...Object.keys(added.properties)]);
|
|
64
|
+
for (const property of propertyNames) {
|
|
65
|
+
const knownProperty = known.properties[property];
|
|
66
|
+
const addedProperty = added.properties[property];
|
|
67
|
+
if (!knownProperty || !addedProperty || !this.sameProperty(knownProperty, addedProperty)) {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`[hydranium] ${knownFrom} and ${addedFrom} define the type ` +
|
|
70
|
+
`'${known.name}' differently (property '${property}'). A name the composed reflections share must ` +
|
|
71
|
+
'denote one type, so rename one of them, or have every grammar take the type unchanged from one ' +
|
|
72
|
+
'shared imported grammar.'
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
properties[property] = addedProperty.optional && !knownProperty.optional ? addedProperty : knownProperty;
|
|
76
|
+
}
|
|
77
|
+
// `Required` so a field Langium adds fails compilation until this merge decides on it.
|
|
78
|
+
const merged: Required<TypeMetaData> = {
|
|
79
|
+
name: known.name,
|
|
80
|
+
properties,
|
|
81
|
+
superTypes: [...new Set([...known.superTypes, ...added.superTypes])]
|
|
82
|
+
};
|
|
83
|
+
return merged;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
protected sameProperty(left: PropertyMetaData, right: PropertyMetaData): boolean {
|
|
87
|
+
return COMPARED_PROPERTY_FIELDS.every(field => JSON.stringify(left[field]) === JSON.stringify(right[field]));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Names `reflections[index]` for the composite's errors: its position and
|
|
92
|
+
* class name. The position is needed because minified bundles and scaffolds
|
|
93
|
+
* sharing a project name leave class names that do not tell reflections
|
|
94
|
+
* apart. An override can name the package each reflection came from.
|
|
95
|
+
*/
|
|
96
|
+
protected formatReflection(reflections: readonly AstReflection[], index: number): string {
|
|
97
|
+
return `reflections[${index}] (${reflections[index].constructor?.name ?? 'no constructor'})`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** How the merge treats each property field; a field Langium adds fails compilation here until decided. */
|
|
102
|
+
const PROPERTY_FIELDS = {
|
|
103
|
+
name: 'compared',
|
|
104
|
+
referenceType: 'compared',
|
|
105
|
+
defaultValue: 'compared',
|
|
106
|
+
// Older generators emit no `optional`, so its absence proves nothing.
|
|
107
|
+
optional: 'merged'
|
|
108
|
+
} as const satisfies Record<keyof PropertyMetaData, 'compared' | 'merged'>;
|
|
109
|
+
|
|
110
|
+
const COMPARED_PROPERTY_FIELDS = (Object.keys(PROPERTY_FIELDS) as Array<keyof PropertyMetaData>).filter(
|
|
111
|
+
field => PROPERTY_FIELDS[field] === 'compared'
|
|
112
|
+
);
|
|
@@ -0,0 +1,119 @@
|
|
|
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 ConfigurationInitializedParams, DefaultConfigurationProvider } from '@hydranium/langium';
|
|
11
|
+
import type { ConfigurationItem, DidChangeConfigurationRegistrationOptions } from 'vscode-languageserver';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Configuration provider that asks the client about a section the first time
|
|
15
|
+
* something reads it.
|
|
16
|
+
*
|
|
17
|
+
* Langium's base requests one section per registered language, named after the
|
|
18
|
+
* language id, and never asks again. A read of any other section — including
|
|
19
|
+
* whatever `lsp.configurationRoot` is bound to — then resolves `undefined` with
|
|
20
|
+
* no request on the wire, which is indistinguishable from a setting the user has
|
|
21
|
+
* not set.
|
|
22
|
+
*
|
|
23
|
+
* Asking on first read rather than from a list collected up front: a reader
|
|
24
|
+
* names its section during DI, after `initialized` has taken its one-shot pass,
|
|
25
|
+
* so a list would have to be complete before the server initialized.
|
|
26
|
+
*/
|
|
27
|
+
export class HydraniumConfigurationProvider extends DefaultConfigurationProvider {
|
|
28
|
+
/**
|
|
29
|
+
* The client-facing hooks, captured because they arrive once as arguments to
|
|
30
|
+
* {@link initialized} and are needed on every later read. Absent in a
|
|
31
|
+
* headless composition, which has no connection to ask.
|
|
32
|
+
*/
|
|
33
|
+
protected registerForSection?: (params: DidChangeConfigurationRegistrationOptions) => void;
|
|
34
|
+
protected fetchSections?: (items: ConfigurationItem[]) => Promise<unknown>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Sections already dealt with, holding the in-flight work so concurrent
|
|
38
|
+
* readers share one round trip. Entries stay after they settle: they record
|
|
39
|
+
* that the section was HANDLED, and without that an unset section is
|
|
40
|
+
* re-requested on every read, "unset" and "not fetched" being the same
|
|
41
|
+
* absence in the store.
|
|
42
|
+
*
|
|
43
|
+
* A section the client's capabilities ruled out counts as handled, having
|
|
44
|
+
* been settled by asking nothing.
|
|
45
|
+
*/
|
|
46
|
+
protected readonly requestedSections = new Map<string, Promise<void>>();
|
|
47
|
+
|
|
48
|
+
override async initialized(params: ConfigurationInitializedParams): Promise<void> {
|
|
49
|
+
this.registerForSection = params.register;
|
|
50
|
+
this.fetchSections = params.fetchConfiguration;
|
|
51
|
+
await super.initialized(params);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The `ready` await precedes the emptiness check: the base resolves it at the
|
|
56
|
+
* end of its own initial fetch, so testing the store first calls every
|
|
57
|
+
* language section missing and re-requests what is already on its way.
|
|
58
|
+
*/
|
|
59
|
+
override async getConfiguration(language: string, configuration: string): Promise<unknown> {
|
|
60
|
+
await this.ready;
|
|
61
|
+
const section = this.toSectionName(language);
|
|
62
|
+
if (this.settings[section] === undefined) {
|
|
63
|
+
await this.requestSection(section);
|
|
64
|
+
}
|
|
65
|
+
return super.getConfiguration(language, configuration);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Ask about `section` once, sharing the request with any concurrent reader. */
|
|
69
|
+
protected requestSection(section: string): Promise<void> {
|
|
70
|
+
const existing = this.requestedSections.get(section);
|
|
71
|
+
if (existing) {
|
|
72
|
+
return existing;
|
|
73
|
+
}
|
|
74
|
+
const request = this.doRequestSection(section);
|
|
75
|
+
this.requestedSections.set(section, request);
|
|
76
|
+
return request;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The hooks are gated on the client having declared `workspace.configuration`.
|
|
81
|
+
* A connection binds them whatever the client said, so their presence is not
|
|
82
|
+
* consent: calling them sends a `client/registerCapability` and a
|
|
83
|
+
* `workspace/configuration` to a client that advertised support for neither,
|
|
84
|
+
* which is entitled to answer either with a method-not-found and may drop the
|
|
85
|
+
* connection.
|
|
86
|
+
*
|
|
87
|
+
* That flag is exact for the fetch and KNOWINGLY coarse for the registration,
|
|
88
|
+
* which the spec governs by
|
|
89
|
+
* `workspace.didChangeConfiguration.dynamicRegistration`. The base registers
|
|
90
|
+
* under `workspace.configuration` alone before any of this runs, so gating
|
|
91
|
+
* the registration on the narrower flag here would withhold a request whose
|
|
92
|
+
* twin has already gone out, sparing the client nothing. A client declaring
|
|
93
|
+
* `workspace.configuration` without dynamic registration is still registered
|
|
94
|
+
* for, by the base and by this; closing that means changing the base's pass,
|
|
95
|
+
* not this gate.
|
|
96
|
+
*
|
|
97
|
+
* Registering before fetching, so an edit landing between the two arrives as
|
|
98
|
+
* a notification instead of being lost; the reverse order drops it.
|
|
99
|
+
*
|
|
100
|
+
* A `null` result is left out of the store rather than written, so the
|
|
101
|
+
* section reads as unset, and no `onConfigurationSectionUpdate` fires — the
|
|
102
|
+
* value goes to the caller that asked for it, and an event would announce a
|
|
103
|
+
* change that is only this provider catching up.
|
|
104
|
+
*/
|
|
105
|
+
protected async doRequestSection(section: string): Promise<void> {
|
|
106
|
+
if (!this.workspaceConfig) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.registerForSection?.({ section });
|
|
110
|
+
if (!this.fetchSections) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const fetched = await this.fetchSections([{ section }]);
|
|
114
|
+
const value = Array.isArray(fetched) ? fetched[0] : fetched;
|
|
115
|
+
if (value !== null && value !== undefined) {
|
|
116
|
+
this.updateSectionConfiguration(section, value);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -8,14 +8,7 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { Format, Logger, type Tracer } from '@hydranium/protocol';
|
|
11
|
-
import {
|
|
12
|
-
DefaultLangiumProfiler,
|
|
13
|
-
DocumentState,
|
|
14
|
-
MultiMap,
|
|
15
|
-
type ProfilingCategory,
|
|
16
|
-
type ProfilingRecord,
|
|
17
|
-
ProfilingTask
|
|
18
|
-
} from '@hydranium/langium';
|
|
11
|
+
import { DefaultLangiumProfiler, MultiMap, type ProfilingCategory, type ProfilingRecord, ProfilingTask } from '@hydranium/langium';
|
|
19
12
|
import { type LogNameOptions } from './logger.js';
|
|
20
13
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
21
14
|
|
|
@@ -29,18 +22,8 @@ export interface LangiumProfilerOptions extends LogNameOptions {
|
|
|
29
22
|
* {@link DefaultLangiumProfiler}) to Langium's full set when omitted.
|
|
30
23
|
*/
|
|
31
24
|
readonly activeCategories?: Set<ProfilingCategory>;
|
|
32
|
-
/**
|
|
33
|
-
* Priority of the per-build flush pass at the `Validated` phase. The flush is
|
|
34
|
-
* normally the only pass at `Validated`, so order is immaterial; the option
|
|
35
|
-
* exists for symmetry with the other framework passes. Default
|
|
36
|
-
* {@link PROFILER_FLUSH_PASS_PRIORITY}.
|
|
37
|
-
*/
|
|
38
|
-
readonly flushPriority?: number;
|
|
39
25
|
}
|
|
40
26
|
|
|
41
|
-
/** Default priority of the profiler's per-build flush pass (see {@link LangiumProfilerOptions.flushPriority}). */
|
|
42
|
-
export const PROFILER_FLUSH_PASS_PRIORITY = 0;
|
|
43
|
-
|
|
44
27
|
/**
|
|
45
28
|
* Framework adapter over Langium's {@link DefaultLangiumProfiler} that is
|
|
46
29
|
* **trace-gated** and emits a single **aggregated** per-category breakdown
|
|
@@ -54,9 +37,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
|
|
|
54
37
|
* task identifier), so the per-document records carry no distinguishing
|
|
55
38
|
* information anyway. We instead accumulate records in {@link records} and
|
|
56
39
|
* {@link flush} one breakdown per category — self-time and invocation counts
|
|
57
|
-
* summed per `$type` across the whole build —
|
|
58
|
-
*
|
|
59
|
-
* one per file.
|
|
40
|
+
* summed per `$type` across the whole build — when the build ends
|
|
41
|
+
* (subscribed in the constructor). One report per build, not one per file.
|
|
60
42
|
* - **Transport safety.** The stock per-record dump uses `console.table`, which
|
|
61
43
|
* is NOT in the set `patchConsole` reroutes; under `vscode-languageserver`'s
|
|
62
44
|
* `--stdio` transport `process.stdout` *is* the JSON-RPC channel, so the
|
|
@@ -74,8 +56,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
|
|
|
74
56
|
* restart. Langium's own `start`/`stop` category selection still applies *on
|
|
75
57
|
* top of* the trace gate.
|
|
76
58
|
*
|
|
77
|
-
* Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its
|
|
78
|
-
*
|
|
59
|
+
* Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its flush is
|
|
60
|
+
* subscribed before the first build. Gives the per-grammar-rule /
|
|
79
61
|
* per-`$type` parse/link/validate self-time the framework's own
|
|
80
62
|
* `ServerTracer` / `ProfileSession` passes
|
|
81
63
|
* cannot produce (those cover the framework's passes *outside* Langium's
|
|
@@ -88,16 +70,11 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
|
|
|
88
70
|
constructor(services: ServerSharedServicesMinimal, options: LangiumProfilerOptions = {}) {
|
|
89
71
|
super(options.activeCategories);
|
|
90
72
|
this.tracer = services.Tracer.for(options.logName ?? 'LangiumProfiler').trace('instantiated');
|
|
91
|
-
// Flush once per build
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
//
|
|
95
|
-
services.workspace.
|
|
96
|
-
id: 'framework:langium-profiler:flush',
|
|
97
|
-
state: DocumentState.Validated,
|
|
98
|
-
priority: options.flushPriority ?? PROFILER_FLUSH_PASS_PRIORITY,
|
|
99
|
-
run: () => this.flush()
|
|
100
|
-
});
|
|
73
|
+
// Flush once per build when it ends rather than once per document. Not at
|
|
74
|
+
// a `Validated` pass: that phase stays silent for a build that validates
|
|
75
|
+
// nothing, the workspace's initial one among them, and the records would
|
|
76
|
+
// then wait for a build that does.
|
|
77
|
+
services.workspace.DocumentBuilder.onBuildEnded(() => this.flush());
|
|
101
78
|
}
|
|
102
79
|
|
|
103
80
|
/**
|
|
@@ -142,14 +119,13 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
|
|
|
142
119
|
/**
|
|
143
120
|
* Emit one aggregated breakdown per category — self-time and invocation
|
|
144
121
|
* counts summed per `<languageId>.<$type>` across every record collected
|
|
145
|
-
* this build — then clear the window.
|
|
146
|
-
*
|
|
147
|
-
*
|
|
122
|
+
* this build — then clear the window. Called when a build ends, so it fires
|
|
123
|
+
* once per build, not per document. Pass explicit categories to flush a
|
|
124
|
+
* subset; defaults to all.
|
|
148
125
|
*
|
|
149
126
|
* `flush` is the sole reset point: because it clears each flushed category,
|
|
150
|
-
* memory is bounded per
|
|
151
|
-
*
|
|
152
|
-
* inflated counts, self-correcting) rather than accumulating without bound.
|
|
127
|
+
* memory is bounded per build. Builds that throw share one flush, once the
|
|
128
|
+
* lock has drained after them.
|
|
153
129
|
*/
|
|
154
130
|
flush(...categories: ProfilingCategory[]): void {
|
|
155
131
|
const toFlush = categories.length > 0 ? categories : ALL_CATEGORIES;
|
|
@@ -50,7 +50,7 @@ export function logPreamble(logger: Logger, options: LogPreambleOptions): void {
|
|
|
50
50
|
|
|
51
51
|
function logSessionInfo(logger: Logger, productName: string, version: string, systemInfoLines: readonly string[]): void {
|
|
52
52
|
const now = new Date();
|
|
53
|
-
const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD,
|
|
53
|
+
const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD in UTC, which can differ from the reader's local date
|
|
54
54
|
const lines = [
|
|
55
55
|
DIVIDER,
|
|
56
56
|
`${productName} server session`,
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Format } from '@hydranium/protocol';
|
|
10
|
+
import { Format, LEVEL_ORDER, type LogLevel, Logger, type LogThreshold } from '@hydranium/protocol';
|
|
11
11
|
import { currentMemoryUsage, onProcessEvent, processPid } from '../../util/environment.js';
|
|
12
12
|
|
|
13
13
|
/** Only append a memory suffix when the heap has moved by at least this much since the last log line. */
|
|
@@ -69,6 +69,28 @@ const pendingLogLines: string[] = [];
|
|
|
69
69
|
/** Matches any remaining `{name}` placeholder token. */
|
|
70
70
|
const PLACEHOLDER_PATTERN = /\{[^}]+\}/;
|
|
71
71
|
|
|
72
|
+
/**
|
|
73
|
+
* `template` with `{pid}` replaced by the process id, known from the start, and
|
|
74
|
+
* each placeholder supplied so far by its value.
|
|
75
|
+
*/
|
|
76
|
+
function substituteLogFilePlaceholders(template: string): string {
|
|
77
|
+
let path = template.split('{pid}').join(String(processPid() ?? 'unknown'));
|
|
78
|
+
for (const [name, value] of logFilePlaceholders) {
|
|
79
|
+
path = path.split(`{${name}}`).join(value);
|
|
80
|
+
}
|
|
81
|
+
return path;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Expand `template` the way the file-tee names its file: `{pid}` and each
|
|
86
|
+
* supplied placeholder by its value, each one still missing by
|
|
87
|
+
* `_startup-<pid>`. A file written beside the log, such as the CPU profile,
|
|
88
|
+
* names itself through this so both carry the same workspace token.
|
|
89
|
+
*/
|
|
90
|
+
export function expandLogFilePlaceholders(template: string): string {
|
|
91
|
+
return substituteLogFilePlaceholders(template).replace(new RegExp(PLACEHOLDER_PATTERN, 'g'), `_startup-${processPid() ?? 'unknown'}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
72
94
|
/**
|
|
73
95
|
* Recompute {@link resolvedLogFilePath} from the template + known placeholders.
|
|
74
96
|
* Resolves (and flushes the pending buffer) only once no `{...}` token remains.
|
|
@@ -78,10 +100,7 @@ function tryResolveLogFilePath(): void {
|
|
|
78
100
|
resolvedLogFilePath = undefined;
|
|
79
101
|
return;
|
|
80
102
|
}
|
|
81
|
-
|
|
82
|
-
for (const [name, value] of logFilePlaceholders) {
|
|
83
|
-
path = path.split(`{${name}}`).join(value);
|
|
84
|
-
}
|
|
103
|
+
const path = substituteLogFilePlaceholders(logFileTemplate);
|
|
85
104
|
if (PLACEHOLDER_PATTERN.test(path)) {
|
|
86
105
|
resolvedLogFilePath = undefined;
|
|
87
106
|
// Target is pending — guarantee the buffer is flushed even if the process
|
|
@@ -116,12 +135,19 @@ function flushPendingLogLines(): void {
|
|
|
116
135
|
/**
|
|
117
136
|
* Set the file-tee target programmatically. Pass `undefined` to disable. The
|
|
118
137
|
* path may contain `{placeholder}` tokens (e.g. `{workspace}`); lines buffer
|
|
119
|
-
* until every token is supplied via {@link resolveLogFilePlaceholder}
|
|
138
|
+
* until every token is supplied via {@link resolveLogFilePlaceholder}, except
|
|
139
|
+
* `{pid}`, which is the process id from the start.
|
|
120
140
|
* Called by the `LspLogger` constructor's
|
|
121
141
|
* one-time `HYDRANIUM_LOG_FILE` env baseline (and by tests).
|
|
142
|
+
*
|
|
143
|
+
* `level` becomes `Logger.setFileLevel`, cleared with the target and when
|
|
144
|
+
* omitted. Setting the file level apart from the target lets it outlive the
|
|
145
|
+
* file, and every sender keeps building lines above the process threshold
|
|
146
|
+
* that nothing writes.
|
|
122
147
|
*/
|
|
123
|
-
export function setLogFilePath(path: string | undefined): void {
|
|
148
|
+
export function setLogFilePath(path: string | undefined, level?: LogThreshold): void {
|
|
124
149
|
logFileTemplate = path && path.length > 0 ? path : undefined;
|
|
150
|
+
Logger.setFileLevel(logFileTemplate ? level : undefined);
|
|
125
151
|
logFilePlaceholders.clear();
|
|
126
152
|
pendingLogLines.length = 0;
|
|
127
153
|
resolvedLogFilePath = undefined;
|
|
@@ -150,7 +176,7 @@ export function flushLogFileFallback(): void {
|
|
|
150
176
|
if (!logFileTemplate || resolvedLogFilePath || pendingLogLines.length === 0) {
|
|
151
177
|
return;
|
|
152
178
|
}
|
|
153
|
-
resolvedLogFilePath = logFileTemplate
|
|
179
|
+
resolvedLogFilePath = expandLogFilePlaceholders(logFileTemplate);
|
|
154
180
|
ensureLogDir(resolvedLogFilePath);
|
|
155
181
|
flushPendingLogLines();
|
|
156
182
|
}
|
|
@@ -173,13 +199,14 @@ export function getLogFilePath(): string | undefined {
|
|
|
173
199
|
|
|
174
200
|
/**
|
|
175
201
|
* Fan a single already-formatted log line out to the file-tee target, if one is
|
|
176
|
-
* configured
|
|
202
|
+
* configured and `level` is within the file's threshold
|
|
203
|
+
* (`Logger.getFileLevel() ?? Logger.getLevel()`). Called by `LspLogger`'s emit in
|
|
177
204
|
* addition to the LSP/console sink — log sinks fan out, they don't replace.
|
|
178
205
|
* While the target is still pending (unresolved `{placeholder}`), the line is
|
|
179
206
|
* buffered instead of dropped.
|
|
180
207
|
*/
|
|
181
|
-
export function teeLogLine(formatted: string): void {
|
|
182
|
-
if (!logFileTemplate) {
|
|
208
|
+
export function teeLogLine(level: LogLevel, formatted: string): void {
|
|
209
|
+
if (!logFileTemplate || LEVEL_ORDER[level] > LEVEL_ORDER[Logger.getFileLevel() ?? Logger.getLevel()]) {
|
|
183
210
|
return;
|
|
184
211
|
}
|
|
185
212
|
const line = `${formatted}\n`;
|
|
@@ -11,12 +11,15 @@ import {
|
|
|
11
11
|
AbstractLogger,
|
|
12
12
|
type Clock,
|
|
13
13
|
DEFAULT_LOG_FILE_ENV,
|
|
14
|
+
DEFAULT_LOG_FILE_LEVEL_ENV,
|
|
14
15
|
DEFAULT_LOG_LEVEL_ENV,
|
|
16
|
+
LEVEL_ORDER,
|
|
15
17
|
Logger,
|
|
16
18
|
type LogLevel,
|
|
17
19
|
type LogThreshold,
|
|
18
20
|
ObservableValue,
|
|
19
21
|
type MaybeObservableValue,
|
|
22
|
+
describeErrorWithStack,
|
|
20
23
|
parseLogLevel
|
|
21
24
|
} from '@hydranium/protocol';
|
|
22
25
|
import { type URI } from '@hydranium/langium';
|
|
@@ -79,9 +82,10 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
79
82
|
options: LspLoggerOptions = {}
|
|
80
83
|
) {
|
|
81
84
|
super(options.component);
|
|
82
|
-
// Apply the framework env baselines (`HYDRANIUM_LOG_LEVEL
|
|
83
|
-
// `HYDRANIUM_LOG_FILE`) exactly once, on
|
|
84
|
-
// before any setting is read.
|
|
85
|
+
// Apply the framework env baselines (`HYDRANIUM_LOG_LEVEL`,
|
|
86
|
+
// `HYDRANIUM_LOG_FILE` and `HYDRANIUM_LOG_FILE_LEVEL`) exactly once, on
|
|
87
|
+
// the first logger construction, before any setting is read.
|
|
88
|
+
// Unconditional and process-global, so it
|
|
85
89
|
// needs no root detection and is never re-applied by derived children —
|
|
86
90
|
// which would otherwise clobber a live setting. These are the single env
|
|
87
91
|
// vars for level / file-tee (an adopter brands them by renaming the
|
|
@@ -92,13 +96,20 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
92
96
|
// a Node concern; skip it cleanly there.
|
|
93
97
|
const env = processEnv();
|
|
94
98
|
if (env) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
+
// The file-tee target FIRST: the other order writes the level
|
|
100
|
+
// announcement before the sink exists, losing the one line that says
|
|
101
|
+
// which threshold the rest of the file was written at.
|
|
99
102
|
const envLogFile = env[DEFAULT_LOG_FILE_ENV];
|
|
100
103
|
if (envLogFile) {
|
|
101
|
-
|
|
104
|
+
const fileLevel = parseLogLevel(env[DEFAULT_LOG_FILE_LEVEL_ENV]);
|
|
105
|
+
setLogFilePath(envLogFile, fileLevel);
|
|
106
|
+
if (fileLevel) {
|
|
107
|
+
this.logAt(fileLevel, `Log file level ${fileLevel} (${DEFAULT_LOG_FILE_LEVEL_ENV})`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const envLevel = parseLogLevel(env[DEFAULT_LOG_LEVEL_ENV]);
|
|
111
|
+
if (envLevel) {
|
|
112
|
+
this.applyLevel(envLevel, DEFAULT_LOG_LEVEL_ENV);
|
|
102
113
|
}
|
|
103
114
|
}
|
|
104
115
|
}
|
|
@@ -109,16 +120,48 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
109
120
|
if (options.logThreshold !== undefined) {
|
|
110
121
|
const level = ObservableValue.from(options.logThreshold);
|
|
111
122
|
if (level.value) {
|
|
112
|
-
|
|
123
|
+
this.applyLevel(level.value, 'setting');
|
|
113
124
|
}
|
|
114
125
|
level.onChange(next => {
|
|
115
126
|
if (next) {
|
|
116
|
-
|
|
127
|
+
this.applyLevel(next, 'setting');
|
|
117
128
|
}
|
|
118
129
|
});
|
|
119
130
|
}
|
|
120
131
|
}
|
|
121
132
|
|
|
133
|
+
/**
|
|
134
|
+
* Set the process-wide threshold and announce the transition under whichever
|
|
135
|
+
* of the two thresholds can carry the notice, so a reader sees every change
|
|
136
|
+
* and its absence means the threshold never moved.
|
|
137
|
+
*
|
|
138
|
+
* `error` and `off` admit no notice of their own — `off` nothing at all, and
|
|
139
|
+
* an error-severity line is read as a fault, which a client that marks its
|
|
140
|
+
* log as having seen an error keeps for the session. Entering either is
|
|
141
|
+
* therefore announced BEFORE the switch, under the outgoing threshold; every
|
|
142
|
+
* other change is announced after it, at the level being entered. Leaving
|
|
143
|
+
* `error` or `off` for one of those two says nothing, both thresholds being
|
|
144
|
+
* unable to carry it.
|
|
145
|
+
*
|
|
146
|
+
* Only on a real transition: the bound setting re-fires for configuration
|
|
147
|
+
* changes that leave the value alone.
|
|
148
|
+
*/
|
|
149
|
+
protected applyLevel(next: LogThreshold, source: string): void {
|
|
150
|
+
const previous = Logger.getLevel();
|
|
151
|
+
if (previous === next) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const message = `Log level ${previous} → ${next} (${source})`;
|
|
155
|
+
const announceFirst = next === 'error' || next === 'off';
|
|
156
|
+
if (announceFirst && previous !== 'error') {
|
|
157
|
+
this.logAt(previous, message);
|
|
158
|
+
}
|
|
159
|
+
Logger.setLevel(next);
|
|
160
|
+
if (!announceFirst) {
|
|
161
|
+
this.logAt(next, message);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
122
165
|
/**
|
|
123
166
|
* Route logger timing and timestamps through the injected framework
|
|
124
167
|
* {@link Clock} (the dedicated `shared.Clock` slot) so server-side log time
|
|
@@ -145,9 +188,7 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
145
188
|
}
|
|
146
189
|
|
|
147
190
|
protected emit(level: LogLevel, label: string, message: string, args: readonly unknown[]): void {
|
|
148
|
-
const
|
|
149
|
-
// Pad to the widest label (5 chars — 'Error'/'Debug'/'Trace') so timestamps line up.
|
|
150
|
-
const prefix = `[${label.padEnd(5)} - ${this.timestamp()}]${component}`;
|
|
191
|
+
const prefix = this.formatLinePrefix(label);
|
|
151
192
|
const combined = args.length === 0 ? message : `${message} ${args.map(formatLogArg).join(' ')}`;
|
|
152
193
|
const formatted = `${prefix} ${combined}`;
|
|
153
194
|
const connection = this.services.lsp.Connection;
|
|
@@ -165,7 +206,11 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
165
206
|
// shutdown diagnostics and the workspace manager's own
|
|
166
207
|
// unhandled-rejection handler. A log sink that throws turns a diagnostic
|
|
167
208
|
// into a crash, so a dead channel degrades to stderr instead.
|
|
168
|
-
|
|
209
|
+
//
|
|
210
|
+
// `send` admits a line either threshold takes, so the client sink checks
|
|
211
|
+
// its own; the file-tee filters for itself.
|
|
212
|
+
const toClient = LEVEL_ORDER[level] <= LEVEL_ORDER[Logger.getLevel()];
|
|
213
|
+
if (toClient && (!connection || !sendViaConnection(connection, level, formatted))) {
|
|
169
214
|
if (!writeStderr(`${formatted}\n`)) {
|
|
170
215
|
// Browser only. In Node every level goes to STDERR, including the
|
|
171
216
|
// three that `console.*` would put on stdout (`info` / `debug` /
|
|
@@ -180,7 +225,7 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
180
225
|
}
|
|
181
226
|
// File-tee fan-out for headless capture (see `setLogFilePath`). Always runs
|
|
182
227
|
// in addition to the LSP/console sink — log sinks fan out, they don't replace.
|
|
183
|
-
teeLogLine(formatted);
|
|
228
|
+
teeLogLine(level, formatted);
|
|
184
229
|
}
|
|
185
230
|
|
|
186
231
|
protected derive(component: string): this {
|
|
@@ -264,7 +309,7 @@ function formatLogArg(value: unknown): string {
|
|
|
264
309
|
return value;
|
|
265
310
|
}
|
|
266
311
|
if (value instanceof Error) {
|
|
267
|
-
return value
|
|
312
|
+
return describeErrorWithStack(value);
|
|
268
313
|
}
|
|
269
314
|
if (typeof value === 'object') {
|
|
270
315
|
try {
|