@hydranium/core 1.0.0-next.24 → 1.0.0-next.241
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 +22 -17
- package/lib/documents/ast-document-manager.d.ts +219 -122
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +241 -130
- 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 +79 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +69 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +179 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +283 -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 +49 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +34 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +399 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +816 -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 +218 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +283 -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 +134 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +171 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +60 -22
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +23 -16
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +66 -28
- package/lib/langium/bootstrap.js.map +1 -1
- 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.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.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +10 -3
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +12 -5
- 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 +57 -16
- 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 +32 -5
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +294 -33
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +477 -61
- 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 +61 -19
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +10 -5
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +16 -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 +81 -24
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +264 -57
- 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 +29 -4
- 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 +343 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +411 -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 +61 -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 +432 -282
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +504 -438
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +150 -35
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +47 -35
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +25 -4
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +2 -1
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts +23 -0
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/naming/name-separator-validation.js +30 -1
- package/lib/langium/naming/name-separator-validation.js.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +9 -2
- 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 +30 -10
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +23 -57
- 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/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +56 -20
- package/lib/langium/scope/hydranium-scope-provider.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.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +12 -21
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +1 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- 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 +21 -6
- 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 +77 -26
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +46 -24
- 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 +43 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +48 -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 +50 -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.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 +280 -9
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +448 -5
- 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 +15 -10
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +7 -5
- 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 +135 -9
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +93 -14
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -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 +82 -9
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
- 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 +31 -2
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +13 -5
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +46 -4
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +60 -5
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +48 -15
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +78 -18
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +12 -4
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/locale/index.d.ts +10 -0
- package/lib/locale/index.d.ts.map +1 -0
- package/lib/locale/index.js +10 -0
- package/lib/locale/index.js.map +1 -0
- package/lib/locale/server-locale.d.ts +73 -0
- package/lib/locale/server-locale.d.ts.map +1 -0
- package/lib/locale/server-locale.js +61 -0
- package/lib/locale/server-locale.js.map +1 -0
- 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 +92 -81
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +153 -99
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +3 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +3 -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/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 +54 -0
- package/lib/messages/carriers.d.ts.map +1 -0
- package/lib/messages/carriers.js +62 -0
- package/lib/messages/carriers.js.map +1 -0
- package/lib/messages/index.d.ts +25 -0
- package/lib/messages/index.d.ts.map +1 -0
- package/lib/messages/index.js +25 -0
- package/lib/messages/index.js.map +1 -0
- package/lib/messages/renderer.d.ts +142 -0
- package/lib/messages/renderer.d.ts.map +1 -0
- package/lib/messages/renderer.js +165 -0
- package/lib/messages/renderer.js.map +1 -0
- 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 +1 -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/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +1 -0
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +41 -6
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +109 -49
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +8 -2
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +1 -1
- 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 +52 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +66 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/socket-launcher.d.ts +20 -4
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +5 -4
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/stdio-launcher.d.ts +6 -5
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +2 -2
- package/lib/node/stdio-launcher.js.map +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 +16 -4
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js +18 -3
- 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 +14 -0
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +28 -2
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +72 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +42 -10
- 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/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 +11 -3
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +43 -10
- 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 +14 -0
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +34 -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 +24 -8
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +27 -6
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +4 -4
- package/lib/testing/run-update-pipeline.d.ts.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 +24 -65
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +26 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +78 -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 +115 -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 +7 -6
- 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.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/util/connection-liveness.d.ts +7 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +35 -14
- 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 +32 -48
- package/src/documents/ast-document-manager.ts +379 -231
- 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 +130 -0
- package/src/documents/document-release-handler.ts +365 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +68 -0
- package/src/documents/hydranium-text-documents.ts +931 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +451 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +267 -0
- package/src/index.ts +8 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +66 -28
- 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/logger.ts +12 -5
- package/src/langium/diagnostics/lsp-logger.ts +59 -15
- package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
- package/src/langium/document-builder/document-builder.ts +565 -59
- package/src/langium/integration-services.ts +83 -24
- package/src/langium/integrity/integrity-rule.ts +16 -8
- package/src/langium/integrity/integrity-service.ts +287 -62
- 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 +48 -7
- package/src/langium/model-service/client-session.ts +644 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +75 -0
- package/src/langium/model-service/model-service.ts +790 -468
- package/src/langium/module.ts +199 -64
- package/src/langium/naming/name-provider.ts +27 -5
- package/src/langium/naming/name-separator-validation.ts +34 -5
- package/src/langium/project/abstract-project-manager.ts +9 -1
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +45 -14
- package/src/langium/scope/hydranium-scope-provider.ts +60 -22
- package/src/langium/serialization/abstract-serializer.ts +13 -32
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +21 -6
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +104 -37
- package/src/langium/trivia/comment-preserver.ts +1100 -0
- package/src/langium/trivia/document-ending-preserver.ts +55 -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 +54 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +523 -10
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/document-uri-policy.ts +15 -10
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +205 -17
- package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +154 -14
- package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
- package/src/langium/workspace/index.ts +1 -0
- package/src/langium/workspace/initialize-workspace.ts +43 -5
- package/src/langium/workspace/langium-documents.ts +75 -6
- package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
- package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
- package/src/langium/workspace/virtual-document.ts +96 -19
- package/src/langium/workspace/write-lock-scope.ts +24 -11
- package/src/locale/index.ts +10 -0
- package/src/locale/server-locale.ts +86 -0
- 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 +187 -108
- package/src/lsp/index.ts +3 -1
- package/src/lsp/lsp-latency.ts +62 -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 +78 -0
- package/src/messages/index.ts +36 -0
- package/src/messages/renderer.ts +212 -0
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +1 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/measure-memory.ts +1 -0
- package/src/node/node-file-system-provider.ts +124 -53
- package/src/node/profile-capture.ts +9 -3
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +78 -0
- package/src/node/socket-launcher.ts +24 -8
- package/src/node/stdio-launcher.ts +8 -7
- package/src/testing/fake-document.ts +24 -5
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-noop-shared-services.ts +50 -2
- package/src/testing/make-test-services.ts +125 -31
- package/src/testing/make-test-tracer.ts +26 -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 +66 -12
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +36 -2
- 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 +45 -11
- package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
- package/src/testing/run-update-pipeline.ts +4 -4
- package/src/testing/stub-ast-document-manager.ts +36 -138
- package/src/testing/stub-document-builder.ts +102 -18
- package/src/testing/stub-hydranium-text-documents.ts +165 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +9 -8
- 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 +1 -1
- package/src/util/connection-liveness.ts +37 -14
- 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.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/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
|
+
}
|
|
@@ -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. */
|
|
@@ -119,9 +119,15 @@ function flushPendingLogLines(): void {
|
|
|
119
119
|
* until every token is supplied via {@link resolveLogFilePlaceholder}.
|
|
120
120
|
* Called by the `LspLogger` constructor's
|
|
121
121
|
* one-time `HYDRANIUM_LOG_FILE` env baseline (and by tests).
|
|
122
|
+
*
|
|
123
|
+
* `level` becomes `Logger.setFileLevel`, cleared with the target and when
|
|
124
|
+
* omitted. Setting the file level apart from the target lets it outlive the
|
|
125
|
+
* file, and every sender keeps building lines above the process threshold
|
|
126
|
+
* that nothing writes.
|
|
122
127
|
*/
|
|
123
|
-
export function setLogFilePath(path: string | undefined): void {
|
|
128
|
+
export function setLogFilePath(path: string | undefined, level?: LogThreshold): void {
|
|
124
129
|
logFileTemplate = path && path.length > 0 ? path : undefined;
|
|
130
|
+
Logger.setFileLevel(logFileTemplate ? level : undefined);
|
|
125
131
|
logFilePlaceholders.clear();
|
|
126
132
|
pendingLogLines.length = 0;
|
|
127
133
|
resolvedLogFilePath = undefined;
|
|
@@ -173,13 +179,14 @@ export function getLogFilePath(): string | undefined {
|
|
|
173
179
|
|
|
174
180
|
/**
|
|
175
181
|
* Fan a single already-formatted log line out to the file-tee target, if one is
|
|
176
|
-
* configured
|
|
182
|
+
* configured and `level` is within the file's threshold
|
|
183
|
+
* (`Logger.getFileLevel() ?? Logger.getLevel()`). Called by `LspLogger`'s emit in
|
|
177
184
|
* addition to the LSP/console sink — log sinks fan out, they don't replace.
|
|
178
185
|
* While the target is still pending (unresolved `{placeholder}`), the line is
|
|
179
186
|
* buffered instead of dropped.
|
|
180
187
|
*/
|
|
181
|
-
export function teeLogLine(formatted: string): void {
|
|
182
|
-
if (!logFileTemplate) {
|
|
188
|
+
export function teeLogLine(level: LogLevel, formatted: string): void {
|
|
189
|
+
if (!logFileTemplate || LEVEL_ORDER[level] > LEVEL_ORDER[Logger.getFileLevel() ?? Logger.getLevel()]) {
|
|
183
190
|
return;
|
|
184
191
|
}
|
|
185
192
|
const line = `${formatted}\n`;
|
|
@@ -11,7 +11,9 @@ 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,
|
|
@@ -79,9 +81,10 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
79
81
|
options: LspLoggerOptions = {}
|
|
80
82
|
) {
|
|
81
83
|
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.
|
|
84
|
+
// Apply the framework env baselines (`HYDRANIUM_LOG_LEVEL`,
|
|
85
|
+
// `HYDRANIUM_LOG_FILE` and `HYDRANIUM_LOG_FILE_LEVEL`) exactly once, on
|
|
86
|
+
// the first logger construction, before any setting is read.
|
|
87
|
+
// Unconditional and process-global, so it
|
|
85
88
|
// needs no root detection and is never re-applied by derived children —
|
|
86
89
|
// which would otherwise clobber a live setting. These are the single env
|
|
87
90
|
// vars for level / file-tee (an adopter brands them by renaming the
|
|
@@ -92,13 +95,20 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
92
95
|
// a Node concern; skip it cleanly there.
|
|
93
96
|
const env = processEnv();
|
|
94
97
|
if (env) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
98
|
+
// The file-tee target FIRST: the other order writes the level
|
|
99
|
+
// announcement before the sink exists, losing the one line that says
|
|
100
|
+
// which threshold the rest of the file was written at.
|
|
99
101
|
const envLogFile = env[DEFAULT_LOG_FILE_ENV];
|
|
100
102
|
if (envLogFile) {
|
|
101
|
-
|
|
103
|
+
const fileLevel = parseLogLevel(env[DEFAULT_LOG_FILE_LEVEL_ENV]);
|
|
104
|
+
setLogFilePath(envLogFile, fileLevel);
|
|
105
|
+
if (fileLevel) {
|
|
106
|
+
this.logAt(fileLevel, `Log file level ${fileLevel} (${DEFAULT_LOG_FILE_LEVEL_ENV})`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const envLevel = parseLogLevel(env[DEFAULT_LOG_LEVEL_ENV]);
|
|
110
|
+
if (envLevel) {
|
|
111
|
+
this.applyLevel(envLevel, DEFAULT_LOG_LEVEL_ENV);
|
|
102
112
|
}
|
|
103
113
|
}
|
|
104
114
|
}
|
|
@@ -109,16 +119,48 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
109
119
|
if (options.logThreshold !== undefined) {
|
|
110
120
|
const level = ObservableValue.from(options.logThreshold);
|
|
111
121
|
if (level.value) {
|
|
112
|
-
|
|
122
|
+
this.applyLevel(level.value, 'setting');
|
|
113
123
|
}
|
|
114
124
|
level.onChange(next => {
|
|
115
125
|
if (next) {
|
|
116
|
-
|
|
126
|
+
this.applyLevel(next, 'setting');
|
|
117
127
|
}
|
|
118
128
|
});
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
|
|
132
|
+
/**
|
|
133
|
+
* Set the process-wide threshold and announce the transition under whichever
|
|
134
|
+
* of the two thresholds can carry the notice, so a reader sees every change
|
|
135
|
+
* and its absence means the threshold never moved.
|
|
136
|
+
*
|
|
137
|
+
* `error` and `off` admit no notice of their own — `off` nothing at all, and
|
|
138
|
+
* an error-severity line is read as a fault, which a client that marks its
|
|
139
|
+
* log as having seen an error keeps for the session. Entering either is
|
|
140
|
+
* therefore announced BEFORE the switch, under the outgoing threshold; every
|
|
141
|
+
* other change is announced after it, at the level being entered. Leaving
|
|
142
|
+
* `error` or `off` for one of those two says nothing, both thresholds being
|
|
143
|
+
* unable to carry it.
|
|
144
|
+
*
|
|
145
|
+
* Only on a real transition: the bound setting re-fires for configuration
|
|
146
|
+
* changes that leave the value alone.
|
|
147
|
+
*/
|
|
148
|
+
protected applyLevel(next: LogThreshold, source: string): void {
|
|
149
|
+
const previous = Logger.getLevel();
|
|
150
|
+
if (previous === next) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const message = `Log level ${previous} → ${next} (${source})`;
|
|
154
|
+
const announceFirst = next === 'error' || next === 'off';
|
|
155
|
+
if (announceFirst && previous !== 'error') {
|
|
156
|
+
this.logAt(previous, message);
|
|
157
|
+
}
|
|
158
|
+
Logger.setLevel(next);
|
|
159
|
+
if (!announceFirst) {
|
|
160
|
+
this.logAt(next, message);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
122
164
|
/**
|
|
123
165
|
* Route logger timing and timestamps through the injected framework
|
|
124
166
|
* {@link Clock} (the dedicated `shared.Clock` slot) so server-side log time
|
|
@@ -145,9 +187,7 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
145
187
|
}
|
|
146
188
|
|
|
147
189
|
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}`;
|
|
190
|
+
const prefix = this.formatLinePrefix(label);
|
|
151
191
|
const combined = args.length === 0 ? message : `${message} ${args.map(formatLogArg).join(' ')}`;
|
|
152
192
|
const formatted = `${prefix} ${combined}`;
|
|
153
193
|
const connection = this.services.lsp.Connection;
|
|
@@ -165,7 +205,11 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
165
205
|
// shutdown diagnostics and the workspace manager's own
|
|
166
206
|
// unhandled-rejection handler. A log sink that throws turns a diagnostic
|
|
167
207
|
// into a crash, so a dead channel degrades to stderr instead.
|
|
168
|
-
|
|
208
|
+
//
|
|
209
|
+
// `send` admits a line either threshold takes, so the client sink checks
|
|
210
|
+
// its own; the file-tee filters for itself.
|
|
211
|
+
const toClient = LEVEL_ORDER[level] <= LEVEL_ORDER[Logger.getLevel()];
|
|
212
|
+
if (toClient && (!connection || !sendViaConnection(connection, level, formatted))) {
|
|
169
213
|
if (!writeStderr(`${formatted}\n`)) {
|
|
170
214
|
// Browser only. In Node every level goes to STDERR, including the
|
|
171
215
|
// three that `console.*` would put on stdout (`info` / `debug` /
|
|
@@ -180,7 +224,7 @@ export class LspLogger extends AbstractLogger implements Logger {
|
|
|
180
224
|
}
|
|
181
225
|
// File-tee fan-out for headless capture (see `setLogFilePath`). Always runs
|
|
182
226
|
// in addition to the LSP/console sink — log sinks fan out, they don't replace.
|
|
183
|
-
teeLogLine(formatted);
|
|
227
|
+
teeLogLine(level, formatted);
|
|
184
228
|
}
|
|
185
229
|
|
|
186
230
|
protected derive(component: string): this {
|
|
@@ -31,13 +31,24 @@ const AST_EXTENSION_PHASES: readonly DocumentState[] = [
|
|
|
31
31
|
];
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* Build phases at which the `BuildPhasePassService` is driven.
|
|
35
|
-
*
|
|
36
|
-
* never fires (the listener is not wired), mirroring the AST-extension contract.
|
|
34
|
+
* Build phases at which the `BuildPhasePassService` is driven. A pass
|
|
35
|
+
* registered at any other state never fires (the listener is not wired), and
|
|
37
36
|
* `runPasses` no-ops at a phase with no registered pass, so wiring the full set
|
|
38
37
|
* unconditionally costs only an empty-bucket check per phase.
|
|
38
|
+
*
|
|
39
|
+
* `IndexedContent` belongs here and NOT in {@link AST_EXTENSION_PHASES}, so the
|
|
40
|
+
* two cannot be collapsed. Per document it carries nothing `Parsed` does; per
|
|
41
|
+
* BATCH it is the only phase meaning the global index is whole again, which
|
|
42
|
+
* batch work keyed on a complete index has nowhere else to run.
|
|
39
43
|
*/
|
|
40
|
-
const BUILD_PHASE_PASS_STATES: readonly DocumentState[] =
|
|
44
|
+
const BUILD_PHASE_PASS_STATES: readonly DocumentState[] = [
|
|
45
|
+
DocumentState.Parsed,
|
|
46
|
+
DocumentState.IndexedContent,
|
|
47
|
+
DocumentState.ComputedScopes,
|
|
48
|
+
DocumentState.Linked,
|
|
49
|
+
DocumentState.IndexedReferences,
|
|
50
|
+
DocumentState.Validated
|
|
51
|
+
];
|
|
41
52
|
|
|
42
53
|
/**
|
|
43
54
|
* Default priority of the framework integrity passes. Integrity mutates / cleans
|
|
@@ -65,6 +76,19 @@ export interface BuildPipelineIntegrationOptions {
|
|
|
65
76
|
readonly integrityPriority?: number;
|
|
66
77
|
}
|
|
67
78
|
|
|
79
|
+
/**
|
|
80
|
+
* The build-pipeline slot. Empty because nothing calls this service — it wires
|
|
81
|
+
* itself in its constructor and every seam it offers is `protected`.
|
|
82
|
+
*
|
|
83
|
+
* Typing the slot by the class instead would stop an adopter's subclass
|
|
84
|
+
* satisfying it, since a class carries its `protected` members into the check
|
|
85
|
+
* and they compare by declaration rather than by shape. The cost of the empty
|
|
86
|
+
* shape is that any non-null value satisfies it, so a mis-bound slot compiles
|
|
87
|
+
* and the framework's phase listeners are then never attached.
|
|
88
|
+
*/
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- the slot has no public member to name
|
|
90
|
+
export interface BuildPipelineIntegration {}
|
|
91
|
+
|
|
68
92
|
/**
|
|
69
93
|
* Wires the framework's build-time features (integrity rules, AST
|
|
70
94
|
* enrichment) into Langium's document-build pipeline. The single shared
|
|
@@ -90,7 +114,7 @@ export interface BuildPipelineIntegrationOptions {
|
|
|
90
114
|
* Eagerly constructed (via `DEFAULT_EAGER_SERVICES`) so the listeners are
|
|
91
115
|
* attached before the first build cycle.
|
|
92
116
|
*/
|
|
93
|
-
export class BuildPipelineIntegration {
|
|
117
|
+
export class DefaultBuildPipelineIntegration implements BuildPipelineIntegration {
|
|
94
118
|
constructor(
|
|
95
119
|
protected readonly services: ServerSharedServices,
|
|
96
120
|
options: BuildPipelineIntegrationOptions = {}
|
|
@@ -128,6 +152,14 @@ export class BuildPipelineIntegration {
|
|
|
128
152
|
);
|
|
129
153
|
}
|
|
130
154
|
|
|
155
|
+
// Per DOCUMENT as well: `reparseAndRelink` re-indexes one document from
|
|
156
|
+
// inside the `Linked` phase and fires no build-phase notification, so a
|
|
157
|
+
// batch-level listener cannot see the AST it replaced.
|
|
158
|
+
builder.onDocumentPhase(
|
|
159
|
+
DocumentState.IndexedContent,
|
|
160
|
+
labelPhaseListener(() => this.clearScopeCaches(), 'BuildPipeline.clearScopeCaches')
|
|
161
|
+
);
|
|
162
|
+
|
|
131
163
|
// AST enrichment stays per-document (onDocumentPhase) and node-granular —
|
|
132
164
|
// unchanged by the build-phase-pass registry, which is batch-granular. The
|
|
133
165
|
// listener calls the `extendAst` seam directly (the document-phase analog of
|
|
@@ -174,6 +206,19 @@ export class BuildPipelineIntegration {
|
|
|
174
206
|
}
|
|
175
207
|
}
|
|
176
208
|
|
|
209
|
+
/**
|
|
210
|
+
* Drop the cached scopes of every REGISTERED language, not of those owning a
|
|
211
|
+
* document in the batch. The index a scope is built from is
|
|
212
|
+
* workspace-global, so narrowing to the batch with
|
|
213
|
+
* {@link groupDocumentsByLanguage}, the way {@link callIntegrity} does,
|
|
214
|
+
* leaves a cross-grammar reference resolving against a mid-rebuild scope.
|
|
215
|
+
*/
|
|
216
|
+
protected clearScopeCaches(): void {
|
|
217
|
+
for (const languageServices of this.services.ServiceRegistry.all) {
|
|
218
|
+
languageServices.references.ScopeProvider.clearScopeCaches();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
177
222
|
/** Run AST enrichment for a single document at `phase` via its language service. */
|
|
178
223
|
protected extendAst(document: LangiumDocument, phase: DocumentState, cancelToken: CancellationToken): void {
|
|
179
224
|
this.services.ServiceRegistry.getServices(document.uri).ast.AstExtensionService.extendDocument(document, phase, cancelToken);
|