Skip to content

Commit 8e7bad7

Browse files
committed
Reduce unnecessary diagnostic noise
1 parent 507482a commit 8e7bad7

File tree

6 files changed

+105
-36
lines changed

6 files changed

+105
-36
lines changed

dist/assemblyscript.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/assemblyscript.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/parser.ts

+103-19
Original file line numberDiff line numberDiff line change
@@ -1927,37 +1927,47 @@ export class Parser extends DiagnosticEmitter {
19271927

19281928
var state = tn.mark();
19291929
var token = tn.next();
1930+
var statement: Statement | null = null;
19301931
switch (token) {
19311932
case Token.BREAK: {
1932-
return this.parseBreak(tn);
1933+
statement = this.parseBreak(tn);
1934+
break;
19331935
}
19341936
case Token.CONST: {
1935-
return this.parseVariable(tn, [
1937+
statement = this.parseVariable(tn, [
19361938
Node.createModifier(ModifierKind.CONST, tn.range())
19371939
], null);
1940+
break;
19381941
}
19391942
case Token.CONTINUE: {
1940-
return this.parseContinue(tn);
1943+
statement = this.parseContinue(tn);
1944+
break;
19411945
}
19421946
case Token.DO: {
1943-
return this.parseDoStatement(tn);
1947+
statement = this.parseDoStatement(tn);
1948+
break;
19441949
}
19451950
case Token.FOR: {
1946-
return this.parseForStatement(tn);
1951+
statement = this.parseForStatement(tn);
1952+
break;
19471953
}
19481954
case Token.IF: {
1949-
return this.parseIfStatement(tn);
1955+
statement = this.parseIfStatement(tn);
1956+
break;
19501957
}
19511958
case Token.LET: {
1952-
return this.parseVariable(tn, [
1959+
statement = this.parseVariable(tn, [
19531960
Node.createModifier(ModifierKind.LET, tn.range())
19541961
], null);
1962+
break;
19551963
}
19561964
case Token.VAR: {
1957-
return this.parseVariable(tn, null, null);
1965+
statement = this.parseVariable(tn, null, null);
1966+
break;
19581967
}
19591968
case Token.OPENBRACE: {
1960-
return this.parseBlockStatement(tn, topLevel);
1969+
statement = this.parseBlockStatement(tn, topLevel);
1970+
break;
19611971
}
19621972
case Token.RETURN: {
19631973
if (topLevel) {
@@ -1966,34 +1976,49 @@ export class Parser extends DiagnosticEmitter {
19661976
tn.range()
19671977
); // recoverable
19681978
}
1969-
return this.parseReturn(tn);
1979+
statement = this.parseReturn(tn);
1980+
break;
19701981
}
19711982
case Token.SEMICOLON: {
19721983
return Node.createEmptyStatement(tn.range(tn.tokenPos));
19731984
}
19741985
case Token.SWITCH: {
1975-
return this.parseSwitchStatement(tn);
1986+
statement = this.parseSwitchStatement(tn);
1987+
break;
19761988
}
19771989
case Token.THROW: {
1978-
return this.parseThrowStatement(tn);
1990+
statement = this.parseThrowStatement(tn);
1991+
break;
19791992
}
19801993
case Token.TRY: {
1981-
return this.parseTryStatement(tn);
1994+
statement = this.parseTryStatement(tn);
1995+
break;
19821996
}
19831997
case Token.TYPE: {
1984-
return this.parseTypeDeclaration(tn);
1998+
statement = this.parseTypeDeclaration(tn);
1999+
break;
19852000
}
19862001
case Token.VOID: {
1987-
return this.parseVoidStatement(tn);
2002+
statement = this.parseVoidStatement(tn);
2003+
break;
19882004
}
19892005
case Token.WHILE: {
1990-
return this.parseWhileStatement(tn);
2006+
statement = this.parseWhileStatement(tn);
2007+
break;
19912008
}
19922009
default: {
19932010
tn.reset(state);
1994-
return this.parseExpressionStatement(tn);
2011+
statement = this.parseExpressionStatement(tn);
2012+
break;
19952013
}
19962014
}
2015+
if (!statement) { // has been reported
2016+
tn.reset(state);
2017+
this.skipStatement(tn);
2018+
} else {
2019+
tn.discard(state);
2020+
}
2021+
return statement;
19972022
}
19982023

19992024
parseBlockStatement(
@@ -2006,9 +2031,15 @@ export class Parser extends DiagnosticEmitter {
20062031
var startPos = tn.tokenPos;
20072032
var statements = new Array<Statement>();
20082033
while (!tn.skip(Token.CLOSEBRACE)) {
2034+
let state = tn.mark();
20092035
let statement = this.parseStatement(tn, topLevel);
2010-
if (!statement) return null;
2011-
statements.push(statement);
2036+
if (!statement) {
2037+
tn.reset(state);
2038+
this.skipStatement(tn);
2039+
} else {
2040+
tn.discard(state);
2041+
statements.push(statement);
2042+
}
20122043
}
20132044
var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));
20142045
tn.skip(Token.SEMICOLON);
@@ -2964,6 +2995,59 @@ export class Parser extends DiagnosticEmitter {
29642995
}
29652996
return expr;
29662997
}
2998+
2999+
/** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */
3000+
skipStatement(tn: Tokenizer): void {
3001+
tn.peek(true);
3002+
if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line
3003+
do {
3004+
let nextToken = tn.peek(true);
3005+
if (
3006+
nextToken == Token.ENDOFFILE || // next step should handle this
3007+
nextToken == Token.CLOSEBRACE // current step should handle this
3008+
) {
3009+
break;
3010+
}
3011+
if (nextToken == Token.SEMICOLON) { // end of the statement for sure
3012+
tn.next();
3013+
break;
3014+
}
3015+
if (tn.nextTokenOnNewLine) break; // end of the statement maybe
3016+
switch (tn.next()) {
3017+
case Token.IDENTIFIER: {
3018+
tn.readIdentifier();
3019+
break;
3020+
}
3021+
case Token.STRINGLITERAL: {
3022+
tn.readString();
3023+
break;
3024+
}
3025+
case Token.INTEGERLITERAL: {
3026+
tn.readInteger();
3027+
break;
3028+
}
3029+
case Token.FLOATLITERAL: {
3030+
tn.readFloat();
3031+
break;
3032+
}
3033+
}
3034+
} while (true);
3035+
}
3036+
3037+
/** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */
3038+
// skipBlock(tn: Tokenizer): void {
3039+
// var depth = 0;
3040+
// var token: Token;
3041+
// do {
3042+
// token = tn.next();
3043+
// if (token == Token.OPENBRACE) {
3044+
// ++depth;
3045+
// } else if (token == Token.CLOSEBRACE) {
3046+
// if (depth) --depth;
3047+
// if (!depth) break; // done
3048+
// }
3049+
// } while (token != Token.ENDOFFILE);
3050+
// }
29673051
}
29683052

29693053
/** Operator precedence from least to largest. */

src/tokenizer.ts

-11
Original file line numberDiff line numberDiff line change
@@ -871,17 +871,6 @@ export class Tokenizer extends DiagnosticEmitter {
871871
}
872872
}
873873

874-
// skipUntil(token1: Token, token2: Token = -1): bool {
875-
// var next: Token;
876-
// do {
877-
// if ((next = this.peek()) == Token.ENDOFFILE)
878-
// return false;
879-
// if (next == token1 || next == token2)
880-
// return true;
881-
// this.next();
882-
// } while (true);
883-
// }
884-
885874
mark(): State {
886875
var state: State;
887876
if (reusableState) {
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
;
2-
;
32
a;
43
from;
54
"./other";
@@ -8,5 +7,3 @@ do {
87
} while (false);
98
// ERROR 1003: "Identifier expected." in continue-on-error.ts @ 0,3
109
// ERROR 1005: "'(' expected." in continue-on-error.ts @ 5,10
11-
// ERROR 1005: "'(' expected." in continue-on-error.ts @ 11,14
12-
// ERROR 1003: "Identifier expected." in continue-on-error.ts @ 15,18

tests/parser/regexp.ts.fixture.ts

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
/(abc)\//;
33
var re = /(abc)\//ig;
44
var noRe = !/(abc)\//i;
5-
b / ig;
65
/(abc)\//iig;
76
/(abc)\//iX;
87
false && /abc/gX.test(someString) || true;

0 commit comments

Comments
 (0)