@ascent-lang/dev 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/errors/elaborate.d.ts +24 -0
- package/dist/errors/elaborate.d.ts.map +1 -0
- package/dist/errors/elaborate.js +53 -0
- package/dist/errors/elaborate.js.map +1 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +356 -30
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/render.d.ts +3 -0
- package/dist/errors/render.d.ts.map +1 -0
- package/dist/errors/render.js +43 -0
- package/dist/errors/render.js.map +1 -0
- package/dist/errors/types.d.ts +29 -0
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/index.js +18 -11
- package/dist/index.js.map +1 -1
- package/dist/interpreter.d.ts.map +1 -1
- package/dist/interpreter.js +28 -5
- package/dist/interpreter.js.map +1 -1
- package/dist/lexer/index.d.ts.map +1 -1
- package/dist/lexer/index.js +4 -3
- package/dist/lexer/index.js.map +1 -1
- package/dist/lexer/keywords.d.ts.map +1 -1
- package/dist/lexer/keywords.js +3 -0
- package/dist/lexer/keywords.js.map +1 -1
- package/dist/lexer/token.d.ts +7 -1
- package/dist/lexer/token.d.ts.map +1 -1
- package/dist/parser/ast.d.ts +8 -4
- package/dist/parser/ast.d.ts.map +1 -1
- package/dist/parser/expr.d.ts.map +1 -1
- package/dist/parser/expr.js +34 -19
- package/dist/parser/expr.js.map +1 -1
- package/dist/parser/stmt.d.ts.map +1 -1
- package/dist/parser/stmt.js +5 -3
- package/dist/parser/stmt.js.map +1 -1
- package/dist/parser/token-stream.d.ts +4 -4
- package/dist/parser/token-stream.d.ts.map +1 -1
- package/dist/parser/token-stream.js +21 -9
- package/dist/parser/token-stream.js.map +1 -1
- package/dist/parser/type-expr.d.ts.map +1 -1
- package/dist/parser/type-expr.js +3 -2
- package/dist/parser/type-expr.js.map +1 -1
- package/dist/parser/typechecker.d.ts.map +1 -1
- package/dist/parser/typechecker.js +109 -67
- package/dist/parser/typechecker.js.map +1 -1
- package/dist/types/types.d.ts +4 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +27 -15
- package/dist/types/types.js.map +1 -1
- package/package.json +1 -1
- package/src/errors/elaborate.ts +88 -0
- package/src/errors/index.ts +356 -30
- package/src/errors/lexical.yml +48 -13
- package/src/errors/name.yml +45 -9
- package/src/errors/render.ts +59 -0
- package/src/errors/syntactic.yml +128 -49
- package/src/errors/typechecker.yml +147 -61
- package/src/errors/types.ts +55 -0
- package/src/index.ts +17 -11
- package/src/interpreter.ts +24 -6
- package/src/lexer/index.ts +4 -3
- package/src/lexer/keywords.ts +3 -0
- package/src/lexer/token.ts +18 -0
- package/src/parser/ast.ts +7 -6
- package/src/parser/expr.ts +34 -19
- package/src/parser/stmt.ts +5 -3
- package/src/parser/token-stream.ts +20 -8
- package/src/parser/type-expr.ts +3 -2
- package/src/parser/typechecker.ts +140 -52
- package/src/types/types.ts +36 -16
package/dist/parser/expr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expr.js","sourceRoot":"","sources":["../../src/parser/expr.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD,0EAA0E;AAC1E,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AACrE,oEAAoE;AACpE,qEAAqE;AACrE,4BAA4B;AAC5B,EAAE;AACF,sEAAsE;AACtE,gEAAgE;AAChE,iEAAiE;AACjE,sEAAsE;AACtE,mEAAmE;AACnE,gEAAgE;AAChE,gDAAgD;AAChD,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,8DAA8D;AAC9D,qEAAqE;AACrE,+BAA+B;AAC/B,MAAM,EAAE,GAAG;IACT,UAAU,EAAE,CAAC;IACb,QAAQ,EAAE,CAAC;IACX,cAAc,EAAE,CAAC;IACjB,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;CACF,CAAC;AAEX,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,+DAA+D;AAC/D,oEAAoE;AACpE,4DAA4D;AAC5D,wEAAwE;AACxE,MAAM,SAAS,GAAqF;IAClG,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACrD,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACvD,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACjD,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACrD,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACjD,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACrD,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACjD,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IAClD,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;IACvD,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;IACxD,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;IAC3D,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;CAC5D,CAAC;AAEF,qEAAqE;AACrE,kEAAkE;AAClE,kEAAkE;AAClE,sEAAsE;AACtE,qEAAqE;AACrE,oDAAoD;AACpD,MAAM,WAAW,GAA+C;IAC9D,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE;IACvB,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE;CAC7B,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"expr.js","sourceRoot":"","sources":["../../src/parser/expr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stmt.d.ts","sourceRoot":"","sources":["../../src/parser/stmt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAQ,SAAS,EAAE,KAAK,EAAE,EAAE,EAAY,MAAM,UAAU,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYrD,wBAAgB,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAMzE;
|
|
1
|
+
{"version":3,"file":"stmt.d.ts","sourceRoot":"","sources":["../../src/parser/stmt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAQ,SAAS,EAAE,KAAK,EAAE,EAAE,EAAY,MAAM,UAAU,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYrD,wBAAgB,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAMzE;AA+BD,wBAAgB,OAAO,CAAC,EAAE,EAAE,WAAW,GAAG,EAAE,GAAG,IAAI,CA6BlD;AA8ED,wBAAgB,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAmB3D"}
|
package/dist/parser/stmt.js
CHANGED
|
@@ -10,7 +10,7 @@ import { parseTypeExpr } from './type-expr.js';
|
|
|
10
10
|
// this consumes its own.
|
|
11
11
|
export function parseBlock(ts, openTok) {
|
|
12
12
|
openTok ??= ts.advance(); // consume '{' unless already consumed
|
|
13
|
-
const parsed = ts.parseSeparated(() => parseStmt(ts), 'SEMICOLON', 'RBRACE', 'S0005', true);
|
|
13
|
+
const parsed = ts.parseSeparated(() => parseStmt(ts), 'SEMICOLON', 'RBRACE', 'S0005', true, openTok.span);
|
|
14
14
|
if (parsed === null)
|
|
15
15
|
return null;
|
|
16
16
|
return { kind: 'block', stmts: parsed.items, span: { start: openTok.span.start, end: parsed.close.span.end } };
|
|
@@ -19,13 +19,14 @@ export function parseBlock(ts, openTok) {
|
|
|
19
19
|
// The body braces already delimit the construct, but the test stays
|
|
20
20
|
// parenthesized to match the C-family/TS surface (§5).
|
|
21
21
|
function parseCond(ts) {
|
|
22
|
-
|
|
22
|
+
const open = ts.expect('LPAREN', 'S0006');
|
|
23
|
+
if (open === null)
|
|
23
24
|
return null;
|
|
24
25
|
const cond = parseExpr(ts);
|
|
25
26
|
if (cond === null) {
|
|
26
27
|
return null;
|
|
27
28
|
}
|
|
28
|
-
if (ts.expect('RPAREN', 'S0001') === null)
|
|
29
|
+
if (ts.expect('RPAREN', 'S0001', [{ key: 'opener', span: open.span }]) === null)
|
|
29
30
|
return null;
|
|
30
31
|
return cond;
|
|
31
32
|
}
|
|
@@ -127,6 +128,7 @@ function parseAssign(ts) {
|
|
|
127
128
|
return {
|
|
128
129
|
kind: 'assign',
|
|
129
130
|
name: nameTok.value,
|
|
131
|
+
nameSpan: nameTok.span,
|
|
130
132
|
value,
|
|
131
133
|
span: { start: nameTok.span.start, end: value.span.end },
|
|
132
134
|
};
|
package/dist/parser/stmt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stmt.js","sourceRoot":"","sources":["../../src/parser/stmt.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,kEAAkE;AAClE,iEAAiE;AACjE,kEAAkE;AAClE,kEAAkE;AAClE,kEAAkE;AAClE,sEAAsE;AACtE,mEAAmE;AACnE,yBAAyB;AACzB,MAAM,UAAU,UAAU,CAAC,EAAe,EAAE,OAAe;IACzD,OAAO,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,sCAAsC;IAChE,MAAM,MAAM,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"stmt.js","sourceRoot":"","sources":["../../src/parser/stmt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Token, TokenKind, Marker, Span } from '../lexer/token.js';
|
|
1
|
+
import type { Token, TokenKind, Marker, RelatedMarker, Span } from '../lexer/token.js';
|
|
2
2
|
export declare class TokenStream {
|
|
3
3
|
private readonly tokens;
|
|
4
4
|
private pos;
|
|
@@ -7,11 +7,11 @@ export declare class TokenStream {
|
|
|
7
7
|
peek(): Token;
|
|
8
8
|
advance(): Token;
|
|
9
9
|
peekNext(): Token;
|
|
10
|
-
report(code: string, span: Span): void;
|
|
11
|
-
expect(kind: TokenKind, code: string): Token | null;
|
|
10
|
+
report(code: string, span: Span, related?: RelatedMarker[]): void;
|
|
11
|
+
expect(kind: TokenKind, code: string, related?: RelatedMarker[]): Token | null;
|
|
12
12
|
private static readonly STMT_START_KINDS;
|
|
13
13
|
private synchronize;
|
|
14
|
-
parseSeparated<T>(parseItem: () => T | null, sep: TokenKind, close: TokenKind, closeCode: string, recover?: boolean): {
|
|
14
|
+
parseSeparated<T>(parseItem: () => T | null, sep: TokenKind, close: TokenKind, closeCode: string, recover?: boolean, openSpan?: Span | null): {
|
|
15
15
|
items: T[];
|
|
16
16
|
close: Token;
|
|
17
17
|
} | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-stream.d.ts","sourceRoot":"","sources":["../../src/parser/token-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"token-stream.d.ts","sourceRoot":"","sources":["../../src/parser/token-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AASvF,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,GAAG,CAAa;IAIxB,SAAgB,MAAM,EAAE,MAAM,EAAE,CAAM;gBAEnB,MAAM,EAAE,KAAK,EAAE;IAM3B,IAAI,IAAI,KAAK;IAIb,OAAO,IAAI,KAAK;IAOhB,QAAQ,IAAI,KAAK;IAOjB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI;IAUjE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,GAAG,KAAK,GAAG,IAAI;IAarF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAqE;IAQ7G,OAAO,CAAC,WAAW;IAuBZ,cAAc,CAAC,CAAC,EACrB,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,EACzB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,UAAQ,EACf,QAAQ,GAAE,IAAI,GAAG,IAAW,GAC3B;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,IAAI;CA8BvC"}
|
|
@@ -31,16 +31,20 @@ export class TokenStream {
|
|
|
31
31
|
// Record a diagnostic at a given span. The one place productions push
|
|
32
32
|
// to the error log when they need to report something expect() can't
|
|
33
33
|
// express (e.g. "this token was fine but the *next* thing is wrong").
|
|
34
|
-
report(code, span) {
|
|
35
|
-
|
|
34
|
+
report(code, span, related) {
|
|
35
|
+
const marker = { code, span };
|
|
36
|
+
if (related !== undefined && related.length > 0)
|
|
37
|
+
marker.related = related;
|
|
38
|
+
this.errors.push(marker);
|
|
36
39
|
}
|
|
37
40
|
// Consume-or-diagnose: the shape every "expect this exact token here"
|
|
38
41
|
// check in the grammar shares. Returns the consumed token, or records
|
|
39
|
-
// `code` at the offending token's span and returns null.
|
|
40
|
-
|
|
42
|
+
// `code` at the offending token's span and returns null. `related` carries
|
|
43
|
+
// any supporting spans (e.g. the '(' this missing ')' should have closed).
|
|
44
|
+
expect(kind, code, related) {
|
|
41
45
|
const tok = this.peek();
|
|
42
46
|
if (tok.kind !== kind) {
|
|
43
|
-
this.report(code, tok.span);
|
|
47
|
+
this.report(code, tok.span, related);
|
|
44
48
|
return null;
|
|
45
49
|
}
|
|
46
50
|
return this.advance();
|
|
@@ -76,7 +80,10 @@ export class TokenStream {
|
|
|
76
80
|
// malformed statement doesn't take the rest of the file's diagnostics
|
|
77
81
|
// down with it. The list can still come back null if synchronize()
|
|
78
82
|
// runs all the way to EOF without ever finding `close`.
|
|
79
|
-
|
|
83
|
+
// `openSpan`, when given, is the span of the opening delimiter (the '(', '{'
|
|
84
|
+
// or '['); it rides along on the close-token error so an unclosed group can
|
|
85
|
+
// point back at where it opened.
|
|
86
|
+
parseSeparated(parseItem, sep, close, closeCode, recover = false, openSpan = null) {
|
|
80
87
|
const items = [];
|
|
81
88
|
if (this.peek().kind !== close) {
|
|
82
89
|
for (;;) {
|
|
@@ -98,11 +105,16 @@ export class TokenStream {
|
|
|
98
105
|
if (this.peek().kind !== sep)
|
|
99
106
|
break;
|
|
100
107
|
this.advance(); // consume separator
|
|
101
|
-
|
|
102
|
-
|
|
108
|
+
// Break on the close OR on end-of-input: a trailing separator right
|
|
109
|
+
// before EOF means the group is simply unclosed, so fall straight to
|
|
110
|
+
// the close-token error below instead of trying to parse another item
|
|
111
|
+
// (which would spuriously demand an expression at end of file).
|
|
112
|
+
if (this.peek().kind === close || this.peek().kind === 'EOF')
|
|
113
|
+
break;
|
|
103
114
|
}
|
|
104
115
|
}
|
|
105
|
-
const
|
|
116
|
+
const related = openSpan !== null ? [{ key: 'opener', span: openSpan }] : [];
|
|
117
|
+
const closeTok = this.expect(close, closeCode, related);
|
|
106
118
|
if (closeTok === null)
|
|
107
119
|
return null;
|
|
108
120
|
return { items, close: closeTok };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-stream.js","sourceRoot":"","sources":["../../src/parser/token-stream.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,oEAAoE;AACpE,6DAA6D;AAC7D,oEAAoE;AACpE,wEAAwE;AACxE,kEAAkE;AAClE,yEAAyE;AACzE,MAAM,OAAO,WAAW;IACL,MAAM,CAAU;IACzB,GAAG,GAAW,CAAC,CAAC;IAExB,yEAAyE;IACzE,iEAAiE;IACjD,MAAM,GAAa,EAAE,CAAC;IAEtC,YAAmB,MAAe;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,qEAAqE;IACrE,oEAAoE;IAC7D,IAAI;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACvE,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACzE,CAAC;IAED,sEAAsE;IACtE,sEAAsE;IACtE,kEAAkE;IAC3D,QAAQ;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAC3E,CAAC;IAED,sEAAsE;IACtE,qEAAqE;IACrE,sEAAsE;IAC/D,MAAM,CAAC,IAAY,EAAE,IAAU;
|
|
1
|
+
{"version":3,"file":"token-stream.js","sourceRoot":"","sources":["../../src/parser/token-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-expr.d.ts","sourceRoot":"","sources":["../../src/parser/type-expr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAW,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,QAAQ,GAAG,IAAI,CAsB9D;AA2BD,wBAAgB,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"type-expr.d.ts","sourceRoot":"","sources":["../../src/parser/type-expr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAW,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,QAAQ,GAAG,IAAI,CAsB9D;AA2BD,wBAAgB,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,IAAI,CAU1D"}
|
package/dist/parser/type-expr.js
CHANGED
|
@@ -44,9 +44,10 @@ function parseArgDef(ts) {
|
|
|
44
44
|
// 'args (name: Type, …)' — the program's typed input declaration.
|
|
45
45
|
export function parseArgs(ts) {
|
|
46
46
|
ts.advance(); // consume 'args'
|
|
47
|
-
|
|
47
|
+
const open = ts.expect('LPAREN', 'S0006');
|
|
48
|
+
if (open === null)
|
|
48
49
|
return null;
|
|
49
|
-
const parsed = ts.parseSeparated(() => parseArgDef(ts), 'COMMA', 'RPAREN', 'S0001');
|
|
50
|
+
const parsed = ts.parseSeparated(() => parseArgDef(ts), 'COMMA', 'RPAREN', 'S0001', false, open.span);
|
|
50
51
|
if (parsed === null)
|
|
51
52
|
return null;
|
|
52
53
|
return parsed.items;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-expr.js","sourceRoot":"","sources":["../../src/parser/type-expr.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,EAAe;IAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,oBAAoB;IAElC,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QACzB,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEnD,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE7B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,KAA4C,CAAC;IAC9D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,wEAAwE;AACxE,qEAAqE;AACrE,+DAA+D;AAC/D,iBAAiB;AACjB,SAAS,WAAW,CAAC,EAAe;IAClC,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe;IAE7B,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEtD,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,oBAAoB;IAElC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,KAAgB,EAAE,CAAC;AACjE,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,SAAS,CAAC,EAAe;IACvC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,iBAAiB;IAE/B,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"type-expr.js","sourceRoot":"","sources":["../../src/parser/type-expr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typechecker.d.ts","sourceRoot":"","sources":["../../src/parser/typechecker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,OAAO,
|
|
1
|
+
{"version":3,"file":"typechecker.d.ts","sourceRoot":"","sources":["../../src/parser/typechecker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,OAAO,EAA0C,MAAM,UAAU,CAAC;AACjG,OAAO,KAAK,EAAE,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAkD,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMnG,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA+cD,eAAO,MAAM,SAAS,GAAI,SAAS,OAAO,KAAG,eAmB5C,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { INT_TYPE, FLOAT_TYPE, BOOL_TYPE, STRING_TYPE, NONE_TYPE, DONE_TYPE, listOfType, leastCommonType, isAssignableTo, } from '../types/types.js';
|
|
1
|
+
import { INT_TYPE, FLOAT_TYPE, BOOL_TYPE, STRING_TYPE, NONE_TYPE, DONE_TYPE, listOfType, leastCommonType, isAssignableTo, typeToString, } from '../types/types.js';
|
|
2
2
|
// A chain of scopes mirroring Environment in the interpreter.
|
|
3
3
|
class TypeEnv {
|
|
4
4
|
parent;
|
|
@@ -9,42 +9,56 @@ class TypeEnv {
|
|
|
9
9
|
get(name) {
|
|
10
10
|
return this.vars.get(name) ?? this.parent?.get(name) ?? null;
|
|
11
11
|
}
|
|
12
|
-
set(name, ty,
|
|
13
|
-
this.vars.set(name, { ty,
|
|
12
|
+
set(name, ty, origin, declSpan = null) {
|
|
13
|
+
this.vars.set(name, { ty, origin, declSpan });
|
|
14
14
|
}
|
|
15
15
|
child() {
|
|
16
16
|
return new TypeEnv(this);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
case '
|
|
30
|
-
return listOfType(resolveTypeExpr(te.elem));
|
|
19
|
+
// ---- Type formation: ⊢ T type --------------------------------------
|
|
20
|
+
//
|
|
21
|
+
// The one place a syntactic type name becomes a semantic AscentType.
|
|
22
|
+
// Total over the name union, so an unexpected name is a compile error
|
|
23
|
+
// here rather than a silent fall-through elsewhere.
|
|
24
|
+
const typeFromName = (name) => {
|
|
25
|
+
switch (name) {
|
|
26
|
+
case 'Int': return INT_TYPE;
|
|
27
|
+
case 'Float': return FLOAT_TYPE;
|
|
28
|
+
case 'Bool': return BOOL_TYPE;
|
|
29
|
+
case 'String': return STRING_TYPE;
|
|
31
30
|
}
|
|
32
31
|
};
|
|
32
|
+
const typeFromExpr = (te) => te.kind === 'TypeName' ? typeFromName(te.name) : listOfType(typeFromExpr(te.elem));
|
|
33
33
|
// ---- Method type signatures ------------------------------------------
|
|
34
34
|
const requireArity = (expected, got, markers, span) => {
|
|
35
35
|
if (got !== expected) {
|
|
36
|
-
markers.push({ code: 'T0007', span });
|
|
36
|
+
markers.push({ code: 'T0007', span, data: { expected: String(expected), got: String(got) } });
|
|
37
37
|
return false;
|
|
38
38
|
}
|
|
39
39
|
return true;
|
|
40
40
|
};
|
|
41
|
+
// A value-type mismatch that carries the expected and actual type names.
|
|
42
|
+
const typeMismatch = (code, markers, span, expected, actual, related = []) => {
|
|
43
|
+
markers.push({
|
|
44
|
+
code, span, related,
|
|
45
|
+
data: { expected: typeToString(expected), actual: typeToString(actual) },
|
|
46
|
+
});
|
|
47
|
+
return null;
|
|
48
|
+
};
|
|
49
|
+
// An operator applied to operands it doesn't accept (T0009). `operands` is the
|
|
50
|
+
// joined list of type names — one for a unary '-', two for a binary operator.
|
|
51
|
+
const operandError = (markers, op, span, ...operands) => {
|
|
52
|
+
markers.push({ code: 'T0009', span, data: { op, operands: operands.map(typeToString).join(' and ') } });
|
|
53
|
+
return null;
|
|
54
|
+
};
|
|
41
55
|
const intMethodType = (method, argTypes, markers, span) => {
|
|
42
56
|
switch (method) {
|
|
43
57
|
case 'toStr': return requireArity(0, argTypes.length, markers, span) ? STRING_TYPE : null;
|
|
44
58
|
case 'toFloat': return requireArity(0, argTypes.length, markers, span) ? FLOAT_TYPE : null;
|
|
45
59
|
case 'abs': return requireArity(0, argTypes.length, markers, span) ? INT_TYPE : null;
|
|
46
60
|
default:
|
|
47
|
-
markers.push({ code: 'T0006', span });
|
|
61
|
+
markers.push({ code: 'T0006', span, data: { method, type: 'Int' } });
|
|
48
62
|
return null;
|
|
49
63
|
}
|
|
50
64
|
};
|
|
@@ -54,7 +68,7 @@ const floatMethodType = (method, argTypes, markers, span) => {
|
|
|
54
68
|
case 'toInt': return requireArity(0, argTypes.length, markers, span) ? INT_TYPE : null;
|
|
55
69
|
case 'abs': return requireArity(0, argTypes.length, markers, span) ? FLOAT_TYPE : null;
|
|
56
70
|
default:
|
|
57
|
-
markers.push({ code: 'T0006', span });
|
|
71
|
+
markers.push({ code: 'T0006', span, data: { method, type: 'Float' } });
|
|
58
72
|
return null;
|
|
59
73
|
}
|
|
60
74
|
};
|
|
@@ -68,29 +82,23 @@ const listMethodType = (elemType, method, argTypes, markers, span) => {
|
|
|
68
82
|
if (!requireArity(1, argTypes.length, markers, span))
|
|
69
83
|
return null;
|
|
70
84
|
const ct = leastCommonType(elemType, argTypes[0]);
|
|
71
|
-
if (ct === null)
|
|
72
|
-
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
85
|
+
if (ct === null)
|
|
86
|
+
return typeMismatch('T0008', markers, span, elemType, argTypes[0]);
|
|
75
87
|
return listOfType(ct);
|
|
76
88
|
}
|
|
77
89
|
case 'concat': {
|
|
78
90
|
if (!requireArity(1, argTypes.length, markers, span))
|
|
79
91
|
return null;
|
|
80
92
|
const arg = argTypes[0];
|
|
81
|
-
if (arg.kind !== 'List')
|
|
82
|
-
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
93
|
+
if (arg.kind !== 'List')
|
|
94
|
+
return typeMismatch('T0008', markers, span, listOfType(elemType), arg);
|
|
85
95
|
const ct = leastCommonType(elemType, arg.elem);
|
|
86
|
-
if (ct === null)
|
|
87
|
-
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
96
|
+
if (ct === null)
|
|
97
|
+
return typeMismatch('T0008', markers, span, listOfType(elemType), arg);
|
|
90
98
|
return listOfType(ct);
|
|
91
99
|
}
|
|
92
100
|
default:
|
|
93
|
-
markers.push({ code: 'T0006', span });
|
|
101
|
+
markers.push({ code: 'T0006', span, data: { method, type: typeToString(listOfType(elemType)) } });
|
|
94
102
|
return null;
|
|
95
103
|
}
|
|
96
104
|
};
|
|
@@ -122,7 +130,7 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
122
130
|
case 'call': {
|
|
123
131
|
// floor is the only built-in for now.
|
|
124
132
|
if (expr.callee !== 'floor') {
|
|
125
|
-
markers.push({ code: '
|
|
133
|
+
markers.push({ code: 'T0013', span: expr.span, data: { name: expr.callee } });
|
|
126
134
|
return null;
|
|
127
135
|
}
|
|
128
136
|
if (!requireArity(1, expr.args.length, markers, expr.span))
|
|
@@ -130,19 +138,22 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
130
138
|
const typedArg = inferExpr(expr.args[0], env, markers);
|
|
131
139
|
if (typedArg === null)
|
|
132
140
|
return null;
|
|
133
|
-
if (typedArg.type.kind !== 'Float')
|
|
134
|
-
|
|
135
|
-
return null;
|
|
136
|
-
}
|
|
141
|
+
if (typedArg.type.kind !== 'Float')
|
|
142
|
+
return typeMismatch('T0008', markers, expr.span, FLOAT_TYPE, typedArg.type);
|
|
137
143
|
return { kind: 'call', callee: expr.callee, args: [typedArg], type: FLOAT_TYPE, span: expr.span };
|
|
138
144
|
}
|
|
139
145
|
case 'unary': {
|
|
140
146
|
const typedOperand = inferExpr(expr.operand, env, markers);
|
|
141
147
|
if (typedOperand === null)
|
|
142
148
|
return null;
|
|
149
|
+
if (expr.op === 'not') {
|
|
150
|
+
if (typedOperand.type.kind !== 'Bool') {
|
|
151
|
+
return operandError(markers, expr.op, expr.span, typedOperand.type);
|
|
152
|
+
}
|
|
153
|
+
return { kind: 'unary', op: expr.op, operand: typedOperand, type: BOOL_TYPE, span: expr.span };
|
|
154
|
+
}
|
|
143
155
|
if (typedOperand.type.kind !== 'Int' && typedOperand.type.kind !== 'Float') {
|
|
144
|
-
markers.
|
|
145
|
-
return null;
|
|
156
|
+
return operandError(markers, expr.op, expr.span, typedOperand.type);
|
|
146
157
|
}
|
|
147
158
|
return { kind: 'unary', op: expr.op, operand: typedOperand, type: typedOperand.type, span: expr.span };
|
|
148
159
|
}
|
|
@@ -159,16 +170,14 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
159
170
|
case '-':
|
|
160
171
|
case '*': {
|
|
161
172
|
if ((lt.kind !== 'Int' && lt.kind !== 'Float') || (rt.kind !== 'Int' && rt.kind !== 'Float')) {
|
|
162
|
-
markers.
|
|
163
|
-
return null;
|
|
173
|
+
return operandError(markers, expr.op, expr.span, lt, rt);
|
|
164
174
|
}
|
|
165
175
|
type = (lt.kind === 'Float' || rt.kind === 'Float') ? FLOAT_TYPE : INT_TYPE;
|
|
166
176
|
break;
|
|
167
177
|
}
|
|
168
178
|
case '/': {
|
|
169
179
|
if ((lt.kind !== 'Int' && lt.kind !== 'Float') || (rt.kind !== 'Int' && rt.kind !== 'Float')) {
|
|
170
|
-
markers.
|
|
171
|
-
return null;
|
|
180
|
+
return operandError(markers, expr.op, expr.span, lt, rt);
|
|
172
181
|
}
|
|
173
182
|
type = FLOAT_TYPE;
|
|
174
183
|
break;
|
|
@@ -176,8 +185,7 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
176
185
|
case 'div':
|
|
177
186
|
case 'mod': {
|
|
178
187
|
if (lt.kind !== 'Int' || rt.kind !== 'Int') {
|
|
179
|
-
markers.
|
|
180
|
-
return null;
|
|
188
|
+
return operandError(markers, expr.op, expr.span, lt, rt);
|
|
181
189
|
}
|
|
182
190
|
type = INT_TYPE;
|
|
183
191
|
break;
|
|
@@ -185,8 +193,7 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
185
193
|
case '==':
|
|
186
194
|
case '!=': {
|
|
187
195
|
if (leastCommonType(lt, rt) === null) {
|
|
188
|
-
markers.
|
|
189
|
-
return null;
|
|
196
|
+
return operandError(markers, expr.op, expr.span, lt, rt);
|
|
190
197
|
}
|
|
191
198
|
type = BOOL_TYPE;
|
|
192
199
|
break;
|
|
@@ -196,8 +203,15 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
196
203
|
case '>':
|
|
197
204
|
case '>=': {
|
|
198
205
|
if ((lt.kind !== 'Int' && lt.kind !== 'Float') || (rt.kind !== 'Int' && rt.kind !== 'Float')) {
|
|
199
|
-
markers.
|
|
200
|
-
|
|
206
|
+
return operandError(markers, expr.op, expr.span, lt, rt);
|
|
207
|
+
}
|
|
208
|
+
type = BOOL_TYPE;
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
case 'and':
|
|
212
|
+
case 'or': {
|
|
213
|
+
if (lt.kind !== 'Bool' || rt.kind !== 'Bool') {
|
|
214
|
+
return operandError(markers, expr.op, expr.span, lt, rt);
|
|
201
215
|
}
|
|
202
216
|
type = BOOL_TYPE;
|
|
203
217
|
break;
|
|
@@ -230,7 +244,11 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
230
244
|
for (const te of typedElements.slice(1)) {
|
|
231
245
|
const ct = leastCommonType(elemType, te.type);
|
|
232
246
|
if (ct === null) {
|
|
233
|
-
markers.push({
|
|
247
|
+
markers.push({
|
|
248
|
+
code: 'T0002', span: expr.span,
|
|
249
|
+
data: { first: typeToString(elemType), other: typeToString(te.type) },
|
|
250
|
+
related: [{ key: 'element', span: te.span }],
|
|
251
|
+
});
|
|
234
252
|
return null;
|
|
235
253
|
}
|
|
236
254
|
elemType = ct;
|
|
@@ -251,11 +269,11 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
251
269
|
if (typedList === null || typedIndex === null)
|
|
252
270
|
return null;
|
|
253
271
|
if (typedList.type.kind !== 'List') {
|
|
254
|
-
markers.push({ code: 'T0010', span: expr.span });
|
|
272
|
+
markers.push({ code: 'T0010', span: expr.list.span, data: { actual: typeToString(typedList.type) } });
|
|
255
273
|
return null;
|
|
256
274
|
}
|
|
257
275
|
if (typedIndex.type.kind !== 'Int') {
|
|
258
|
-
markers.push({ code: 'T0011', span: expr.span });
|
|
276
|
+
markers.push({ code: 'T0011', span: expr.index.span, data: { actual: typeToString(typedIndex.type) } });
|
|
259
277
|
return null;
|
|
260
278
|
}
|
|
261
279
|
return { kind: 'index', list: typedList, index: typedIndex, type: typedList.type.elem, span: expr.span };
|
|
@@ -290,7 +308,7 @@ const inferExpr = (expr, env, markers, contextType = null) => {
|
|
|
290
308
|
resultType = listMethodType(typedReceiver.type.elem, expr.method, argTypes, markers, expr.span);
|
|
291
309
|
break;
|
|
292
310
|
default:
|
|
293
|
-
markers.push({ code: 'T0012', span: expr.span });
|
|
311
|
+
markers.push({ code: 'T0012', span: expr.span, data: { type: typeToString(typedReceiver.type) } });
|
|
294
312
|
return null;
|
|
295
313
|
}
|
|
296
314
|
if (resultType === null)
|
|
@@ -328,7 +346,7 @@ const inferBlock = (block, env, markers) => {
|
|
|
328
346
|
const inferIf = (expr, env, markers) => {
|
|
329
347
|
const typedCond = inferExpr(expr.cond, env, markers);
|
|
330
348
|
if (typedCond !== null && typedCond.type.kind !== 'Bool') {
|
|
331
|
-
markers.push({ code: 'T0004', span: expr.cond.span });
|
|
349
|
+
markers.push({ code: 'T0004', span: expr.cond.span, data: { actual: typeToString(typedCond.type) } });
|
|
332
350
|
}
|
|
333
351
|
const typedThen = inferBlock(expr.then, env, markers);
|
|
334
352
|
if (expr.else === null) {
|
|
@@ -343,7 +361,14 @@ const inferIf = (expr, env, markers) => {
|
|
|
343
361
|
return null;
|
|
344
362
|
const ct = leastCommonType(typedThen.type, typedElse.type);
|
|
345
363
|
if (ct === null) {
|
|
346
|
-
markers.push({
|
|
364
|
+
markers.push({
|
|
365
|
+
code: 'T0005', span: expr.span,
|
|
366
|
+
data: { then: typeToString(typedThen.type), else: typeToString(typedElse.type) },
|
|
367
|
+
related: [
|
|
368
|
+
{ key: 'then', span: typedThen.span },
|
|
369
|
+
{ key: 'else', span: typedElse.span },
|
|
370
|
+
],
|
|
371
|
+
});
|
|
347
372
|
return null;
|
|
348
373
|
}
|
|
349
374
|
return { kind: 'if', cond: typedCond, then: typedThen, else: typedElse, type: ct, span: expr.span };
|
|
@@ -352,12 +377,16 @@ const inferStmt = (stmt, env, markers) => {
|
|
|
352
377
|
switch (stmt.kind) {
|
|
353
378
|
case 'fix':
|
|
354
379
|
case 'mut': {
|
|
355
|
-
const annotation = stmt.typeAnnotation !== null ?
|
|
380
|
+
const annotation = stmt.typeAnnotation !== null ? typeFromExpr(stmt.typeAnnotation) : null;
|
|
356
381
|
const typedInit = inferExpr(stmt.init, env, markers, annotation);
|
|
357
382
|
let slotType;
|
|
358
383
|
if (annotation !== null) {
|
|
359
384
|
if (typedInit !== null && !isAssignableTo(typedInit.type, annotation)) {
|
|
360
|
-
markers.push({
|
|
385
|
+
markers.push({
|
|
386
|
+
code: 'T0001', span: stmt.init.span,
|
|
387
|
+
data: { expected: typeToString(annotation), actual: typeToString(typedInit.type) },
|
|
388
|
+
related: [{ key: 'annotation', span: stmt.typeAnnotation.span }],
|
|
389
|
+
});
|
|
361
390
|
}
|
|
362
391
|
slotType = annotation;
|
|
363
392
|
}
|
|
@@ -365,7 +394,7 @@ const inferStmt = (stmt, env, markers) => {
|
|
|
365
394
|
slotType = typedInit?.type ?? null;
|
|
366
395
|
}
|
|
367
396
|
if (slotType !== null)
|
|
368
|
-
env.set(stmt.name, slotType, stmt.kind
|
|
397
|
+
env.set(stmt.name, slotType, stmt.kind, stmt.span);
|
|
369
398
|
if (typedInit === null)
|
|
370
399
|
return null;
|
|
371
400
|
return {
|
|
@@ -380,14 +409,31 @@ const inferStmt = (stmt, env, markers) => {
|
|
|
380
409
|
case 'assign': {
|
|
381
410
|
const binding = env.get(stmt.name);
|
|
382
411
|
if (binding === null) {
|
|
383
|
-
|
|
412
|
+
// Assigning to a name that was never created — a different mistake
|
|
413
|
+
// (and lesson) than using an undefined name in an expression (N0001).
|
|
414
|
+
markers.push({ code: 'N0003', span: stmt.nameSpan });
|
|
415
|
+
}
|
|
416
|
+
else if (binding.origin === 'arg') {
|
|
417
|
+
// A program input is read-only for the whole run — its own lesson,
|
|
418
|
+
// distinct from a 'fix' slot (there is no 'mut' arg to switch to).
|
|
419
|
+
markers.push({ code: 'N0004', span: stmt.nameSpan });
|
|
384
420
|
}
|
|
385
|
-
else if (
|
|
386
|
-
|
|
421
|
+
else if (binding.origin === 'fix') {
|
|
422
|
+
// Point back at the 'fix' declaration ("created with 'fix' here"),
|
|
423
|
+
// which always has a source location.
|
|
424
|
+
const related = binding.declSpan !== null
|
|
425
|
+
? [{ key: 'declaration', span: binding.declSpan }]
|
|
426
|
+
: [];
|
|
427
|
+
markers.push({ code: 'N0002', span: stmt.nameSpan, related });
|
|
387
428
|
}
|
|
388
429
|
const typedValue = inferExpr(stmt.value, env, markers);
|
|
389
430
|
if (binding !== null && typedValue !== null && !isAssignableTo(typedValue.type, binding.ty)) {
|
|
390
|
-
|
|
431
|
+
const related = binding.declSpan !== null ? [{ key: 'declaration', span: binding.declSpan }] : [];
|
|
432
|
+
markers.push({
|
|
433
|
+
code: 'T0001', span: stmt.value.span,
|
|
434
|
+
data: { expected: typeToString(binding.ty), actual: typeToString(typedValue.type) },
|
|
435
|
+
related,
|
|
436
|
+
});
|
|
391
437
|
}
|
|
392
438
|
if (typedValue === null)
|
|
393
439
|
return null;
|
|
@@ -402,7 +448,7 @@ const inferStmt = (stmt, env, markers) => {
|
|
|
402
448
|
case 'while': {
|
|
403
449
|
const typedCond = inferExpr(stmt.cond, env, markers);
|
|
404
450
|
if (typedCond !== null && typedCond.type.kind !== 'Bool') {
|
|
405
|
-
markers.push({ code: 'T0004', span: stmt.cond.span });
|
|
451
|
+
markers.push({ code: 'T0004', span: stmt.cond.span, data: { actual: typeToString(typedCond.type) } });
|
|
406
452
|
}
|
|
407
453
|
const typedBody = inferBlock(stmt.body, env, markers);
|
|
408
454
|
if (typedCond === null || typedBody === null)
|
|
@@ -421,11 +467,7 @@ export const typecheck = (program) => {
|
|
|
421
467
|
const markers = [];
|
|
422
468
|
const env = new TypeEnv();
|
|
423
469
|
for (const arg of program.args) {
|
|
424
|
-
|
|
425
|
-
: arg.type === 'Float' ? FLOAT_TYPE
|
|
426
|
-
: arg.type === 'Bool' ? BOOL_TYPE
|
|
427
|
-
: STRING_TYPE;
|
|
428
|
-
env.set(arg.name, ty, false);
|
|
470
|
+
env.set(arg.name, typeFromName(arg.type), 'arg');
|
|
429
471
|
}
|
|
430
472
|
const typedStmts = [];
|
|
431
473
|
let failed = false;
|