@aster-cloud/aster-lang-ts 1.0.37 → 1.2.0
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/CHANGELOG.md +68 -0
- package/README.md +13 -7
- package/dist/scripts/aster.js +10 -5
- package/dist/scripts/aster.js.map +1 -1
- package/dist/scripts/core-ir-json.js +8 -3
- package/dist/scripts/core-ir-json.js.map +1 -1
- package/dist/scripts/emit-classfiles.js +3 -2
- package/dist/scripts/emit-classfiles.js.map +1 -1
- package/dist/scripts/emit-core.js +8 -5
- package/dist/scripts/emit-core.js.map +1 -1
- package/dist/scripts/generate-casefold.d.ts +2 -0
- package/dist/scripts/generate-casefold.d.ts.map +1 -0
- package/dist/scripts/generate-casefold.js +34 -0
- package/dist/scripts/generate-casefold.js.map +1 -0
- package/dist/scripts/generate-diagnostic-overlays.d.ts +29 -0
- package/dist/scripts/generate-diagnostic-overlays.d.ts.map +1 -0
- package/dist/scripts/generate-diagnostic-overlays.js +90 -0
- package/dist/scripts/generate-diagnostic-overlays.js.map +1 -0
- package/dist/scripts/golden.js +45 -20
- package/dist/scripts/golden.js.map +1 -1
- package/dist/scripts/perf-benchmark.js +1 -0
- package/dist/scripts/perf-benchmark.js.map +1 -1
- package/dist/scripts/profile-medium-project.js +1 -1
- package/dist/scripts/profile-medium-project.js.map +1 -1
- package/dist/scripts/repl.js +3 -8
- package/dist/scripts/repl.js.map +1 -1
- package/dist/scripts/typecheck-cli.js +10 -9
- package/dist/scripts/typecheck-cli.js.map +1 -1
- package/dist/scripts/update-eff-violation-expected.js +6 -6
- package/dist/scripts/update-eff-violation-expected.js.map +1 -1
- package/dist/scripts/verify-capabilities.js +3 -6
- package/dist/scripts/verify-capabilities.js.map +1 -1
- package/dist/scripts/verify-lexicon-sync.js +26 -0
- package/dist/scripts/verify-lexicon-sync.js.map +1 -1
- package/dist/src/ai/validator.d.ts +1 -1
- package/dist/src/ai/validator.d.ts.map +1 -1
- package/dist/src/ai/validator.js +12 -12
- package/dist/src/ai/validator.js.map +1 -1
- package/dist/src/ast/ast.d.ts +2 -0
- package/dist/src/ast/ast.d.ts.map +1 -1
- package/dist/src/ast/ast.js +6 -0
- package/dist/src/ast/ast.js.map +1 -1
- package/dist/src/ast/type-nodes.d.ts +25 -0
- package/dist/src/ast/type-nodes.d.ts.map +1 -0
- package/dist/src/ast/type-nodes.js +56 -0
- package/dist/src/ast/type-nodes.js.map +1 -0
- package/dist/src/browser.d.ts +27 -10
- package/dist/src/browser.d.ts.map +1 -1
- package/dist/src/browser.js +44 -55
- package/dist/src/browser.js.map +1 -1
- package/dist/src/cli/policy-converter.js +5 -9
- package/dist/src/cli/policy-converter.js.map +1 -1
- package/dist/src/cnl-printer.d.ts.map +1 -1
- package/dist/src/cnl-printer.js +10 -9
- package/dist/src/cnl-printer.js.map +1 -1
- package/dist/src/compile-pipeline.d.ts +48 -0
- package/dist/src/compile-pipeline.d.ts.map +1 -0
- package/dist/src/compile-pipeline.js +89 -0
- package/dist/src/compile-pipeline.js.map +1 -0
- package/dist/src/config/lexicons/diagnostic-messages.d.ts +7 -5
- package/dist/src/config/lexicons/diagnostic-messages.d.ts.map +1 -1
- package/dist/src/config/lexicons/diagnostic-messages.js +17 -105
- package/dist/src/config/lexicons/diagnostic-messages.js.map +1 -1
- package/dist/src/config/lexicons/diagnostic-overlays.generated.d.ts +9 -0
- package/dist/src/config/lexicons/diagnostic-overlays.generated.d.ts.map +1 -0
- package/dist/src/config/lexicons/diagnostic-overlays.generated.js +615 -0
- package/dist/src/config/lexicons/diagnostic-overlays.generated.js.map +1 -0
- package/dist/src/config/lexicons/identifiers/casefold-table.generated.d.ts +9 -0
- package/dist/src/config/lexicons/identifiers/casefold-table.generated.d.ts.map +1 -0
- package/dist/src/config/lexicons/identifiers/casefold-table.generated.js +1467 -0
- package/dist/src/config/lexicons/identifiers/casefold-table.generated.js.map +1 -0
- package/dist/src/config/lexicons/identifiers/casefold.d.ts +7 -0
- package/dist/src/config/lexicons/identifiers/casefold.d.ts.map +1 -0
- package/dist/src/config/lexicons/identifiers/casefold.js +37 -0
- package/dist/src/config/lexicons/identifiers/casefold.js.map +1 -0
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.de-DE.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.de-DE.js +8 -0
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.de-DE.js.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.en-US.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.en-US.js +8 -0
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.en-US.js.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.zh-CN.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.zh-CN.js +8 -0
- package/dist/src/config/lexicons/identifiers/domains/finance.loan.zh-CN.js.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.de-DE.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.de-DE.js +6 -0
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.de-DE.js.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.en-US.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.en-US.js +6 -0
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.en-US.js.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.zh-CN.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.zh-CN.js +6 -0
- package/dist/src/config/lexicons/identifiers/domains/insurance.auto.zh-CN.js.map +1 -1
- package/dist/src/config/lexicons/identifiers/index.d.ts +7 -9
- package/dist/src/config/lexicons/identifiers/index.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/index.js +8 -9
- package/dist/src/config/lexicons/identifiers/index.js.map +1 -1
- package/dist/src/config/lexicons/identifiers/registry.d.ts +11 -5
- package/dist/src/config/lexicons/identifiers/registry.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/registry.js +20 -14
- package/dist/src/config/lexicons/identifiers/registry.js.map +1 -1
- package/dist/src/config/lexicons/identifiers/scopes.d.ts +52 -0
- package/dist/src/config/lexicons/identifiers/scopes.d.ts.map +1 -0
- package/dist/src/config/lexicons/identifiers/scopes.js +166 -0
- package/dist/src/config/lexicons/identifiers/scopes.js.map +1 -0
- package/dist/src/config/lexicons/identifiers/types.d.ts +15 -29
- package/dist/src/config/lexicons/identifiers/types.d.ts.map +1 -1
- package/dist/src/config/lexicons/identifiers/types.js +91 -101
- package/dist/src/config/lexicons/identifiers/types.js.map +1 -1
- package/dist/src/config/lexicons/lsp-ui-texts.d.ts +7 -0
- package/dist/src/config/lexicons/lsp-ui-texts.d.ts.map +1 -1
- package/dist/src/config/lexicons/lsp-ui-texts.js +12 -0
- package/dist/src/config/lexicons/lsp-ui-texts.js.map +1 -1
- package/dist/src/config/semantic.d.ts +5 -0
- package/dist/src/config/semantic.d.ts.map +1 -1
- package/dist/src/config/semantic.js +12 -0
- package/dist/src/config/semantic.js.map +1 -1
- package/dist/src/core/core_ir.d.ts +2 -0
- package/dist/src/core/core_ir.d.ts.map +1 -1
- package/dist/src/core/core_ir.js +6 -0
- package/dist/src/core/core_ir.js.map +1 -1
- package/dist/src/core/inferred_fields.d.ts +10 -0
- package/dist/src/core/inferred_fields.d.ts.map +1 -1
- package/dist/src/core/inferred_fields.js +9 -0
- package/dist/src/core/inferred_fields.js.map +1 -1
- package/dist/src/core/interpreter.d.ts.map +1 -1
- package/dist/src/core/interpreter.js +12 -10
- package/dist/src/core/interpreter.js.map +1 -1
- package/dist/src/core/resolution-mark.d.ts +28 -0
- package/dist/src/core/resolution-mark.d.ts.map +1 -0
- package/dist/src/core/resolution-mark.js +19 -0
- package/dist/src/core/resolution-mark.js.map +1 -0
- package/dist/src/core/resolve-typed-references.d.ts +36 -0
- package/dist/src/core/resolve-typed-references.d.ts.map +1 -0
- package/dist/src/core/resolve-typed-references.js +703 -0
- package/dist/src/core/resolve-typed-references.js.map +1 -0
- package/dist/src/diagnostics/error_codes.d.ts +11 -1
- package/dist/src/diagnostics/error_codes.d.ts.map +1 -1
- package/dist/src/diagnostics/error_codes.js +80 -0
- package/dist/src/diagnostics/error_codes.js.map +1 -1
- package/dist/src/frontend/canonicalizer.d.ts +8 -13
- package/dist/src/frontend/canonicalizer.d.ts.map +1 -1
- package/dist/src/frontend/canonicalizer.js +19 -48
- package/dist/src/frontend/canonicalizer.js.map +1 -1
- package/dist/src/frontend/resolution-choice.d.ts +34 -0
- package/dist/src/frontend/resolution-choice.d.ts.map +1 -0
- package/dist/src/frontend/resolution-choice.js +69 -0
- package/dist/src/frontend/resolution-choice.js.map +1 -0
- package/dist/src/frontend/resolution-context.d.ts +28 -0
- package/dist/src/frontend/resolution-context.d.ts.map +1 -0
- package/dist/src/frontend/resolution-context.js +7 -0
- package/dist/src/frontend/resolution-context.js.map +1 -0
- package/dist/src/frontend/resolve-declarations.d.ts +13 -0
- package/dist/src/frontend/resolve-declarations.d.ts.map +1 -0
- package/dist/src/frontend/resolve-declarations.js +595 -0
- package/dist/src/frontend/resolve-declarations.js.map +1 -0
- package/dist/src/frontend/resolve-policy-types.d.ts +54 -0
- package/dist/src/frontend/resolve-policy-types.d.ts.map +1 -0
- package/dist/src/frontend/resolve-policy-types.js +71 -0
- package/dist/src/frontend/resolve-policy-types.js.map +1 -0
- package/dist/src/index.d.ts +14 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +14 -7
- package/dist/src/index.js.map +1 -1
- package/dist/src/lower_to_core.d.ts +2 -16
- package/dist/src/lower_to_core.d.ts.map +1 -1
- package/dist/src/lower_to_core.js +105 -44
- package/dist/src/lower_to_core.js.map +1 -1
- package/dist/src/lsp/canonicalize-options.d.ts +8 -11
- package/dist/src/lsp/canonicalize-options.d.ts.map +1 -1
- package/dist/src/lsp/canonicalize-options.js +8 -8
- package/dist/src/lsp/canonicalize-options.js.map +1 -1
- package/dist/src/lsp/completion.d.ts +55 -5
- package/dist/src/lsp/completion.d.ts.map +1 -1
- package/dist/src/lsp/completion.js +149 -0
- package/dist/src/lsp/completion.js.map +1 -1
- package/dist/src/lsp/diagnostics.d.ts +2 -0
- package/dist/src/lsp/diagnostics.d.ts.map +1 -1
- package/dist/src/lsp/diagnostics.js +84 -73
- package/dist/src/lsp/diagnostics.js.map +1 -1
- package/dist/src/lsp/navigation/definition.d.ts +2 -1
- package/dist/src/lsp/navigation/definition.d.ts.map +1 -1
- package/dist/src/lsp/navigation/definition.js +35 -1
- package/dist/src/lsp/navigation/definition.js.map +1 -1
- package/dist/src/lsp/navigation/hover.d.ts +12 -5
- package/dist/src/lsp/navigation/hover.d.ts.map +1 -1
- package/dist/src/lsp/navigation/hover.js +136 -90
- package/dist/src/lsp/navigation/hover.js.map +1 -1
- package/dist/src/lsp/parse-document.d.ts +4 -1
- package/dist/src/lsp/parse-document.d.ts.map +1 -1
- package/dist/src/lsp/parse-document.js +20 -17
- package/dist/src/lsp/parse-document.js.map +1 -1
- package/dist/src/lsp/resolution.d.ts +40 -0
- package/dist/src/lsp/resolution.d.ts.map +1 -0
- package/dist/src/lsp/resolution.js +179 -0
- package/dist/src/lsp/resolution.js.map +1 -0
- package/dist/src/lsp/server.js +3 -1
- package/dist/src/lsp/server.js.map +1 -1
- package/dist/src/lsp/source-positions.d.ts +2 -8
- package/dist/src/lsp/source-positions.d.ts.map +1 -1
- package/dist/src/lsp/source-positions.js +4 -16
- package/dist/src/lsp/source-positions.js.map +1 -1
- package/dist/src/mapping/pipeline.js +3 -2
- package/dist/src/mapping/pipeline.js.map +1 -1
- package/dist/src/mapping/review-queue.d.ts.map +1 -1
- package/dist/src/mapping/review-queue.js +3 -2
- package/dist/src/mapping/review-queue.js.map +1 -1
- package/dist/src/parser/context.d.ts +3 -1
- package/dist/src/parser/context.d.ts.map +1 -1
- package/dist/src/parser/context.js +1 -0
- package/dist/src/parser/context.js.map +1 -1
- package/dist/src/parser/decl-parser.d.ts.map +1 -1
- package/dist/src/parser/decl-parser.js +7 -5
- package/dist/src/parser/decl-parser.js.map +1 -1
- package/dist/src/parser/expr-stmt-parser.d.ts.map +1 -1
- package/dist/src/parser/expr-stmt-parser.js +2 -16
- package/dist/src/parser/expr-stmt-parser.js.map +1 -1
- package/dist/src/parser/type-parser.d.ts.map +1 -1
- package/dist/src/parser/type-parser.js +42 -0
- package/dist/src/parser/type-parser.js.map +1 -1
- package/dist/src/parser.d.ts.map +1 -1
- package/dist/src/parser.js +6 -1
- package/dist/src/parser.js.map +1 -1
- package/dist/src/typecheck/diagnostics.d.ts +10 -0
- package/dist/src/typecheck/diagnostics.d.ts.map +1 -1
- package/dist/src/typecheck/diagnostics.js +27 -0
- package/dist/src/typecheck/diagnostics.js.map +1 -1
- package/dist/src/typecheck/expression.d.ts.map +1 -1
- package/dist/src/typecheck/expression.js +13 -0
- package/dist/src/typecheck/expression.js.map +1 -1
- package/dist/src/typecheck/generics.d.ts +5 -0
- package/dist/src/typecheck/generics.d.ts.map +1 -1
- package/dist/src/typecheck/generics.js +15 -8
- package/dist/src/typecheck/generics.js.map +1 -1
- package/dist/src/types.d.ts +59 -13
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/version.d.ts +18 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/src/version.js +18 -0
- package/dist/src/version.js.map +1 -0
- package/dist/test/integration/builtin-enum-vocabulary.test.d.ts +2 -0
- package/dist/test/integration/builtin-enum-vocabulary.test.d.ts.map +1 -0
- package/dist/test/integration/builtin-enum-vocabulary.test.js +51 -0
- package/dist/test/integration/builtin-enum-vocabulary.test.js.map +1 -0
- package/dist/test/integration/lsp/lsp-rename-safety.test.js +0 -13
- package/dist/test/integration/lsp/lsp-rename-safety.test.js.map +1 -1
- package/dist/test/integration/name-resolution-entrypoints.test.d.ts +2 -0
- package/dist/test/integration/name-resolution-entrypoints.test.d.ts.map +1 -0
- package/dist/test/integration/name-resolution-entrypoints.test.js +109 -0
- package/dist/test/integration/name-resolution-entrypoints.test.js.map +1 -0
- package/dist/test/integration/scripts/typecheck-cli-repl.test.d.ts +2 -0
- package/dist/test/integration/scripts/typecheck-cli-repl.test.d.ts.map +1 -0
- package/dist/test/integration/scripts/typecheck-cli-repl.test.js +133 -0
- package/dist/test/integration/scripts/typecheck-cli-repl.test.js.map +1 -0
- package/dist/test/integration/vocabulary-resolution.test.d.ts +2 -0
- package/dist/test/integration/vocabulary-resolution.test.d.ts.map +1 -0
- package/dist/test/integration/vocabulary-resolution.test.js +291 -0
- package/dist/test/integration/vocabulary-resolution.test.js.map +1 -0
- package/dist/test/property/property.test.js +2 -1
- package/dist/test/property/property.test.js.map +1 -1
- package/dist/test/unit/canonicalizer/canonicalizer.test.js +7 -79
- package/dist/test/unit/canonicalizer/canonicalizer.test.js.map +1 -1
- package/dist/test/unit/config/lexicons/identifiers/identifier-mapping.test.js +134 -31
- package/dist/test/unit/config/lexicons/identifiers/identifier-mapping.test.js.map +1 -1
- package/dist/test/unit/config/lexicons/identifiers/literal-macro.test.js +16 -18
- package/dist/test/unit/config/lexicons/identifiers/literal-macro.test.js.map +1 -1
- package/dist/test/unit/core/resolve-typed-references.test.d.ts +2 -0
- package/dist/test/unit/core/resolve-typed-references.test.d.ts.map +1 -0
- package/dist/test/unit/core/resolve-typed-references.test.js +600 -0
- package/dist/test/unit/core/resolve-typed-references.test.js.map +1 -0
- package/dist/test/unit/diagnostics/diagnostic-overlays.test.d.ts +2 -0
- package/dist/test/unit/diagnostics/diagnostic-overlays.test.d.ts.map +1 -0
- package/dist/test/unit/diagnostics/diagnostic-overlays.test.js +156 -0
- package/dist/test/unit/diagnostics/diagnostic-overlays.test.js.map +1 -0
- package/dist/test/unit/diagnostics/resolution-codes.test.d.ts +6 -0
- package/dist/test/unit/diagnostics/resolution-codes.test.d.ts.map +1 -0
- package/dist/test/unit/diagnostics/resolution-codes.test.js +96 -0
- package/dist/test/unit/diagnostics/resolution-codes.test.js.map +1 -0
- package/dist/test/unit/formatter-corpus-roundtrip.test.js +5 -0
- package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -1
- package/dist/test/unit/formatter-roundtrip.test.js +84 -0
- package/dist/test/unit/formatter-roundtrip.test.js.map +1 -1
- package/dist/test/unit/frontend/resolve-declarations.test.d.ts +2 -0
- package/dist/test/unit/frontend/resolve-declarations.test.d.ts.map +1 -0
- package/dist/test/unit/frontend/resolve-declarations.test.js +459 -0
- package/dist/test/unit/frontend/resolve-declarations.test.js.map +1 -0
- package/dist/test/unit/identifiers/casefold.test.d.ts +2 -0
- package/dist/test/unit/identifiers/casefold.test.d.ts.map +1 -0
- package/dist/test/unit/identifiers/casefold.test.js +77 -0
- package/dist/test/unit/identifiers/casefold.test.js.map +1 -0
- package/dist/test/unit/identifiers/scopes.test.d.ts +2 -0
- package/dist/test/unit/identifiers/scopes.test.d.ts.map +1 -0
- package/dist/test/unit/identifiers/scopes.test.js +109 -0
- package/dist/test/unit/identifiers/scopes.test.js.map +1 -0
- package/dist/test/unit/lambda-capture-parity.test.js +12 -5
- package/dist/test/unit/lambda-capture-parity.test.js.map +1 -1
- package/dist/test/unit/lsp/lsp-locale-fixes.test.js +10 -11
- package/dist/test/unit/lsp/lsp-locale-fixes.test.js.map +1 -1
- package/dist/test/unit/lsp/parse-document.test.js +42 -0
- package/dist/test/unit/lsp/parse-document.test.js.map +1 -1
- package/dist/test/unit/lsp/resolution-completion.test.d.ts +2 -0
- package/dist/test/unit/lsp/resolution-completion.test.d.ts.map +1 -0
- package/dist/test/unit/lsp/resolution-completion.test.js +132 -0
- package/dist/test/unit/lsp/resolution-completion.test.js.map +1 -0
- package/dist/test/unit/lsp/resolution-definition.test.d.ts +2 -0
- package/dist/test/unit/lsp/resolution-definition.test.d.ts.map +1 -0
- package/dist/test/unit/lsp/resolution-definition.test.js +75 -0
- package/dist/test/unit/lsp/resolution-definition.test.js.map +1 -0
- package/dist/test/unit/lsp/resolution-diagnostics.test.d.ts +2 -0
- package/dist/test/unit/lsp/resolution-diagnostics.test.d.ts.map +1 -0
- package/dist/test/unit/lsp/resolution-diagnostics.test.js +88 -0
- package/dist/test/unit/lsp/resolution-diagnostics.test.js.map +1 -0
- package/dist/test/unit/lsp/resolution-fixture.d.ts +32 -0
- package/dist/test/unit/lsp/resolution-fixture.d.ts.map +1 -0
- package/dist/test/unit/lsp/resolution-fixture.js +69 -0
- package/dist/test/unit/lsp/resolution-fixture.js.map +1 -0
- package/dist/test/unit/lsp/resolution-hover.test.d.ts +2 -0
- package/dist/test/unit/lsp/resolution-hover.test.d.ts.map +1 -0
- package/dist/test/unit/lsp/resolution-hover.test.js +107 -0
- package/dist/test/unit/lsp/resolution-hover.test.js.map +1 -0
- package/dist/test/unit/lsp/tenant-vocabulary.test.js +21 -47
- package/dist/test/unit/lsp/tenant-vocabulary.test.js.map +1 -1
- package/dist/test/unit/parser/func-type.test.d.ts +2 -0
- package/dist/test/unit/parser/func-type.test.d.ts.map +1 -0
- package/dist/test/unit/parser/func-type.test.js +161 -0
- package/dist/test/unit/parser/func-type.test.js.map +1 -0
- package/dist/test/unit/parser/parser.test.js +33 -0
- package/dist/test/unit/parser/parser.test.js.map +1 -1
- package/dist/test/unit/public-api-checked-entries.test.d.ts +2 -0
- package/dist/test/unit/public-api-checked-entries.test.d.ts.map +1 -0
- package/dist/test/unit/public-api-checked-entries.test.js +28 -0
- package/dist/test/unit/public-api-checked-entries.test.js.map +1 -0
- package/dist/test/unit/typecheck/qualified-enum-member.test.d.ts +2 -0
- package/dist/test/unit/typecheck/qualified-enum-member.test.d.ts.map +1 -0
- package/dist/test/unit/typecheck/qualified-enum-member.test.js +73 -0
- package/dist/test/unit/typecheck/qualified-enum-member.test.js.map +1 -0
- package/dist/test/unit/version.test.d.ts +9 -0
- package/dist/test/unit/version.test.d.ts.map +1 -0
- package/dist/test/unit/version.test.js +34 -0
- package/dist/test/unit/version.test.js.map +1 -0
- package/package.json +2 -1
- package/dist/src/config/lexicons/identifiers/examples/canonicalizer-integration.d.ts +0 -47
- package/dist/src/config/lexicons/identifiers/examples/canonicalizer-integration.d.ts.map +0 -1
- package/dist/src/config/lexicons/identifiers/examples/canonicalizer-integration.js +0 -142
- package/dist/src/config/lexicons/identifiers/examples/canonicalizer-integration.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-definition.test.js","sourceRoot":"","sources":["../../../../test/unit/lsp/resolution-definition.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-diagnostics.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/lsp/resolution-diagnostics.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 语法不完整时诊断的降级(ADR 0051 Review Focus 1):只对解析器恢复出的部分运行 R1,跳过 R2,
|
|
3
|
+
* 不从未完成代码级联出 E8xx / W8xx;语法完整时 R2 照常报告。
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { computeDiagnostics } from '../../../src/lsp/diagnostics.js';
|
|
8
|
+
import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
|
|
9
|
+
import { EN_US } from '../../../src/config/lexicons/en-US.js';
|
|
10
|
+
import { parseDocumentText } from '../../../src/lsp/parse-document.js';
|
|
11
|
+
import { DECLS, docOf, getOrParseWith } from './resolution-fixture.js';
|
|
12
|
+
async function codesOf(lines) {
|
|
13
|
+
const doc = docOf(lines);
|
|
14
|
+
const diags = await computeDiagnostics(doc.document, getOrParseWith(ZH_CN), ZH_CN);
|
|
15
|
+
return diags.map((d) => String(d.code ?? ''));
|
|
16
|
+
}
|
|
17
|
+
const isResolution = (code) => /^[EW]8\d\d$/.test(code);
|
|
18
|
+
const GOOD = ['规则 检查 给定 x 作为 司机,产出 整数:', ' 返回 x.alter。', ''];
|
|
19
|
+
describe('诊断:语法不完整时降级', () => {
|
|
20
|
+
it('★各种半行输入都不产生 E8xx / W8xx', async () => {
|
|
21
|
+
const tails = [
|
|
22
|
+
' 返回 x.',
|
|
23
|
+
' 返回 x.al',
|
|
24
|
+
' 返回 x.alter',
|
|
25
|
+
' 令 y 定义为 司机 包含 alter 将 设为',
|
|
26
|
+
' 令 y 定义为 司机 包含 al',
|
|
27
|
+
' 返回 Ho',
|
|
28
|
+
' 返回 检',
|
|
29
|
+
'规则 坏 给定 h 作为 车',
|
|
30
|
+
'定义 车主 包含 jah',
|
|
31
|
+
' 如果 x.alter',
|
|
32
|
+
];
|
|
33
|
+
for (const tail of tails) {
|
|
34
|
+
const codes = await codesOf([...DECLS, ...GOOD, '规则 坏 给定 x 作为 司机,产出 整数:', tail, '']);
|
|
35
|
+
assert.ok(codes.some((c) => !isResolution(c)), `夹具应含语法错误:${tail}`);
|
|
36
|
+
assert.deepEqual(codes.filter(isResolution), [], `半行 "${tail}" 级联出了名称解析诊断`);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
it('★语法不完整时,完整部分的本地化路径不被误报(R2 跳过,也不拿未解析的 Core 做类型检查)', async () => {
|
|
40
|
+
const codes = await codesOf([...DECLS, ...GOOD, '规则 坏 给定 h 作为 车主,产出 整数:', ' 返回 h.fahrer.al', '']);
|
|
41
|
+
assert.deepEqual(codes.filter((c) => /^E8|^W8|^E0/.test(c) && c !== ''), [], `实际:${codes}`);
|
|
42
|
+
});
|
|
43
|
+
it('★正在编辑的声明被解析器丢弃时,引用它的完整部分不报 E800 / E802', async () => {
|
|
44
|
+
const codes = await codesOf([
|
|
45
|
+
'模块 m。',
|
|
46
|
+
'',
|
|
47
|
+
'定义 Kunde 包含 nam',
|
|
48
|
+
'',
|
|
49
|
+
'规则 g 给定 k 作为 Kunde,产出 Kunde:',
|
|
50
|
+
' 返回 k。',
|
|
51
|
+
'',
|
|
52
|
+
'规则 hilfe 产出 整数:',
|
|
53
|
+
' 返回 1 加',
|
|
54
|
+
'',
|
|
55
|
+
'规则 h 产出 整数:',
|
|
56
|
+
' 令 f 定义为 hilfe。',
|
|
57
|
+
' 返回 1。',
|
|
58
|
+
'',
|
|
59
|
+
]);
|
|
60
|
+
assert.ok(codes.some((c) => !isResolution(c)), '夹具应含语法错误');
|
|
61
|
+
assert.deepEqual(codes.filter(isResolution), [], `被丢弃的声明级联出了名称解析诊断:${codes}`);
|
|
62
|
+
});
|
|
63
|
+
it('★无词汇时语法错误不屏蔽其它声明的类型诊断(R2 跳过,R1 输出直接 lower 做检查)', async () => {
|
|
64
|
+
const doc = docOf([
|
|
65
|
+
'Module m.',
|
|
66
|
+
'',
|
|
67
|
+
'Rule f given x as Int, produce Text:',
|
|
68
|
+
' Return x.',
|
|
69
|
+
'',
|
|
70
|
+
'Rule g given z as Int, produce Int:',
|
|
71
|
+
' Return z plus',
|
|
72
|
+
'',
|
|
73
|
+
]);
|
|
74
|
+
const plain = (d) => ({ ...parseDocumentText(d.getText(), EN_US, undefined, undefined), text: d.getText() });
|
|
75
|
+
const codes = (await computeDiagnostics(doc.document, plain, EN_US)).map((d) => String(d.code ?? ''));
|
|
76
|
+
assert.ok(codes.some((c) => c.startsWith('P')), `夹具应含语法错误:${codes}`);
|
|
77
|
+
assert.ok(codes.includes('E003'), `返回类型不匹配应仍被报告:${codes}`);
|
|
78
|
+
assert.deepEqual(codes.filter(isResolution), []);
|
|
79
|
+
});
|
|
80
|
+
it('语法完整时 R2 照常报告:未知字段 E801', async () => {
|
|
81
|
+
const codes = await codesOf([...DECLS, '规则 检查 给定 x 作为 司机,产出 整数:', ' 返回 x.unbekannt。', '']);
|
|
82
|
+
assert.ok(codes.includes('E801'), `实际:${codes}`);
|
|
83
|
+
});
|
|
84
|
+
it('语法完整且全部可解析时无名称解析诊断', async () => {
|
|
85
|
+
assert.deepEqual((await codesOf([...DECLS, ...GOOD])).filter(isResolution), []);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=resolution-diagnostics.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-diagnostics.test.js","sourceRoot":"","sources":["../../../../test/unit/lsp/resolution-diagnostics.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 名称解析悬停 / 补全测试的共用夹具(ADR 0051):带租户词汇的文档快照与 stub connection。
|
|
3
|
+
*
|
|
4
|
+
* 走真实的 parseDocumentText 与 register*Handlers 接线,只把词汇作用域直接塞进快照
|
|
5
|
+
* (等价于 server 的 CachedDoc),避免依赖租户注册中心的全局状态。
|
|
6
|
+
*/
|
|
7
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
8
|
+
import { parseDocumentText } from '../../../src/lsp/parse-document.js';
|
|
9
|
+
import type { VocabularyScopes } from '../../../src/config/lexicons/identifiers/scopes.js';
|
|
10
|
+
import type { Lexicon } from '../../../src/config/lexicons/types.js';
|
|
11
|
+
/** Driver(司机)字段 age → alter、name 无本地化;Owner(车主)字段 years → jahre、driver → fahrer;Level 成员 Hoch / Niedrig。 */
|
|
12
|
+
export declare const VOCAB: VocabularyScopes;
|
|
13
|
+
export declare const DECLS: string[];
|
|
14
|
+
export interface Doc {
|
|
15
|
+
readonly uri: string;
|
|
16
|
+
readonly document: TextDocument;
|
|
17
|
+
readonly lines: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function docOf(lines: readonly string[]): Doc;
|
|
20
|
+
/** 等价 server 的 getOrParse:解析文档并附上租户词汇作用域。 */
|
|
21
|
+
export declare function getOrParseWith(lexicon: Lexicon, vocabulary?: VocabularyScopes): (doc: TextDocument) => ReturnType<typeof parseDocumentText> & {
|
|
22
|
+
text: string;
|
|
23
|
+
};
|
|
24
|
+
/** 第 line 行(0 基)中第 nth 个 needle 的起始列 + offset。 */
|
|
25
|
+
export declare function posOf(doc: Doc, line: number, needle: string, offset?: number, nth?: number): {
|
|
26
|
+
line: number;
|
|
27
|
+
character: number;
|
|
28
|
+
};
|
|
29
|
+
export declare function documentsOf(...docs: Doc[]): {
|
|
30
|
+
get: (uri: string) => TextDocument | undefined;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=resolution-fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-fixture.d.ts","sourceRoot":"","sources":["../../../../test/unit/lsp/resolution-fixture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAC;AAG3F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAUrE,4GAA4G;AAC5G,eAAO,MAAM,KAAK,EAAE,gBAMlB,CAAC;AAEH,eAAO,MAAM,KAAK,UASjB,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAID,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAGnD;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,GAAE,gBAAwB,IAE3E,KAAK,YAAY,KAMI,UAAU,CAAC,OAAO,iBAAiB,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAErF;AAED,kDAAkD;AAClD,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,GAAG,SAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAStH;AAED,wBAAgB,WAAW,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;eAEpB,MAAM;EAC3B"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 名称解析悬停 / 补全测试的共用夹具(ADR 0051):带租户词汇的文档快照与 stub connection。
|
|
3
|
+
*
|
|
4
|
+
* 走真实的 parseDocumentText 与 register*Handlers 接线,只把词汇作用域直接塞进快照
|
|
5
|
+
* (等价于 server 的 CachedDoc),避免依赖租户注册中心的全局状态。
|
|
6
|
+
*/
|
|
7
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
8
|
+
import { parseDocumentText } from '../../../src/lsp/parse-document.js';
|
|
9
|
+
import { buildVocabularyScopes } from '../../../src/config/lexicons/identifiers/scopes.js';
|
|
10
|
+
import { IdentifierKind } from '../../../src/config/lexicons/identifiers/types.js';
|
|
11
|
+
const struct = (canonical, localized) => ({ canonical, localized, kind: IdentifierKind.STRUCT });
|
|
12
|
+
const field = (parent, canonical, localized) => ({
|
|
13
|
+
canonical, localized, kind: IdentifierKind.FIELD, parent,
|
|
14
|
+
});
|
|
15
|
+
const member = (parent, canonical, localized) => ({
|
|
16
|
+
canonical, localized, kind: IdentifierKind.ENUM_VALUE, parent,
|
|
17
|
+
});
|
|
18
|
+
/** Driver(司机)字段 age → alter、name 无本地化;Owner(车主)字段 years → jahre、driver → fahrer;Level 成员 Hoch / Niedrig。 */
|
|
19
|
+
export const VOCAB = buildVocabularyScopes({
|
|
20
|
+
id: 'lsp-resolution', name: 't', locale: 'zh-CN', version: '1',
|
|
21
|
+
structs: [struct('Driver', '司机'), struct('Owner', '车主'), struct('Level', '等级')],
|
|
22
|
+
fields: [field('Driver', 'age', 'alter'), field('Owner', 'years', 'jahre'), field('Owner', 'driver', 'fahrer')],
|
|
23
|
+
functions: [{ canonical: 'check', localized: '检查', kind: IdentifierKind.FUNCTION }],
|
|
24
|
+
enumValues: [member('Level', 'High', 'Hoch'), member('Level', 'Low', 'Niedrig')],
|
|
25
|
+
});
|
|
26
|
+
export const DECLS = [
|
|
27
|
+
'模块 m。',
|
|
28
|
+
'',
|
|
29
|
+
'定义 司机 包含 alter 作为 整数,name 作为 文本。',
|
|
30
|
+
'',
|
|
31
|
+
'定义 车主 包含 jahre 作为 整数,fahrer 作为 司机。',
|
|
32
|
+
'',
|
|
33
|
+
'定义 等级 为以下之一 Hoch、Niedrig。',
|
|
34
|
+
'',
|
|
35
|
+
];
|
|
36
|
+
let seq = 0;
|
|
37
|
+
export function docOf(lines) {
|
|
38
|
+
const uri = `file:///resolution-${seq++}.aster`;
|
|
39
|
+
return { uri, document: TextDocument.create(uri, 'aster', 1, lines.join('\n')), lines };
|
|
40
|
+
}
|
|
41
|
+
/** 等价 server 的 getOrParse:解析文档并附上租户词汇作用域。 */
|
|
42
|
+
export function getOrParseWith(lexicon, vocabulary = VOCAB) {
|
|
43
|
+
const entries = new Map();
|
|
44
|
+
return (doc) => {
|
|
45
|
+
const key = `${doc.uri}@${doc.version}`;
|
|
46
|
+
if (!entries.has(key)) {
|
|
47
|
+
const parsed = parseDocumentText(doc.getText(), lexicon, undefined, undefined);
|
|
48
|
+
entries.set(key, { ...parsed, text: doc.getText(), vocabulary });
|
|
49
|
+
}
|
|
50
|
+
return entries.get(key);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** 第 line 行(0 基)中第 nth 个 needle 的起始列 + offset。 */
|
|
54
|
+
export function posOf(doc, line, needle, offset = 0, nth = 0) {
|
|
55
|
+
let from = 0;
|
|
56
|
+
let at = -1;
|
|
57
|
+
for (let i = 0; i <= nth; i++) {
|
|
58
|
+
at = doc.lines[line].indexOf(needle, from);
|
|
59
|
+
from = at + 1;
|
|
60
|
+
}
|
|
61
|
+
if (at < 0)
|
|
62
|
+
throw new Error(`第 ${line} 行找不到 ${needle}`);
|
|
63
|
+
return { line, character: at + offset };
|
|
64
|
+
}
|
|
65
|
+
export function documentsOf(...docs) {
|
|
66
|
+
const byUri = new Map(docs.map((d) => [d.uri, d.document]));
|
|
67
|
+
return { get: (uri) => byUri.get(uri) };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=resolution-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-fixture.js","sourceRoot":"","sources":["../../../../test/unit/lsp/resolution-fixture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAE3F,OAAO,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AAInF,MAAM,MAAM,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAqB,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;AACpI,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAqB,EAAE,CAAC,CAAC;IAC1F,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM;CACzD,CAAC,CAAC;AACH,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAqB,EAAE,CAAC,CAAC;IAC3F,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,UAAU,EAAE,MAAM;CAC9D,CAAC,CAAC;AAEH,4GAA4G;AAC5G,MAAM,CAAC,MAAM,KAAK,GAAqB,qBAAqB,CAAC;IAC3D,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG;IAC9D,OAAO,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/E,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/G,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC;IACnF,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;CACjF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,OAAO;IACP,EAAE;IACF,kCAAkC;IAClC,EAAE;IACF,oCAAoC;IACpC,EAAE;IACF,2BAA2B;IAC3B,EAAE;CACH,CAAC;AAQF,IAAI,GAAG,GAAG,CAAC,CAAC;AAEZ,MAAM,UAAU,KAAK,CAAC,KAAwB;IAC5C,MAAM,GAAG,GAAG,sBAAsB,GAAG,EAAE,QAAQ,CAAC;IAChD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC1F,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,aAA+B,KAAK;IACnF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC3C,OAAO,CAAC,GAAiB,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAA4D,CAAC;IACrF,CAAC,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,KAAK,CAAC,GAAQ,EAAE,IAAY,EAAE,MAAc,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC;IAC/E,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,EAAE,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,SAAS,MAAM,EAAE,CAAC,CAAC;IACxD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAG,IAAW;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-hover.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/lsp/resolution-hover.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 按位置角色的悬停(ADR 0051 §5「LSP」与 Review Focus 1)。
|
|
3
|
+
*
|
|
4
|
+
* 悬停在本地化写法上显示 `写法 → 规范名(角色 · 父名)`,角色与父名来自 R1 的 resolved 与
|
|
5
|
+
* R2 的解析结果;写法等于规范名时不追加任何内容。语法不完整时只用 R1 结果,R2 跳过,不抛异常。
|
|
6
|
+
* 走真实的 registerHoverHandler 接线(stub connection 捕获回调)。
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it } from 'node:test';
|
|
9
|
+
import assert from 'node:assert/strict';
|
|
10
|
+
import { registerHoverHandler } from '../../../src/lsp/navigation/hover.js';
|
|
11
|
+
import { resolveDocument } from '../../../src/lsp/resolution.js';
|
|
12
|
+
import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
|
|
13
|
+
import { DE_DE } from '../../../src/config/lexicons/de-DE.js';
|
|
14
|
+
import { DECLS, docOf, documentsOf, getOrParseWith, posOf } from './resolution-fixture.js';
|
|
15
|
+
function hoverAt(doc, pos, lexicon = ZH_CN) {
|
|
16
|
+
let handler;
|
|
17
|
+
const connection = { onHover: (fn) => { handler = fn; } };
|
|
18
|
+
registerHoverHandler(connection, documentsOf(doc), getOrParseWith(lexicon), () => lexicon);
|
|
19
|
+
assert.ok(handler, 'onHover 未注册');
|
|
20
|
+
return handler({ textDocument: { uri: doc.uri }, position: pos }).then((h) => h?.contents.value ?? null);
|
|
21
|
+
}
|
|
22
|
+
const PROGRAM = docOf([
|
|
23
|
+
...DECLS,
|
|
24
|
+
'规则 检查 给定 x 作为 司机,产出 整数:',
|
|
25
|
+
' 返回 x.alter。',
|
|
26
|
+
'',
|
|
27
|
+
'规则 级别 给定 x 作为 司机,产出 等级:',
|
|
28
|
+
' 返回 Hoch。',
|
|
29
|
+
'',
|
|
30
|
+
'规则 g 给定 h 作为 车主,产出 整数:',
|
|
31
|
+
' 返回 h.fahrer.alter。',
|
|
32
|
+
'',
|
|
33
|
+
]);
|
|
34
|
+
describe('按角色悬停', () => {
|
|
35
|
+
it('★字段声明 alter:alter → age(字段 · Driver)', async () => {
|
|
36
|
+
const text = await hoverAt(PROGRAM, posOf(PROGRAM, 2, 'alter', 1));
|
|
37
|
+
assert.ok(text?.includes('alter → age(字段 · Driver)'), `实际:${text}`);
|
|
38
|
+
});
|
|
39
|
+
it('★点分路径 x.alter 的字段段(R2):alter → age(字段 · Driver)', async () => {
|
|
40
|
+
const text = await hoverAt(PROGRAM, posOf(PROGRAM, 9, 'alter', 2));
|
|
41
|
+
assert.ok(text?.includes('alter → age(字段 · Driver)'), `实际:${text}`);
|
|
42
|
+
});
|
|
43
|
+
it('★多段路径 h.fahrer.alter:各段按前一段的类型取父名', async () => {
|
|
44
|
+
const fahrer = await hoverAt(PROGRAM, posOf(PROGRAM, 15, 'fahrer', 1));
|
|
45
|
+
const alter = await hoverAt(PROGRAM, posOf(PROGRAM, 15, 'alter', 1));
|
|
46
|
+
assert.ok(fahrer?.includes('fahrer → driver(字段 · Owner)'), `实际:${fahrer}`);
|
|
47
|
+
assert.ok(alter?.includes('alter → age(字段 · Driver)'), `实际:${alter}`);
|
|
48
|
+
});
|
|
49
|
+
it('★枚举成员:声明与期望枚举下的裸名都显示 Hoch → High(枚举成员 · Level)', async () => {
|
|
50
|
+
const decl = await hoverAt(PROGRAM, posOf(PROGRAM, 6, 'Hoch', 1));
|
|
51
|
+
const ref = await hoverAt(PROGRAM, posOf(PROGRAM, 12, 'Hoch', 1));
|
|
52
|
+
assert.ok(decl?.includes('Hoch → High(枚举成员 · Level)'), `实际:${decl}`);
|
|
53
|
+
assert.ok(ref?.includes('Hoch → High(枚举成员 · Level)'), `实际:${ref}`);
|
|
54
|
+
});
|
|
55
|
+
it('类型与函数:司机 → Driver(类型)、检查 → check(函数)', async () => {
|
|
56
|
+
const type = await hoverAt(PROGRAM, posOf(PROGRAM, 8, '司机', 1));
|
|
57
|
+
const func = await hoverAt(PROGRAM, posOf(PROGRAM, 8, '检查', 1));
|
|
58
|
+
assert.ok(type?.includes('司机 → Driver(类型)'), `实际:${type}`);
|
|
59
|
+
assert.ok(func?.includes('检查 → check(函数)'), `实际:${func}`);
|
|
60
|
+
});
|
|
61
|
+
it('★写法等于规范名时不追加解析行,原有悬停保持不变', async () => {
|
|
62
|
+
const param = await hoverAt(PROGRAM, posOf(PROGRAM, 8, 'x', 0));
|
|
63
|
+
const name = await hoverAt(PROGRAM, posOf(PROGRAM, 2, 'name', 1));
|
|
64
|
+
assert.ok(param && !param.includes('→'), `实际:${param}`);
|
|
65
|
+
assert.ok(param.startsWith('参数'), `原有参数悬停丢失:${param}`);
|
|
66
|
+
assert.ok(name && !name.includes('→'), `实际:${name}`);
|
|
67
|
+
});
|
|
68
|
+
it('文案随文档 lexicon 本地化:英文界面为 alter → age (field · Driver)', async () => {
|
|
69
|
+
const doc = docOf(['Modul m.', '', 'Definiere Driver hat alter als Ganzzahl.', '']);
|
|
70
|
+
const text = await hoverAt(doc, posOf(doc, 2, 'alter', 1), DE_DE);
|
|
71
|
+
assert.ok(text?.includes('alter → age (field · Driver)'), `实际:${text}`);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('语法不完整时的降级(Review Focus 1)', () => {
|
|
75
|
+
const BROKEN = docOf([
|
|
76
|
+
...DECLS,
|
|
77
|
+
'规则 检查 给定 x 作为 司机,产出 整数:',
|
|
78
|
+
' 返回 x.alter。',
|
|
79
|
+
'',
|
|
80
|
+
'规则 坏 给定 h 作为 车主,产出 整数:',
|
|
81
|
+
' 返回 h.fahrer.al',
|
|
82
|
+
'',
|
|
83
|
+
]);
|
|
84
|
+
it('★R2 跳过,仍保留 R1 可得的解析位置', () => {
|
|
85
|
+
const parsed = getOrParseWith(ZH_CN)(BROKEN.document);
|
|
86
|
+
assert.ok(parsed.parseDiagnostics.some((d) => d.severity === 'error'), '夹具应含语法错误');
|
|
87
|
+
const res = resolveDocument(parsed);
|
|
88
|
+
assert.equal(res.complete, false);
|
|
89
|
+
assert.equal(res.core, undefined, '语法不完整时不应运行 lower/R2');
|
|
90
|
+
assert.ok(res.sites.some((s) => s.role === 'FIELD_DECL' && s.canonical === 'age'), 'R1 的字段声明位置应保留');
|
|
91
|
+
});
|
|
92
|
+
it('★R1 位置照常悬停;R2 位置不悬停解析行;均不抛异常', async () => {
|
|
93
|
+
const decl = await hoverAt(BROKEN, posOf(BROKEN, 2, 'alter', 1));
|
|
94
|
+
assert.ok(decl?.includes('alter → age(字段 · Driver)'), `实际:${decl}`);
|
|
95
|
+
const path = await hoverAt(BROKEN, posOf(BROKEN, 9, 'alter', 2));
|
|
96
|
+
assert.ok(!path?.includes('→'), `R2 已跳过,不应有字段段解析行:${path}`);
|
|
97
|
+
await hoverAt(BROKEN, posOf(BROKEN, 12, 'al', 1));
|
|
98
|
+
});
|
|
99
|
+
it('半行输入的各种形态都不抛异常', async () => {
|
|
100
|
+
const tails = [' 返回 h.', ' 令 y 定义为 司机 包含 alter 将 设为', '规则 坏 给定 h 作为 车', ' 返回 Ho', '定义 车主 包含 jah'];
|
|
101
|
+
for (const tail of tails) {
|
|
102
|
+
const doc = docOf([...DECLS, '规则 坏 给定 h 作为 车主,产出 整数:', tail, '']);
|
|
103
|
+
await hoverAt(doc, { line: DECLS.length + 1, character: tail.length - 1 });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=resolution-hover.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-hover.test.js","sourceRoot":"","sources":["../../../../test/unit/lsp/resolution-hover.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,29 +3,21 @@ import assert from 'node:assert/strict';
|
|
|
3
3
|
import { vocabularyRegistry, initBuiltinVocabularies, } from '../../../src/config/lexicons/identifiers/registry.js';
|
|
4
4
|
import { canonicalize } from '../../../src/frontend/canonicalizer.js';
|
|
5
5
|
import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
|
|
6
|
+
import { lookup } from '../../../src/config/lexicons/identifiers/scopes.js';
|
|
6
7
|
import { buildCanonicalizeOptions } from '../../../src/lsp/canonicalize-options.js';
|
|
7
8
|
import { applyTenantInitOptions, resolveTenantContext } from '../../../src/lsp/tenant-init.js';
|
|
8
9
|
/**
|
|
9
10
|
* 租户领域词汇必须参与 LSP 的解析(issue #161)。
|
|
10
11
|
*
|
|
11
12
|
* ★缺口有**两半**,缺任一半都等于没做:
|
|
12
|
-
* 1. LSP 进程不知道自己在为哪个租户服务 ——
|
|
13
|
-
* Origin + 共享 token,不传租户身份。已改为由客户端在 `initialize` 的
|
|
13
|
+
* 1. LSP 进程不知道自己在为哪个租户服务 —— 已改为由客户端在 `initialize` 的
|
|
14
14
|
* `initializationOptions` 里推送 `{ tenantId, domainVocabularies }`。
|
|
15
|
-
* 2.
|
|
16
|
-
*
|
|
17
|
-
* 而 LSP 此前调用的是 `canonicalize(text, lexicon)` —— 只传 lexicon,
|
|
18
|
-
* 那条分支(要求 `opts.domain && opts.locale` 同时存在)根本走不到。
|
|
15
|
+
* 2. LSP 必须把该租户的词汇作用域交给 canonicalize(字面量宏)与后续名称解析
|
|
16
|
+
* (ADR 0051:标识符按位置解析,canonicalize 不再替换标识符)。
|
|
19
17
|
*
|
|
20
18
|
* 本测试两半都锁:
|
|
21
|
-
* · 第 2
|
|
19
|
+
* · 第 2 半——buildCanonicalizeOptions 在传/不传租户上下文时取到的词汇作用域
|
|
22
20
|
* · 第 1 半——`applyTenantInitOptions` 是否真的把词汇注册进去
|
|
23
|
-
*
|
|
24
|
-
* ★为什么第 1 半非补不可:原先它只由 `server.ts` 承担,而那个模块顶层就
|
|
25
|
-
* `createConnection()`,单测无法 import。实测把 server.ts 整段注册逻辑改成
|
|
26
|
-
* `if (false)`,本文件 6 条用例**仍然全绿**——契约证明"canonicalizer 会用
|
|
27
|
-
* 租户词汇",证明不了"LSP 真的注册了"。已把决策点抽成无副作用的
|
|
28
|
-
* `src/lsp/tenant-init.ts`(与 aster-lang-ts#162 同一修法)。
|
|
29
21
|
*/
|
|
30
22
|
const TENANT = 'tenant-vocab-test';
|
|
31
23
|
const DOMAIN = 'insurance.vocabtest';
|
|
@@ -40,36 +32,31 @@ const VOCAB = {
|
|
|
40
32
|
functions: [{ canonical: 'coverageAmount', localized: '保额', kind: 'function' }],
|
|
41
33
|
};
|
|
42
34
|
const SRC = '模块 probe。\n\n规则 main 产出 Int:\n 返回 保额()。\n';
|
|
35
|
+
function vocabularyOf(opts) {
|
|
36
|
+
return opts && 'vocabulary' in opts ? opts.vocabulary : undefined;
|
|
37
|
+
}
|
|
43
38
|
describe('租户领域词汇参与解析', () => {
|
|
44
|
-
it('
|
|
39
|
+
it('★有完整租户上下文时,LSP 传的是带该租户词汇作用域的 options', () => {
|
|
45
40
|
initBuiltinVocabularies();
|
|
46
41
|
vocabularyRegistry.registerCustom(TENANT, VOCAB);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
});
|
|
53
|
-
assert.ok(out.includes('coverageAmount'), `「保额」应被规范化为 coverageAmount,实际输出:${out.slice(0, 120)}`);
|
|
42
|
+
const opts = buildCanonicalizeOptions(ZH_CN, TENANT, DOMAIN);
|
|
43
|
+
const scopes = vocabularyOf(opts);
|
|
44
|
+
assert.ok(scopes, 'LSP 应传 options 对象而非裸 lexicon,否则租户词汇走不到');
|
|
45
|
+
assert.equal(opts.lexicon, ZH_CN);
|
|
46
|
+
assert.deepEqual(lookup(scopes.functions, '保额').exact.map((c) => c.canonical), ['coverageAmount']);
|
|
54
47
|
});
|
|
55
|
-
it('
|
|
48
|
+
it('★canonicalize 不再替换标识符:本地化词保持原写法,交由名称解析', () => {
|
|
56
49
|
initBuiltinVocabularies();
|
|
57
50
|
vocabularyRegistry.registerCustom(TENANT, VOCAB);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const out = canonicalize(SRC, ZH_CN);
|
|
61
|
-
assert.ok(!out.includes('coverageAmount'), `未传租户时不得应用其词汇(跨租户泄露),实际输出:${out.slice(0, 120)}`);
|
|
51
|
+
const out = canonicalize(SRC, buildCanonicalizeOptions(ZH_CN, TENANT, DOMAIN));
|
|
52
|
+
assert.ok(out.includes('保额') && !out.includes('coverageAmount'), `实际输出:${out.slice(0, 120)}`);
|
|
62
53
|
});
|
|
63
54
|
it('★另一个租户拿不到本租户的词汇(隔离性)', () => {
|
|
64
55
|
initBuiltinVocabularies();
|
|
65
56
|
vocabularyRegistry.registerCustom(TENANT, VOCAB);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
domain: DOMAIN,
|
|
70
|
-
locale: 'zh-CN',
|
|
71
|
-
});
|
|
72
|
-
assert.ok(!out.includes('coverageAmount'), `租户隔离被打破:other-tenant 用到了 ${TENANT} 的词汇`);
|
|
57
|
+
// 没有这一条,把实现写成「无条件查所有租户词汇」也能让上面变绿——
|
|
58
|
+
// 而那会造成**跨租户词汇泄露**:A 租户的术语在 B 租户的文档里生效。
|
|
59
|
+
assert.equal(buildCanonicalizeOptions(ZH_CN, 'some-other-tenant', DOMAIN), ZH_CN, `租户隔离被打破:other-tenant 用到了 ${TENANT} 的词汇`);
|
|
73
60
|
});
|
|
74
61
|
it('无效词汇表被拒绝(registerCustom 有校验,不静默接受)', () => {
|
|
75
62
|
initBuiltinVocabularies();
|
|
@@ -77,20 +64,7 @@ describe('租户领域词汇参与解析', () => {
|
|
|
77
64
|
// 否则损坏的词汇会在解析期以更难定位的方式炸。
|
|
78
65
|
assert.throws(() => vocabularyRegistry.registerCustom(TENANT, { id: 'bad', name: 'x' }), /.+/);
|
|
79
66
|
});
|
|
80
|
-
|
|
81
|
-
*
|
|
82
|
-
* ★上面四条只锁 canonicalizer 契约。实测把 LSP 里的租户参数删掉
|
|
83
|
-
* (回到缺陷版)后,那四条**仍然全绿** —— 契约对了不等于调用方传了。
|
|
84
|
-
* 故必须对 LSP 实际构造的参数单独断言。
|
|
85
|
-
*/
|
|
86
|
-
it('★有完整租户上下文时,LSP 传的是带 tenantId/domain 的 options', () => {
|
|
87
|
-
const opts = buildCanonicalizeOptions(ZH_CN, TENANT, DOMAIN);
|
|
88
|
-
assert.ok(opts && typeof opts === 'object' && 'tenantId' in opts, 'LSP 应传 options 对象而非裸 lexicon,否则自定义词汇分支走不到');
|
|
89
|
-
assert.equal(opts.tenantId, TENANT);
|
|
90
|
-
assert.equal(opts.domain, DOMAIN);
|
|
91
|
-
assert.equal(opts.locale, ZH_CN.id, 'locale 必须跟随 lexicon —— canonicalizer 按 (tenant, domain, locale) 三元组查');
|
|
92
|
-
});
|
|
93
|
-
it('★缺任一项即回退裸 lexicon(半套参数会静默走内置,比报错更难查)', () => {
|
|
67
|
+
it('★缺任一项即回退裸 lexicon(半套参数查不到租户那一份)', () => {
|
|
94
68
|
assert.equal(buildCanonicalizeOptions(ZH_CN, undefined, DOMAIN), ZH_CN, '缺 tenantId 应回退');
|
|
95
69
|
assert.equal(buildCanonicalizeOptions(ZH_CN, TENANT, undefined), ZH_CN, '缺 domain 应回退');
|
|
96
70
|
assert.equal(buildCanonicalizeOptions(undefined, TENANT, DOMAIN), undefined, '无 lexicon 时保持 undefined');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-vocabulary.test.js","sourceRoot":"","sources":["../../../../test/unit/lsp/tenant-vocabulary.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAE9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE/F
|
|
1
|
+
{"version":3,"file":"tenant-vocabulary.test.js","sourceRoot":"","sources":["../../../../test/unit/lsp/tenant-vocabulary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"func-type.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/parser/func-type.test.ts"],"names":[],"mappings":""}
|