@aster-cloud/aster-lang-ts 1.6.0 → 3.0.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 +64 -0
- package/dist/scripts/aster.js +5 -12
- package/dist/scripts/aster.js.map +1 -1
- package/dist/scripts/emit-classfiles.js +3 -1
- package/dist/scripts/emit-classfiles.js.map +1 -1
- package/dist/scripts/generate-core-ir-types.d.ts +16 -0
- package/dist/scripts/generate-core-ir-types.d.ts.map +1 -0
- package/dist/scripts/generate-core-ir-types.js +116 -0
- package/dist/scripts/generate-core-ir-types.js.map +1 -0
- package/dist/scripts/generate-naming-rules.d.ts +5 -0
- package/dist/scripts/generate-naming-rules.d.ts.map +1 -0
- package/dist/scripts/generate-naming-rules.js +35 -0
- package/dist/scripts/generate-naming-rules.js.map +1 -0
- package/dist/scripts/golden.js +1 -1
- package/dist/scripts/golden.js.map +1 -1
- package/dist/src/ast/ast_visitor.d.ts +27 -27
- package/dist/src/ast/ast_visitor.d.ts.map +1 -1
- package/dist/src/ast/ast_visitor.js.map +1 -1
- package/dist/src/browser/schema.d.ts.map +1 -1
- package/dist/src/browser/schema.js +1 -3
- package/dist/src/browser/schema.js.map +1 -1
- package/dist/src/browser.d.ts +7 -0
- package/dist/src/browser.d.ts.map +1 -1
- package/dist/src/browser.js +7 -4
- package/dist/src/browser.js.map +1 -1
- package/dist/src/cli/policy-converter.js +6 -10
- package/dist/src/cli/policy-converter.js.map +1 -1
- package/dist/src/cli/utils/core-ir-file.d.ts +8 -0
- package/dist/src/cli/utils/core-ir-file.d.ts.map +1 -0
- package/dist/src/cli/utils/core-ir-file.js +29 -0
- package/dist/src/cli/utils/core-ir-file.js.map +1 -0
- package/dist/src/cnl-printer.d.ts.map +1 -1
- package/dist/src/cnl-printer.js +13 -3
- package/dist/src/cnl-printer.js.map +1 -1
- package/dist/src/compile-pipeline.d.ts.map +1 -1
- package/dist/src/compile-pipeline.js +2 -3
- package/dist/src/compile-pipeline.js.map +1 -1
- package/dist/src/config/lexicons/diagnostic-overlays.generated.d.ts.map +1 -1
- package/dist/src/config/lexicons/diagnostic-overlays.generated.js +18 -6
- package/dist/src/config/lexicons/diagnostic-overlays.generated.js.map +1 -1
- package/dist/src/config/lexicons/fallback-lexicon.d.ts +1 -1
- package/dist/src/config/lexicons/fallback-lexicon.d.ts.map +1 -1
- package/dist/src/config/lexicons/fallback-lexicon.js +1 -4
- package/dist/src/config/lexicons/fallback-lexicon.js.map +1 -1
- package/dist/src/config/lexicons/overlay-loader.d.ts +0 -13
- package/dist/src/config/lexicons/overlay-loader.d.ts.map +1 -1
- package/dist/src/config/lexicons/overlay-loader.js +0 -18
- package/dist/src/config/lexicons/overlay-loader.js.map +1 -1
- package/dist/src/config/lexicons/types.d.ts +0 -3
- package/dist/src/config/lexicons/types.d.ts.map +1 -1
- package/dist/src/config/lexicons/types.js.map +1 -1
- package/dist/src/core/canonical-decimal.d.ts +3 -0
- package/dist/src/core/canonical-decimal.d.ts.map +1 -0
- package/dist/src/core/canonical-decimal.js +19 -0
- package/dist/src/core/canonical-decimal.js.map +1 -0
- package/dist/src/core/canonical-json.d.ts +59 -0
- package/dist/src/core/canonical-json.d.ts.map +1 -0
- package/dist/src/core/canonical-json.js +250 -0
- package/dist/src/core/canonical-json.js.map +1 -0
- package/dist/src/core/core-ir-v2.generated.d.ts +807 -0
- package/dist/src/core/core-ir-v2.generated.d.ts.map +1 -0
- package/dist/src/core/core-ir-v2.generated.js +6 -0
- package/dist/src/core/core-ir-v2.generated.js.map +1 -0
- package/dist/src/core/core-ir-v2.schema.generated.d.ts +6 -0
- package/dist/src/core/core-ir-v2.schema.generated.d.ts.map +1 -0
- package/dist/src/core/core-ir-v2.schema.generated.js +2636 -0
- package/dist/src/core/core-ir-v2.schema.generated.js.map +1 -0
- package/dist/src/core/core_ir.d.ts +27 -11
- package/dist/src/core/core_ir.d.ts.map +1 -1
- package/dist/src/core/core_ir.js +118 -63
- package/dist/src/core/core_ir.js.map +1 -1
- package/dist/src/core/index.d.ts +4 -3
- package/dist/src/core/index.d.ts.map +1 -1
- package/dist/src/core/index.js +3 -2
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/core/inferred_fields.d.ts +9 -11
- package/dist/src/core/inferred_fields.d.ts.map +1 -1
- package/dist/src/core/inferred_fields.js +7 -28
- package/dist/src/core/inferred_fields.js.map +1 -1
- package/dist/src/core/interpreter.js +16 -35
- package/dist/src/core/interpreter.js.map +1 -1
- package/dist/src/core/lambda-captures.d.ts +14 -0
- package/dist/src/core/lambda-captures.d.ts.map +1 -0
- package/dist/src/core/lambda-captures.js +128 -0
- package/dist/src/core/lambda-captures.js.map +1 -0
- package/dist/src/core/pretty_core.d.ts.map +1 -1
- package/dist/src/core/pretty_core.js +6 -10
- package/dist/src/core/pretty_core.js.map +1 -1
- package/dist/src/core/read-core-ir.d.ts +15 -0
- package/dist/src/core/read-core-ir.d.ts.map +1 -0
- package/dist/src/core/read-core-ir.js +69 -0
- package/dist/src/core/read-core-ir.js.map +1 -0
- package/dist/src/core/resolution-mark.d.ts +3 -4
- package/dist/src/core/resolution-mark.d.ts.map +1 -1
- package/dist/src/core/resolution-mark.js +2 -3
- package/dist/src/core/resolution-mark.js.map +1 -1
- package/dist/src/core/resolve-typed-references.d.ts.map +1 -1
- package/dist/src/core/resolve-typed-references.js +11 -27
- package/dist/src/core/resolve-typed-references.js.map +1 -1
- package/dist/src/core/serialize-core-ir.d.ts +13 -0
- package/dist/src/core/serialize-core-ir.d.ts.map +1 -0
- package/dist/src/core/serialize-core-ir.js +125 -0
- package/dist/src/core/serialize-core-ir.js.map +1 -0
- package/dist/src/core/visitor.d.ts.map +1 -1
- package/dist/src/core/visitor.js +4 -1
- package/dist/src/core/visitor.js.map +1 -1
- package/dist/src/diagnostics/error_codes.d.ts +2 -0
- package/dist/src/diagnostics/error_codes.d.ts.map +1 -1
- package/dist/src/diagnostics/error_codes.js +16 -0
- package/dist/src/diagnostics/error_codes.js.map +1 -1
- package/dist/src/effects/declared-effects.d.ts +17 -0
- package/dist/src/effects/declared-effects.d.ts.map +1 -0
- package/dist/src/effects/declared-effects.js +27 -0
- package/dist/src/effects/declared-effects.js.map +1 -0
- package/dist/src/effects/effect_inference.d.ts.map +1 -1
- package/dist/src/effects/effect_inference.js +14 -10
- package/dist/src/effects/effect_inference.js.map +1 -1
- package/dist/src/effects/effect_inference_browser.d.ts.map +1 -1
- package/dist/src/effects/effect_inference_browser.js +14 -9
- package/dist/src/effects/effect_inference_browser.js.map +1 -1
- package/dist/src/frontend/keyword-translator.d.ts.map +1 -1
- package/dist/src/frontend/keyword-translator.js +3 -0
- package/dist/src/frontend/keyword-translator.js.map +1 -1
- package/dist/src/frontend/lexer.d.ts.map +1 -1
- package/dist/src/frontend/lexer.js +7 -3
- package/dist/src/frontend/lexer.js.map +1 -1
- package/dist/src/frontend/resolve-declarations.d.ts.map +1 -1
- package/dist/src/frontend/resolve-declarations.js +3 -23
- package/dist/src/frontend/resolve-declarations.js.map +1 -1
- package/dist/src/governance/input-refs.js +5 -8
- package/dist/src/governance/input-refs.js.map +1 -1
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/jvm/emitter.d.ts.map +1 -1
- package/dist/src/jvm/emitter.js +20 -29
- package/dist/src/jvm/emitter.js.map +1 -1
- package/dist/src/lower_to_core.d.ts +2 -19
- package/dist/src/lower_to_core.d.ts.map +1 -1
- package/dist/src/lower_to_core.js +194 -384
- package/dist/src/lower_to_core.js.map +1 -1
- package/dist/src/lsp/pii_diagnostics.d.ts.map +1 -1
- package/dist/src/lsp/pii_diagnostics.js +3 -8
- package/dist/src/lsp/pii_diagnostics.js.map +1 -1
- package/dist/src/mapping/mapping-ir.d.ts +3 -3
- package/dist/src/mapping/mapping-ir.js +3 -3
- package/dist/src/nodeid/node-id-map.d.ts +6 -15
- package/dist/src/nodeid/node-id-map.d.ts.map +1 -1
- package/dist/src/nodeid/node-id-map.js +6 -15
- package/dist/src/nodeid/node-id-map.js.map +1 -1
- package/dist/src/parser/constraint-parser.js +25 -6
- package/dist/src/parser/constraint-parser.js.map +1 -1
- package/dist/src/parser/decl-parser.d.ts.map +1 -1
- package/dist/src/parser/decl-parser.js +30 -59
- 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 +17 -10
- package/dist/src/parser/expr-stmt-parser.js.map +1 -1
- package/dist/src/parser/field-variant-parser.d.ts.map +1 -1
- package/dist/src/parser/field-variant-parser.js +9 -3
- package/dist/src/parser/field-variant-parser.js.map +1 -1
- package/dist/src/parser/naming-rules.d.ts +19 -0
- package/dist/src/parser/naming-rules.d.ts.map +1 -0
- package/dist/src/parser/naming-rules.generated.d.ts +7 -0
- package/dist/src/parser/naming-rules.generated.d.ts.map +1 -0
- package/dist/src/parser/naming-rules.generated.js +392 -0
- package/dist/src/parser/naming-rules.generated.js.map +1 -0
- package/dist/src/parser/naming-rules.js +2 -0
- package/dist/src/parser/naming-rules.js.map +1 -0
- package/dist/src/parser/parse-issue.d.ts +2 -0
- package/dist/src/parser/parse-issue.d.ts.map +1 -1
- package/dist/src/parser/parse-issue.js +2 -0
- package/dist/src/parser/parse-issue.js.map +1 -1
- package/dist/src/parser/type-inference.d.ts +29 -70
- package/dist/src/parser/type-inference.d.ts.map +1 -1
- package/dist/src/parser/type-inference.js +82 -212
- package/dist/src/parser/type-inference.js.map +1 -1
- package/dist/src/parser/type-parser.d.ts +1 -1
- package/dist/src/parser/type-parser.d.ts.map +1 -1
- package/dist/src/parser/type-parser.js +31 -21
- package/dist/src/parser/type-parser.js.map +1 -1
- package/dist/src/parser.d.ts.map +1 -1
- package/dist/src/parser.js +2 -5
- package/dist/src/parser.js.map +1 -1
- package/dist/src/stability/stability_gate.d.ts +1 -1
- package/dist/src/stability/stability_gate.d.ts.map +1 -1
- package/dist/src/stability/stability_gate.js +2 -26
- package/dist/src/stability/stability_gate.js.map +1 -1
- package/dist/src/typecheck/async.d.ts.map +1 -1
- package/dist/src/typecheck/async.js +4 -1
- package/dist/src/typecheck/async.js.map +1 -1
- package/dist/src/typecheck/browser.d.ts.map +1 -1
- package/dist/src/typecheck/browser.js +4 -3
- package/dist/src/typecheck/browser.js.map +1 -1
- package/dist/src/typecheck/capabilities.d.ts.map +1 -1
- package/dist/src/typecheck/capabilities.js +3 -2
- package/dist/src/typecheck/capabilities.js.map +1 -1
- package/dist/src/typecheck/context.d.ts +5 -5
- package/dist/src/typecheck/context.d.ts.map +1 -1
- package/dist/src/typecheck/context.js.map +1 -1
- package/dist/src/typecheck/diagnostics.d.ts +2 -2
- package/dist/src/typecheck/diagnostics.d.ts.map +1 -1
- package/dist/src/typecheck/diagnostics.js.map +1 -1
- package/dist/src/typecheck/effects.js +18 -11
- package/dist/src/typecheck/effects.js.map +1 -1
- package/dist/src/typecheck/expression.d.ts +4 -4
- package/dist/src/typecheck/expression.d.ts.map +1 -1
- package/dist/src/typecheck/expression.js +1 -1
- package/dist/src/typecheck/expression.js.map +1 -1
- package/dist/src/typecheck/generics.d.ts +2 -2
- package/dist/src/typecheck/generics.d.ts.map +1 -1
- package/dist/src/typecheck/generics.js +23 -12
- package/dist/src/typecheck/generics.js.map +1 -1
- package/dist/src/typecheck/governance.d.ts +1 -1
- package/dist/src/typecheck/governance.d.ts.map +1 -1
- package/dist/src/typecheck/governance.js +1 -1
- package/dist/src/typecheck/governance.js.map +1 -1
- package/dist/src/typecheck/module.d.ts.map +1 -1
- package/dist/src/typecheck/module.js +7 -6
- package/dist/src/typecheck/module.js.map +1 -1
- package/dist/src/typecheck/pattern.d.ts +2 -2
- package/dist/src/typecheck/pattern.d.ts.map +1 -1
- package/dist/src/typecheck/pattern.js +12 -46
- package/dist/src/typecheck/pattern.js.map +1 -1
- package/dist/src/typecheck/pure.d.ts +19 -19
- package/dist/src/typecheck/pure.d.ts.map +1 -1
- package/dist/src/typecheck/pure.js.map +1 -1
- package/dist/src/typecheck/statement.d.ts +6 -6
- package/dist/src/typecheck/statement.d.ts.map +1 -1
- package/dist/src/typecheck/statement.js +17 -20
- package/dist/src/typecheck/statement.js.map +1 -1
- package/dist/src/typecheck/symbol_table.d.ts +2 -2
- package/dist/src/typecheck/symbol_table.d.ts.map +1 -1
- package/dist/src/typecheck/symbol_table.js.map +1 -1
- package/dist/src/typecheck/type_system.d.ts +4 -4
- package/dist/src/typecheck/type_system.d.ts.map +1 -1
- package/dist/src/typecheck/type_system.js +1 -1
- package/dist/src/typecheck/type_system.js.map +1 -1
- package/dist/src/typecheck/workflow.d.ts +3 -3
- package/dist/src/typecheck/workflow.d.ts.map +1 -1
- package/dist/src/typecheck/workflow.js.map +1 -1
- package/dist/src/typecheck-pii.d.ts.map +1 -1
- package/dist/src/typecheck-pii.js +2 -13
- package/dist/src/typecheck-pii.js.map +1 -1
- package/dist/src/types/type-inference.d.ts +1 -13
- package/dist/src/types/type-inference.d.ts.map +1 -1
- package/dist/src/types/type-inference.js +1 -2
- package/dist/src/types/type-inference.js.map +1 -1
- package/dist/src/types.d.ts +160 -172
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/version.d.ts +3 -3
- package/dist/src/version.js +3 -3
- package/dist/test/helpers/core-ir-v2.d.ts +5 -0
- package/dist/test/helpers/core-ir-v2.d.ts.map +1 -0
- package/dist/test/helpers/core-ir-v2.js +123 -0
- package/dist/test/helpers/core-ir-v2.js.map +1 -0
- package/dist/test/helpers/locales-core-ir.d.ts +7 -0
- package/dist/test/helpers/locales-core-ir.d.ts.map +1 -0
- package/dist/test/helpers/locales-core-ir.js +15 -0
- package/dist/test/helpers/locales-core-ir.js.map +1 -0
- package/dist/test/helpers/locales-type-inference.d.ts +6 -0
- package/dist/test/helpers/locales-type-inference.d.ts.map +1 -0
- package/dist/test/helpers/locales-type-inference.js +14 -0
- package/dist/test/helpers/locales-type-inference.js.map +1 -0
- package/dist/test/helpers/test-factories.d.ts +5 -5
- package/dist/test/helpers/test-factories.d.ts.map +1 -1
- package/dist/test/helpers/test-factories.js +9 -8
- package/dist/test/helpers/test-factories.js.map +1 -1
- package/dist/test/integration/compliance/compliance-smoke.test.js +1 -2
- package/dist/test/integration/compliance/compliance-smoke.test.js.map +1 -1
- package/dist/test/integration/pipeline/pipeline.test.js +1 -1
- package/dist/test/integration/pipeline/pipeline.test.js.map +1 -1
- package/dist/test/integration/vocabulary-resolution.test.js +1 -1
- package/dist/test/integration/vocabulary-resolution.test.js.map +1 -1
- package/dist/test/regression/type-checker-golden.test.js +1 -1
- package/dist/test/regression/type-checker-golden.test.js.map +1 -1
- package/dist/test/type-checker/pii-propagation.test.js +7 -6
- package/dist/test/type-checker/pii-propagation.test.js.map +1 -1
- package/dist/test/types/core-ir-v2.test-d.d.ts +28 -0
- package/dist/test/types/core-ir-v2.test-d.d.ts.map +1 -0
- package/dist/test/types/core-ir-v2.test-d.js +5 -0
- package/dist/test/types/core-ir-v2.test-d.js.map +1 -0
- package/dist/test/unit/browser/typecheck-browser-pii-failure.test.js +4 -3
- package/dist/test/unit/browser/typecheck-browser-pii-failure.test.js.map +1 -1
- package/dist/test/unit/canonicalizer/article-declaration-names.test.js +1 -1
- package/dist/test/unit/canonicalizer/article-declaration-names.test.js.map +1 -1
- package/dist/test/unit/canonicalizer/chinese-function-syntax.test.js +2 -1
- package/dist/test/unit/canonicalizer/chinese-function-syntax.test.js.map +1 -1
- package/dist/test/unit/core/canonical-json.test.d.ts +2 -0
- package/dist/test/unit/core/canonical-json.test.d.ts.map +1 -0
- package/dist/test/unit/core/canonical-json.test.js +38 -0
- package/dist/test/unit/core/canonical-json.test.js.map +1 -0
- package/dist/test/unit/core/caseless-pattern-name.test.js +6 -8
- package/dist/test/unit/core/caseless-pattern-name.test.js.map +1 -1
- package/dist/test/unit/core/core-ir-conformance.test.d.ts +2 -0
- package/dist/test/unit/core/core-ir-conformance.test.d.ts.map +1 -0
- package/dist/test/unit/core/core-ir-conformance.test.js +39 -0
- package/dist/test/unit/core/core-ir-conformance.test.js.map +1 -0
- package/dist/test/unit/core/core-ir-schema-parity.test.d.ts +2 -0
- package/dist/test/unit/core/core-ir-schema-parity.test.d.ts.map +1 -0
- package/dist/test/unit/core/core-ir-schema-parity.test.js +25 -0
- package/dist/test/unit/core/core-ir-schema-parity.test.js.map +1 -0
- package/dist/test/unit/core/core-ir-v2-outputs.test.d.ts +2 -0
- package/dist/test/unit/core/core-ir-v2-outputs.test.d.ts.map +1 -0
- package/dist/test/unit/core/core-ir-v2-outputs.test.js +128 -0
- package/dist/test/unit/core/core-ir-v2-outputs.test.js.map +1 -0
- package/dist/test/unit/core/read-core-ir.test.d.ts +2 -0
- package/dist/test/unit/core/read-core-ir.test.d.ts.map +1 -0
- package/dist/test/unit/core/read-core-ir.test.js +129 -0
- package/dist/test/unit/core/read-core-ir.test.js.map +1 -0
- package/dist/test/unit/core/resolve-typed-references.test.js +22 -18
- package/dist/test/unit/core/resolve-typed-references.test.js.map +1 -1
- package/dist/test/unit/diagnostics/lowering-diagnostics-parity.test.js +5 -5
- package/dist/test/unit/diagnostics/lowering-diagnostics-parity.test.js.map +1 -1
- package/dist/test/unit/diagnostics/parse-diagnostics-parity.test.js +3 -2
- package/dist/test/unit/diagnostics/parse-diagnostics-parity.test.js.map +1 -1
- package/dist/test/unit/effect/effect-caps-explicit-only.test.d.ts +2 -0
- package/dist/test/unit/effect/effect-caps-explicit-only.test.d.ts.map +1 -0
- package/dist/test/unit/effect/effect-caps-explicit-only.test.js +73 -0
- package/dist/test/unit/effect/effect-caps-explicit-only.test.js.map +1 -0
- package/dist/test/unit/effect/effect-inference.test.js +17 -13
- package/dist/test/unit/effect/effect-inference.test.js.map +1 -1
- package/dist/test/unit/emitter/emitter.test.js +47 -46
- package/dist/test/unit/emitter/emitter.test.js.map +1 -1
- package/dist/test/unit/formatter-corpus-roundtrip.test.js +5 -1
- package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -1
- package/dist/test/unit/formatter-roundtrip.test.js +5 -4
- package/dist/test/unit/formatter-roundtrip.test.js.map +1 -1
- package/dist/test/unit/frontend/resolve-declarations.test.js +13 -14
- package/dist/test/unit/frontend/resolve-declarations.test.js.map +1 -1
- package/dist/test/unit/governance/governance-check.test.js +1 -1
- package/dist/test/unit/governance/governance-check.test.js.map +1 -1
- package/dist/test/unit/governance/input-refs-parity.test.js +1 -1
- package/dist/test/unit/governance/input-refs-parity.test.js.map +1 -1
- package/dist/test/unit/governance/input-refs.test.js +2 -2
- package/dist/test/unit/governance/input-refs.test.js.map +1 -1
- package/dist/test/unit/governance/no-profile-ir-unchanged.test.js +6 -6
- package/dist/test/unit/governance/no-profile-ir-unchanged.test.js.map +1 -1
- package/dist/test/unit/interpreter/interpreter.test.js +23 -21
- package/dist/test/unit/interpreter/interpreter.test.js.map +1 -1
- package/dist/test/unit/interpreter/scope-writeback.test.js +28 -27
- package/dist/test/unit/interpreter/scope-writeback.test.js.map +1 -1
- package/dist/test/unit/keyword-aliases.test.js +1 -1
- package/dist/test/unit/lambda-capture-parity.test.js +43 -14
- package/dist/test/unit/lambda-capture-parity.test.js.map +1 -1
- package/dist/test/unit/lexicons/fallback-lexicon.test.d.ts +1 -1
- package/dist/test/unit/lexicons/fallback-lexicon.test.js +2 -4
- package/dist/test/unit/lexicons/fallback-lexicon.test.js.map +1 -1
- package/dist/test/unit/lowering/core-ir-v2.test.d.ts +2 -0
- package/dist/test/unit/lowering/core-ir-v2.test.d.ts.map +1 -0
- package/dist/test/unit/lowering/core-ir-v2.test.js +253 -0
- package/dist/test/unit/lowering/core-ir-v2.test.js.map +1 -0
- package/dist/test/unit/lowering/lowering.test.js +19 -14
- package/dist/test/unit/lowering/lowering.test.js.map +1 -1
- package/dist/test/unit/lsp/pii-diagnostics.test.js +33 -30
- package/dist/test/unit/lsp/pii-diagnostics.test.js.map +1 -1
- package/dist/test/unit/lsp/utils.test.js +5 -4
- package/dist/test/unit/lsp/utils.test.js.map +1 -1
- package/dist/test/unit/parser/effect-unknown-name.test.js +7 -7
- package/dist/test/unit/parser/effect-unknown-name.test.js.map +1 -1
- package/dist/test/unit/parser/entry-annotations.test.js +2 -1
- package/dist/test/unit/parser/entry-annotations.test.js.map +1 -1
- package/dist/test/unit/parser/func-type.test.js +3 -3
- package/dist/test/unit/parser/func-type.test.js.map +1 -1
- package/dist/test/unit/parser/governance-sugar.test.js +4 -4
- package/dist/test/unit/parser/governance-sugar.test.js.map +1 -1
- package/dist/test/unit/parser/inferred-type-anchor.test.d.ts +2 -0
- package/dist/test/unit/parser/inferred-type-anchor.test.d.ts.map +1 -0
- package/dist/test/unit/parser/inferred-type-anchor.test.js +83 -0
- package/dist/test/unit/parser/inferred-type-anchor.test.js.map +1 -0
- package/dist/test/unit/parser/naming-rules-parity.test.d.ts +2 -0
- package/dist/test/unit/parser/naming-rules-parity.test.d.ts.map +1 -0
- package/dist/test/unit/parser/naming-rules-parity.test.js +26 -0
- package/dist/test/unit/parser/naming-rules-parity.test.js.map +1 -0
- package/dist/test/unit/parser/parser.test.js +11 -32
- package/dist/test/unit/parser/parser.test.js.map +1 -1
- package/dist/test/unit/parser/type-inference-vectors.test.d.ts +2 -0
- package/dist/test/unit/parser/type-inference-vectors.test.d.ts.map +1 -0
- package/dist/test/unit/parser/type-inference-vectors.test.js +40 -0
- package/dist/test/unit/parser/type-inference-vectors.test.js.map +1 -0
- package/dist/test/unit/parser/type-inference.test.d.ts +2 -1
- package/dist/test/unit/parser/type-inference.test.d.ts.map +1 -1
- package/dist/test/unit/parser/type-inference.test.js +93 -159
- package/dist/test/unit/parser/type-inference.test.js.map +1 -1
- package/dist/test/unit/regex-guard.test.js +6 -6
- package/dist/test/unit/regex-guard.test.js.map +1 -1
- package/dist/test/unit/rule-call-checks.test.js +2 -1
- package/dist/test/unit/rule-call-checks.test.js.map +1 -1
- package/dist/test/unit/typecheck/async-discipline-extended.test.js +11 -10
- package/dist/test/unit/typecheck/async-discipline-extended.test.js.map +1 -1
- package/dist/test/unit/typecheck/effect-prefix-injection.test.js +3 -2
- package/dist/test/unit/typecheck/effect-prefix-injection.test.js.map +1 -1
- package/dist/test/unit/typecheck/function-return-inference.test.js +33 -32
- package/dist/test/unit/typecheck/function-return-inference.test.js.map +1 -1
- package/dist/test/unit/typecheck/pii-cross-runtime-conformance.test.js +5 -4
- package/dist/test/unit/typecheck/pii-cross-runtime-conformance.test.js.map +1 -1
- package/dist/test/unit/typecheck/regression-fixes.test.js +110 -112
- package/dist/test/unit/typecheck/regression-fixes.test.js.map +1 -1
- package/dist/test/unit/typecheck/symbol-table.test.js +3 -2
- package/dist/test/unit/typecheck/symbol-table.test.js.map +1 -1
- package/dist/test/unit/typecheck/type-system-extended.test.js +6 -5
- package/dist/test/unit/typecheck/type-system-extended.test.js.map +1 -1
- package/dist/test/unit/typecheck/type-system.test.js +20 -19
- package/dist/test/unit/typecheck/type-system.test.js.map +1 -1
- package/dist/test/unit/typecheck/typecheck-advanced.test.js +19 -18
- package/dist/test/unit/typecheck/typecheck-advanced.test.js.map +1 -1
- package/dist/test/unit/typecheck/untyped-field-dynamic.test.js +6 -4
- package/dist/test/unit/typecheck/untyped-field-dynamic.test.js.map +1 -1
- package/dist/test/unit/version.test.js +3 -3
- package/package.json +4 -3
- package/dist/src/config/lexicons/type-inference-rules.d.ts +0 -19
- package/dist/src/config/lexicons/type-inference-rules.d.ts.map +0 -1
- package/dist/src/config/lexicons/type-inference-rules.js +0 -63
- package/dist/src/config/lexicons/type-inference-rules.js.map +0 -1
- package/dist/src/core/core_ir_json.d.ts +0 -62
- package/dist/src/core/core_ir_json.d.ts.map +0 -1
- package/dist/src/core/core_ir_json.js +0 -81
- package/dist/src/core/core_ir_json.js.map +0 -1
- package/dist/test/unit/core_ir_json/core_ir_json.test.d.ts +0 -2
- package/dist/test/unit/core_ir_json/core_ir_json.test.d.ts.map +0 -1
- package/dist/test/unit/core_ir_json/core_ir_json.test.js +0 -218
- package/dist/test/unit/core_ir_json/core_ir_json.test.js.map +0 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { compile } from '../../../src/browser.js';
|
|
4
|
+
import { EN_US } from '../../../src/config/lexicons/en-US.js';
|
|
5
|
+
import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
|
|
6
|
+
import { DE_DE } from '../../../src/config/lexicons/de-DE.js';
|
|
7
|
+
import { HI_IN } from '../../../src/config/lexicons/hi-IN.js';
|
|
8
|
+
import { CoreIrFormatError, readCoreIr } from '../../../src/core/read-core-ir.js';
|
|
9
|
+
import { serializeCoreIr } from '../../../src/core/serialize-core-ir.js';
|
|
10
|
+
import { loadCorpus } from '../../../scripts/corpus-loader.js';
|
|
11
|
+
// ADR 0055 §3:ts 对语料的全部输出都必须通过 v2 schema 与不变式(与 core CoreIrSchemaConformanceTest 对应)。
|
|
12
|
+
// 语料取自 aster-lang-test(兄弟 checkout,缺失时退回 npm 快照,见 scripts/corpus-loader.ts)。
|
|
13
|
+
const LEXICONS = { 'en-US': EN_US, 'zh-CN': ZH_CN, 'de-DE': DE_DE, 'hi-IN': HI_IN };
|
|
14
|
+
test('corpus output conforms to Core IR v2 schema and invariants', async () => {
|
|
15
|
+
const { listSamples } = await loadCorpus();
|
|
16
|
+
const failures = [];
|
|
17
|
+
let checked = 0;
|
|
18
|
+
for (const sample of listSamples()) {
|
|
19
|
+
if (sample.path.startsWith('tier1-reject/'))
|
|
20
|
+
continue;
|
|
21
|
+
const lexicon = LEXICONS[sample.meta.lexicon ?? 'en-US'];
|
|
22
|
+
if (!lexicon)
|
|
23
|
+
continue;
|
|
24
|
+
const result = compile(sample.readSource(), { lexicon });
|
|
25
|
+
if (!result.success || !result.core)
|
|
26
|
+
continue;
|
|
27
|
+
checked++;
|
|
28
|
+
try {
|
|
29
|
+
readCoreIr(serializeCoreIr(result.core));
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
const detail = e instanceof CoreIrFormatError ? JSON.stringify(e.problems.slice(0, 3)) : String(e);
|
|
33
|
+
failures.push(`${sample.path}: ${e instanceof Error ? e.message : String(e)} ${detail}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
assert.ok(checked >= 300, `可编译样本异常偏少(${checked})`);
|
|
37
|
+
assert.deepEqual(failures, []);
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=core-ir-conformance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-ir-conformance.test.js","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,sFAAsF;AACtF,6EAA6E;AAC7E,MAAM,QAAQ,GAAsC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAEvH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;IAC5E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,SAAS;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,SAAS;QAC9C,OAAO,EAAE,CAAC;QACV,IAAI,CAAC;YACH,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,CAAC,YAAY,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnG,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,GAAG,EAAE,aAAa,OAAO,GAAG,CAAC,CAAC;IACnD,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-ir-schema-parity.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-schema-parity.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { CORE_IR_SCHEMA_MODULE_PATH, CORE_IR_SCHEMA_PATH, CORE_IR_TYPES_PATH, renderCoreIrSchemaModule, renderCoreIrTypes, } from '../../../scripts/generate-core-ir-types.js';
|
|
6
|
+
import { CORE_IR_V2_SCHEMA } from '../../../src/core/core-ir-v2.schema.generated.js';
|
|
7
|
+
import { locateLocalesCoreIr } from '../../helpers/locales-core-ir.js';
|
|
8
|
+
// ADR 0055 §3:shared/ 副本与 aster-lang-locales 真相源深度相等,生成物与副本同步。
|
|
9
|
+
const root = process.cwd();
|
|
10
|
+
const readRepo = (p) => readFileSync(join(root, p), 'utf8');
|
|
11
|
+
const sharedSchema = () => JSON.parse(readRepo(CORE_IR_SCHEMA_PATH));
|
|
12
|
+
test('schema copy equals locales source', (t) => {
|
|
13
|
+
const source = locateLocalesCoreIr('core-ir.v2.schema.json');
|
|
14
|
+
if (source === undefined)
|
|
15
|
+
return t.skip('本地未并列 checkout aster-lang-locales');
|
|
16
|
+
assert.deepEqual(sharedSchema(), JSON.parse(readFileSync(source, 'utf8')));
|
|
17
|
+
});
|
|
18
|
+
test('generated types are fresh', async () => {
|
|
19
|
+
assert.equal(readRepo(CORE_IR_TYPES_PATH), await renderCoreIrTypes(sharedSchema()), '重新运行 node dist/scripts/generate-core-ir-types.js 并提交生成物');
|
|
20
|
+
});
|
|
21
|
+
test('generated schema module is fresh and equals the shared copy', () => {
|
|
22
|
+
assert.equal(readRepo(CORE_IR_SCHEMA_MODULE_PATH), renderCoreIrSchemaModule(sharedSchema()), '重新运行 node dist/scripts/generate-core-ir-types.js 并提交生成物');
|
|
23
|
+
assert.deepEqual(CORE_IR_V2_SCHEMA, sharedSchema());
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=core-ir-schema-parity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-ir-schema-parity.test.js","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-schema-parity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,+DAA+D;AAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC3B,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5E,MAAM,YAAY,GAAG,GAA4B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAA4B,CAAC;AAEzH,IAAI,CAAC,mCAAmC,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7E,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;IAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,iBAAiB,CAAC,YAAY,EAAE,CAAC,EAChF,yDAAyD,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,wBAAwB,CAAC,YAAY,EAAE,CAAC,EACzF,yDAAyD,CAAC,CAAC;IAC7D,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,YAAY,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-ir-v2-outputs.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-v2-outputs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core IR v2 的读写出口与消费方(ADR 0055 §5;实施计划 Task T3):
|
|
3
|
+
* compile().coreJson、CLI 写出的 IR 文件、解释器与治理检查读 v2 IR。
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { spawnSync } from 'node:child_process';
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import os from 'node:os';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { compile, compileAndTypecheck } from '../../../src/browser.js';
|
|
12
|
+
import { prepareTruffleCoreJson } from '../../../src/cli/utils/core-ir-file.js';
|
|
13
|
+
import { Core as CoreIR } from '../../../src/core/core_ir.js';
|
|
14
|
+
import { evaluate } from '../../../src/core/interpreter.js';
|
|
15
|
+
import { CoreIrFormatError, readCoreIr } from '../../../src/core/read-core-ir.js';
|
|
16
|
+
import { serializeCoreIr } from '../../../src/core/serialize-core-ir.js';
|
|
17
|
+
import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
|
|
18
|
+
import { checkGovernance, controls, ruleId } from '../../../src/typecheck/governance.js';
|
|
19
|
+
const COLOR = 'Module m.\n\nDefine Color as one of Red, Green.\n\n'
|
|
20
|
+
+ 'Rule f given c as Color, produce Int:\n Match c:\n When Red, Return 1.\n When Green, Return 2.\n';
|
|
21
|
+
function core(source) {
|
|
22
|
+
const r = compile(source, {});
|
|
23
|
+
assert.equal(r.success, true, JSON.stringify(r.parseErrors ?? r.resolutionDiagnostics));
|
|
24
|
+
return r.core;
|
|
25
|
+
}
|
|
26
|
+
describe('compile().coreJson', () => {
|
|
27
|
+
it('compile returns coreJson equal to serializeCoreIr(core)', () => {
|
|
28
|
+
const r = compile(COLOR, {});
|
|
29
|
+
assert.equal(r.success, true);
|
|
30
|
+
assert.equal(r.coreJson, serializeCoreIr(r.core));
|
|
31
|
+
assert.deepEqual(readCoreIr(r.coreJson), r.core);
|
|
32
|
+
const t = compileAndTypecheck(COLOR, {});
|
|
33
|
+
assert.equal(t.coreJson, serializeCoreIr(t.core));
|
|
34
|
+
});
|
|
35
|
+
it('编译失败时不产出 coreJson', () => {
|
|
36
|
+
const r = compile('Module m.\n\nRule f given x as Int, produce Int:\n Return y.\n', {});
|
|
37
|
+
assert.equal(r.success, false);
|
|
38
|
+
assert.equal(r.coreJson, undefined);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('解释器读 v2 IR', () => {
|
|
42
|
+
it('interpreter evaluates v2 PatCtor zero-arg variant', () => {
|
|
43
|
+
const m = core(COLOR);
|
|
44
|
+
assert.equal(evaluate(m, 'f', { c: 'Green' }).value, 2);
|
|
45
|
+
// 读回的 JSON IR(无任何旁路表)同样可求值
|
|
46
|
+
const fromJson = readCoreIr(serializeCoreIr(m));
|
|
47
|
+
assert.equal(evaluate(fromJson, 'f', { c: 'Red' }).value, 1);
|
|
48
|
+
});
|
|
49
|
+
it('中文枚举成员(无大小写)经 0 参 PatCtor 正确匹配', () => {
|
|
50
|
+
const src = '模块 探针.样例。\n\n定义 状态 为以下之一 待处理、进行中。\n\n'
|
|
51
|
+
+ '规则 描述 给定 s 作为 状态,产出 整数:\n 匹配于 s:\n 当 待处理,返回 1。\n 当 进行中,返回 2。\n';
|
|
52
|
+
const r = compile(src, { lexicon: ZH_CN });
|
|
53
|
+
assert.equal(r.success, true);
|
|
54
|
+
assert.equal(evaluate(readCoreIr(r.coreJson), '描述', { s: '进行中' }).value, 2);
|
|
55
|
+
});
|
|
56
|
+
it('PatName 只绑定:手写 IR 中的大写 PatName 也是绑定,不再当作变体', () => {
|
|
57
|
+
const body = CoreIR.Block([CoreIR.Match(CoreIR.Name('c'), [
|
|
58
|
+
CoreIR.Case(CoreIR.PatName('Red'), CoreIR.Return(CoreIR.Int(1))),
|
|
59
|
+
])]);
|
|
60
|
+
const fn = CoreIR.Func('f', [], [CoreIR.Param('c', CoreIR.TypeName('Text'))], CoreIR.TypeName('Int'), [], body);
|
|
61
|
+
const m = CoreIR.Module('m', [fn]);
|
|
62
|
+
assert.equal(evaluate(m, 'f', { c: 'anything' }).value, 1);
|
|
63
|
+
});
|
|
64
|
+
it('Double 字面量的规范十进制串在运行时解析为浮点数', () => {
|
|
65
|
+
assert.equal(evaluate(core('Module m.\n\nRule f, produce Double:\n Return 0.25.\n'), 'f', {}).value, 0.25);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('治理检查读 v2 注解', () => {
|
|
69
|
+
it('governance reads $0 from args', () => {
|
|
70
|
+
const m = core('Module m.\n\n@id("R1")\n@control("EU_AI_ACT:ART14")\nRule decide given x as Int, produce Verdict:\n Return Verdict.allow().\n');
|
|
71
|
+
const f = m.decls.find((d) => d.kind === 'Func');
|
|
72
|
+
assert.deepEqual(f.annotations.map((a) => a.args), [[{ name: '$0', value: 'R1' }], [{ name: '$0', value: 'EU_AI_ACT:ART14' }]]);
|
|
73
|
+
assert.equal(ruleId(f), 'R1');
|
|
74
|
+
assert.deepEqual(controls(f), ['EU_AI_ACT:ART14']);
|
|
75
|
+
const codes = checkGovernance(m).map((d) => d.code);
|
|
76
|
+
assert.equal(codes.includes("W700" /* ErrorCode.GOV_VERDICT_RULE_MISSING_ID */), false);
|
|
77
|
+
});
|
|
78
|
+
it('$0 不是字符串时报 E702', () => {
|
|
79
|
+
const m = core('Module m.\n\n@id(42)\nRule decide given x as Int, produce Verdict:\n Return Verdict.allow().\n');
|
|
80
|
+
assert.ok(checkGovernance(m).some((d) => d.code === "E702" /* ErrorCode.GOV_ANNOTATION_ARG_INVALID */));
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('与 Java 解析面的对照(T3 审查复核)', () => {
|
|
84
|
+
it('重复的效应名在 IR 中按首次出现去重(与 Java LinkedHashSet 一致),输出能被严格读回', () => {
|
|
85
|
+
const r = compile('Module m.\n\nRule f given x as Int, produce Int. It performs io and io and cpu:\n Return x.\n', {});
|
|
86
|
+
assert.equal(r.success, true);
|
|
87
|
+
assert.deepEqual(r.core.decls[0].effects, ['io', 'cpu']);
|
|
88
|
+
readCoreIr(r.coreJson);
|
|
89
|
+
});
|
|
90
|
+
it('注解参数名与值可以是软关键词(与 Java structKeywordName 一致)', () => {
|
|
91
|
+
const m = core('Module m.\n\n@x(return: "a", to)\nRule f given x as Int, produce Int:\n Return x.\n');
|
|
92
|
+
const f = m.decls[0];
|
|
93
|
+
assert.deepEqual(f.annotations[0].args, [{ name: 'return', value: 'a' }, { name: '$0', value: 'to' }]);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('CLI 的 IR 文件', () => {
|
|
97
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-core-ir-v2-'));
|
|
98
|
+
it('cli truffle writes canonical v2', () => {
|
|
99
|
+
const input = path.join(dir, 'color.aster');
|
|
100
|
+
fs.writeFileSync(input, COLOR);
|
|
101
|
+
const out = prepareTruffleCoreJson(input, path.join(dir, 'build'));
|
|
102
|
+
const bytes = fs.readFileSync(out, 'utf8');
|
|
103
|
+
assert.equal(bytes, compile(COLOR, {}).coreJson);
|
|
104
|
+
assert.equal(serializeCoreIr(readCoreIr(bytes)), bytes);
|
|
105
|
+
});
|
|
106
|
+
it('truffle 的 .json 输入先严格读入:v1 形状(无 schemaVersion)被拒收', () => {
|
|
107
|
+
const v1 = path.join(dir, 'old.json');
|
|
108
|
+
fs.writeFileSync(v1, JSON.stringify({ kind: 'Module', name: 'm', decls: [] }));
|
|
109
|
+
assert.throws(() => prepareTruffleCoreJson(v1), (e) => e instanceof CoreIrFormatError && e.code === 'unsupported_schema_version');
|
|
110
|
+
const ok = path.join(dir, 'ok.json');
|
|
111
|
+
fs.writeFileSync(ok, compile(COLOR, {}).coreJson);
|
|
112
|
+
assert.equal(prepareTruffleCoreJson(ok), ok);
|
|
113
|
+
});
|
|
114
|
+
it('aster-convert compile-to-json 输出规范字节,json-to-cnl 拒收 v1 IR', () => {
|
|
115
|
+
const input = path.join(dir, 'conv.aster');
|
|
116
|
+
fs.writeFileSync(input, COLOR);
|
|
117
|
+
const cli = path.join(process.cwd(), 'dist', 'src', 'cli', 'policy-converter.js');
|
|
118
|
+
const compiled = spawnSync(process.execPath, [cli, 'compile-to-json', input], { encoding: 'utf8' });
|
|
119
|
+
assert.equal(compiled.status, 0, compiled.stderr);
|
|
120
|
+
assert.equal(compiled.stdout.trim(), compile(COLOR, {}).coreJson);
|
|
121
|
+
const v1 = path.join(dir, 'conv-old.json');
|
|
122
|
+
fs.writeFileSync(v1, JSON.stringify({ version: '1.0', module: { kind: 'Module', name: 'm', decls: [] } }));
|
|
123
|
+
const back = spawnSync(process.execPath, [cli, 'json-to-cnl', v1], { encoding: 'utf8' });
|
|
124
|
+
assert.notEqual(back.status, 0);
|
|
125
|
+
assert.match(back.stderr, /schemaVersion/);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=core-ir-v2-outputs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-ir-v2-outputs.test.js","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-v2-outputs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-core-ir.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/core/read-core-ir.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { canonicalDecimalFromLiteral } from '../../../src/core/canonical-decimal.js';
|
|
6
|
+
import { CoreIrFormatError, readCoreIr } from '../../../src/core/read-core-ir.js';
|
|
7
|
+
import { serializeCoreIr, validateCoreIrInvariants } from '../../../src/core/serialize-core-ir.js';
|
|
8
|
+
import { locateLocalesCoreIr } from '../../helpers/locales-core-ir.js';
|
|
9
|
+
const VERSION_FIXTURES = new Set([
|
|
10
|
+
'bad-missing-schema-version.json',
|
|
11
|
+
'bad-schema-version-1.json',
|
|
12
|
+
'bad-schema-version-string.json',
|
|
13
|
+
]);
|
|
14
|
+
const expectedPath = locateLocalesCoreIr(join('test-fixtures', 'expected-problems.json'));
|
|
15
|
+
const fixtureDir = expectedPath === undefined ? undefined : dirname(expectedPath);
|
|
16
|
+
const expected = expectedPath === undefined
|
|
17
|
+
? []
|
|
18
|
+
: JSON.parse(readFileSync(expectedPath, 'utf8'));
|
|
19
|
+
/** 与 validateCoreIrInvariants 相同的排序:先 path、再 code(码元序)。 */
|
|
20
|
+
function byPathThenCode(a, b) {
|
|
21
|
+
if (a.path !== b.path)
|
|
22
|
+
return a.path < b.path ? -1 : 1;
|
|
23
|
+
return a.code === b.code ? 0 : a.code < b.code ? -1 : 1;
|
|
24
|
+
}
|
|
25
|
+
function readError(json) {
|
|
26
|
+
try {
|
|
27
|
+
readCoreIr(json);
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
if (e instanceof CoreIrFormatError)
|
|
31
|
+
return e;
|
|
32
|
+
throw e;
|
|
33
|
+
}
|
|
34
|
+
assert.fail('readCoreIr 应当拒收');
|
|
35
|
+
}
|
|
36
|
+
describe('readCoreIr rejects every locales bad fixture with expected problems', () => {
|
|
37
|
+
test('夹具目录存在且 expected-problems.json 覆盖目录中的每个夹具', (t) => {
|
|
38
|
+
if (fixtureDir === undefined)
|
|
39
|
+
return t.skip('本地未并列 checkout aster-lang-locales');
|
|
40
|
+
const onDisk = readdirSync(fixtureDir).filter(f => /^(bad|ok)-.*\.json$/.test(f)).sort();
|
|
41
|
+
assert.deepEqual(expected.map(e => e.file).sort(), onDisk);
|
|
42
|
+
assert.ok(onDisk.filter(f => f.startsWith('bad-')).length >= 24, '负例数异常偏少');
|
|
43
|
+
});
|
|
44
|
+
for (const { file, problems } of expected) {
|
|
45
|
+
test(file, () => {
|
|
46
|
+
const json = readFileSync(join(fixtureDir, file), 'utf8');
|
|
47
|
+
if (problems.length === 0) {
|
|
48
|
+
assert.doesNotThrow(() => readCoreIr(json));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const err = readError(json);
|
|
52
|
+
if (VERSION_FIXTURES.has(file)) {
|
|
53
|
+
assert.equal(err.code, 'unsupported_schema_version');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
assert.equal(err.code, 'invalid_request');
|
|
57
|
+
if (problems.every(p => p.code === 'schema')) {
|
|
58
|
+
assert.ok(err.problems.length > 0);
|
|
59
|
+
assert.deepEqual([...new Set(err.problems.map(p => p.code))], ['schema']);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// 不变式夹具必须先通过 schema,问题列表只含不变式问题
|
|
63
|
+
assert.deepEqual(err.problems, [...problems].sort(byPathThenCode));
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
describe('readCoreIr 版本预检查与解析错误', () => {
|
|
69
|
+
test('非 JSON 报 invalid_request', () => {
|
|
70
|
+
assert.equal(readError('{').code, 'invalid_request');
|
|
71
|
+
});
|
|
72
|
+
test('数组、null 与缺失 schemaVersion 都报 unsupported_schema_version', () => {
|
|
73
|
+
for (const json of ['[]', 'null', '{"kind":"Module"}', '{"schemaVersion":"2"}', '{"schemaVersion":1}']) {
|
|
74
|
+
assert.equal(readError(json).code, 'unsupported_schema_version', json);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
test('版本正确但形状不对报 invalid_request 且问题 code 为 schema', () => {
|
|
78
|
+
const err = readError('{"schemaVersion":2}');
|
|
79
|
+
assert.equal(err.code, 'invalid_request');
|
|
80
|
+
assert.ok(err.problems.length > 0 && err.problems.every(p => p.code === 'schema'));
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('double literals match locales fixture', () => {
|
|
84
|
+
test('每条源码字面量的规范十进制串都与夹具一致', (t) => {
|
|
85
|
+
const path = locateLocalesCoreIr(join('test-fixtures', 'double-literals.json'));
|
|
86
|
+
if (path === undefined)
|
|
87
|
+
return t.skip('本地未并列 checkout aster-lang-locales');
|
|
88
|
+
const rows = JSON.parse(readFileSync(path, 'utf8'));
|
|
89
|
+
assert.ok(rows.length >= 8);
|
|
90
|
+
for (const { source, canonical } of rows) {
|
|
91
|
+
assert.equal(canonicalDecimalFromLiteral(source), canonical, source);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
test('不经 double:超出双精度有效位的字面量原样保留', () => {
|
|
95
|
+
assert.equal(canonicalDecimalFromLiteral('123456789012345678901.5'), '123456789012345678901.5');
|
|
96
|
+
assert.equal(canonicalDecimalFromLiteral('-0'), '0');
|
|
97
|
+
assert.equal(canonicalDecimalFromLiteral('-1.50'), '-1.5');
|
|
98
|
+
assert.equal(canonicalDecimalFromLiteral('007.0'), '7');
|
|
99
|
+
});
|
|
100
|
+
test('输出满足 schema 的 CanonicalDecimal pattern', () => {
|
|
101
|
+
const pattern = /^(0|-?[1-9][0-9]*(\.[0-9]*[1-9])?|-?0\.[0-9]*[1-9])$/;
|
|
102
|
+
for (const raw of ['0.1', '1.0', '-0.0', '1E3', '0.000', '-0.25', '100']) {
|
|
103
|
+
assert.match(canonicalDecimalFromLiteral(raw), pattern, raw);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('serializeCoreIr', () => {
|
|
108
|
+
test('ok 夹具读入后规范输出:键按码点升序,null 与空数组显式输出,读回仍通过', (t) => {
|
|
109
|
+
if (fixtureDir === undefined)
|
|
110
|
+
return t.skip('本地未并列 checkout aster-lang-locales');
|
|
111
|
+
for (const file of expected.filter(e => e.problems.length === 0).map(e => e.file)) {
|
|
112
|
+
const module = readCoreIr(readFileSync(join(fixtureDir, file), 'utf8'));
|
|
113
|
+
const bytes = serializeCoreIr(module);
|
|
114
|
+
assert.ok(bytes.startsWith('{"decls":['), file);
|
|
115
|
+
assert.ok(bytes.includes('"written":null'), file);
|
|
116
|
+
assert.deepEqual(readCoreIr(bytes), module, file);
|
|
117
|
+
assert.equal(serializeCoreIr(readCoreIr(bytes)), bytes, `${file} 规范输出应当幂等`);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
test('validateCoreIrInvariants 对 ok 夹具无问题', (t) => {
|
|
121
|
+
if (fixtureDir === undefined)
|
|
122
|
+
return t.skip('本地未并列 checkout aster-lang-locales');
|
|
123
|
+
for (const file of expected.filter(e => e.problems.length === 0).map(e => e.file)) {
|
|
124
|
+
const module = JSON.parse(readFileSync(join(fixtureDir, file), 'utf8'));
|
|
125
|
+
assert.deepEqual(validateCoreIrInvariants(module), [], file);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=read-core-ir.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-core-ir.test.js","sourceRoot":"","sources":["../../../../test/unit/core/read-core-ir.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -287,8 +287,9 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
287
287
|
'Regel f gegeben s als Stufe, liefert Ganzzahl:\n pruefe s:\n bei Hoch, gib zurueck 1.\n bei andere, gib zurueck 2.\n', LEVEL);
|
|
288
288
|
assert.deepEqual(codes(r2), []);
|
|
289
289
|
const cases = stmt(func(module, 'f'), 0, 'Match').cases;
|
|
290
|
+
// ADR 0055 #16:解析为成员的裸名产出 0 参 PatCtor
|
|
290
291
|
const first = cases[0].pattern;
|
|
291
|
-
assert.
|
|
292
|
+
assert.deepEqual([first.kind, first.typeName, first.args], ['PatCtor', 'High', []]);
|
|
292
293
|
assert.equal(first.origin?.written, 'Hoch');
|
|
293
294
|
assert.equal(first.origin?.role, 'MEMBER_REF');
|
|
294
295
|
assert.equal(cases[1].pattern.name, 'andere');
|
|
@@ -300,7 +301,7 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
300
301
|
assert.deepEqual(codes(r2), []);
|
|
301
302
|
const pat = stmt(func(module, 'f'), 1, 'Match').cases[0].pattern;
|
|
302
303
|
assert.equal(pat.typeName, 'Driver');
|
|
303
|
-
assert.deepEqual(pat.
|
|
304
|
+
assert.deepEqual(pat.args.map((a) => a.name), ['a']);
|
|
304
305
|
});
|
|
305
306
|
it('主语未知、全部枚举成员与构造器中唯一 → 采用 + W801', () => {
|
|
306
307
|
const { module, r2 } = run(MODULE + LEVEL_DECL +
|
|
@@ -309,7 +310,7 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
309
310
|
assert.deepEqual(codes(r2), ["W801" /* ErrorCode.RESOLVED_WITHOUT_TYPE */, "W801" /* ErrorCode.RESOLVED_WITHOUT_TYPE */]);
|
|
310
311
|
const cases = stmt(func(module, 'f'), 1, 'Match').cases;
|
|
311
312
|
assert.equal(cases[0].pattern.typeName, 'High');
|
|
312
|
-
assert.equal(cases[1].pattern.
|
|
313
|
+
assert.equal(cases[1].pattern.typeName, 'Low');
|
|
313
314
|
});
|
|
314
315
|
it('主语未知、多个候选 → E806', () => {
|
|
315
316
|
const { r2 } = run(MODULE + LEVEL_DECL + 'Definiere Rang als eines von Hoch, Mittel.\n\n' +
|
|
@@ -344,7 +345,7 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
344
345
|
const ufcs = stmt(func(module, 'f'), 0, 'Let').expr;
|
|
345
346
|
assert.deepEqual([nameOf(ufcs.target).name, nameOf(ufcs.args[0]).name], ['get', 'io']);
|
|
346
347
|
});
|
|
347
|
-
it('lambda:期望类型取 lambda
|
|
348
|
+
it('lambda:期望类型取 lambda 声明返回类型,枚举成员不进捕获列表', () => {
|
|
348
349
|
const { module, r2 } = run('Module m.\n\nDefine Stufe as one of Hoch, Niedrig.\n\n' +
|
|
349
350
|
'Rule f given outer as Int, produce Int:\n' +
|
|
350
351
|
' Let g be function with x as Int, produce Stufe:\n' +
|
|
@@ -355,7 +356,8 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
355
356
|
const lambda = stmt(func(module, 'f'), 0, 'Let').expr;
|
|
356
357
|
const ret = lambda.body.statements[1];
|
|
357
358
|
assert.equal(nameOf(ret.expr).name, 'High');
|
|
358
|
-
|
|
359
|
+
// 枚举成员不是外层局部,lowering 就不把它放进 captures(ADR 0056 §4.2),R2 无须改写
|
|
360
|
+
assert.deepEqual(lambda.captures, ['outer']);
|
|
359
361
|
});
|
|
360
362
|
});
|
|
361
363
|
describe('裁决 R19:未知调用目标交由类型检查', () => {
|
|
@@ -398,11 +400,11 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
398
400
|
collect(module, names, origins);
|
|
399
401
|
assert.deepEqual(names.filter((n) => LOCALIZED.includes(n)), []);
|
|
400
402
|
for (const o of origins) {
|
|
401
|
-
if (o
|
|
403
|
+
if (o.written === null && o.role === null)
|
|
402
404
|
continue;
|
|
403
|
-
assert.ok(o.written !==
|
|
405
|
+
assert.ok(o.written !== null && o.role !== null, '两者同时出现');
|
|
404
406
|
}
|
|
405
|
-
const withWritten = origins.filter((o) => o
|
|
407
|
+
const withWritten = origins.filter((o) => o.written !== null).map((o) => o.written);
|
|
406
408
|
assert.ok(withWritten.includes('fahrer.alter'));
|
|
407
409
|
assert.ok(withWritten.includes('Hoch'));
|
|
408
410
|
const f = func(module, 'check');
|
|
@@ -410,7 +412,7 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
410
412
|
assert.equal(f.origin?.role, 'FUNC_DECL');
|
|
411
413
|
// 局部名 fahrer 未改写:其节点 origin 不带 written
|
|
412
414
|
const let0 = stmt(f, 0, 'Let');
|
|
413
|
-
assert.equal(let0.origin
|
|
415
|
+
assert.equal(let0.origin.written, null);
|
|
414
416
|
});
|
|
415
417
|
it('函数签名的参数 / 返回类型名记录 written/role(与 Java 对齐)', () => {
|
|
416
418
|
const { module, r1, r2 } = run(SOURCE, VOCAB);
|
|
@@ -425,18 +427,20 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
425
427
|
assert.equal(ret.origin?.written, 'Stufe');
|
|
426
428
|
assert.equal(ret.origin?.role, 'TYPE');
|
|
427
429
|
});
|
|
428
|
-
it('
|
|
430
|
+
it('函数签名中未改写的类型名:origin 恒输出,written / role 为 null(ADR 0055 #17)', () => {
|
|
429
431
|
const { module } = run('Module m.\n\nDefine Driver has age as Int.\n\nRule f given d as Driver, produce Int:\n Return d.age.\n', DRIVER, EN_US);
|
|
430
432
|
const f = func(module, 'f');
|
|
431
|
-
|
|
432
|
-
|
|
433
|
+
for (const t of [f.params[0].type, f.ret]) {
|
|
434
|
+
assert.ok(t.origin.start.line > 0);
|
|
435
|
+
assert.deepEqual([t.origin.written, t.origin.role], [null, null]);
|
|
436
|
+
}
|
|
433
437
|
});
|
|
434
438
|
it('规范名直写的源码:origin 不带 written/role', () => {
|
|
435
439
|
const { module, r2 } = run('Module m.\n\nDefine Driver has age as Int.\n\nRule f given d as Driver, produce Int:\n Return d.age.\n', DRIVER, EN_US);
|
|
436
440
|
assert.deepEqual(codes(r2), []);
|
|
437
441
|
const origins = [];
|
|
438
442
|
collect(module, [], origins);
|
|
439
|
-
assert.deepEqual(origins.filter((o) => o
|
|
443
|
+
assert.deepEqual(origins.filter((o) => o.written !== null || o.role !== null), []);
|
|
440
444
|
});
|
|
441
445
|
it('任一 E8xx 时 diagnostics 非空(调用方据此不发出 IR)', () => {
|
|
442
446
|
const { r2 } = run(MODULE + DRIVER_DECL + 'Regel f gegeben x als Fahrer, liefert Ganzzahl:\n gib zurueck x.gewicht.\n', DRIVER);
|
|
@@ -463,7 +467,7 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
463
467
|
assert.deepEqual([...codes(r1), ...codes(r2)], []);
|
|
464
468
|
assert.equal(nameOf(stmt(func(module, 'f'), 1, 'Let').expr).name, 'y.age');
|
|
465
469
|
const cases = stmt(func(module, 'f'), 2, 'Match').cases;
|
|
466
|
-
assert.equal(cases[0].pattern.
|
|
470
|
+
assert.equal(cases[0].pattern.typeName, 'Gold');
|
|
467
471
|
assert.equal(cases[1].pattern.typeName, 'Silver');
|
|
468
472
|
});
|
|
469
473
|
it('2. 无期望类型的裸成员规范名 → 原样接受;期望枚举下写法即规范名不改写', () => {
|
|
@@ -475,7 +479,7 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
475
479
|
assert.equal(nameOf(returned(func(module, 'g'), 0).args[1]).name, 'Silver');
|
|
476
480
|
const h = nameOf(returned(func(module, 'h'), 0));
|
|
477
481
|
assert.equal(h.name, 'Gold');
|
|
478
|
-
assert.equal(h.origin
|
|
482
|
+
assert.equal(h.origin.written, null);
|
|
479
483
|
});
|
|
480
484
|
it('2. 成员规范名属于多个枚举且无期望类型 → E804', () => {
|
|
481
485
|
const { r2 } = run(TIER + 'Define Medal as one of Gold, Bronze.\n\nRule f given t as Text:\n Return Gold.\n', [], EN_US);
|
|
@@ -566,7 +570,7 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
566
570
|
it('未注解主语上的裸成员模式 → 采用 + W801', () => {
|
|
567
571
|
const { module, r2 } = run(MODULE + LEVEL_DECL + 'Regel f gegeben s, liefert Ganzzahl:\n pruefe s:\n bei Hoch, gib zurueck 1.\n bei andere, gib zurueck 2.\n', LEVEL);
|
|
568
572
|
assert.deepEqual(codes(r2), ["W801" /* ErrorCode.RESOLVED_WITHOUT_TYPE */]);
|
|
569
|
-
assert.equal(stmt(func(module, 'f'), 0, 'Match').cases[0].pattern.
|
|
573
|
+
assert.equal(stmt(func(module, 'f'), 0, 'Match').cases[0].pattern.typeName, 'High');
|
|
570
574
|
});
|
|
571
575
|
it('未注解 lambda 参数上的路径 → 全局候选采用 + W801(裁决 R31)', () => {
|
|
572
576
|
const { module, r2 } = run('Module m.\n\nDefine Fahrer has alter as Int.\n\n' +
|
|
@@ -590,8 +594,8 @@ describe('resolveTypedReferences(R2)', () => {
|
|
|
590
594
|
const ast = parse(MODULE + DRIVER_DECL + 'Regel f gegeben x als Fahrer, liefert Ganzzahl:\n gib zurueck x.alter.\n');
|
|
591
595
|
const core = lowerModule(ast);
|
|
592
596
|
const json = JSON.stringify(core);
|
|
593
|
-
assert.ok(!json.includes('"written"'));
|
|
594
|
-
assert.ok(!json.includes('"role"'));
|
|
597
|
+
assert.ok(!json.includes('"written":"'));
|
|
598
|
+
assert.ok(!json.includes('"role":"'));
|
|
595
599
|
assert.equal(nameOf(returned(func(core, 'f'), 0)).name, 'x.alter');
|
|
596
600
|
assert.equal(core.decls[0].name, 'Fahrer');
|
|
597
601
|
});
|