@aster-cloud/aster-lang-ts 1.2.2 → 1.2.4
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 +93 -0
- package/dist/src/config/semantic.d.ts +8 -0
- package/dist/src/config/semantic.d.ts.map +1 -1
- package/dist/src/config/semantic.js +13 -0
- package/dist/src/config/semantic.js.map +1 -1
- package/dist/src/core/interpreter.d.ts.map +1 -1
- package/dist/src/core/interpreter.js +84 -16
- package/dist/src/core/interpreter.js.map +1 -1
- package/dist/src/core/resolve-typed-references.d.ts.map +1 -1
- package/dist/src/core/resolve-typed-references.js +18 -1
- package/dist/src/core/resolve-typed-references.js.map +1 -1
- package/dist/src/frontend/resolution-choice.d.ts +2 -0
- package/dist/src/frontend/resolution-choice.d.ts.map +1 -1
- package/dist/src/frontend/resolution-choice.js +33 -2
- package/dist/src/frontend/resolution-choice.js.map +1 -1
- package/dist/src/frontend/resolve-declarations.js +2 -2
- package/dist/src/frontend/resolve-declarations.js.map +1 -1
- package/dist/src/lsp/completion.d.ts +7 -2
- package/dist/src/lsp/completion.d.ts.map +1 -1
- package/dist/src/lsp/completion.js +11 -4
- package/dist/src/lsp/completion.js.map +1 -1
- package/dist/src/lsp/member-completion.d.ts +38 -3
- package/dist/src/lsp/member-completion.d.ts.map +1 -1
- package/dist/src/lsp/member-completion.js +124 -24
- package/dist/src/lsp/member-completion.js.map +1 -1
- package/dist/src/lsp/server.js +4 -1
- package/dist/src/lsp/server.js.map +1 -1
- package/dist/src/typecheck/browser.d.ts.map +1 -1
- package/dist/src/typecheck/browser.js +3 -3
- package/dist/src/typecheck/browser.js.map +1 -1
- package/dist/src/typecheck/context.d.ts +1 -1
- package/dist/src/typecheck/context.d.ts.map +1 -1
- package/dist/src/typecheck/context.js +35 -5
- package/dist/src/typecheck/context.js.map +1 -1
- package/dist/src/typecheck/expression.d.ts.map +1 -1
- package/dist/src/typecheck/expression.js +78 -19
- package/dist/src/typecheck/expression.js.map +1 -1
- package/dist/src/typecheck/module.d.ts.map +1 -1
- package/dist/src/typecheck/module.js +3 -3
- package/dist/src/typecheck/module.js.map +1 -1
- package/dist/src/typecheck/pattern.js +2 -2
- package/dist/src/typecheck/pattern.js.map +1 -1
- package/dist/src/typecheck/pure.d.ts +15 -0
- package/dist/src/typecheck/pure.d.ts.map +1 -1
- package/dist/src/typecheck/pure.js +83 -0
- package/dist/src/typecheck/pure.js.map +1 -1
- package/dist/src/typecheck/statement.d.ts.map +1 -1
- package/dist/src/typecheck/statement.js +4 -2
- package/dist/src/typecheck/statement.js.map +1 -1
- package/dist/src/typecheck/symbol_table.d.ts +10 -1
- package/dist/src/typecheck/symbol_table.d.ts.map +1 -1
- package/dist/src/typecheck/symbol_table.js +15 -0
- package/dist/src/typecheck/symbol_table.js.map +1 -1
- package/dist/src/typecheck/utils.d.ts +1 -1
- package/dist/src/typecheck/utils.d.ts.map +1 -1
- package/dist/src/typecheck/utils.js +1 -1
- package/dist/src/typecheck/utils.js.map +1 -1
- package/dist/test/integration/lsp/lsp-member-completion.test.js +43 -4
- package/dist/test/integration/lsp/lsp-member-completion.test.js.map +1 -1
- package/dist/test/integration/lsp/package-exports.test.d.ts +2 -0
- package/dist/test/integration/lsp/package-exports.test.d.ts.map +1 -0
- package/dist/test/integration/lsp/package-exports.test.js +30 -0
- package/dist/test/integration/lsp/package-exports.test.js.map +1 -0
- package/dist/test/unit/canonicalizer/possessive-anchor.test.js +25 -28
- package/dist/test/unit/canonicalizer/possessive-anchor.test.js.map +1 -1
- package/dist/test/unit/core/caseless-pattern-name.test.d.ts +2 -0
- package/dist/test/unit/core/caseless-pattern-name.test.d.ts.map +1 -0
- package/dist/test/unit/core/caseless-pattern-name.test.js +114 -0
- package/dist/test/unit/core/caseless-pattern-name.test.js.map +1 -0
- package/dist/test/unit/formatter-corpus-roundtrip.test.js +44 -3
- package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -1
- package/dist/test/unit/frontend/resolution-choice.test.d.ts +2 -0
- package/dist/test/unit/frontend/resolution-choice.test.d.ts.map +1 -0
- package/dist/test/unit/frontend/resolution-choice.test.js +90 -0
- package/dist/test/unit/frontend/resolution-choice.test.js.map +1 -0
- package/dist/test/unit/interpreter/scope-writeback.test.d.ts +2 -0
- package/dist/test/unit/interpreter/scope-writeback.test.d.ts.map +1 -0
- package/dist/test/unit/interpreter/scope-writeback.test.js +154 -0
- package/dist/test/unit/interpreter/scope-writeback.test.js.map +1 -0
- package/dist/test/unit/lsp/member-completion.test.d.ts +2 -0
- package/dist/test/unit/lsp/member-completion.test.d.ts.map +1 -0
- package/dist/test/unit/lsp/member-completion.test.js +203 -0
- package/dist/test/unit/lsp/member-completion.test.js.map +1 -0
- package/dist/test/unit/rule-call-checks.test.d.ts +2 -0
- package/dist/test/unit/rule-call-checks.test.d.ts.map +1 -0
- package/dist/test/unit/rule-call-checks.test.js +269 -0
- package/dist/test/unit/rule-call-checks.test.js.map +1 -0
- package/dist/test/unit/rule-function-values.test.d.ts +2 -0
- package/dist/test/unit/rule-function-values.test.d.ts.map +1 -0
- package/dist/test/unit/rule-function-values.test.js +89 -0
- package/dist/test/unit/rule-function-values.test.js.map +1 -0
- package/dist/test/unit/typecheck/assign-mutability.test.d.ts +2 -0
- package/dist/test/unit/typecheck/assign-mutability.test.d.ts.map +1 -0
- package/dist/test/unit/typecheck/assign-mutability.test.js +144 -0
- package/dist/test/unit/typecheck/assign-mutability.test.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-completion.test.js","sourceRoot":"","sources":["../../../../test/unit/lsp/member-completion.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-call-checks.test.d.ts","sourceRoot":"","sources":["../../../test/unit/rule-call-checks.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 用户规则调用的静态检查与运行期调用目标(#266 #268)。
|
|
3
|
+
*
|
|
4
|
+
* #266:调用本模块规则或函数值局部名时,按**显式写了类型**的形参比较实参类型,不符报 E001
|
|
5
|
+
* (与 Java BaseTypeChecker.checkCall 同码)。未写类型的形参(解析器按名字推断出类型,
|
|
6
|
+
* `typeInferred`)不参与比较——推断类型只是按名字猜的。Java 目前仍按推断类型比较并拒绝这类调用,
|
|
7
|
+
* TS 放行(向 TS 对齐见 aster-lang-core#229)。原则:能正常运行的程序不新增 E001,拿不准时放行。
|
|
8
|
+
* #268:调用目标解析与 Java/truffle 一致——局部名遮蔽同名规则。局部名类型已知且不是函数类型时
|
|
9
|
+
* 报 E001(期望函数);TS 解释器同样按局部名分派,不再悄悄改调同名规则。
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it } from 'node:test';
|
|
12
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
13
|
+
import { join, resolve } from 'node:path';
|
|
14
|
+
import assert from 'node:assert/strict';
|
|
15
|
+
import { compileAndTypecheck, evaluate, EN_US } from '../../src/browser.js';
|
|
16
|
+
import { NAMED_BUILTIN_OPS } from '../../src/config/semantic.js';
|
|
17
|
+
const INC = 'Rule inc given x as Int, produce Int:\n Return x plus 1.\n\n';
|
|
18
|
+
const GREET = 'Rule greet given name as Text, produce Text:\n Return name.\n\n';
|
|
19
|
+
const TWICE = 'Rule twice given f as (Int) -> Int, n as Int, produce Int:\n Return f(f(n)).\n\n';
|
|
20
|
+
function check(body) {
|
|
21
|
+
const r = compileAndTypecheck(`Module demo.\n\n${body}`, { lexicon: EN_US });
|
|
22
|
+
const errors = [...(r.parseErrors ?? []), ...(r.resolutionDiagnostics ?? []), ...(r.typeErrors ?? [])]
|
|
23
|
+
.filter((d) => d.severity === 'error');
|
|
24
|
+
return { errors, core: r.core };
|
|
25
|
+
}
|
|
26
|
+
function mismatches(errors) {
|
|
27
|
+
return errors.filter((d) => d.code === 'E001').map((d) => d.data);
|
|
28
|
+
}
|
|
29
|
+
describe('#266 用户规则调用的实参类型', () => {
|
|
30
|
+
it('★inc("a"):形参 Int、实参 Text,报 E001', () => {
|
|
31
|
+
const { errors } = check(INC + 'Rule main given n as Int, produce Int:\n Return inc("a").\n');
|
|
32
|
+
assert.deepEqual(mismatches(errors), [{ expected: 'Int', actual: 'Text' }]);
|
|
33
|
+
});
|
|
34
|
+
it('经函数值局部名调用同样比较:Let g be inc. Return g("a").', () => {
|
|
35
|
+
const { errors } = check(INC + 'Rule main given n as Int, produce Int:\n Let g be inc.\n Return g("a").\n');
|
|
36
|
+
assert.deepEqual(mismatches(errors), [{ expected: 'Int', actual: 'Text' }]);
|
|
37
|
+
});
|
|
38
|
+
it('函数值实参与函数类型形参不符:twice(greet, n) 报 E001', () => {
|
|
39
|
+
const { errors } = check(GREET + TWICE + 'Rule main given n as Int, produce Int:\n Return twice(greet, n).\n');
|
|
40
|
+
assert.deepEqual(mismatches(errors), [{ expected: '(Int) -> Int', actual: '(Text) -> Text' }]);
|
|
41
|
+
});
|
|
42
|
+
it('类型相符不报错:inc(n)、twice(inc, n)', () => {
|
|
43
|
+
const { errors } = check(INC + TWICE + 'Rule main given n as Int, produce Int:\n Return twice(inc, inc(n)).\n');
|
|
44
|
+
assert.deepEqual(errors, []);
|
|
45
|
+
});
|
|
46
|
+
it('★未写类型的形参不比较:greet given name 推断为 Text,传 Int 不报错', () => {
|
|
47
|
+
const { errors } = check('Rule label given amount, produce Text:\n Return "x".\n\n' +
|
|
48
|
+
'Rule main given n as Int, produce Text:\n Return label("a").\n');
|
|
49
|
+
assert.deepEqual(errors, []);
|
|
50
|
+
});
|
|
51
|
+
it('未写类型的形参经函数值传递也不比较:twice(bump, n) 不因推断类型报错', () => {
|
|
52
|
+
const { errors } = check('Rule bump given amount, produce Int:\n Return 1.\n\n' + TWICE +
|
|
53
|
+
'Rule main given n as Int, produce Int:\n Return twice(bump, n).\n');
|
|
54
|
+
assert.deepEqual(mismatches(errors), []);
|
|
55
|
+
});
|
|
56
|
+
it('lambda 函数值:显式类型形参比较,未写类型的形参不比较', () => {
|
|
57
|
+
const typed = check('Rule main given n as Int, produce Int:\n Let f be function with x as Int, produce Int:\n Return x.\n Return f("a").\n');
|
|
58
|
+
assert.deepEqual(mismatches(typed.errors), [{ expected: 'Int', actual: 'Text' }]);
|
|
59
|
+
const untyped = check('Rule main given flag as Bool, produce Int:\n Let f be function with x, produce:\n Return 1.\n Return f(flag).\n');
|
|
60
|
+
assert.deepEqual(mismatches(untyped.errors), []);
|
|
61
|
+
});
|
|
62
|
+
it('Int 实参传给 Float 形参按数值拓宽放行', () => {
|
|
63
|
+
const { errors } = check('Rule half given x as Float, produce Float:\n Return x.\n\n' +
|
|
64
|
+
'Rule main given n as Int, produce Float:\n Return half(n).\n');
|
|
65
|
+
assert.deepEqual(mismatches(errors), []);
|
|
66
|
+
});
|
|
67
|
+
it('函数类型形参位按逆变比较:期望 (Int) -> Int 时可传 (Float) -> Int', () => {
|
|
68
|
+
const { errors } = check('Rule widen given x as Float, produce Int:\n Return 1.\n\n' + TWICE +
|
|
69
|
+
'Rule main given n as Int, produce Int:\n Return twice(widen, n).\n');
|
|
70
|
+
assert.deepEqual(mismatches(errors), []);
|
|
71
|
+
});
|
|
72
|
+
it('实参只类型化一次:实参内部的诊断不重复', () => {
|
|
73
|
+
const { errors } = check(INC + 'Rule main given n as Int, produce Int:\n Return inc(Verdict.nope()).\n');
|
|
74
|
+
assert.deepEqual(errors.map((d) => d.code), ['E101'], JSON.stringify(errors));
|
|
75
|
+
});
|
|
76
|
+
it('个数不符报 E032,前缀位置照常比较类型(与 Java 一致,按 min 个数比较)', () => {
|
|
77
|
+
const { errors } = check(INC + 'Rule main given n as Int, produce Int:\n Return inc("a", n).\n');
|
|
78
|
+
assert.deepEqual(errors.map((d) => d.code).sort(), ['E001', 'E032']);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('#268 非函数局部名与规则同名', () => {
|
|
82
|
+
const SCORE = 'Rule score given a as Int, produce Int:\n Return a.\n\n';
|
|
83
|
+
it('★Rule main given score as Int … Return score(1, 2).:报 E001(期望函数),不按同名规则校验', () => {
|
|
84
|
+
const { errors } = check(SCORE + 'Rule main given score as Int, produce Int:\n Return score(1, 2).\n');
|
|
85
|
+
assert.deepEqual(errors.map((d) => d.code), ['E001']);
|
|
86
|
+
assert.deepEqual(errors[0].data, { expected: 'a function', actual: "'score' of type Int" });
|
|
87
|
+
});
|
|
88
|
+
it('没有同名规则时调用非函数局部名同样报 E001', () => {
|
|
89
|
+
const { errors } = check('Rule main given n as Int, produce Int:\n Return n(1).\n');
|
|
90
|
+
assert.deepEqual(errors.map((d) => d.data), [{ expected: 'a function', actual: "'n' of type Int" }]);
|
|
91
|
+
});
|
|
92
|
+
it('★解释器按局部名分派:局部值不可调用时报错,不再静默调用同名规则', () => {
|
|
93
|
+
const { core } = check(SCORE + 'Rule main given score as Int, produce Int:\n Return score(1, 2).\n');
|
|
94
|
+
assert.ok(core, '应产出 Core IR');
|
|
95
|
+
const r = evaluate(core, 'main', { score: 7 });
|
|
96
|
+
assert.equal(r.success, false, `不应求值成功:${JSON.stringify(r)}`);
|
|
97
|
+
assert.match(r.error ?? '', /score/);
|
|
98
|
+
});
|
|
99
|
+
it('函数类型局部名遮蔽同名规则的既有行为不变', () => {
|
|
100
|
+
const { errors, core } = check(INC + 'Rule main given inc as (Int) -> Int, n as Int, produce Int:\n Return inc(n).\n\n' +
|
|
101
|
+
'Rule dec given x as Int, produce Int:\n Return x minus 1.\n\n' +
|
|
102
|
+
'Rule run given n as Int, produce Int:\n Return main(dec, n).\n');
|
|
103
|
+
assert.deepEqual(errors, []);
|
|
104
|
+
const r = evaluate(core, 'run', { n: 5 });
|
|
105
|
+
assert.equal(r.success, true, r.error);
|
|
106
|
+
assert.equal(r.value, 4);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
/** 运行 main 并断言成功:放行的用例须是真能跑通的程序 */
|
|
110
|
+
function runsOk(core, input) {
|
|
111
|
+
assert.ok(core, '应产出 Core IR');
|
|
112
|
+
const r = evaluate(core, 'main', input);
|
|
113
|
+
assert.equal(r.success, true, r.error);
|
|
114
|
+
return r.value;
|
|
115
|
+
}
|
|
116
|
+
describe('#266 审查跟进:能正常运行的调用不新增 E001', () => {
|
|
117
|
+
it('M1 实参为推断失败的返回类型(produce:):inc(mk(n)) 放行', () => {
|
|
118
|
+
const { errors, core } = check(INC + 'Rule mk given x as Int, produce:\n Return x.\n\nRule main given n as Int, produce Int:\n Return inc(mk(n)).\n');
|
|
119
|
+
assert.deepEqual(mismatches(errors), []);
|
|
120
|
+
assert.equal(runsOk(core, { n: 1 }), 2);
|
|
121
|
+
});
|
|
122
|
+
it('M1 函数值的返回类型为推断占位:twice(inc2, n)(inc2 写 produce:)放行', () => {
|
|
123
|
+
const { errors, core } = check('Rule inc2 given x as Int, produce:\n Return x plus 1.\n\n' + TWICE + 'Rule main given n as Int, produce Int:\n Return twice(inc2, n).\n');
|
|
124
|
+
assert.deepEqual(mismatches(errors), []);
|
|
125
|
+
assert.equal(runsOk(core, { n: 1 }), 3);
|
|
126
|
+
});
|
|
127
|
+
it('M1 未写类型且 produce: 推断不出返回类型的规则作函数值:twice(bump, n) 放行', () => {
|
|
128
|
+
// `amount plus 1` 推断不出返回类型,签名 ret 为 TypeVar 'Unknown' 占位,函数值类型为 (Unknown) -> Unknown
|
|
129
|
+
const { errors, core } = check('Rule bump given amount, produce:\n Return amount plus 1.\n\n' + TWICE + 'Rule main given n as Int, produce Int:\n Return twice(bump, n).\n');
|
|
130
|
+
assert.deepEqual(mismatches(errors), []);
|
|
131
|
+
assert.equal(runsOk(core, { n: 1 }), 3);
|
|
132
|
+
});
|
|
133
|
+
it('M1 泛型规则 id of T 作函数值传给 (Int) -> Int 放行', () => {
|
|
134
|
+
const { errors, core } = check('Rule id of T given x as T, produce T:\n Return x.\n\n' + TWICE + 'Rule main given n as Int, produce Int:\n Return twice(id, n).\n');
|
|
135
|
+
assert.deepEqual(mismatches(errors), []);
|
|
136
|
+
assert.equal(runsOk(core, { n: 4 }), 4);
|
|
137
|
+
});
|
|
138
|
+
it('M2 T → T?、None → T?、T? ↔ Option of T、Some(n) → Option of Int 都放行', () => {
|
|
139
|
+
const OPT = 'Rule pick given x as Text?, produce Text:\n Return "k".\n\nRule pickO given x as Option of Text, produce Text:\n Return "o".\n\nRule pickI given x as Option of Int, produce Text:\n Return "i".\n\n';
|
|
140
|
+
for (const call of ['pick(t)', 'pick(None)', 'pickO(m)', 'pick(o)', 'pickI(Some(n))']) {
|
|
141
|
+
const { errors, core } = check(OPT + `Rule main given t as Text, m as Text?, o as Option of Text, n as Int, produce Text:\n Return ${call}.\n`);
|
|
142
|
+
assert.deepEqual(mismatches(errors), [], call);
|
|
143
|
+
runsOk(core, { t: 'a', m: 'b', o: 'c', n: 1 });
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
it('M2 内层类型不符仍报:Text? 形参传 Int', () => {
|
|
147
|
+
const { errors } = check('Rule pick given x as Text?, produce Text:\n Return "k".\n\nRule main given n as Int, produce Text:\n Return pick(n).\n');
|
|
148
|
+
assert.deepEqual(mismatches(errors), [{ expected: 'Text?', actual: 'Int' }]);
|
|
149
|
+
});
|
|
150
|
+
it('M3 实参类型只来自名字推断(given amount)时放行:inc(amount)', () => {
|
|
151
|
+
const { errors, core } = check(INC + 'Rule main given amount, produce Int:\n Return inc(amount).\n');
|
|
152
|
+
assert.deepEqual(mismatches(errors), []);
|
|
153
|
+
assert.equal(runsOk(core, { amount: 1 }), 2);
|
|
154
|
+
});
|
|
155
|
+
it('M3 调用未写类型的形参(given f … f(n))不报「期望函数」', () => {
|
|
156
|
+
const { errors, core } = check(INC + 'Rule ap given f, n as Int, produce Int:\n Return f(n).\n\nRule main given n as Int, produce Int:\n Return ap(inc, n).\n');
|
|
157
|
+
assert.deepEqual(errors, []);
|
|
158
|
+
assert.equal(runsOk(core, { n: 1 }), 2);
|
|
159
|
+
});
|
|
160
|
+
it('数值拓宽统一放行:Int → Long / Float、Long → Float,含字面量与容器元素', () => {
|
|
161
|
+
const DECLS = 'Rule toL given x as Long, produce Int:\n Return 1.\n\nRule toF given x as Float, produce Int:\n Return 1.\n\n' +
|
|
162
|
+
'Rule toLF given xs as List of Float, produce Int:\n Return 1.\n\nRule toOF given x as Option of Float, produce Int:\n Return 1.\n\n';
|
|
163
|
+
for (const call of ['toL(n)', 'toL(5)', 'toF(5)', 'toF(l)', 'toLF(xs)', 'toLF([1, 2])', 'toOF(Some(n))']) {
|
|
164
|
+
const { errors } = check(DECLS + `Rule main given n as Int, l as Long, xs as List of Int, produce Int:\n Return ${call}.\n`);
|
|
165
|
+
assert.deepEqual(mismatches(errors), [], call);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
// Decimal 形参目前被降级为类型变量(#276),任何实参都放行,断言没有意义;#276 修复后去掉 skip
|
|
169
|
+
it('数值拓宽:Int / Long 实参传给 Decimal 形参放行,Double 传 Decimal 报错(ADR 0025)', { skip: '#276 Decimal 形参被降级为类型变量' }, () => {
|
|
170
|
+
const DECLS = 'Rule toD given x as Decimal, produce Int:\n Return 1.\n\n';
|
|
171
|
+
for (const call of ['toD(n)', 'toD(l)', 'toD(5)']) {
|
|
172
|
+
const { errors } = check(DECLS + `Rule main given n as Int, l as Long, produce Int:\n Return ${call}.\n`);
|
|
173
|
+
assert.deepEqual(mismatches(errors), [], call);
|
|
174
|
+
}
|
|
175
|
+
const { errors } = check(DECLS + 'Rule main given x as Float, produce Int:\n Return toD(x).\n');
|
|
176
|
+
assert.equal(mismatches(errors).length, 1);
|
|
177
|
+
});
|
|
178
|
+
it('收窄仍报:Float 实参传给 Int 形参', () => {
|
|
179
|
+
const { errors } = check(INC + 'Rule main given x as Float, produce Int:\n Return inc(x).\n');
|
|
180
|
+
assert.deepEqual(mismatches(errors), [{ expected: 'Int', actual: 'Double' }]);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe('core#231 审查跟进:TS 不比 Java 严', () => {
|
|
184
|
+
const codes = (errors) => errors.map((d) => d.code);
|
|
185
|
+
it('F2 字段构造(E012)复用实参兼容规则:T? ← T、T? ← None、Long ← Int、List of Float ← List of Int 放行', () => {
|
|
186
|
+
const DATA = 'Define Box has t as Text?, l as Long, fs as List of Float.\n\n';
|
|
187
|
+
for (const [t, l, fs] of [['s', 'n', 'xs'], ['None', '5', '[1, 2]']]) {
|
|
188
|
+
const { errors, core } = check(DATA + `Rule main given s as Text, n as Int, xs as List of Int, produce Int:\n Let b be Box with t set to ${t}, l set to ${l}, fs set to ${fs}.\n Return 1.\n`);
|
|
189
|
+
assert.deepEqual(codes(errors), [], `${t} ${l} ${fs}`);
|
|
190
|
+
runsOk(core, { s: 'a', n: 1, xs: [1] });
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
it('F2 字段构造:推断不出返回类型的实参(produce:)放行,不再报 expects Float, got Unknown', () => {
|
|
194
|
+
const { errors } = check('Define Q has cost as Float.\n\nRule est given x as Int, produce:\n Return x plus 1.\n\n' +
|
|
195
|
+
'Rule main given n as Int, produce Int:\n Let q be Q with cost set to est(n).\n Return 1.\n');
|
|
196
|
+
assert.deepEqual(codes(errors), []);
|
|
197
|
+
});
|
|
198
|
+
it('F2 字段构造的收窄仍报 E012:Int 字段 ← Float', () => {
|
|
199
|
+
const { errors } = check('Define Box has i as Int.\n\nRule main given x as Float, produce Int:\n Let b be Box with i set to x.\n Return 1.\n');
|
|
200
|
+
assert.deepEqual(codes(errors), ['E012']);
|
|
201
|
+
});
|
|
202
|
+
it('F2 Set(E002)复用实参兼容规则:Float 变量 ← Int、Text? 变量 ← Text 放行', () => {
|
|
203
|
+
const { errors, core } = check('Rule main given n as Int, f as Float, m as Text?, t as Text, produce Int:\n Let x be f.\n Set x to n.\n Let y be m.\n Set y to t.\n Return 1.\n');
|
|
204
|
+
assert.deepEqual(codes(errors), []);
|
|
205
|
+
runsOk(core, { n: 1, f: 1.5, m: 'a', t: 'b' });
|
|
206
|
+
});
|
|
207
|
+
it('F2 Set 的收窄仍报 E002:Int 变量 ← Float', () => {
|
|
208
|
+
const { errors } = check('Rule main given n as Int, f as Float, produce Int:\n Let x be n.\n Set x to f.\n Return 1.\n');
|
|
209
|
+
assert.deepEqual(codes(errors), ['E002']);
|
|
210
|
+
});
|
|
211
|
+
it('按名字推断的标记随 Let 传播:given amount 后 Let y be amount. inc(y) 放行', () => {
|
|
212
|
+
const { errors, core } = check(INC + 'Rule main given amount, produce Int:\n Let y be amount.\n Return inc(y).\n');
|
|
213
|
+
assert.deepEqual(codes(errors), []);
|
|
214
|
+
assert.equal(runsOk(core, { amount: 1 }), 2);
|
|
215
|
+
});
|
|
216
|
+
it('F1 局部名与单段 builtin 同名、调用的正是 builtin:不报「期望函数」,解释器先调 builtin(与 truffle 一致)', () => {
|
|
217
|
+
const cases = [
|
|
218
|
+
['Rule main given add as Int, produce Int:\n Return add(1, 2).\n', { add: 7 }, 3],
|
|
219
|
+
['Rule main given n as Int, produce Int:\n Let sub be 3.\n Return sub(5, n).\n', { n: 2 }, 3],
|
|
220
|
+
['Rule main given gt as Int, produce Bool:\n Return gt(2, 1).\n', { gt: 0 }, true],
|
|
221
|
+
];
|
|
222
|
+
for (const [body, input, expected] of cases) {
|
|
223
|
+
const { errors, core } = check(body);
|
|
224
|
+
assert.deepEqual(codes(errors), [], body);
|
|
225
|
+
assert.equal(runsOk(core, input), expected, body);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
it('F1 builtin 名一律不做调用目标检查(与 core CallTargetBuiltins 一致);有同名规则时运行期按局部值分派,与 truffle 一致失败', () => {
|
|
229
|
+
const { errors, core } = check('Rule add given a as Int, b as Int, produce Int:\n Return a.\n\nRule main given add as Int, produce Int:\n Return add(1, 2).\n');
|
|
230
|
+
assert.deepEqual(codes(errors), []);
|
|
231
|
+
const r = evaluate(core, 'main', { add: 7 });
|
|
232
|
+
assert.equal(r.success, false);
|
|
233
|
+
assert.match(r.error ?? '', /'add' is not a function/);
|
|
234
|
+
});
|
|
235
|
+
it('R1 局部函数值优先于同名 builtin:函数类型形参 gt、闭包 add、单参闭包 add 都调用局部值', () => {
|
|
236
|
+
const cases = [
|
|
237
|
+
[
|
|
238
|
+
'Rule lessThan given a as Int, b as Int, produce Bool:\n Return a less than b.\n\n' +
|
|
239
|
+
'Rule ap given gt as (Int, Int) -> Bool, produce Bool:\n Return gt(1, 2).\n\n' +
|
|
240
|
+
'Rule main given n as Int, produce Bool:\n Return ap(lessThan).\n',
|
|
241
|
+
{ n: 0 },
|
|
242
|
+
true,
|
|
243
|
+
],
|
|
244
|
+
['Rule main given n as Int, produce Int:\n Let add be function with a as Int, b as Int, produce Int:\n Return a times b.\n Return add(2, 3).\n', { n: 0 }, 6],
|
|
245
|
+
['Rule main given n as Int, produce Int:\n Let add be function with a as Int, produce Int:\n Return a.\n Return add(n).\n', { n: 1 }, 1],
|
|
246
|
+
];
|
|
247
|
+
for (const [body, input, expected] of cases) {
|
|
248
|
+
const { errors, core } = check(body);
|
|
249
|
+
assert.deepEqual(codes(errors), [], body);
|
|
250
|
+
assert.equal(runsOk(core, input), expected, body);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
it('R1 与 builtin 同名的局部函数值按局部函数类型检查:add 闭包为 (Int) -> Int 时 add(1, 2) 报 E032', () => {
|
|
254
|
+
const { errors } = check('Rule main given n as Int, produce Int:\n Let add be function with a as Int, produce Int:\n Return a.\n Return add(1, 2).\n');
|
|
255
|
+
assert.deepEqual(codes(errors), ['E032']);
|
|
256
|
+
});
|
|
257
|
+
it('F1 交叉核对:单段 builtin 名单与 aster-lang-core CallTargetBuiltins.NAMES 一致(找不到 core 即失败)', () => {
|
|
258
|
+
// CI 的 test job 把 core 检出到工作区内 ./aster-lang-core;本地可用 ASTER_CORE_DIR 指定,或放在兄弟目录 ../aster-lang-core
|
|
259
|
+
const RELATIVE = 'src/main/java/aster/core/typecheck/CallTargetBuiltins.java';
|
|
260
|
+
const roots = [process.env['ASTER_CORE_DIR'], resolve(process.cwd(), 'aster-lang-core'), resolve(process.cwd(), '..', 'aster-lang-core')];
|
|
261
|
+
const file = roots.filter((r) => !!r).map((r) => join(r, RELATIVE)).find((f) => existsSync(f));
|
|
262
|
+
assert.ok(file, `找不到 aster-lang-core 的 ${RELATIVE}(CI 检出 ./aster-lang-core;本地用 ASTER_CORE_DIR 指定)`);
|
|
263
|
+
const block = /Set\.of\(([^)]*)\)/.exec(readFileSync(file, 'utf8'));
|
|
264
|
+
assert.ok(block, 'CallTargetBuiltins.NAMES 的 Set.of(...) 未找到');
|
|
265
|
+
const names = [...block[1].matchAll(/"([^"]+)"/g)].map((m) => m[1]);
|
|
266
|
+
assert.deepEqual([...new Set(names)].sort(), Object.keys(NAMED_BUILTIN_OPS).sort());
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
//# sourceMappingURL=rule-call-checks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-call-checks.test.js","sourceRoot":"","sources":["../../../test/unit/rule-call-checks.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-function-values.test.d.ts","sourceRoot":"","sources":["../../../test/unit/rule-function-values.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 规则引用作为函数值(#256):`twice(inc, n)` 把模块规则 inc 当作函数值传给高阶规则。
|
|
3
|
+
*
|
|
4
|
+
* 语言语义早已允许(ADR 0024:具名规则可作 List.map 的 fn 参数;ADR 0051 §4 名称位置表把
|
|
5
|
+
* 「函数值引用」列为 FUNC_REF),Java 引擎也已支持:
|
|
6
|
+
* - typecheck:TypeChecker.defineFunctionSignature 把全部函数签名以 FuncType 登记进模块作用域,
|
|
7
|
+
* 值位置的 Name 照常查到;
|
|
8
|
+
* - 运行期:truffle Loader 把每个函数以 LambdaValue 放进 env,Name 回退到 env 即得到可调用值。
|
|
9
|
+
* TS 只在 List.* 等 stdlib 回调里特判了函数名,typecheck 报 E101、解释器报 Undefined variable。
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it } from 'node:test';
|
|
12
|
+
import assert from 'node:assert/strict';
|
|
13
|
+
import { compileAndTypecheck, evaluate, EN_US } from '../../src/browser.js';
|
|
14
|
+
import { typecheckBrowser } from '../../src/typecheck/browser.js';
|
|
15
|
+
const INC = 'Rule inc given x as Int, produce Int:\n Return x plus 1.\n\n';
|
|
16
|
+
const TWICE = 'Rule twice given f as (Int) -> Int, n as Int, produce Int:\n Return f(f(n)).\n\n';
|
|
17
|
+
function compileClean(body) {
|
|
18
|
+
const r = compileAndTypecheck(`Module demo.\n\n${body}`, { lexicon: EN_US });
|
|
19
|
+
const errors = [...(r.parseErrors ?? []), ...(r.resolutionDiagnostics ?? []), ...(r.typeErrors ?? [])]
|
|
20
|
+
.filter((d) => d.severity === 'error');
|
|
21
|
+
assert.deepEqual(errors, []);
|
|
22
|
+
assert.equal(r.success, true);
|
|
23
|
+
return r.core;
|
|
24
|
+
}
|
|
25
|
+
function run(core, func, input) {
|
|
26
|
+
const r = evaluate(core, func, input);
|
|
27
|
+
assert.equal(r.success, true, r.error);
|
|
28
|
+
return r.value;
|
|
29
|
+
}
|
|
30
|
+
describe('规则引用作为函数值', () => {
|
|
31
|
+
it('★twice(inc, n):无 E101,求值得 n + 2', () => {
|
|
32
|
+
const core = compileClean(INC + TWICE + 'Rule main given n as Int, produce Int:\n Return twice(inc, n).\n');
|
|
33
|
+
assert.equal(run(core, 'main', { n: 1 }), 3);
|
|
34
|
+
});
|
|
35
|
+
it('规则声明在使用之后(前向引用)同样可用', () => {
|
|
36
|
+
const core = compileClean(TWICE + 'Rule main given n as Int, produce Int:\n Return twice(inc, n).\n\n' + INC);
|
|
37
|
+
assert.equal(run(core, 'main', { n: 5 }), 7);
|
|
38
|
+
});
|
|
39
|
+
it('Let g be inc:绑定后按局部名调用', () => {
|
|
40
|
+
const core = compileClean(INC + 'Rule main given n as Int, produce Int:\n Let g be inc.\n Return g(n).\n');
|
|
41
|
+
assert.equal(run(core, 'main', { n: 41 }), 42);
|
|
42
|
+
});
|
|
43
|
+
it('函数值的静态类型为规则签名的 FuncType:经局部名调用的结果类型为返回类型(返回类型不符照常报错)', () => {
|
|
44
|
+
const r = compileAndTypecheck(`Module demo.\n\n${INC}Rule main given n as Int, produce Text:\n Let g be inc.\n Return g(n).\n`, { lexicon: EN_US });
|
|
45
|
+
const codes = (r.typeErrors ?? []).filter((d) => d.severity === 'error').map((d) => d.code);
|
|
46
|
+
assert.ok(codes.length > 0, '返回 Int 却声明 Text,应报类型错误');
|
|
47
|
+
assert.ok(!codes.includes('E101'), `不应报 E101:${codes}`);
|
|
48
|
+
});
|
|
49
|
+
it('局部名遮蔽同名规则:参数 inc 优先于模块规则 inc', () => {
|
|
50
|
+
const core = compileClean(INC + TWICE +
|
|
51
|
+
'Rule dec given x as Int, produce Int:\n Return x minus 1.\n\n' +
|
|
52
|
+
'Rule viaParam given inc as (Int) -> Int, n as Int, produce Int:\n Return twice(inc, n).\n\n' +
|
|
53
|
+
'Rule main given n as Int, produce Int:\n Return viaParam(dec, n).\n');
|
|
54
|
+
assert.equal(run(core, 'main', { n: 10 }), 8);
|
|
55
|
+
});
|
|
56
|
+
it('局部函数值遮蔽同名规则时,调用个数按局部值而非规则签名校验', () => {
|
|
57
|
+
compileClean('Rule pair given a as Int, b as Int, produce Int:\n Return a plus b.\n\n' +
|
|
58
|
+
'Rule main given pair as (Int) -> Int, n as Int, produce Int:\n Return pair(n).\n');
|
|
59
|
+
});
|
|
60
|
+
it('★经函数值局部名调用时校验参数个数:`Let g be inc. Return g(n, n).` 报 E032(Java 报 TYPE_MISMATCH 拒绝)', () => {
|
|
61
|
+
const r = compileAndTypecheck(`Module demo.\n\n${INC}Rule main given n as Int, produce Int:\n Let g be inc.\n Return g(n, n).\n`, { lexicon: EN_US });
|
|
62
|
+
const arity = (r.typeErrors ?? []).filter((d) => d.code === 'E032');
|
|
63
|
+
assert.equal(arity.length, 1, JSON.stringify(r.typeErrors));
|
|
64
|
+
assert.deepEqual(arity[0].data, { func: 'g', expected: 1, actual: 2 });
|
|
65
|
+
});
|
|
66
|
+
it('函数类型参数调用个数不符同样报 E032', () => {
|
|
67
|
+
const r = compileAndTypecheck(`Module demo.\n\nRule apply given f as (Int) -> Int, n as Int, produce Int:\n Return f().\n`, { lexicon: EN_US });
|
|
68
|
+
assert.deepEqual((r.typeErrors ?? []).filter((d) => d.code === 'E032').map((d) => d.data), [{ func: 'f', expected: 1, actual: 0 }]);
|
|
69
|
+
});
|
|
70
|
+
it('未声明的名字仍被拒绝(名称解析报 E802,不产出 IR)', () => {
|
|
71
|
+
const r = compileAndTypecheck(`Module demo.\n\n${TWICE}Rule main given n as Int, produce Int:\n Return twice(nope, n).\n`, { lexicon: EN_US });
|
|
72
|
+
assert.equal(r.success, false);
|
|
73
|
+
assert.deepEqual((r.resolutionDiagnostics ?? []).map((d) => d.code), ['E802']);
|
|
74
|
+
});
|
|
75
|
+
it('typecheck 层:Core 中未定义的值名仍报 E101(函数签名回退不吞掉未定义名)', () => {
|
|
76
|
+
const core = compileClean(INC + 'Rule main given n as Int, produce Int:\n Return inc(n).\n');
|
|
77
|
+
const main = core.decls.find((d) => d.kind === 'Func' && d.name === 'main');
|
|
78
|
+
const ret = main.body.statements[0];
|
|
79
|
+
const call = ret.expr;
|
|
80
|
+
const broken = { ...core, decls: core.decls.map((d) => (d === main ? { ...main, body: { ...main.body, statements: [{ ...ret, expr: { ...call, args: [{ ...call.args[0], name: 'nope' }] } }] } } : d)) };
|
|
81
|
+
const diags = typecheckBrowser(broken);
|
|
82
|
+
assert.ok(diags.some((d) => d.code === 'E101' && d.message.includes('nope')), JSON.stringify(diags));
|
|
83
|
+
});
|
|
84
|
+
it('List.map(xs, inc) 的既有行为不变', () => {
|
|
85
|
+
const core = compileClean(INC + 'Rule main given xs as List of Int, produce List of Int:\n Return List.map(xs, inc).\n');
|
|
86
|
+
assert.deepEqual(run(core, 'main', { xs: [1, 2] }), [2, 3]);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=rule-function-values.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-function-values.test.js","sourceRoot":"","sources":["../../../test/unit/rule-function-values.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assign-mutability.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/typecheck/assign-mutability.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Set 的可赋值目标(ADR 0052,aster-cloud/aster-lang-truffle#151)。
|
|
3
|
+
*
|
|
4
|
+
* 只有 Let 绑定可被 `Set` 赋值,且可跨 case 体 / If 分支写回外层;形参、lambda 形参、模式绑定不可变,
|
|
5
|
+
* 与 Java BaseTypeChecker 同报 E001(TYPE_MISMATCH)。
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it } from 'node:test';
|
|
8
|
+
import assert from 'node:assert/strict';
|
|
9
|
+
import { compileAndTypecheck } from '../../../src/browser.js';
|
|
10
|
+
function errors(lines) {
|
|
11
|
+
const result = compileAndTypecheck(['Module m.', '', ...lines, ''].join('\n'));
|
|
12
|
+
assert.deepEqual(result.parseErrors ?? [], [], JSON.stringify(result.parseErrors));
|
|
13
|
+
return result.typeErrors
|
|
14
|
+
.filter((d) => d.severity === 'error')
|
|
15
|
+
.map((d) => ({ code: d.code, line: d.span?.start.line ?? -1, message: d.message }));
|
|
16
|
+
}
|
|
17
|
+
describe('Set 赋值目标的可变性', () => {
|
|
18
|
+
it('case 体内 Set 外层 Let:无错误', () => {
|
|
19
|
+
assert.deepEqual(errors([
|
|
20
|
+
'Rule r given n as Int, produce Int:',
|
|
21
|
+
' Let total be 0.',
|
|
22
|
+
' Match n:',
|
|
23
|
+
' When 1,',
|
|
24
|
+
' Set total to 10.',
|
|
25
|
+
' When other,',
|
|
26
|
+
' Set total to total plus other.',
|
|
27
|
+
' Return total.',
|
|
28
|
+
]), []);
|
|
29
|
+
});
|
|
30
|
+
it('If / Otherwise 分支内 Set 外层 Let:无错误', () => {
|
|
31
|
+
assert.deepEqual(errors([
|
|
32
|
+
'Rule r given n as Int, produce Int:',
|
|
33
|
+
' Let sign be 0.',
|
|
34
|
+
' If n greater than 0',
|
|
35
|
+
' Set sign to 1.',
|
|
36
|
+
' Otherwise',
|
|
37
|
+
' Set sign to 2.',
|
|
38
|
+
' Return sign.',
|
|
39
|
+
]), []);
|
|
40
|
+
});
|
|
41
|
+
it('Set 形参:报 E001 且指明是形参', () => {
|
|
42
|
+
const errs = errors([
|
|
43
|
+
'Rule r given n as Int, produce Int:',
|
|
44
|
+
' Set n to 1.',
|
|
45
|
+
' Return n.',
|
|
46
|
+
]);
|
|
47
|
+
assert.deepEqual(errs.map((e) => [e.code, e.line]), [["E001" /* ErrorCode.TYPE_MISMATCH */, 4]]);
|
|
48
|
+
assert.match(errs[0].message, /parameter 'n'/);
|
|
49
|
+
});
|
|
50
|
+
it('case 体内 Set 形参:同样拒绝', () => {
|
|
51
|
+
const errs = errors([
|
|
52
|
+
'Rule r given n as Int, produce Int:',
|
|
53
|
+
' Match n:',
|
|
54
|
+
' When 1,',
|
|
55
|
+
' Set n to 2.',
|
|
56
|
+
' Return n.',
|
|
57
|
+
]);
|
|
58
|
+
assert.deepEqual(errs.map((e) => [e.code, e.line]), [["E001" /* ErrorCode.TYPE_MISMATCH */, 6]]);
|
|
59
|
+
});
|
|
60
|
+
it('Set 模式绑定:报 E001 且指明是模式绑定', () => {
|
|
61
|
+
const errs = errors([
|
|
62
|
+
'Rule r given n as Int, produce Int:',
|
|
63
|
+
' Let total be 0.',
|
|
64
|
+
' Match n:',
|
|
65
|
+
' When other,',
|
|
66
|
+
' Set other to 1.',
|
|
67
|
+
' Set total to other.',
|
|
68
|
+
' Return total.',
|
|
69
|
+
]);
|
|
70
|
+
assert.deepEqual(errs.map((e) => [e.code, e.line]), [["E001" /* ErrorCode.TYPE_MISMATCH */, 7]]);
|
|
71
|
+
assert.match(errs[0].message, /pattern binding 'other'/);
|
|
72
|
+
});
|
|
73
|
+
it('lambda 体内 Set lambda 形参:同样拒绝', () => {
|
|
74
|
+
const errs = errors([
|
|
75
|
+
'Rule r given n as Int, produce Int:',
|
|
76
|
+
' Let f be function with k as Int, produce Int:',
|
|
77
|
+
' Set k to 1.',
|
|
78
|
+
' Return k.',
|
|
79
|
+
' Return f(n).',
|
|
80
|
+
]);
|
|
81
|
+
assert.deepEqual(errs.map((e) => [e.code, e.line]), [["E001" /* ErrorCode.TYPE_MISMATCH */, 5]]);
|
|
82
|
+
assert.match(errs[0].message, /parameter 'k'/);
|
|
83
|
+
});
|
|
84
|
+
it('lambda 体内 Set 捕获的外层 Let:报 E001(按值捕获,语义未定义,一律拒绝)', () => {
|
|
85
|
+
const errs = errors([
|
|
86
|
+
'Rule r given n as Int, produce Int:',
|
|
87
|
+
' Let acc be 0.',
|
|
88
|
+
' Let f be function with k as Int, produce Int:',
|
|
89
|
+
' Set acc to acc plus k.',
|
|
90
|
+
' Return acc.',
|
|
91
|
+
' Return f(n).',
|
|
92
|
+
]);
|
|
93
|
+
assert.deepEqual(errs.map((e) => [e.code, e.line]), [["E001" /* ErrorCode.TYPE_MISMATCH */, 6]]);
|
|
94
|
+
assert.match(errs[0].message, /captured variable 'acc'/);
|
|
95
|
+
});
|
|
96
|
+
it('lambda 体内 Set 自己的 Let:无错误', () => {
|
|
97
|
+
assert.deepEqual(errors([
|
|
98
|
+
'Rule r given n as Int, produce Int:',
|
|
99
|
+
' Let f be function with k as Int, produce Int:',
|
|
100
|
+
' Let local be k.',
|
|
101
|
+
' Set local to local plus 1.',
|
|
102
|
+
' Return local.',
|
|
103
|
+
' Return f(n).',
|
|
104
|
+
]), []);
|
|
105
|
+
});
|
|
106
|
+
it('Set 函数名:报 E101(与 Java 一致)', () => {
|
|
107
|
+
const errs = errors([
|
|
108
|
+
'Rule g given n as Int, produce Int:',
|
|
109
|
+
' Return n.',
|
|
110
|
+
'',
|
|
111
|
+
'Rule r given n as Int, produce Int:',
|
|
112
|
+
' Set g to 1.',
|
|
113
|
+
' Return n.',
|
|
114
|
+
]);
|
|
115
|
+
assert.deepEqual(errs.map((e) => [e.code, e.line]), [["E101" /* ErrorCode.UNDEFINED_VARIABLE */, 7]]);
|
|
116
|
+
});
|
|
117
|
+
it('小写 set 同样是 Set 语句', () => {
|
|
118
|
+
assert.deepEqual(errors([
|
|
119
|
+
'Rule r given n as Int, produce Int:',
|
|
120
|
+
' Let total be 0.',
|
|
121
|
+
' set total to n.',
|
|
122
|
+
' Return total.',
|
|
123
|
+
]), []);
|
|
124
|
+
});
|
|
125
|
+
// 有意的破坏性变更(ADR 0052 §6):Set 只能赋值给已有的 Let 绑定,首次声明用 Set 报 E101。
|
|
126
|
+
it('Set 未定义的名字:报 E101', () => {
|
|
127
|
+
const errs = errors([
|
|
128
|
+
'Rule r given n as Int, produce Int:',
|
|
129
|
+
' Set missing to 1.',
|
|
130
|
+
' Return n.',
|
|
131
|
+
]);
|
|
132
|
+
assert.deepEqual(errs.map((e) => [e.code, e.line]), [["E101" /* ErrorCode.UNDEFINED_VARIABLE */, 4]]);
|
|
133
|
+
});
|
|
134
|
+
it('Set 外层 Let 类型不符:报 E002', () => {
|
|
135
|
+
const errs = errors([
|
|
136
|
+
'Rule r given n as Int, produce Int:',
|
|
137
|
+
' Let total be 0.',
|
|
138
|
+
' Set total to "x".',
|
|
139
|
+
' Return total.',
|
|
140
|
+
]);
|
|
141
|
+
assert.ok(errs.some((e) => e.code === "E002" /* ErrorCode.TYPE_MISMATCH_ASSIGN */), JSON.stringify(errs));
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=assign-mutability.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assign-mutability.test.js","sourceRoot":"","sources":["../../../../test/unit/typecheck/assign-mutability.test.ts"],"names":[],"mappings":"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"}
|