@hydranium/core 1.0.0-next.28 → 1.0.0-next.280
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 +64 -82
- package/lib/documents/ast-document-manager.d.ts +252 -122
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +290 -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 +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 +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 +415 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +849 -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 +284 -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 +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 +3 -0
- 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 +49 -36
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +91 -45
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +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/build-phase-pass/build-phase-pass.d.ts +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 +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 +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 +32 -5
- 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 +309 -35
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +511 -75
- 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 +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 +83 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +273 -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 +372 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +446 -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 +440 -282
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +542 -446
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +158 -37
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +52 -36
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +27 -6
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +4 -3
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts +23 -1
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/naming/name-separator-validation.js +22 -0
- 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 +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 +35 -12
- 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/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 +61 -24
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +74 -35
- 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 +23 -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 +84 -35
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +34 -23
- 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 +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 +453 -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 +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 +154 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +102 -13
- 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 +109 -9
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +192 -12
- 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 +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 +37 -4
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +49 -4
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +7 -9
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +14 -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 +49 -15
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +81 -18
- 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/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 +106 -82
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +182 -102
- 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 +18 -12
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +22 -13
- package/lib/messages/carriers.js.map +1 -1
- package/lib/messages/index.d.ts +4 -1
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +4 -1
- package/lib/messages/index.js.map +1 -1
- 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.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 +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/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 +60 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +162 -52
- 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 +20 -4
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +8 -7
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/stdio-launcher.d.ts +10 -10
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +17 -9
- 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 +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/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 +115 -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 +12 -4
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +45 -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 +35 -8
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +39 -6
- 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 +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +6 -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 +29 -53
- package/src/documents/ast-document-manager.ts +463 -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 +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 +68 -0
- package/src/documents/hydranium-text-documents.ts +968 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +452 -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 +8 -0
- package/src/langium/ast-extension/ast-extension-service.ts +3 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +95 -52
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +1 -1
- package/src/langium/build-phase-pass/build-phase-pass.ts +1 -1
- 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 +12 -5
- package/src/langium/diagnostics/lsp-logger.ts +61 -16
- package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +616 -73
- package/src/langium/integration-services.ts +59 -28
- package/src/langium/integrity/integrity-rule.ts +16 -8
- package/src/langium/integrity/integrity-service.ts +296 -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 +702 -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 +835 -475
- package/src/langium/module.ts +212 -67
- package/src/langium/naming/name-provider.ts +29 -7
- package/src/langium/naming/name-separator-validation.ts +25 -3
- 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 +50 -16
- 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 +89 -38
- 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 +26 -6
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +102 -45
- 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-service.ts +1 -1
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +528 -13
- 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 +234 -16
- 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 +221 -16
- 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 +43 -5
- package/src/langium/workspace/langium-documents.ts +63 -5
- package/src/langium/workspace/persistent-file-system-provider.ts +15 -14
- package/src/langium/workspace/self-save-registry.ts +118 -0
- package/src/langium/workspace/virtual-document.ts +100 -19
- package/src/langium/workspace/write-lock-scope.ts +27 -12
- package/src/launcher/integrated-server.ts +3 -1
- 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 +227 -111
- 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 +23 -15
- package/src/messages/index.ts +13 -1
- package/src/messages/renderer.ts +212 -0
- package/src/node/event-loop-monitor.ts +2 -1
- 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/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 +178 -56
- 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 +27 -11
- package/src/node/stdio-launcher.ts +22 -14
- package/src/testing/document-uri-policy-conformance.ts +1 -1
- 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/applied-edit-capture.ts +139 -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 +74 -117
- 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 +63 -11
- 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 +12 -1
- package/src/testing/run-update-pipeline.ts +6 -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
package/src/langium/bootstrap.ts
CHANGED
|
@@ -10,17 +10,20 @@
|
|
|
10
10
|
import { type Logger } from '@hydranium/protocol';
|
|
11
11
|
import { type LangiumSharedCoreServices } from '@hydranium/langium';
|
|
12
12
|
import { type LangiumServices, type LangiumSharedServices } from '@hydranium/langium/lsp';
|
|
13
|
-
import type {
|
|
13
|
+
import type { ServerSharedServices } from './module.js';
|
|
14
14
|
import { collectProducibleTypes } from './language-types.js';
|
|
15
|
-
import {
|
|
15
|
+
import { assertSingleLangiumCopy } from './single-langium-copy.js';
|
|
16
|
+
import { DefaultAstDocumentManager } from '../documents/ast-document-manager.js';
|
|
16
17
|
import { HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
|
|
17
|
-
import {
|
|
18
|
+
import { DefaultBuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
|
|
18
19
|
import { HydraniumDocumentBuilder } from './document-builder/document-builder.js';
|
|
19
|
-
import {
|
|
20
|
+
import { DefaultModelService } from './model-service/model-service.js';
|
|
20
21
|
import { HydraniumScopeComputation } from './scope/hydranium-scope-computation.js';
|
|
21
22
|
import { HydraniumScopeProvider } from './scope/hydranium-scope-provider.js';
|
|
22
23
|
import { processEnv } from '../util/environment.js';
|
|
23
|
-
import {
|
|
24
|
+
import { DefaultTransferEncoder } from './transfer/transfer-encoder.js';
|
|
25
|
+
import { HydraniumLangiumDocumentFactory } from './workspace/hydranium-langium-document-factory.js';
|
|
26
|
+
import { HydraniumLangiumDocuments } from './workspace/langium-documents.js';
|
|
24
27
|
import { HydraniumWorkspaceManager } from './workspace/hydranium-workspace-manager.js';
|
|
25
28
|
|
|
26
29
|
/**
|
|
@@ -73,7 +76,14 @@ const EXPECTED_SHARED_SLOTS: readonly ExpectedSlot[] = [
|
|
|
73
76
|
side: 'shared',
|
|
74
77
|
path: 'workspace.BuildPipelineIntegration',
|
|
75
78
|
get: services => nested(services, 'workspace', 'BuildPipelineIntegration')
|
|
76
|
-
}
|
|
79
|
+
},
|
|
80
|
+
// Unbound, this fails where the cause is least visible: the render pass runs
|
|
81
|
+
// inside the `Validated` phase, so a `TypeError` there propagates out of
|
|
82
|
+
// `notifyDocumentPhase` and the document reaches `Validated` with Langium's
|
|
83
|
+
// publisher never invoked — the client receives no diagnostics for the file
|
|
84
|
+
// and the stack names the document builder.
|
|
85
|
+
{ side: 'shared', path: 'MessageRenderer', get: services => nested(services, 'MessageRenderer') },
|
|
86
|
+
{ side: 'shared', path: 'ServerLocale', get: services => nested(services, 'ServerLocale') }
|
|
77
87
|
];
|
|
78
88
|
|
|
79
89
|
/**
|
|
@@ -184,6 +194,20 @@ interface StrictSlot {
|
|
|
184
194
|
|
|
185
195
|
const STRICT_SHARED_SLOTS: readonly StrictSlot[] = [
|
|
186
196
|
{ side: 'shared', path: 'workspace.TextDocuments', base: HydraniumTextDocuments, get: s => nested(s, 'workspace', 'TextDocuments') },
|
|
197
|
+
// Every root it builds records no version, so every write gated on one conflicts.
|
|
198
|
+
{
|
|
199
|
+
side: 'shared',
|
|
200
|
+
path: 'workspace.LangiumDocumentFactory',
|
|
201
|
+
base: HydraniumLangiumDocumentFactory,
|
|
202
|
+
get: s => nested(s, 'workspace', 'LangiumDocumentFactory')
|
|
203
|
+
},
|
|
204
|
+
// It reports no registered root, so none is reconciled with the text store or announced.
|
|
205
|
+
{
|
|
206
|
+
side: 'shared',
|
|
207
|
+
path: 'workspace.LangiumDocuments',
|
|
208
|
+
base: HydraniumLangiumDocuments,
|
|
209
|
+
get: s => nested(s, 'workspace', 'LangiumDocuments')
|
|
210
|
+
},
|
|
187
211
|
{
|
|
188
212
|
side: 'shared',
|
|
189
213
|
path: 'workspace.WorkspaceManager',
|
|
@@ -199,17 +223,17 @@ const STRICT_SHARED_SLOTS: readonly StrictSlot[] = [
|
|
|
199
223
|
{
|
|
200
224
|
side: 'shared',
|
|
201
225
|
path: 'workspace.AstDocumentManager',
|
|
202
|
-
base:
|
|
226
|
+
base: DefaultAstDocumentManager,
|
|
203
227
|
get: s => nested(s, 'workspace', 'AstDocumentManager')
|
|
204
228
|
},
|
|
205
229
|
{
|
|
206
230
|
side: 'shared',
|
|
207
231
|
path: 'workspace.BuildPipelineIntegration',
|
|
208
|
-
base:
|
|
232
|
+
base: DefaultBuildPipelineIntegration,
|
|
209
233
|
get: s => nested(s, 'workspace', 'BuildPipelineIntegration')
|
|
210
234
|
},
|
|
211
|
-
{ side: 'shared', path: 'model.TransferEncoder', base:
|
|
212
|
-
{ side: 'shared', path: 'model.ModelService', base:
|
|
235
|
+
{ side: 'shared', path: 'model.TransferEncoder', base: DefaultTransferEncoder, get: s => nested(s, 'model', 'TransferEncoder') },
|
|
236
|
+
{ side: 'shared', path: 'model.ModelService', base: DefaultModelService, get: s => nested(s, 'model', 'ModelService') }
|
|
213
237
|
];
|
|
214
238
|
|
|
215
239
|
const STRICT_LANGUAGE_SLOTS: readonly StrictSlot[] = [
|
|
@@ -287,31 +311,40 @@ export function warnOnUnexpectedBindings(shared: LangiumSharedServices, language
|
|
|
287
311
|
* dispatch every build-phase pass and drive AST enrichment, and
|
|
288
312
|
* registers the framework integrity passes itself. The per-language
|
|
289
313
|
* feature services it routes to (`ast.AstExtensionService` +
|
|
290
|
-
* `integrity.IntegrityService
|
|
291
|
-
* read by the scope provider) hold the registries and the logic but own
|
|
314
|
+
* `integrity.IntegrityService`) hold the registries and the logic but own
|
|
292
315
|
* no listeners, so they need not be eager: each language's services
|
|
293
|
-
* construct lazily when the orchestrator
|
|
294
|
-
*
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
316
|
+
* construct lazily when the orchestrator first reaches them, and their
|
|
317
|
+
* constructors register that language's rules / extensions just-in-time.
|
|
318
|
+
* `references.ScopeExtensionService`, read by the scope provider, does
|
|
319
|
+
* subscribe to the builder, but only to report its own calls, so
|
|
320
|
+
* constructing it at its first call misses none.
|
|
321
|
+
* - **`profilers.LangiumProfiler`** — subscribes to
|
|
322
|
+
* `documentBuilder.onBuildEnded` to flush the aggregated
|
|
323
|
+
* parse/link/validate profile once per build. No production cost (the
|
|
324
|
+
* profiler is trace-gated), but the listener must be attached before the
|
|
325
|
+
* first build ends.
|
|
300
326
|
* - **`workspace.CstResidencyService`** — self-registers a `Validated`
|
|
301
327
|
* BuildPhasePass that sheds the CST of closed documents. The framework
|
|
302
328
|
* default strategy is `always-keep`, so the pass runs but sheds nothing
|
|
303
329
|
* until an adopter configures a shedding strategy.
|
|
330
|
+
* - **`workspace.AstDocumentManager`** — subscribes to the build pipeline
|
|
331
|
+
* and the text store to track opens, deletions and each build's causes.
|
|
332
|
+
* - **`model.ModelService`** — subscribes to the settled document phase to
|
|
333
|
+
* bring the language client up to date. A tree without an LSP `initialize`,
|
|
334
|
+
* such as a headless init, may not resolve it before the first build.
|
|
304
335
|
*
|
|
305
336
|
* Consumers with no additional eager targets can omit the third argument
|
|
306
337
|
* to {@link bootstrapLangium} — the parameter default is this exact set.
|
|
307
338
|
* Adopters needing extra eager targets spread this constant into their own
|
|
308
339
|
* array and append their accessors.
|
|
309
340
|
*/
|
|
310
|
-
export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services:
|
|
341
|
+
export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services: ServerSharedServices) => unknown> = [
|
|
311
342
|
services => services.workspace.ProjectManager,
|
|
312
343
|
services => services.workspace.BuildPipelineIntegration,
|
|
313
344
|
services => services.profilers.LangiumProfiler,
|
|
314
|
-
services => services.workspace.CstResidencyService
|
|
345
|
+
services => services.workspace.CstResidencyService,
|
|
346
|
+
services => services.workspace.AstDocumentManager,
|
|
347
|
+
services => services.model.ModelService
|
|
315
348
|
];
|
|
316
349
|
|
|
317
350
|
/**
|
|
@@ -329,36 +362,39 @@ export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services: ServerSharedServic
|
|
|
329
362
|
* discarded.
|
|
330
363
|
*
|
|
331
364
|
* Bootstrap responsibilities, in order:
|
|
332
|
-
* 1.
|
|
365
|
+
* 1. {@link assertSingleLangiumCopy} — fail fast when the shared
|
|
366
|
+
* `AstReflection` is built on a second copy of `langium`, before any
|
|
367
|
+
* later check can fail first and name the wrong cause.
|
|
368
|
+
* 2. Hand the shared services to `shared.ServiceRegistry` if it accepts
|
|
333
369
|
* them after construction, so Langium's declared-languageId lookup
|
|
334
370
|
* rung works however the adopter's registry binding was built.
|
|
335
|
-
*
|
|
371
|
+
* 3. {@link assertDistinctFileRouting} — before registration, because
|
|
336
372
|
* `register` resolves a routing collision by last-wins and afterwards
|
|
337
373
|
* the evidence is gone.
|
|
338
|
-
*
|
|
374
|
+
* 4. Register `language` against `shared.ServiceRegistry`, the
|
|
339
375
|
* required final step of any Langium DI bootstrap. Done before slot
|
|
340
376
|
* validation so subclassed registries (typed-accessor extensions)
|
|
341
377
|
* populate any side state before validation walks construct services
|
|
342
378
|
* that read from the registry.
|
|
343
|
-
*
|
|
379
|
+
* 5. {@link assertCoreSlotsBound} — fail fast if the consumer's
|
|
344
380
|
* `inject(...)` composition is missing a `@hydranium/core` module. May
|
|
345
381
|
* trigger lazy service construction as side effect of walking the
|
|
346
382
|
* slots; that construction expects a populated `ServiceRegistry`,
|
|
347
383
|
* hence the order.
|
|
348
|
-
*
|
|
384
|
+
* 6. {@link warnOnUnexpectedBindings} — opt-in (gated by
|
|
349
385
|
* {@link STRICT_BINDINGS_ENV}); warns when a framework slot is bound
|
|
350
386
|
* to a non-subclass of its framework base. No-op unless the env is set.
|
|
351
|
-
*
|
|
387
|
+
* 7. {@link assertReflectionCoversLanguages} — catch a clobbered shared
|
|
352
388
|
* `AstReflection` before it starts silently answering `isSubtype`
|
|
353
389
|
* false for a registered language's types. Skipped here, since a lone
|
|
354
390
|
* language has no sibling that could clobber it.
|
|
355
|
-
*
|
|
391
|
+
* 8. Invoke eager-construction accessors in array order.
|
|
356
392
|
*
|
|
357
393
|
* Multi-grammar adopters use {@link bootstrapLangiumLanguages}, which
|
|
358
394
|
* registers every language before validating slots or constructing the
|
|
359
395
|
* eager set.
|
|
360
396
|
*/
|
|
361
|
-
export function bootstrapLangium<TShared extends LangiumSharedServices &
|
|
397
|
+
export function bootstrapLangium<TShared extends LangiumSharedServices & ServerSharedServices, TLang extends LangiumServices>(
|
|
362
398
|
shared: TShared,
|
|
363
399
|
language: TLang,
|
|
364
400
|
eagerlyConstructedServices: ReadonlyArray<(services: TShared) => unknown> = DEFAULT_EAGER_SERVICES
|
|
@@ -377,32 +413,32 @@ export function bootstrapLangium<TShared extends LangiumSharedServices & ServerS
|
|
|
377
413
|
* ORDER across languages is what makes this a distinct function rather
|
|
378
414
|
* than a loop the caller could write:
|
|
379
415
|
*
|
|
380
|
-
* 1.
|
|
381
|
-
*
|
|
416
|
+
* 1. {@link assertSingleLangiumCopy} runs **once**, before anything else,
|
|
417
|
+
* since every language shares the one `AstReflection`.
|
|
418
|
+
* 2. **Every** language is registered against `shared.ServiceRegistry`
|
|
419
|
+
* next. Slot validation and eager construction both build services
|
|
382
420
|
* that read the registry — a per-language
|
|
383
421
|
* register-then-validate-then-eager loop would run them while later
|
|
384
422
|
* languages were still missing, so a shared service that walks
|
|
385
423
|
* `ServiceRegistry.all` (or resolves by extension) would see a
|
|
386
424
|
* half-populated registry and cache the wrong answer.
|
|
387
|
-
*
|
|
425
|
+
* 3. `assertCoreSlotsBound` / `warnOnUnexpectedBindings` per language —
|
|
388
426
|
* each language composes its own module chain, so each is checked.
|
|
389
|
-
*
|
|
390
|
-
*
|
|
391
|
-
*
|
|
392
|
-
*
|
|
393
|
-
* routes per document URI to
|
|
394
|
-
* `AstExtensionService`, so it
|
|
395
|
-
* them. Running the set per language
|
|
396
|
-
* `documentBuilder` listeners N times and enforce each
|
|
427
|
+
* 4. {@link assertReflectionCoversLanguages} runs **once**, on the one
|
|
428
|
+
* shared `AstReflection`.
|
|
429
|
+
* 5. Eager accessors run **once**, after all registrations. They take
|
|
430
|
+
* the shared tier, and the framework's eager set is shared-tier only —
|
|
431
|
+
* `BuildPipelineIntegration` in particular routes per document URI to
|
|
432
|
+
* each language's `IntegrityService` / `AstExtensionService`, so it
|
|
433
|
+
* must be constructed knowing all of them. Running the set per language
|
|
434
|
+
* would attach its `documentBuilder` listeners N times and enforce each
|
|
435
|
+
* phase N times.
|
|
397
436
|
*
|
|
398
437
|
* Throws when `languages` is empty: a shared tier with no registered
|
|
399
438
|
* language never validates its slots, which silently defers a
|
|
400
439
|
* composition error to the first build.
|
|
401
440
|
*/
|
|
402
|
-
export function bootstrapLangiumLanguages<
|
|
403
|
-
TShared extends LangiumSharedServices & ServerSharedServicesMinimal,
|
|
404
|
-
TLang extends LangiumServices
|
|
405
|
-
>(
|
|
441
|
+
export function bootstrapLangiumLanguages<TShared extends LangiumSharedServices & ServerSharedServices, TLang extends LangiumServices>(
|
|
406
442
|
shared: TShared,
|
|
407
443
|
languages: ReadonlyArray<TLang>,
|
|
408
444
|
eagerlyConstructedServices: ReadonlyArray<(services: TShared) => unknown> = DEFAULT_EAGER_SERVICES
|
|
@@ -414,6 +450,11 @@ export function bootstrapLangiumLanguages<
|
|
|
414
450
|
'`inject(...)` composition.'
|
|
415
451
|
);
|
|
416
452
|
}
|
|
453
|
+
// First, because a second copy of `langium` can make a later check fail
|
|
454
|
+
// first and name the wrong cause.
|
|
455
|
+
if (shared.AstReflection) {
|
|
456
|
+
assertSingleLangiumCopy(shared.AstReflection);
|
|
457
|
+
}
|
|
417
458
|
// Back-fill the shared services onto a registry that was constructed
|
|
418
459
|
// without them, so Langium's declared-languageId lookup rung works no
|
|
419
460
|
// matter how the adopter's `ServiceRegistry` binding built it. An adopter
|
|
@@ -521,11 +562,11 @@ export function assertDistinctFileRouting(languages: ReadonlyArray<LangiumServic
|
|
|
521
562
|
*
|
|
522
563
|
* The check is per language, on the types its grammar can produce, and costs
|
|
523
564
|
* one grammar walk per language at boot; a single-language composition, which
|
|
524
|
-
* nothing can clobber, is skipped entirely. It cannot repair the situation
|
|
525
|
-
* reflection
|
|
526
|
-
*
|
|
527
|
-
*
|
|
528
|
-
*
|
|
565
|
+
* nothing can clobber, is skipped entirely. It cannot repair the situation, since
|
|
566
|
+
* the losing reflection is already gone; the point is to turn a silent runtime
|
|
567
|
+
* misbehaviour into a boot failure that names the language and the mistake. The
|
|
568
|
+
* repair is the adopter's: bind a `CompositeAstReflection` over every package's
|
|
569
|
+
* generated reflection, or generate all grammars in one `langium-cli` run.
|
|
529
570
|
*
|
|
530
571
|
* **Two severities, because a clobber is not always total.** Throwing only when
|
|
531
572
|
* NONE of a language's types are known misses the realistic case: two grammars
|
|
@@ -567,8 +608,9 @@ export function assertReflectionCoversLanguages(shared: LangiumSharedServices, l
|
|
|
567
608
|
`[hydranium] the shared AstReflection knows NONE of the ${produced.size} types the language ` +
|
|
568
609
|
`'${languageId}' can produce (e.g. ${missing.slice(0, 3).join(', ')}). ` +
|
|
569
610
|
'AstReflection is a single shared slot, so composing two independently generated language ' +
|
|
570
|
-
|
|
571
|
-
'
|
|
611
|
+
"packages leaves only the last one bound. Bind a CompositeAstReflection over every package's " +
|
|
612
|
+
'generated reflection, or generate all grammars in ONE langium-cli run (one langium-config with ' +
|
|
613
|
+
'several entry grammars) so a single combined reflection covers them all.'
|
|
572
614
|
);
|
|
573
615
|
}
|
|
574
616
|
}
|
|
@@ -590,7 +632,8 @@ function warnPartialReflectionCoverage(
|
|
|
590
632
|
'For those types `isSubtype` answers false and `getTypeMetaData` is empty, so `IndexManager.allElements` ' +
|
|
591
633
|
'finds nothing, reference routing misses, and the encoder emits nothing. Most likely two independently ' +
|
|
592
634
|
'generated language packages each bound the single shared AstReflection slot and the last one won — ' +
|
|
593
|
-
|
|
635
|
+
"bind a CompositeAstReflection over every package's generated reflection, or generate all grammars in " +
|
|
636
|
+
'ONE langium-cli run so a single combined reflection covers them. If instead ' +
|
|
594
637
|
'these are rules your generator legitimately folded away, this warning is expected.';
|
|
595
638
|
if (logger) {
|
|
596
639
|
logger.warn(message);
|
|
@@ -27,7 +27,7 @@ import { type BuildPhasePass, type BuildPhasePassRegistry } from './build-phase-
|
|
|
27
27
|
* per-language work (integrity) fans out by language *inside* its pass. This
|
|
28
28
|
* also keeps one priority space per phase across framework and adopter passes,
|
|
29
29
|
* which is the point — `runPasses` orders the framework's integrity and
|
|
30
|
-
*
|
|
30
|
+
* CST-residency passes against adopter passes deterministically.
|
|
31
31
|
*/
|
|
32
32
|
export interface BuildPhasePassService extends BuildPhasePassRegistry {
|
|
33
33
|
/**
|
|
@@ -102,7 +102,7 @@ export function groupDocumentsByLanguage<TLanguage extends LangiumCoreServices>(
|
|
|
102
102
|
* Registry handed to a {@link BuildPhasePassContribution}. Implemented by the
|
|
103
103
|
* `BuildPhasePassService`; doubles
|
|
104
104
|
* as the low-level imperative API the framework uses to self-register its own
|
|
105
|
-
* passes (integrity,
|
|
105
|
+
* passes (integrity, CST residency).
|
|
106
106
|
*/
|
|
107
107
|
export interface BuildPhasePassRegistry {
|
|
108
108
|
register(pass: BuildPhasePass): Disposable;
|
|
@@ -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;
|