@hydranium/core 1.0.0-next.10
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/LICENSE +21 -0
- package/README.md +100 -0
- package/lib/documents/ast-document-manager.d.ts +243 -0
- package/lib/documents/ast-document-manager.d.ts.map +1 -0
- package/lib/documents/ast-document-manager.js +302 -0
- package/lib/documents/ast-document-manager.js.map +1 -0
- package/lib/documents/client-ids.d.ts +30 -0
- package/lib/documents/client-ids.d.ts.map +1 -0
- package/lib/documents/client-ids.js +30 -0
- package/lib/documents/client-ids.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +490 -0
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -0
- package/lib/documents/hydranium-text-documents.js +893 -0
- package/lib/documents/hydranium-text-documents.js.map +1 -0
- package/lib/documents/index.d.ts +14 -0
- package/lib/documents/index.d.ts.map +1 -0
- package/lib/documents/index.js +14 -0
- package/lib/documents/index.js.map +1 -0
- package/lib/documents/language-client-text-shadow.d.ts +101 -0
- package/lib/documents/language-client-text-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-text-shadow.js +156 -0
- package/lib/documents/language-client-text-shadow.js.map +1 -0
- package/lib/documents/self-save-registry.d.ts +55 -0
- package/lib/documents/self-save-registry.d.ts.map +1 -0
- package/lib/documents/self-save-registry.js +68 -0
- package/lib/documents/self-save-registry.js.map +1 -0
- package/lib/index.d.ts +38 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +39 -0
- package/lib/index.js.map +1 -0
- package/lib/langium/ast-extension/ast-extension-contribution.d.ts +33 -0
- package/lib/langium/ast-extension/ast-extension-contribution.d.ts.map +1 -0
- package/lib/langium/ast-extension/ast-extension-contribution.js +10 -0
- package/lib/langium/ast-extension/ast-extension-contribution.js.map +1 -0
- package/lib/langium/ast-extension/ast-extension-service.d.ts +212 -0
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -0
- package/lib/langium/ast-extension/ast-extension-service.js +181 -0
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -0
- package/lib/langium/ast-extension/ast-node-builder.d.ts +90 -0
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -0
- package/lib/langium/ast-extension/ast-node-builder.js +61 -0
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -0
- package/lib/langium/ast-extension/index.d.ts +12 -0
- package/lib/langium/ast-extension/index.d.ts.map +1 -0
- package/lib/langium/ast-extension/index.js +12 -0
- package/lib/langium/ast-extension/index.js.map +1 -0
- package/lib/langium/bootstrap.d.ts +224 -0
- package/lib/langium/bootstrap.d.ts.map +1 -0
- package/lib/langium/bootstrap.js +512 -0
- package/lib/langium/bootstrap.js.map +1 -0
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +77 -0
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -0
- package/lib/langium/build-phase-pass/build-phase-pass-service.js +102 -0
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -0
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts +106 -0
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -0
- package/lib/langium/build-phase-pass/build-phase-pass.js +43 -0
- package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -0
- package/lib/langium/build-phase-pass/index.d.ts +11 -0
- package/lib/langium/build-phase-pass/index.d.ts.map +1 -0
- package/lib/langium/build-phase-pass/index.js +11 -0
- package/lib/langium/build-phase-pass/index.js.map +1 -0
- package/lib/langium/config/index.d.ts +10 -0
- package/lib/langium/config/index.d.ts.map +1 -0
- package/lib/langium/config/index.js +10 -0
- package/lib/langium/config/index.js.map +1 -0
- package/lib/langium/config/settings.d.ts +173 -0
- package/lib/langium/config/settings.d.ts.map +1 -0
- package/lib/langium/config/settings.js +196 -0
- package/lib/langium/config/settings.js.map +1 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +109 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.js +153 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -0
- package/lib/langium/diagnostics/index.d.ts +14 -0
- package/lib/langium/diagnostics/index.d.ts.map +1 -0
- package/lib/langium/diagnostics/index.js +19 -0
- package/lib/langium/diagnostics/index.js.map +1 -0
- package/lib/langium/diagnostics/log-file-token.d.ts +16 -0
- package/lib/langium/diagnostics/log-file-token.d.ts.map +1 -0
- package/lib/langium/diagnostics/log-file-token.js +25 -0
- package/lib/langium/diagnostics/log-file-token.js.map +1 -0
- package/lib/langium/diagnostics/log-preamble.d.ts +42 -0
- package/lib/langium/diagnostics/log-preamble.d.ts.map +1 -0
- package/lib/langium/diagnostics/log-preamble.js +57 -0
- package/lib/langium/diagnostics/log-preamble.js.map +1 -0
- package/lib/langium/diagnostics/logger.d.ts +104 -0
- package/lib/langium/diagnostics/logger.d.ts.map +1 -0
- package/lib/langium/diagnostics/logger.js +178 -0
- package/lib/langium/diagnostics/logger.js.map +1 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts +76 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -0
- package/lib/langium/diagnostics/lsp-logger.js +223 -0
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -0
- package/lib/langium/diagnostics/server-tracer.d.ts +27 -0
- package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -0
- package/lib/langium/diagnostics/server-tracer.js +66 -0
- package/lib/langium/diagnostics/server-tracer.js.map +1 -0
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +88 -0
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -0
- package/lib/langium/document-builder/build-pipeline-integration.js +151 -0
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -0
- package/lib/langium/document-builder/document-builder.d.ts +405 -0
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -0
- package/lib/langium/document-builder/document-builder.js +729 -0
- package/lib/langium/document-builder/document-builder.js.map +1 -0
- package/lib/langium/document-builder/index.d.ts +12 -0
- package/lib/langium/document-builder/index.d.ts.map +1 -0
- package/lib/langium/document-builder/index.js +12 -0
- package/lib/langium/document-builder/index.js.map +1 -0
- package/lib/langium/document-builder/labeled-phase-listener.d.ts +21 -0
- package/lib/langium/document-builder/labeled-phase-listener.d.ts.map +1 -0
- package/lib/langium/document-builder/labeled-phase-listener.js +15 -0
- package/lib/langium/document-builder/labeled-phase-listener.js.map +1 -0
- package/lib/langium/documentation/comment-provider.d.ts +31 -0
- package/lib/langium/documentation/comment-provider.d.ts.map +1 -0
- package/lib/langium/documentation/comment-provider.js +36 -0
- package/lib/langium/documentation/comment-provider.js.map +1 -0
- package/lib/langium/documentation/index.d.ts +10 -0
- package/lib/langium/documentation/index.d.ts.map +1 -0
- package/lib/langium/documentation/index.js +10 -0
- package/lib/langium/documentation/index.js.map +1 -0
- package/lib/langium/integration-services.d.ts +200 -0
- package/lib/langium/integration-services.d.ts.map +1 -0
- package/lib/langium/integration-services.js +65 -0
- package/lib/langium/integration-services.js.map +1 -0
- package/lib/langium/integrity/index.d.ts +12 -0
- package/lib/langium/integrity/index.d.ts.map +1 -0
- package/lib/langium/integrity/index.js +12 -0
- package/lib/langium/integrity/index.js.map +1 -0
- package/lib/langium/integrity/integrity-contribution.d.ts +42 -0
- package/lib/langium/integrity/integrity-contribution.d.ts.map +1 -0
- package/lib/langium/integrity/integrity-contribution.js +10 -0
- package/lib/langium/integrity/integrity-contribution.js.map +1 -0
- package/lib/langium/integrity/integrity-rule.d.ts +82 -0
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -0
- package/lib/langium/integrity/integrity-rule.js +52 -0
- package/lib/langium/integrity/integrity-rule.js.map +1 -0
- package/lib/langium/integrity/integrity-service.d.ts +221 -0
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -0
- package/lib/langium/integrity/integrity-service.js +328 -0
- package/lib/langium/integrity/integrity-service.js.map +1 -0
- package/lib/langium/keys/default-element-key-provider.d.ts +19 -0
- package/lib/langium/keys/default-element-key-provider.d.ts.map +1 -0
- package/lib/langium/keys/default-element-key-provider.js +18 -0
- package/lib/langium/keys/default-element-key-provider.js.map +1 -0
- package/lib/langium/keys/element-key-provider.d.ts +106 -0
- package/lib/langium/keys/element-key-provider.d.ts.map +1 -0
- package/lib/langium/keys/element-key-provider.js +25 -0
- package/lib/langium/keys/element-key-provider.js.map +1 -0
- package/lib/langium/keys/index.d.ts +13 -0
- package/lib/langium/keys/index.d.ts.map +1 -0
- package/lib/langium/keys/index.js +13 -0
- package/lib/langium/keys/index.js.map +1 -0
- package/lib/langium/keys/name-based-key-provider.d.ts +99 -0
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -0
- package/lib/langium/keys/name-based-key-provider.js +134 -0
- package/lib/langium/keys/name-based-key-provider.js.map +1 -0
- package/lib/langium/keys/positional-key-provider.d.ts +41 -0
- package/lib/langium/keys/positional-key-provider.d.ts.map +1 -0
- package/lib/langium/keys/positional-key-provider.js +48 -0
- package/lib/langium/keys/positional-key-provider.js.map +1 -0
- package/lib/langium/labeling/index.d.ts +10 -0
- package/lib/langium/labeling/index.d.ts.map +1 -0
- package/lib/langium/labeling/index.js +10 -0
- package/lib/langium/labeling/index.js.map +1 -0
- package/lib/langium/labeling/label-provider.d.ts +79 -0
- package/lib/langium/labeling/label-provider.d.ts.map +1 -0
- package/lib/langium/labeling/label-provider.js +44 -0
- package/lib/langium/labeling/label-provider.js.map +1 -0
- package/lib/langium/language-module.d.ts +281 -0
- package/lib/langium/language-module.d.ts.map +1 -0
- package/lib/langium/language-module.js +103 -0
- package/lib/langium/language-module.js.map +1 -0
- package/lib/langium/language-types.d.ts +85 -0
- package/lib/langium/language-types.d.ts.map +1 -0
- package/lib/langium/language-types.js +173 -0
- package/lib/langium/language-types.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +10 -0
- package/lib/langium/model-service/index.d.ts.map +1 -0
- package/lib/langium/model-service/index.js +10 -0
- package/lib/langium/model-service/index.js.map +1 -0
- package/lib/langium/model-service/model-service.d.ts +598 -0
- package/lib/langium/model-service/model-service.d.ts.map +1 -0
- package/lib/langium/model-service/model-service.js +889 -0
- package/lib/langium/model-service/model-service.js.map +1 -0
- package/lib/langium/module.d.ts +308 -0
- package/lib/langium/module.d.ts.map +1 -0
- package/lib/langium/module.js +165 -0
- package/lib/langium/module.js.map +1 -0
- package/lib/langium/naming/index.d.ts +11 -0
- package/lib/langium/naming/index.d.ts.map +1 -0
- package/lib/langium/naming/index.js +11 -0
- package/lib/langium/naming/index.js.map +1 -0
- package/lib/langium/naming/name-provider.d.ts +360 -0
- package/lib/langium/naming/name-provider.d.ts.map +1 -0
- package/lib/langium/naming/name-provider.js +240 -0
- package/lib/langium/naming/name-provider.js.map +1 -0
- package/lib/langium/naming/name-separator-validation.d.ts +47 -0
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -0
- package/lib/langium/naming/name-separator-validation.js +61 -0
- package/lib/langium/naming/name-separator-validation.js.map +1 -0
- package/lib/langium/project/abstract-project-manager.d.ts +242 -0
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -0
- package/lib/langium/project/abstract-project-manager.js +545 -0
- package/lib/langium/project/abstract-project-manager.js.map +1 -0
- package/lib/langium/project/index.d.ts +13 -0
- package/lib/langium/project/index.d.ts.map +1 -0
- package/lib/langium/project/index.js +13 -0
- package/lib/langium/project/index.js.map +1 -0
- package/lib/langium/project/project-change-event.d.ts +64 -0
- package/lib/langium/project/project-change-event.d.ts.map +1 -0
- package/lib/langium/project/project-change-event.js +10 -0
- package/lib/langium/project/project-change-event.js.map +1 -0
- package/lib/langium/project/project-manager.d.ts +196 -0
- package/lib/langium/project/project-manager.d.ts.map +1 -0
- package/lib/langium/project/project-manager.js +10 -0
- package/lib/langium/project/project-manager.js.map +1 -0
- package/lib/langium/project/single-project-manager.d.ts +69 -0
- package/lib/langium/project/single-project-manager.d.ts.map +1 -0
- package/lib/langium/project/single-project-manager.js +104 -0
- package/lib/langium/project/single-project-manager.js.map +1 -0
- package/lib/langium/residency/cst-residency-service.d.ts +214 -0
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -0
- package/lib/langium/residency/cst-residency-service.js +349 -0
- package/lib/langium/residency/cst-residency-service.js.map +1 -0
- package/lib/langium/residency/index.d.ts +10 -0
- package/lib/langium/residency/index.d.ts.map +1 -0
- package/lib/langium/residency/index.js +10 -0
- package/lib/langium/residency/index.js.map +1 -0
- package/lib/langium/scope/ast-node-description-provider.d.ts +122 -0
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -0
- package/lib/langium/scope/ast-node-description-provider.js +115 -0
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -0
- package/lib/langium/scope/hydranium-scope-computation.d.ts +163 -0
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -0
- package/lib/langium/scope/hydranium-scope-computation.js +220 -0
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -0
- package/lib/langium/scope/hydranium-scope-provider.d.ts +411 -0
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -0
- package/lib/langium/scope/hydranium-scope-provider.js +543 -0
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -0
- package/lib/langium/scope/index.d.ts +18 -0
- package/lib/langium/scope/index.d.ts.map +1 -0
- package/lib/langium/scope/index.js +18 -0
- package/lib/langium/scope/index.js.map +1 -0
- package/lib/langium/scope/reference-builder.d.ts +125 -0
- package/lib/langium/scope/reference-builder.d.ts.map +1 -0
- package/lib/langium/scope/reference-builder.js +115 -0
- package/lib/langium/scope/reference-builder.js.map +1 -0
- package/lib/langium/scope/reference-candidate-provider.d.ts +228 -0
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -0
- package/lib/langium/scope/reference-candidate-provider.js +185 -0
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -0
- package/lib/langium/scope/scope-extension-contribution.d.ts +32 -0
- package/lib/langium/scope/scope-extension-contribution.d.ts.map +1 -0
- package/lib/langium/scope/scope-extension-contribution.js +10 -0
- package/lib/langium/scope/scope-extension-contribution.js.map +1 -0
- package/lib/langium/scope/scope-extension-service.d.ts +149 -0
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -0
- package/lib/langium/scope/scope-extension-service.js +94 -0
- package/lib/langium/scope/scope-extension-service.js.map +1 -0
- package/lib/langium/scope/scoped-ast-node-description.d.ts +160 -0
- package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -0
- package/lib/langium/scope/scoped-ast-node-description.js +98 -0
- package/lib/langium/scope/scoped-ast-node-description.js.map +1 -0
- package/lib/langium/scope/tier-specificity.d.ts +47 -0
- package/lib/langium/scope/tier-specificity.d.ts.map +1 -0
- package/lib/langium/scope/tier-specificity.js +83 -0
- package/lib/langium/scope/tier-specificity.js.map +1 -0
- package/lib/langium/serialization/abstract-serializer.d.ts +316 -0
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -0
- package/lib/langium/serialization/abstract-serializer.js +351 -0
- package/lib/langium/serialization/abstract-serializer.js.map +1 -0
- package/lib/langium/serialization/index.d.ts +14 -0
- package/lib/langium/serialization/index.d.ts.map +1 -0
- package/lib/langium/serialization/index.js +14 -0
- package/lib/langium/serialization/index.js.map +1 -0
- package/lib/langium/serialization/json-serializer.d.ts +106 -0
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -0
- package/lib/langium/serialization/json-serializer.js +198 -0
- package/lib/langium/serialization/json-serializer.js.map +1 -0
- package/lib/langium/serialization/serialization-util.d.ts +29 -0
- package/lib/langium/serialization/serialization-util.d.ts.map +1 -0
- package/lib/langium/serialization/serialization-util.js +37 -0
- package/lib/langium/serialization/serialization-util.js.map +1 -0
- package/lib/langium/serialization/serializer.d.ts +66 -0
- package/lib/langium/serialization/serializer.d.ts.map +1 -0
- package/lib/langium/serialization/serializer.js +10 -0
- package/lib/langium/serialization/serializer.js.map +1 -0
- package/lib/langium/serialization/yaml-serializer.d.ts +166 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -0
- package/lib/langium/serialization/yaml-serializer.js +228 -0
- package/lib/langium/serialization/yaml-serializer.js.map +1 -0
- package/lib/langium/service-registry.d.ts +220 -0
- package/lib/langium/service-registry.d.ts.map +1 -0
- package/lib/langium/service-registry.js +258 -0
- package/lib/langium/service-registry.js.map +1 -0
- package/lib/langium/shared-services.d.ts +98 -0
- package/lib/langium/shared-services.d.ts.map +1 -0
- package/lib/langium/shared-services.js +30 -0
- package/lib/langium/shared-services.js.map +1 -0
- package/lib/langium/transfer/index.d.ts +10 -0
- package/lib/langium/transfer/index.d.ts.map +1 -0
- package/lib/langium/transfer/index.js +10 -0
- package/lib/langium/transfer/index.js.map +1 -0
- package/lib/langium/transfer/transfer-encoder.d.ts +294 -0
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -0
- package/lib/langium/transfer/transfer-encoder.js +328 -0
- package/lib/langium/transfer/transfer-encoder.js.map +1 -0
- package/lib/langium/update-rewrite/index.d.ts +14 -0
- package/lib/langium/update-rewrite/index.d.ts.map +1 -0
- package/lib/langium/update-rewrite/index.js +14 -0
- package/lib/langium/update-rewrite/index.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts +52 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.js +83 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.js.map +1 -0
- package/lib/langium/update-rewrite/semantic-root-rewrite.d.ts +37 -0
- package/lib/langium/update-rewrite/semantic-root-rewrite.d.ts.map +1 -0
- package/lib/langium/update-rewrite/semantic-root-rewrite.js +51 -0
- package/lib/langium/update-rewrite/semantic-root-rewrite.js.map +1 -0
- package/lib/langium/update-rewrite/update-rewrite-contribution.d.ts +42 -0
- package/lib/langium/update-rewrite/update-rewrite-contribution.d.ts.map +1 -0
- package/lib/langium/update-rewrite/update-rewrite-contribution.js +10 -0
- package/lib/langium/update-rewrite/update-rewrite-contribution.js.map +1 -0
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts +89 -0
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -0
- package/lib/langium/update-rewrite/update-rewrite-service.js +75 -0
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -0
- package/lib/langium/update-rewrite/update-rewrite.d.ts +59 -0
- package/lib/langium/update-rewrite/update-rewrite.d.ts.map +1 -0
- package/lib/langium/update-rewrite/update-rewrite.js +10 -0
- package/lib/langium/update-rewrite/update-rewrite.js.map +1 -0
- package/lib/langium/validation/document-validator.d.ts +106 -0
- package/lib/langium/validation/document-validator.d.ts.map +1 -0
- package/lib/langium/validation/document-validator.js +118 -0
- package/lib/langium/validation/document-validator.js.map +1 -0
- package/lib/langium/validation/index.d.ts +12 -0
- package/lib/langium/validation/index.d.ts.map +1 -0
- package/lib/langium/validation/index.js +12 -0
- package/lib/langium/validation/index.js.map +1 -0
- package/lib/langium/validation/validation-contribution-collector.d.ts +34 -0
- package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -0
- package/lib/langium/validation/validation-contribution-collector.js +51 -0
- package/lib/langium/validation/validation-contribution-collector.js.map +1 -0
- package/lib/langium/validation/validation-contribution.d.ts +36 -0
- package/lib/langium/validation/validation-contribution.d.ts.map +1 -0
- package/lib/langium/validation/validation-contribution.js +10 -0
- package/lib/langium/validation/validation-contribution.js.map +1 -0
- package/lib/langium/workspace/additional-document-contribution.d.ts +68 -0
- package/lib/langium/workspace/additional-document-contribution.d.ts.map +1 -0
- package/lib/langium/workspace/additional-document-contribution.js +23 -0
- package/lib/langium/workspace/additional-document-contribution.js.map +1 -0
- package/lib/langium/workspace/document-uri-policy.d.ts +151 -0
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -0
- package/lib/langium/workspace/document-uri-policy.js +121 -0
- package/lib/langium/workspace/document-uri-policy.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +30 -0
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -0
- package/lib/langium/workspace/file-system-provider.js +41 -0
- package/lib/langium/workspace/file-system-provider.js.map +1 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +45 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js +64 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -0
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +31 -0
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -0
- package/lib/langium/workspace/hydranium-workspace-lock.js +33 -0
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -0
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +232 -0
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -0
- package/lib/langium/workspace/hydranium-workspace-manager.js +368 -0
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -0
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +127 -0
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -0
- package/lib/langium/workspace/in-memory-file-system-provider.js +195 -0
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -0
- package/lib/langium/workspace/index-manager.d.ts +142 -0
- package/lib/langium/workspace/index-manager.d.ts.map +1 -0
- package/lib/langium/workspace/index-manager.js +245 -0
- package/lib/langium/workspace/index-manager.js.map +1 -0
- package/lib/langium/workspace/index.d.ts +23 -0
- package/lib/langium/workspace/index.d.ts.map +1 -0
- package/lib/langium/workspace/index.js +23 -0
- package/lib/langium/workspace/index.js.map +1 -0
- package/lib/langium/workspace/initialize-workspace.d.ts +63 -0
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -0
- package/lib/langium/workspace/initialize-workspace.js +88 -0
- package/lib/langium/workspace/initialize-workspace.js.map +1 -0
- package/lib/langium/workspace/langium-documents.d.ts +47 -0
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -0
- package/lib/langium/workspace/langium-documents.js +85 -0
- package/lib/langium/workspace/langium-documents.js.map +1 -0
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +207 -0
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -0
- package/lib/langium/workspace/persistent-file-system-provider.js +208 -0
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -0
- package/lib/langium/workspace/synthetic.d.ts +38 -0
- package/lib/langium/workspace/synthetic.d.ts.map +1 -0
- package/lib/langium/workspace/synthetic.js +58 -0
- package/lib/langium/workspace/synthetic.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +78 -0
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -0
- package/lib/langium/workspace/virtual-document.js +89 -0
- package/lib/langium/workspace/virtual-document.js.map +1 -0
- package/lib/langium/workspace/write-lock-scope.d.ts +69 -0
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -0
- package/lib/langium/workspace/write-lock-scope.js +54 -0
- package/lib/langium/workspace/write-lock-scope.js.map +1 -0
- package/lib/launcher/index.d.ts +10 -0
- package/lib/launcher/index.d.ts.map +1 -0
- package/lib/launcher/index.js +12 -0
- package/lib/launcher/index.js.map +1 -0
- package/lib/launcher/integrated-server.d.ts +28 -0
- package/lib/launcher/integrated-server.d.ts.map +1 -0
- package/lib/launcher/integrated-server.js +10 -0
- package/lib/launcher/integrated-server.js.map +1 -0
- package/lib/lsp/completion/hydranium-completion-provider.d.ts +89 -0
- package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -0
- package/lib/lsp/completion/hydranium-completion-provider.js +123 -0
- package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +204 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.js +288 -0
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -0
- package/lib/lsp/index.d.ts +23 -0
- package/lib/lsp/index.d.ts.map +1 -0
- package/lib/lsp/index.js +23 -0
- package/lib/lsp/index.js.map +1 -0
- package/lib/lsp/instrument-connection.d.ts +36 -0
- package/lib/lsp/instrument-connection.d.ts.map +1 -0
- package/lib/lsp/instrument-connection.js +62 -0
- package/lib/lsp/instrument-connection.js.map +1 -0
- package/lib/lsp/language-module.d.ts +53 -0
- package/lib/lsp/language-module.d.ts.map +1 -0
- package/lib/lsp/language-module.js +28 -0
- package/lib/lsp/language-module.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +131 -0
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -0
- package/lib/lsp/semantic-token-provider.js +148 -0
- package/lib/lsp/semantic-token-provider.js.map +1 -0
- package/lib/lsp/shared-module.d.ts +76 -0
- package/lib/lsp/shared-module.d.ts.map +1 -0
- package/lib/lsp/shared-module.js +33 -0
- package/lib/lsp/shared-module.js.map +1 -0
- package/lib/lsp/start-language-server.d.ts +43 -0
- package/lib/lsp/start-language-server.d.ts.map +1 -0
- package/lib/lsp/start-language-server.js +60 -0
- package/lib/lsp/start-language-server.js.map +1 -0
- package/lib/node/ast-ground-truth.d.ts +57 -0
- package/lib/node/ast-ground-truth.d.ts.map +1 -0
- package/lib/node/ast-ground-truth.js +46 -0
- package/lib/node/ast-ground-truth.js.map +1 -0
- package/lib/node/event-loop-monitor.d.ts +40 -0
- package/lib/node/event-loop-monitor.d.ts.map +1 -0
- package/lib/node/event-loop-monitor.js +62 -0
- package/lib/node/event-loop-monitor.js.map +1 -0
- package/lib/node/index.d.ts +29 -0
- package/lib/node/index.d.ts.map +1 -0
- package/lib/node/index.js +50 -0
- package/lib/node/index.js.map +1 -0
- package/lib/node/latency-from-env.d.ts +32 -0
- package/lib/node/latency-from-env.d.ts.map +1 -0
- package/lib/node/latency-from-env.js +36 -0
- package/lib/node/latency-from-env.js.map +1 -0
- package/lib/node/lint-grammar.d.ts +87 -0
- package/lib/node/lint-grammar.d.ts.map +1 -0
- package/lib/node/lint-grammar.js +124 -0
- package/lib/node/lint-grammar.js.map +1 -0
- package/lib/node/log-file-sink.d.ts +22 -0
- package/lib/node/log-file-sink.d.ts.map +1 -0
- package/lib/node/log-file-sink.js +43 -0
- package/lib/node/log-file-sink.js.map +1 -0
- package/lib/node/log-preamble-node.d.ts +28 -0
- package/lib/node/log-preamble-node.d.ts.map +1 -0
- package/lib/node/log-preamble-node.js +55 -0
- package/lib/node/log-preamble-node.js.map +1 -0
- package/lib/node/measure-memory.d.ts +86 -0
- package/lib/node/measure-memory.d.ts.map +1 -0
- package/lib/node/measure-memory.js +128 -0
- package/lib/node/measure-memory.js.map +1 -0
- package/lib/node/memory-monitor.d.ts +42 -0
- package/lib/node/memory-monitor.d.ts.map +1 -0
- package/lib/node/memory-monitor.js +83 -0
- package/lib/node/memory-monitor.js.map +1 -0
- package/lib/node/node-file-system-provider.d.ts +112 -0
- package/lib/node/node-file-system-provider.d.ts.map +1 -0
- package/lib/node/node-file-system-provider.js +230 -0
- package/lib/node/node-file-system-provider.js.map +1 -0
- package/lib/node/process-memory.d.ts +66 -0
- package/lib/node/process-memory.d.ts.map +1 -0
- package/lib/node/process-memory.js +252 -0
- package/lib/node/process-memory.js.map +1 -0
- package/lib/node/profile-capture.d.ts +118 -0
- package/lib/node/profile-capture.d.ts.map +1 -0
- package/lib/node/profile-capture.js +315 -0
- package/lib/node/profile-capture.js.map +1 -0
- package/lib/node/profile-digest.d.ts +49 -0
- package/lib/node/profile-digest.d.ts.map +1 -0
- package/lib/node/profile-digest.js +74 -0
- package/lib/node/profile-digest.js.map +1 -0
- package/lib/node/profiling-run.d.ts +80 -0
- package/lib/node/profiling-run.d.ts.map +1 -0
- package/lib/node/profiling-run.js +183 -0
- package/lib/node/profiling-run.js.map +1 -0
- package/lib/node/reflect-grammar.d.ts +109 -0
- package/lib/node/reflect-grammar.d.ts.map +1 -0
- package/lib/node/reflect-grammar.js +96 -0
- package/lib/node/reflect-grammar.js.map +1 -0
- package/lib/node/server-diagnostics.d.ts +43 -0
- package/lib/node/server-diagnostics.d.ts.map +1 -0
- package/lib/node/server-diagnostics.js +46 -0
- package/lib/node/server-diagnostics.js.map +1 -0
- package/lib/node/server-state-snapshot.d.ts +48 -0
- package/lib/node/server-state-snapshot.d.ts.map +1 -0
- package/lib/node/server-state-snapshot.js +139 -0
- package/lib/node/server-state-snapshot.js.map +1 -0
- package/lib/node/socket-launcher.d.ts +106 -0
- package/lib/node/socket-launcher.d.ts.map +1 -0
- package/lib/node/socket-launcher.js +138 -0
- package/lib/node/socket-launcher.js.map +1 -0
- package/lib/node/stdio-launcher.d.ts +88 -0
- package/lib/node/stdio-launcher.d.ts.map +1 -0
- package/lib/node/stdio-launcher.js +83 -0
- package/lib/node/stdio-launcher.js.map +1 -0
- package/lib/node/validate-workspace.d.ts +80 -0
- package/lib/node/validate-workspace.d.ts.map +1 -0
- package/lib/node/validate-workspace.js +72 -0
- package/lib/node/validate-workspace.js.map +1 -0
- package/lib/node/write-lock-scope-node.d.ts +27 -0
- package/lib/node/write-lock-scope-node.d.ts.map +1 -0
- package/lib/node/write-lock-scope-node.js +38 -0
- package/lib/node/write-lock-scope-node.js.map +1 -0
- package/lib/testing/ast-snapshot.d.ts +38 -0
- package/lib/testing/ast-snapshot.d.ts.map +1 -0
- package/lib/testing/ast-snapshot.js +78 -0
- package/lib/testing/ast-snapshot.js.map +1 -0
- package/lib/testing/document-uri-policy-conformance.d.ts +65 -0
- package/lib/testing/document-uri-policy-conformance.d.ts.map +1 -0
- package/lib/testing/document-uri-policy-conformance.js +69 -0
- package/lib/testing/document-uri-policy-conformance.js.map +1 -0
- package/lib/testing/fake-description.d.ts +35 -0
- package/lib/testing/fake-description.d.ts.map +1 -0
- package/lib/testing/fake-description.js +38 -0
- package/lib/testing/fake-description.js.map +1 -0
- package/lib/testing/fake-document.d.ts +71 -0
- package/lib/testing/fake-document.d.ts.map +1 -0
- package/lib/testing/fake-document.js +85 -0
- package/lib/testing/fake-document.js.map +1 -0
- package/lib/testing/fake-reflection.d.ts +29 -0
- package/lib/testing/fake-reflection.d.ts.map +1 -0
- package/lib/testing/fake-reflection.js +30 -0
- package/lib/testing/fake-reflection.js.map +1 -0
- package/lib/testing/index.d.ts +44 -0
- package/lib/testing/index.d.ts.map +1 -0
- package/lib/testing/index.js +44 -0
- package/lib/testing/index.js.map +1 -0
- package/lib/testing/langium-test-helpers.d.ts +26 -0
- package/lib/testing/langium-test-helpers.d.ts.map +1 -0
- package/lib/testing/langium-test-helpers.js +26 -0
- package/lib/testing/langium-test-helpers.js.map +1 -0
- package/lib/testing/make-noop-language-services.d.ts +39 -0
- package/lib/testing/make-noop-language-services.d.ts.map +1 -0
- package/lib/testing/make-noop-language-services.js +30 -0
- package/lib/testing/make-noop-language-services.js.map +1 -0
- package/lib/testing/make-noop-shared-services.d.ts +61 -0
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -0
- package/lib/testing/make-noop-shared-services.js +49 -0
- package/lib/testing/make-noop-shared-services.js.map +1 -0
- package/lib/testing/make-test-services.d.ts +217 -0
- package/lib/testing/make-test-services.d.ts.map +1 -0
- package/lib/testing/make-test-services.js +128 -0
- package/lib/testing/make-test-services.js.map +1 -0
- package/lib/testing/make-test-tracer.d.ts +67 -0
- package/lib/testing/make-test-tracer.d.ts.map +1 -0
- package/lib/testing/make-test-tracer.js +68 -0
- package/lib/testing/make-test-tracer.js.map +1 -0
- package/lib/testing/node/generated-workspace.d.ts +95 -0
- package/lib/testing/node/generated-workspace.d.ts.map +1 -0
- package/lib/testing/node/generated-workspace.js +134 -0
- package/lib/testing/node/generated-workspace.js.map +1 -0
- package/lib/testing/node/golden-corpus.d.ts +50 -0
- package/lib/testing/node/golden-corpus.d.ts.map +1 -0
- package/lib/testing/node/golden-corpus.js +80 -0
- package/lib/testing/node/golden-corpus.js.map +1 -0
- package/lib/testing/node/index.d.ts +28 -0
- package/lib/testing/node/index.d.ts.map +1 -0
- package/lib/testing/node/index.js +28 -0
- package/lib/testing/node/index.js.map +1 -0
- package/lib/testing/node/lsp-harness.d.ts +139 -0
- package/lib/testing/node/lsp-harness.d.ts.map +1 -0
- package/lib/testing/node/lsp-harness.js +119 -0
- package/lib/testing/node/lsp-harness.js.map +1 -0
- package/lib/testing/node/lsp-server-connection.d.ts +232 -0
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -0
- package/lib/testing/node/lsp-server-connection.js +304 -0
- package/lib/testing/node/lsp-server-connection.js.map +1 -0
- package/lib/testing/node/scratch-workspace.d.ts +60 -0
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -0
- package/lib/testing/node/scratch-workspace.js +87 -0
- package/lib/testing/node/scratch-workspace.js.map +1 -0
- package/lib/testing/node/spawned-server.d.ts +170 -0
- package/lib/testing/node/spawned-server.d.ts.map +1 -0
- package/lib/testing/node/spawned-server.js +265 -0
- package/lib/testing/node/spawned-server.js.map +1 -0
- package/lib/testing/parse-semantic-root.d.ts +83 -0
- package/lib/testing/parse-semantic-root.d.ts.map +1 -0
- package/lib/testing/parse-semantic-root.js +119 -0
- package/lib/testing/parse-semantic-root.js.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.d.ts +80 -0
- package/lib/testing/playwright/browser-capture-bridge.d.ts.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.js +161 -0
- package/lib/testing/playwright/browser-capture-bridge.js.map +1 -0
- package/lib/testing/playwright/e2e-profiling.d.ts +132 -0
- package/lib/testing/playwright/e2e-profiling.d.ts.map +1 -0
- package/lib/testing/playwright/e2e-profiling.js +270 -0
- package/lib/testing/playwright/e2e-profiling.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +13 -0
- package/lib/testing/playwright/index.d.ts.map +1 -0
- package/lib/testing/playwright/index.js +16 -0
- package/lib/testing/playwright/index.js.map +1 -0
- package/lib/testing/playwright/server-log-capture.d.ts +230 -0
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-capture.js +336 -0
- package/lib/testing/playwright/server-log-capture.js.map +1 -0
- package/lib/testing/playwright/server-log-fixture.d.ts +36 -0
- package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-fixture.js +38 -0
- package/lib/testing/playwright/server-log-fixture.js.map +1 -0
- package/lib/testing/playwright/server-log-rename-reporter.d.ts +22 -0
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-rename-reporter.js +26 -0
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -0
- package/lib/testing/run-update-pipeline.d.ts +99 -0
- package/lib/testing/run-update-pipeline.d.ts.map +1 -0
- package/lib/testing/run-update-pipeline.js +24 -0
- package/lib/testing/run-update-pipeline.js.map +1 -0
- package/lib/testing/stub-ast-document-manager.d.ts +82 -0
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -0
- package/lib/testing/stub-ast-document-manager.js +125 -0
- package/lib/testing/stub-ast-document-manager.js.map +1 -0
- package/lib/testing/stub-document-builder.d.ts +99 -0
- package/lib/testing/stub-document-builder.d.ts.map +1 -0
- package/lib/testing/stub-document-builder.js +142 -0
- package/lib/testing/stub-document-builder.js.map +1 -0
- package/lib/testing/stub-hydranium-text-documents.d.ts +125 -0
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -0
- package/lib/testing/stub-hydranium-text-documents.js +164 -0
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -0
- package/lib/testing/stub-index-manager.d.ts +40 -0
- package/lib/testing/stub-index-manager.d.ts.map +1 -0
- package/lib/testing/stub-index-manager.js +38 -0
- package/lib/testing/stub-index-manager.js.map +1 -0
- package/lib/testing/stub-langium-documents.d.ts +53 -0
- package/lib/testing/stub-langium-documents.d.ts.map +1 -0
- package/lib/testing/stub-langium-documents.js +62 -0
- package/lib/testing/stub-langium-documents.js.map +1 -0
- package/lib/testing/stub-model-service.d.ts +31 -0
- package/lib/testing/stub-model-service.d.ts.map +1 -0
- package/lib/testing/stub-model-service.js +45 -0
- package/lib/testing/stub-model-service.js.map +1 -0
- package/lib/testing/stub-project-manager.d.ts +43 -0
- package/lib/testing/stub-project-manager.d.ts.map +1 -0
- package/lib/testing/stub-project-manager.js +125 -0
- package/lib/testing/stub-project-manager.js.map +1 -0
- package/lib/testing/stub-self-save-registry.d.ts +31 -0
- package/lib/testing/stub-self-save-registry.d.ts.map +1 -0
- package/lib/testing/stub-self-save-registry.js +23 -0
- package/lib/testing/stub-self-save-registry.js.map +1 -0
- package/lib/testing/stub-service-registry.d.ts +95 -0
- package/lib/testing/stub-service-registry.d.ts.map +1 -0
- package/lib/testing/stub-service-registry.js +108 -0
- package/lib/testing/stub-service-registry.js.map +1 -0
- package/lib/testing/stub-writable-file-system.d.ts +42 -0
- package/lib/testing/stub-writable-file-system.d.ts.map +1 -0
- package/lib/testing/stub-writable-file-system.js +26 -0
- package/lib/testing/stub-writable-file-system.js.map +1 -0
- package/lib/util/connection-liveness.d.ts +25 -0
- package/lib/util/connection-liveness.d.ts.map +1 -0
- package/lib/util/connection-liveness.js +46 -0
- package/lib/util/connection-liveness.js.map +1 -0
- package/lib/util/environment.d.ts +53 -0
- package/lib/util/environment.d.ts.map +1 -0
- package/lib/util/environment.js +78 -0
- package/lib/util/environment.js.map +1 -0
- package/lib/util/index.d.ts +13 -0
- package/lib/util/index.d.ts.map +1 -0
- package/lib/util/index.js +18 -0
- package/lib/util/index.js.map +1 -0
- package/lib/util/registry.d.ts +88 -0
- package/lib/util/registry.d.ts.map +1 -0
- package/lib/util/registry.js +105 -0
- package/lib/util/registry.js.map +1 -0
- package/package.json +134 -0
- package/src/documents/ast-document-manager.ts +455 -0
- package/src/documents/client-ids.ts +33 -0
- package/src/documents/hydranium-text-documents.ts +1142 -0
- package/src/documents/index.ts +14 -0
- package/src/documents/language-client-text-shadow.ts +175 -0
- package/src/documents/self-save-registry.ts +81 -0
- package/src/index.ts +39 -0
- package/src/langium/ast-extension/ast-extension-contribution.ts +35 -0
- package/src/langium/ast-extension/ast-extension-service.ts +311 -0
- package/src/langium/ast-extension/ast-node-builder.ts +125 -0
- package/src/langium/ast-extension/index.ts +12 -0
- package/src/langium/bootstrap.ts +600 -0
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +141 -0
- package/src/langium/build-phase-pass/build-phase-pass.ts +123 -0
- package/src/langium/build-phase-pass/index.ts +11 -0
- package/src/langium/config/index.ts +10 -0
- package/src/langium/config/settings.ts +353 -0
- package/src/langium/diagnostics/hydranium-langium-profiler.ts +187 -0
- package/src/langium/diagnostics/index.ts +19 -0
- package/src/langium/diagnostics/log-file-token.ts +26 -0
- package/src/langium/diagnostics/log-preamble.ts +87 -0
- package/src/langium/diagnostics/logger.ts +246 -0
- package/src/langium/diagnostics/lsp-logger.ts +277 -0
- package/src/langium/diagnostics/server-tracer.ts +73 -0
- package/src/langium/document-builder/build-pipeline-integration.ts +193 -0
- package/src/langium/document-builder/document-builder.ts +839 -0
- package/src/langium/document-builder/index.ts +12 -0
- package/src/langium/document-builder/labeled-phase-listener.ts +26 -0
- package/src/langium/documentation/comment-provider.ts +37 -0
- package/src/langium/documentation/index.ts +10 -0
- package/src/langium/integration-services.ts +281 -0
- package/src/langium/integrity/index.ts +12 -0
- package/src/langium/integrity/integrity-contribution.ts +44 -0
- package/src/langium/integrity/integrity-rule.ts +100 -0
- package/src/langium/integrity/integrity-service.ts +423 -0
- package/src/langium/keys/default-element-key-provider.ts +20 -0
- package/src/langium/keys/element-key-provider.ts +114 -0
- package/src/langium/keys/index.ts +13 -0
- package/src/langium/keys/name-based-key-provider.ts +146 -0
- package/src/langium/keys/positional-key-provider.ts +57 -0
- package/src/langium/labeling/index.ts +10 -0
- package/src/langium/labeling/label-provider.ts +110 -0
- package/src/langium/language-module.ts +367 -0
- package/src/langium/language-types.ts +214 -0
- package/src/langium/model-service/index.ts +10 -0
- package/src/langium/model-service/model-service.ts +1051 -0
- package/src/langium/module.ts +446 -0
- package/src/langium/naming/index.ts +11 -0
- package/src/langium/naming/name-provider.ts +533 -0
- package/src/langium/naming/name-separator-validation.ts +73 -0
- package/src/langium/project/abstract-project-manager.ts +630 -0
- package/src/langium/project/index.ts +13 -0
- package/src/langium/project/project-change-event.ts +66 -0
- package/src/langium/project/project-manager.ts +221 -0
- package/src/langium/project/single-project-manager.ts +126 -0
- package/src/langium/residency/cst-residency-service.ts +412 -0
- package/src/langium/residency/index.ts +10 -0
- package/src/langium/scope/ast-node-description-provider.ts +141 -0
- package/src/langium/scope/hydranium-scope-computation.ts +246 -0
- package/src/langium/scope/hydranium-scope-provider.ts +659 -0
- package/src/langium/scope/index.ts +18 -0
- package/src/langium/scope/reference-builder.ts +194 -0
- package/src/langium/scope/reference-candidate-provider.ts +314 -0
- package/src/langium/scope/scope-extension-contribution.ts +34 -0
- package/src/langium/scope/scope-extension-service.ts +207 -0
- package/src/langium/scope/scoped-ast-node-description.ts +174 -0
- package/src/langium/scope/tier-specificity.ts +89 -0
- package/src/langium/serialization/abstract-serializer.ts +474 -0
- package/src/langium/serialization/index.ts +14 -0
- package/src/langium/serialization/json-serializer.ts +264 -0
- package/src/langium/serialization/serialization-util.ts +40 -0
- package/src/langium/serialization/serializer.ts +68 -0
- package/src/langium/serialization/yaml-serializer.ts +348 -0
- package/src/langium/service-registry.ts +323 -0
- package/src/langium/shared-services.ts +107 -0
- package/src/langium/transfer/index.ts +10 -0
- package/src/langium/transfer/transfer-encoder.ts +434 -0
- package/src/langium/update-rewrite/index.ts +14 -0
- package/src/langium/update-rewrite/normalize-empty-strings.ts +86 -0
- package/src/langium/update-rewrite/semantic-root-rewrite.ts +57 -0
- package/src/langium/update-rewrite/update-rewrite-contribution.ts +44 -0
- package/src/langium/update-rewrite/update-rewrite-service.ts +129 -0
- package/src/langium/update-rewrite/update-rewrite.ts +60 -0
- package/src/langium/validation/document-validator.ts +188 -0
- package/src/langium/validation/index.ts +12 -0
- package/src/langium/validation/validation-contribution-collector.ts +61 -0
- package/src/langium/validation/validation-contribution.ts +38 -0
- package/src/langium/workspace/additional-document-contribution.ts +80 -0
- package/src/langium/workspace/document-uri-policy.ts +187 -0
- package/src/langium/workspace/file-system-provider.ts +52 -0
- package/src/langium/workspace/hydranium-langium-document-factory.ts +78 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +35 -0
- package/src/langium/workspace/hydranium-workspace-manager.ts +412 -0
- package/src/langium/workspace/in-memory-file-system-provider.ts +241 -0
- package/src/langium/workspace/index-manager.ts +266 -0
- package/src/langium/workspace/index.ts +23 -0
- package/src/langium/workspace/initialize-workspace.ts +102 -0
- package/src/langium/workspace/langium-documents.ts +94 -0
- package/src/langium/workspace/persistent-file-system-provider.ts +287 -0
- package/src/langium/workspace/synthetic.ts +63 -0
- package/src/langium/workspace/virtual-document.ts +94 -0
- package/src/langium/workspace/write-lock-scope.ts +88 -0
- package/src/launcher/index.ts +12 -0
- package/src/launcher/integrated-server.ts +28 -0
- package/src/lsp/completion/hydranium-completion-provider.ts +132 -0
- package/src/lsp/hydranium-document-update-handler.ts +345 -0
- package/src/lsp/index.ts +24 -0
- package/src/lsp/instrument-connection.ts +66 -0
- package/src/lsp/language-module.ts +64 -0
- package/src/lsp/semantic-token-provider.ts +215 -0
- package/src/lsp/shared-module.ts +88 -0
- package/src/lsp/start-language-server.ts +68 -0
- package/src/node/ast-ground-truth.ts +76 -0
- package/src/node/event-loop-monitor.ts +89 -0
- package/src/node/index.ts +53 -0
- package/src/node/latency-from-env.ts +39 -0
- package/src/node/lint-grammar.ts +189 -0
- package/src/node/log-file-sink.ts +43 -0
- package/src/node/log-preamble-node.ts +63 -0
- package/src/node/measure-memory.ts +196 -0
- package/src/node/memory-monitor.ts +103 -0
- package/src/node/node-file-system-provider.ts +252 -0
- package/src/node/process-memory.ts +299 -0
- package/src/node/profile-capture.ts +377 -0
- package/src/node/profile-digest.ts +112 -0
- package/src/node/profiling-run.ts +236 -0
- package/src/node/reflect-grammar.ts +182 -0
- package/src/node/server-diagnostics.ts +63 -0
- package/src/node/server-state-snapshot.ts +192 -0
- package/src/node/socket-launcher.ts +210 -0
- package/src/node/stdio-launcher.ts +150 -0
- package/src/node/validate-workspace.ts +133 -0
- package/src/node/write-lock-scope-node.ts +41 -0
- package/src/testing/ast-snapshot.ts +88 -0
- package/src/testing/document-uri-policy-conformance.ts +104 -0
- package/src/testing/fake-description.ts +52 -0
- package/src/testing/fake-document.ts +120 -0
- package/src/testing/fake-reflection.ts +39 -0
- package/src/testing/index.ts +45 -0
- package/src/testing/langium-test-helpers.ts +26 -0
- package/src/testing/make-noop-language-services.ts +47 -0
- package/src/testing/make-noop-shared-services.ts +78 -0
- package/src/testing/make-test-services.ts +356 -0
- package/src/testing/make-test-tracer.ts +92 -0
- package/src/testing/node/generated-workspace.ts +222 -0
- package/src/testing/node/golden-corpus.ts +114 -0
- package/src/testing/node/index.ts +29 -0
- package/src/testing/node/lsp-harness.ts +230 -0
- package/src/testing/node/lsp-server-connection.ts +575 -0
- package/src/testing/node/scratch-workspace.ts +137 -0
- package/src/testing/node/spawned-server.ts +447 -0
- package/src/testing/parse-semantic-root.ts +150 -0
- package/src/testing/playwright/browser-capture-bridge.ts +258 -0
- package/src/testing/playwright/e2e-profiling.ts +362 -0
- package/src/testing/playwright/index.ts +16 -0
- package/src/testing/playwright/server-log-capture.ts +433 -0
- package/src/testing/playwright/server-log-fixture.ts +57 -0
- package/src/testing/playwright/server-log-rename-reporter.ts +29 -0
- package/src/testing/run-update-pipeline.ts +113 -0
- package/src/testing/stub-ast-document-manager.ts +224 -0
- package/src/testing/stub-document-builder.ts +242 -0
- package/src/testing/stub-hydranium-text-documents.ts +270 -0
- package/src/testing/stub-index-manager.ts +79 -0
- package/src/testing/stub-langium-documents.ts +104 -0
- package/src/testing/stub-model-service.ts +72 -0
- package/src/testing/stub-project-manager.ts +161 -0
- package/src/testing/stub-self-save-registry.ts +43 -0
- package/src/testing/stub-service-registry.ts +192 -0
- package/src/testing/stub-writable-file-system.ts +58 -0
- package/src/util/connection-liveness.ts +47 -0
- package/src/util/environment.ts +88 -0
- package/src/util/index.ts +18 -0
- package/src/util/registry.ts +129 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 CrossBreeze, 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 { Deferred, type Logger, type Tracer } from '@hydranium/protocol';
|
|
11
|
+
import { DefaultWorkspaceManager, DocumentState, type LangiumDocument, UriUtils, type URI } from '@hydranium/langium';
|
|
12
|
+
import { type CancellationToken } from 'vscode-languageserver';
|
|
13
|
+
import type { WorkspaceFolder } from 'vscode-languageserver-types';
|
|
14
|
+
import { type LogNameOptions, resolveLogFilePlaceholder, toLogFileWorkspaceToken } from '../diagnostics/logger.js';
|
|
15
|
+
import type { ProjectChangeEvent } from '../project/project-change-event.js';
|
|
16
|
+
import type { ProjectManager } from '../project/project-manager.js';
|
|
17
|
+
import type { ServerSharedServicesMinimal } from '../shared-services.js';
|
|
18
|
+
import type { WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
|
|
19
|
+
import { type DocumentUriPolicy, findRealpathDivergence } from './document-uri-policy.js';
|
|
20
|
+
import { type AdditionalDocumentContribution, collectAdditionalDocuments } from './additional-document-contribution.js';
|
|
21
|
+
import { onProcessEvent } from '../../util/environment.js';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Module-level guard so repeated workspace-manager construction (e.g.
|
|
25
|
+
* test environments creating multiple instances across files) doesn't
|
|
26
|
+
* pile up listeners on the `process` singleton.
|
|
27
|
+
*/
|
|
28
|
+
let operationCancelledSuppressionInstalled = false;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The logger the installed listener routes through, re-pointed by every
|
|
32
|
+
* install rather than captured by the first. A process hosts more than one
|
|
33
|
+
* services tree — a test worker builds many, and a CLI subcommand spawns one
|
|
34
|
+
* beside a running head — and a handler holding the first tree's logger sends
|
|
35
|
+
* every later tree's genuine rejections to a logger nobody is reading.
|
|
36
|
+
*/
|
|
37
|
+
let operationCancelledSuppressionLogger: Logger | undefined;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Decide what to do with a process-level unhandled promise rejection.
|
|
41
|
+
*
|
|
42
|
+
* Langium's internal `Symbol(OperationCancelled)` marker — emitted when a
|
|
43
|
+
* `documentBuilder.build` is preempted by a concurrent write lock or
|
|
44
|
+
* cancellation token — is benign and is swallowed silently (without it the
|
|
45
|
+
* server logs spurious "Unhandled rejection" entries for cancellations that
|
|
46
|
+
* are not errors).
|
|
47
|
+
*
|
|
48
|
+
* Every OTHER reason is re-surfaced through {@link Logger.error}. This matters
|
|
49
|
+
* because Node disables its default crash/warn for ALL unhandled rejections as
|
|
50
|
+
* soon as any `unhandledRejection` listener is registered — so a handler that
|
|
51
|
+
* swallowed everything would make genuine unhandled rejections (real bugs)
|
|
52
|
+
* vanish silently. Logging keeps them visible while preserving the server's
|
|
53
|
+
* resilience (it does not re-crash the process).
|
|
54
|
+
*
|
|
55
|
+
* Pure and listener-free so it is unit-testable without touching the `process`
|
|
56
|
+
* singleton; {@link installOperationCancelledSuppression} wires it up.
|
|
57
|
+
*/
|
|
58
|
+
export function handleProcessUnhandledRejection(reason: unknown, logger: Logger): void {
|
|
59
|
+
if (typeof reason === 'symbol' && String(reason) === 'Symbol(OperationCancelled)') {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
logger.error('Unhandled promise rejection: ' + (reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Install a process-level `unhandledRejection` listener that routes every
|
|
67
|
+
* rejection through {@link handleProcessUnhandledRejection} — swallowing
|
|
68
|
+
* Langium's `OperationCancelled` marker and logging everything else via the
|
|
69
|
+
* supplied {@link Logger}.
|
|
70
|
+
*
|
|
71
|
+
* Idempotent — safe to call from every {@link HydraniumWorkspaceManager}
|
|
72
|
+
* constructor. The `process` listener is installed at most once, because one
|
|
73
|
+
* per tree would pile up on a singleton, but each call RE-POINTS the logger it
|
|
74
|
+
* routes through: the listener reads it at rejection time rather than closing
|
|
75
|
+
* over the first caller's, so the most recently built tree is the one that
|
|
76
|
+
* hears about a genuine rejection.
|
|
77
|
+
*
|
|
78
|
+
* Applies to every Langium-based server that experiences concurrent builds.
|
|
79
|
+
*/
|
|
80
|
+
export function installOperationCancelledSuppression(logger: Logger): void {
|
|
81
|
+
operationCancelledSuppressionLogger = logger;
|
|
82
|
+
if (operationCancelledSuppressionInstalled) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
operationCancelledSuppressionInstalled = true;
|
|
86
|
+
// Node-only: a browser worker has no `process` / `unhandledRejection` — the
|
|
87
|
+
// accessor makes this a no-op there.
|
|
88
|
+
onProcessEvent('unhandledRejection', reason => {
|
|
89
|
+
if (operationCancelledSuppressionLogger) {
|
|
90
|
+
handleProcessUnhandledRejection(reason, operationCancelledSuppressionLogger);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Framework {@link DefaultWorkspaceManager} subclass that integrates the
|
|
97
|
+
* project tier with Langium's workspace startup.
|
|
98
|
+
*
|
|
99
|
+
* ## Phase 0 — project discovery
|
|
100
|
+
*
|
|
101
|
+
* Overrides {@link performStartup} to await
|
|
102
|
+
* {@link ProjectManager.discoverProjects} **before** Langium's standard
|
|
103
|
+
* startup phases (additional documents → file traversal → workspace
|
|
104
|
+
* documents). By the time `documentBuilder.build` runs, the project
|
|
105
|
+
* registry is fully populated and every parsed document can resolve its
|
|
106
|
+
* owning project via `projectManager.getProject(uri)`.
|
|
107
|
+
*
|
|
108
|
+
* Single-project consumers using `SingleProjectManager` pay no cost —
|
|
109
|
+
* the override is a no-op resolve.
|
|
110
|
+
*
|
|
111
|
+
* Discovery has a side effect the startup sequence has to compensate for:
|
|
112
|
+
* it reads each descriptor through `LangiumDocuments.getOrCreateDocument`,
|
|
113
|
+
* so those documents already exist when Langium's traversal runs — and
|
|
114
|
+
* Langium's traversal deliberately drops URIs that already have a document
|
|
115
|
+
* ("ensure that the documents don't already exist"), so it never returns
|
|
116
|
+
* them. {@link performStartup} adds them back; see the method comment for
|
|
117
|
+
* what breaks without it.
|
|
118
|
+
*
|
|
119
|
+
* ## Cascade rebuild
|
|
120
|
+
*
|
|
121
|
+
* Subscribes to {@link ProjectManager.onProjectsChanged} in the
|
|
122
|
+
* constructor. When a project's identity, version, or dependencies
|
|
123
|
+
* change post-startup, the project manager emits the affected document
|
|
124
|
+
* URIs (its own members plus any transitive dependents per the
|
|
125
|
+
* `getAffectedProjects` hook). This manager re-runs
|
|
126
|
+
* `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
|
|
127
|
+
* affected document so the next build cycle re-links them with the new
|
|
128
|
+
* visibility scope.
|
|
129
|
+
*
|
|
130
|
+
* Descriptor URIs that triggered the cycle are intentionally excluded
|
|
131
|
+
* from the affected set by `AbstractProjectManager.onBuildUpdate` —
|
|
132
|
+
* re-adding them would loop.
|
|
133
|
+
*/
|
|
134
|
+
export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
|
|
135
|
+
protected readonly projectManager: ProjectManager;
|
|
136
|
+
protected readonly tracer: Tracer;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Deferred backing {@link workspaceInitialized}. The framework default
|
|
140
|
+
* resolves it from {@link initializeWorkspace} once Langium's standard
|
|
141
|
+
* workspace setup completes. Adopters that need to gate first-`didOpen`
|
|
142
|
+
* on additional async work (project-scope discovery, schema fetch, etc.)
|
|
143
|
+
* override {@link initializeWorkspace} and resolve / reject this Deferred
|
|
144
|
+
* after their work completes.
|
|
145
|
+
*/
|
|
146
|
+
protected readonly workspaceInitializedDeferred = new Deferred<unknown>();
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Resolves when the workspace is ready to handle the first `didOpen`
|
|
150
|
+
* event. `HydraniumTextDocuments.listen` awaits this promise inside its
|
|
151
|
+
* `didOpen` handler so the gate is hit at first use, not at DI. The
|
|
152
|
+
* framework resolves it from {@link initializeWorkspace}; adopters with
|
|
153
|
+
* extra async init override `initializeWorkspace` to thread their work
|
|
154
|
+
* before the resolve.
|
|
155
|
+
*/
|
|
156
|
+
readonly workspaceInitialized: Promise<unknown> = this.workspaceInitializedDeferred.promise;
|
|
157
|
+
|
|
158
|
+
protected readonly uriPolicy: DocumentUriPolicy;
|
|
159
|
+
protected readonly writableFileSystemProvider: WritableFileSystemProvider;
|
|
160
|
+
protected readonly additionalDocuments: Record<string, AdditionalDocumentContribution>;
|
|
161
|
+
/** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
|
|
162
|
+
protected readonly languageRegistry: ServerSharedServicesMinimal['ServiceRegistry'];
|
|
163
|
+
|
|
164
|
+
constructor(services: ServerSharedServicesMinimal, options: LogNameOptions = {}) {
|
|
165
|
+
super(services);
|
|
166
|
+
this.projectManager = services.workspace.ProjectManager;
|
|
167
|
+
this.projectManager.onProjectsChanged(event => this.onProjectsChanged(event));
|
|
168
|
+
this.uriPolicy = services.workspace.DocumentUriPolicy;
|
|
169
|
+
this.writableFileSystemProvider = services.workspace.FileSystemProvider;
|
|
170
|
+
this.additionalDocuments = services.additionalDocuments;
|
|
171
|
+
this.languageRegistry = services.ServiceRegistry;
|
|
172
|
+
this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceManager').trace('instantiated');
|
|
173
|
+
installOperationCancelledSuppression(this.tracer);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Contribution form of Langium's `loadAdditionalDocuments`. Runs the base
|
|
178
|
+
* behaviour first (a no-op unless a further subclass adds documents), then
|
|
179
|
+
* lets every {@link AdditionalDocumentContribution} in the shared
|
|
180
|
+
* `additionalDocuments` group build in-memory documents via the bound
|
|
181
|
+
* `LangiumDocumentFactory` and seed them through Langium's `collector`
|
|
182
|
+
* — so each is added to the workspace and indexed like a file-backed
|
|
183
|
+
* document. Adopters contribute a stdlib / built-in set here instead of
|
|
184
|
+
* overriding this method.
|
|
185
|
+
*/
|
|
186
|
+
protected override async loadAdditionalDocuments(
|
|
187
|
+
folders: WorkspaceFolder[],
|
|
188
|
+
collector: (document: LangiumDocument) => void
|
|
189
|
+
): Promise<void> {
|
|
190
|
+
await super.loadAdditionalDocuments(folders, collector);
|
|
191
|
+
const contributions = Object.keys(this.additionalDocuments);
|
|
192
|
+
if (contributions.length === 0) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Observable like the discovery / build-phase spans: one timed line
|
|
196
|
+
// reporting how many contributions ran and how many documents they
|
|
197
|
+
// seeded. `tags` is read at the done-emit, so the document count pushed
|
|
198
|
+
// inside the callback appears in the log line.
|
|
199
|
+
const tags: string[] = [`${contributions.length} contributions`];
|
|
200
|
+
let documentCount = 0;
|
|
201
|
+
await this.tracer.time(
|
|
202
|
+
'Load additional documents',
|
|
203
|
+
async () => {
|
|
204
|
+
await collectAdditionalDocuments(this.additionalDocuments, folders, document => {
|
|
205
|
+
documentCount++;
|
|
206
|
+
this.warnIfUnroutable(document);
|
|
207
|
+
collector(document);
|
|
208
|
+
});
|
|
209
|
+
tags.push(`${documentCount} documents`);
|
|
210
|
+
},
|
|
211
|
+
'info',
|
|
212
|
+
{ logAfterMs: 0, tags }
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Warn when a seeded additional document's URI matches no registered
|
|
218
|
+
* language.
|
|
219
|
+
*
|
|
220
|
+
* Such a document is added to the workspace and indexed, but every
|
|
221
|
+
* per-language service is resolved per URI — so scope computation, naming,
|
|
222
|
+
* validation and serialisation all fail to route to it, and it contributes
|
|
223
|
+
* nothing to the scopes it was written to populate. Nothing else reports
|
|
224
|
+
* this: the document exists, so no lookup errors, it is simply inert.
|
|
225
|
+
*
|
|
226
|
+
* The usual cause is a `virtualUri` with no file extension:
|
|
227
|
+
* `virtualUri(contributor)` yields `virtual:<contributor>`, and routing has
|
|
228
|
+
* nothing to match on — there is no extension, and a virtual document is
|
|
229
|
+
* never open in `TextDocuments`, so the declared-languageId rung cannot
|
|
230
|
+
* serve it either. The convention is to end the URI with a registered
|
|
231
|
+
* extension by passing it as the last segment,
|
|
232
|
+
* `virtualUri(contributor, 'name.<ext>')`.
|
|
233
|
+
*/
|
|
234
|
+
protected warnIfUnroutable(document: LangiumDocument): void {
|
|
235
|
+
if (this.languageRegistry.hasServices(document.uri)) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const extensions = this.languageRegistry.all.flatMap(language => language.LanguageMetaData.fileExtensions);
|
|
239
|
+
this.tracer.warn(
|
|
240
|
+
`Additional document '${document.uri.toString()}' matches no registered language, so every per-language ` +
|
|
241
|
+
'service (scope computation, naming, validation, serialization) will fail to route to it and it will ' +
|
|
242
|
+
`contribute nothing to scopes. End its URI with a registered file extension (${extensions.join(', ')}); ` +
|
|
243
|
+
'for a virtual document that means passing it as the last segment, `virtualUri(contributor, "name.<ext>")`.'
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
protected override async performStartup(folders: WorkspaceFolder[]): Promise<LangiumDocument[]> {
|
|
248
|
+
// Resolve the `{workspace}` file-tee placeholder (if configured) as early
|
|
249
|
+
// as possible — before any build logging — so per-workspace log capture
|
|
250
|
+
// names its file correctly and the buffered startup lines flush.
|
|
251
|
+
this.resolveWorkspaceLogTarget(folders);
|
|
252
|
+
// Snapshot the document set around discovery so the descriptor documents
|
|
253
|
+
// it creates can be identified afterwards. Plain iteration rather than
|
|
254
|
+
// stream operators, so the two passes work against any conforming
|
|
255
|
+
// `LangiumDocuments`; both run once per workspace initialization, next to
|
|
256
|
+
// a discovery walk of the whole tree.
|
|
257
|
+
const beforeDiscovery = new Set<string>();
|
|
258
|
+
for (const document of this.langiumDocuments.all) {
|
|
259
|
+
beforeDiscovery.add(document.uri.toString());
|
|
260
|
+
}
|
|
261
|
+
// Phase 0: project discovery. By the time Langium's standard startup
|
|
262
|
+
// runs below, `getProject(uri)` returns a definitive answer for every URI
|
|
263
|
+
// that belongs to a discovered project.
|
|
264
|
+
await this.projectManager.discoverProjects(folders);
|
|
265
|
+
const discovered: LangiumDocument[] = [];
|
|
266
|
+
for (const document of this.langiumDocuments.all) {
|
|
267
|
+
if (!beforeDiscovery.has(document.uri.toString())) {
|
|
268
|
+
discovered.push(document);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const documents = await super.performStartup(folders);
|
|
272
|
+
this.probePathDivergence(folders);
|
|
273
|
+
return this.withDiscoveredDescriptors(documents, discovered);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Add back the documents project discovery created that Langium's file
|
|
278
|
+
* traversal then filtered out.
|
|
279
|
+
*
|
|
280
|
+
* `AbstractProjectManager.discoverProjects` has to parse each descriptor to
|
|
281
|
+
* read it, which it does through `LangiumDocuments.getOrCreateDocument`.
|
|
282
|
+
* Langium's `performStartup` traversal skips any URI that already has a
|
|
283
|
+
* document, so every descriptor is missing from the list it returns — and
|
|
284
|
+
* `initializeWorkspace` builds exactly that list.
|
|
285
|
+
*
|
|
286
|
+
* The consequence is not a slow first build but a WRONG one. Descriptor
|
|
287
|
+
* documents stay at `Parsed` with nothing in the global index, while the
|
|
288
|
+
* documents that did make the list run all the way through `Linked` against
|
|
289
|
+
* that empty index. Every cross-document reference into a descriptor fails,
|
|
290
|
+
* and the failure sticks: a later build skips documents already at
|
|
291
|
+
* `Validated`, so nothing re-links them until the user edits the file.
|
|
292
|
+
*
|
|
293
|
+
* Invisible to an adopter whose descriptors ARE its model files (every file
|
|
294
|
+
* is a descriptor, the returned list is empty, `build([])` is a no-op).
|
|
295
|
+
* Fatal for one whose descriptors are a subset — a folder-scoped project
|
|
296
|
+
* model, or a second grammar whose files are never descriptors.
|
|
297
|
+
*
|
|
298
|
+
* Only documents created by discovery are re-added: pre-existing ones are
|
|
299
|
+
* either additional/library documents (already collected by
|
|
300
|
+
* `loadAdditionalDocuments`) or leftovers from an earlier initialization,
|
|
301
|
+
* and neither belongs in this build list.
|
|
302
|
+
*/
|
|
303
|
+
protected withDiscoveredDescriptors(documents: LangiumDocument[], discovered: readonly LangiumDocument[]): LangiumDocument[] {
|
|
304
|
+
if (discovered.length === 0) {
|
|
305
|
+
return documents;
|
|
306
|
+
}
|
|
307
|
+
const collected = new Set(documents.map(document => document.uri.toString()));
|
|
308
|
+
const missing = discovered.filter(document => !collected.has(document.uri.toString()));
|
|
309
|
+
if (missing.length === 0) {
|
|
310
|
+
return documents;
|
|
311
|
+
}
|
|
312
|
+
this.tracer.debug(`Re-adding ${missing.length} project-descriptor document(s) to the initial build.`);
|
|
313
|
+
return [...missing, ...documents];
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* One-shot startup diagnostic. Warns when a workspace root resolves through a
|
|
318
|
+
* symlink / `..` / case variant, so the URI a client opens (`S`) diverges
|
|
319
|
+
* from the canonical document identity (`R`) the build keys by — the
|
|
320
|
+
* condition the {@link DocumentUriPolicy} seam exists to reconcile.
|
|
321
|
+
* Probing the roots is sufficient and cheap: a divergent ancestor means every
|
|
322
|
+
* file beneath it diverges, and the loaded documents' URIs are already
|
|
323
|
+
* canonical (their original spelling is gone). Emits NOTHING for a plain
|
|
324
|
+
* on-disk workspace, or a filesystem without `realpath` — so a non-empty line
|
|
325
|
+
* is the empirical signal that a deployment actually exercises the divergence
|
|
326
|
+
* machinery.
|
|
327
|
+
*/
|
|
328
|
+
protected probePathDivergence(folders: WorkspaceFolder[]): void {
|
|
329
|
+
if (!this.uriPolicy) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
for (const folder of folders) {
|
|
333
|
+
const real = findRealpathDivergence(folder.uri, this.writableFileSystemProvider);
|
|
334
|
+
if (!real) {
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
const policyName = this.uriPolicy.constructor.name;
|
|
338
|
+
const collapsed = this.uriPolicy.canonicalUri(folder.uri) === this.uriPolicy.canonicalUri(real);
|
|
339
|
+
this.tracer.warn(
|
|
340
|
+
`Workspace root '${folder.uri}' resolves through a symlink/'..'/case variant to '${real.toString()}', ` +
|
|
341
|
+
`so client URIs under it diverge from canonical document identity. ` +
|
|
342
|
+
(collapsed
|
|
343
|
+
? `The bound ${policyName} collapses both spellings to one identity, so subscriptions stay consistent.`
|
|
344
|
+
: `The bound ${policyName} does NOT collapse them — the link and its target would become distinct documents.`)
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Resolve the `{workspace}` file-tee placeholder from the first workspace
|
|
351
|
+
* folder. No-op when no folder is known or no `{workspace}`-templated log
|
|
352
|
+
* target is configured. See {@link toLogFileWorkspaceToken} for the token
|
|
353
|
+
* derivation — a log-capturing test harness uses the same function so the
|
|
354
|
+
* server's file name and the harness's correlation key agree.
|
|
355
|
+
*/
|
|
356
|
+
protected resolveWorkspaceLogTarget(folders: WorkspaceFolder[]): void {
|
|
357
|
+
const first = folders[0];
|
|
358
|
+
if (first) {
|
|
359
|
+
resolveLogFilePlaceholder('workspace', toLogFileWorkspaceToken(first.uri));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Override of Langium's workspace setup to resolve / reject
|
|
365
|
+
* {@link workspaceInitializedDeferred} once setup completes. Adopters with
|
|
366
|
+
* extra async work override this method, do their work in a sub-helper,
|
|
367
|
+
* and either delegate to `super.initializeWorkspace(...)` (preserving the
|
|
368
|
+
* default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
|
|
369
|
+
* themselves after the additional work finishes.
|
|
370
|
+
*/
|
|
371
|
+
override async initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void> {
|
|
372
|
+
try {
|
|
373
|
+
await super.initializeWorkspace(folders, cancelToken);
|
|
374
|
+
this.workspaceInitializedDeferred.resolve(undefined);
|
|
375
|
+
} catch (error) {
|
|
376
|
+
this.workspaceInitializedDeferred.reject(error);
|
|
377
|
+
throw error;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Default cascade-rebuild handler. Iterates {@link ProjectChangeEvent.affectedDocuments}
|
|
383
|
+
* and resets each to {@link DocumentState.Changed} so the next build cycle
|
|
384
|
+
* re-runs the pipeline (parse → link → validate) under the new project
|
|
385
|
+
* visibility scope.
|
|
386
|
+
*
|
|
387
|
+
* Subclasses can override for additional behaviour (e.g. logging,
|
|
388
|
+
* telemetry, custom rebuild policies); call `super` to preserve the
|
|
389
|
+
* default cascade.
|
|
390
|
+
*/
|
|
391
|
+
protected onProjectsChanged(event: ProjectChangeEvent): void {
|
|
392
|
+
for (const uri of event.affectedDocuments) {
|
|
393
|
+
const document = this.langiumDocuments.getDocument(uri);
|
|
394
|
+
if (document) {
|
|
395
|
+
this.documentBuilder.resetToState(document, DocumentState.Changed);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Format a URI as a workspace-relative path suitable for log messages.
|
|
402
|
+
* Returns the path relative to `workspace` when provided (defaults to the
|
|
403
|
+
* first workspace folder's URI); falls back to the URI string when no
|
|
404
|
+
* workspace folder is known. Adopters with a multi-workspace model or a
|
|
405
|
+
* different display convention override on their workspace-manager
|
|
406
|
+
* subclass.
|
|
407
|
+
*/
|
|
408
|
+
wsRelativePath(uri: URI | string, workspace?: string): string;
|
|
409
|
+
wsRelativePath(uri: URI | string, workspace = this.workspaceFolders?.[0]?.uri): string {
|
|
410
|
+
return workspace ? UriUtils.relative(workspace, uri) : typeof uri === 'string' ? uri : uri.path.toString();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 CrossBreeze, 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 FileSystemNode, URI } from '@hydranium/langium';
|
|
11
|
+
import { type Tracer } from '@hydranium/protocol';
|
|
12
|
+
import { type WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
|
|
13
|
+
import { type LogNameOptions } from '../diagnostics/logger.js';
|
|
14
|
+
import { serverSharedFactory, type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
15
|
+
import { serveVirtualDocument } from './virtual-document.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* File content keyed by path, for seeding an {@link InMemoryFileSystemProvider}.
|
|
19
|
+
*
|
|
20
|
+
* Keys are absolute URI strings unless {@link InMemoryFileSystemOptions.rootUri}
|
|
21
|
+
* is given, in which case they are relative to it. The relative form is what
|
|
22
|
+
* lets a build step emit the record without knowing where the host will mount
|
|
23
|
+
* the workspace.
|
|
24
|
+
*/
|
|
25
|
+
export type FileSystemSeed = Readonly<Record<string, string>>;
|
|
26
|
+
|
|
27
|
+
/** Options for {@link InMemoryFileSystemProvider} and {@link inMemoryFileSystem}. */
|
|
28
|
+
export interface InMemoryFileSystemOptions extends LogNameOptions {
|
|
29
|
+
/** Initial content. Absent leaves the filesystem empty but writable. */
|
|
30
|
+
seed?: FileSystemSeed;
|
|
31
|
+
/**
|
|
32
|
+
* Prefix for relative {@link seed} keys, without a trailing separator. When
|
|
33
|
+
* omitted the keys are taken as absolute URIs.
|
|
34
|
+
*/
|
|
35
|
+
rootUri?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A writable filesystem held in a `Map`, for a host with no disk — a browser
|
|
40
|
+
* worker, or a test that needs the workspace walk to find real content.
|
|
41
|
+
*
|
|
42
|
+
* # Why neither shipped provider stands in
|
|
43
|
+
*
|
|
44
|
+
* `DefaultEmptyFileSystemProvider` is genuinely empty (reads throw, writes
|
|
45
|
+
* are dropped) and the disk-backed one in `@hydranium/core/node` pulls
|
|
46
|
+
* `node:fs`, which a browser bundle refuses to resolve. A host that means to
|
|
47
|
+
* open a workspace without a disk needs a third thing: real contents, no
|
|
48
|
+
* syscalls.
|
|
49
|
+
*
|
|
50
|
+
* # It must be typed writable, not merely `FileSystemProvider`
|
|
51
|
+
*
|
|
52
|
+
* The `fileSystemProvider` context slot accepts what it is handed only if that
|
|
53
|
+
* carries `writeFile`; anything narrower is silently replaced by the empty
|
|
54
|
+
* default, which presents as "the workspace is empty" rather than as a wiring
|
|
55
|
+
* error. A read-only in-memory provider is therefore not a smaller version of
|
|
56
|
+
* this one — it is one that does not bind.
|
|
57
|
+
*
|
|
58
|
+
* # Directories are implied, never stored
|
|
59
|
+
*
|
|
60
|
+
* Only files are held. A directory exists exactly when some file key sits under
|
|
61
|
+
* it, which is what keeps a write a single `Map.set` with no parent-creation
|
|
62
|
+
* step to forget. The cost is that an empty directory cannot be represented; the
|
|
63
|
+
* workspace walk does not need one, and a stored directory set would be a second
|
|
64
|
+
* source of truth to keep in step with the first.
|
|
65
|
+
*
|
|
66
|
+
* # A trailing separator is stripped on every lookup
|
|
67
|
+
*
|
|
68
|
+
* Langium spells the workspace root both with and without one depending on which
|
|
69
|
+
* walk asks, so normalising only where a directory prefix is computed leaves
|
|
70
|
+
* `stat` and `exists` disagreeing with `readDirectory` about the same folder.
|
|
71
|
+
*
|
|
72
|
+
* # What it deliberately does not answer
|
|
73
|
+
*
|
|
74
|
+
* No watch notifications, no case-insensitivity, no eviction policy for a
|
|
75
|
+
* workspace larger than memory. `mtimeMs` and `realpath` are omitted rather than
|
|
76
|
+
* stubbed, which the framework degrades on by design: the self-save filter lets
|
|
77
|
+
* the change through and the URI policy keeps the URI it was given.
|
|
78
|
+
*
|
|
79
|
+
* Nor does the map outlive the host: every write is lost when the process or the
|
|
80
|
+
* page goes. `PersistentFileSystemProvider` is the subclass that mirrors
|
|
81
|
+
* the same writes into an asynchronous backing store, and it is a subclass
|
|
82
|
+
* rather than an option because the map has to stay the read path either way.
|
|
83
|
+
*/
|
|
84
|
+
export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
|
|
85
|
+
protected readonly files = new Map<string, string>();
|
|
86
|
+
protected readonly tracer: Tracer;
|
|
87
|
+
|
|
88
|
+
constructor(
|
|
89
|
+
protected readonly services: ServerSharedServicesMinimal,
|
|
90
|
+
options: InMemoryFileSystemOptions = {}
|
|
91
|
+
) {
|
|
92
|
+
const { seed = {}, rootUri } = options;
|
|
93
|
+
for (const [path, content] of Object.entries(seed)) {
|
|
94
|
+
this.files.set(normalize(rootUri === undefined ? path : `${rootUri}/${path}`), content);
|
|
95
|
+
}
|
|
96
|
+
this.tracer = services.Tracer.for(options.logName ?? this.constructor.name).trace('instantiated', {
|
|
97
|
+
files: this.files.size
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Replace the content at `uri`, creating it if absent. The synchronous twin
|
|
103
|
+
* of `writeFile`, for a test that mutates the filesystem between builds
|
|
104
|
+
* rather than through the server.
|
|
105
|
+
*/
|
|
106
|
+
setFile(uri: URI, content: string): void {
|
|
107
|
+
this.files.set(normalize(uri), content);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Remove the file at `uri`. A no-op when nothing is there. */
|
|
111
|
+
deleteFile(uri: URI): void {
|
|
112
|
+
this.files.delete(normalize(uri));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async writeFile(uri: URI, content: string): Promise<void> {
|
|
116
|
+
this.setFile(uri, content);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
readFile(uri: URI): Promise<string> {
|
|
120
|
+
return Promise.resolve(this.readFileSync(uri));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
readFileSync(uri: URI): string {
|
|
124
|
+
const served = serveVirtualDocument(this.services, uri);
|
|
125
|
+
if (served !== undefined) {
|
|
126
|
+
return served;
|
|
127
|
+
}
|
|
128
|
+
const content = this.files.get(normalize(uri));
|
|
129
|
+
if (content === undefined) {
|
|
130
|
+
throw new Error(`No such file: ${uri.toString()}`);
|
|
131
|
+
}
|
|
132
|
+
return content;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
readBinary(uri: URI): Promise<Uint8Array> {
|
|
136
|
+
return Promise.resolve(this.readBinarySync(uri));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
readBinarySync(uri: URI): Uint8Array {
|
|
140
|
+
return new TextEncoder().encode(this.readFileSync(uri));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
stat(uri: URI): Promise<FileSystemNode> {
|
|
144
|
+
return Promise.resolve(this.statSync(uri));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
statSync(uri: URI): FileSystemNode {
|
|
148
|
+
const path = normalize(uri);
|
|
149
|
+
if (this.files.has(path)) {
|
|
150
|
+
return { isFile: true, isDirectory: false, uri };
|
|
151
|
+
}
|
|
152
|
+
if (this.hasChildren(path)) {
|
|
153
|
+
return { isFile: false, isDirectory: true, uri };
|
|
154
|
+
}
|
|
155
|
+
throw new Error(`No such file or directory: ${uri.toString()}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
exists(uri: URI): Promise<boolean> {
|
|
159
|
+
return Promise.resolve(this.existsSync(uri));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
existsSync(uri: URI): boolean {
|
|
163
|
+
const path = normalize(uri);
|
|
164
|
+
return this.files.has(path) || this.hasChildren(path);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
readDirectory(uri: URI): Promise<FileSystemNode[]> {
|
|
168
|
+
return Promise.resolve(this.readDirectorySync(uri));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
readDirectorySync(uri: URI): FileSystemNode[] {
|
|
172
|
+
const prefix = `${normalize(uri)}/`;
|
|
173
|
+
const children = new Map<string, boolean>();
|
|
174
|
+
for (const path of this.files.keys()) {
|
|
175
|
+
if (!path.startsWith(prefix)) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const remainder = path.slice(prefix.length);
|
|
179
|
+
const separator = remainder.indexOf('/');
|
|
180
|
+
const name = separator < 0 ? remainder : remainder.slice(0, separator);
|
|
181
|
+
if (!children.has(name)) {
|
|
182
|
+
children.set(name, separator < 0);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return [...children].map(([name, isFile]) => ({
|
|
186
|
+
isFile,
|
|
187
|
+
isDirectory: !isFile,
|
|
188
|
+
uri: URI.parse(`${prefix}${name}`)
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The map key for `uri`.
|
|
194
|
+
*
|
|
195
|
+
* Exposed for a subclass that mirrors the map into a second store and has to
|
|
196
|
+
* key it the same way. Deriving a key from `uri.toString()` instead agrees
|
|
197
|
+
* with this one for every ordinary path and disagrees for exactly the ones
|
|
198
|
+
* normalisation exists for — a percent-encodable character, a trailing
|
|
199
|
+
* separator — so the stored entry becomes unfindable in the case nobody
|
|
200
|
+
* tests.
|
|
201
|
+
*/
|
|
202
|
+
protected fileKey(uri: URI | string): string {
|
|
203
|
+
return normalize(uri);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
protected hasChildren(path: string): boolean {
|
|
207
|
+
const prefix = `${path}/`;
|
|
208
|
+
for (const candidate of this.files.keys()) {
|
|
209
|
+
if (candidate.startsWith(prefix)) {
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Key a URI into the file map: parsed so a seeded string and a URI the framework
|
|
219
|
+
* hands back agree on percent-encoding, then stripped of a trailing separator so
|
|
220
|
+
* a folder spelled both ways is one entry.
|
|
221
|
+
*/
|
|
222
|
+
function normalize(uri: URI | string): string {
|
|
223
|
+
const text = typeof uri === 'string' ? URI.parse(uri).toString() : uri.toString();
|
|
224
|
+
return text.endsWith('/') ? text.slice(0, -1) : text;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Module fragment binding an {@link InMemoryFileSystemProvider}, spread into the
|
|
229
|
+
* services context exactly where a Node host spreads `NodeFileSystem`.
|
|
230
|
+
*
|
|
231
|
+
* A host that needs to reach the provider afterwards — to seed or mutate it
|
|
232
|
+
* mid-test — reads it back off `shared.workspace.FileSystemProvider`, since the
|
|
233
|
+
* slot owns construction.
|
|
234
|
+
*/
|
|
235
|
+
export function inMemoryFileSystem(options: InMemoryFileSystemOptions = {}): {
|
|
236
|
+
fileSystemProvider: (services: unknown) => WritableFileSystemProvider;
|
|
237
|
+
} {
|
|
238
|
+
return {
|
|
239
|
+
fileSystemProvider: serverSharedFactory(services => new InMemoryFileSystemProvider(services, options))
|
|
240
|
+
};
|
|
241
|
+
}
|