1
0
mirror of https://github.com/fluencelabs/assemblyscript synced 2025-07-30 05:32:08 +00:00

Reduce unnecessary diagnostic noise

This commit is contained in:
dcodeIO
2018-03-14 15:31:50 +01:00
parent 507482adb2
commit 8e7bad7459
6 changed files with 105 additions and 36 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@@ -1927,37 +1927,47 @@ export class Parser extends DiagnosticEmitter {
var state = tn.mark(); var state = tn.mark();
var token = tn.next(); var token = tn.next();
var statement: Statement | null = null;
switch (token) { switch (token) {
case Token.BREAK: { case Token.BREAK: {
return this.parseBreak(tn); statement = this.parseBreak(tn);
break;
} }
case Token.CONST: { case Token.CONST: {
return this.parseVariable(tn, [ statement = this.parseVariable(tn, [
Node.createModifier(ModifierKind.CONST, tn.range()) Node.createModifier(ModifierKind.CONST, tn.range())
], null); ], null);
break;
} }
case Token.CONTINUE: { case Token.CONTINUE: {
return this.parseContinue(tn); statement = this.parseContinue(tn);
break;
} }
case Token.DO: { case Token.DO: {
return this.parseDoStatement(tn); statement = this.parseDoStatement(tn);
break;
} }
case Token.FOR: { case Token.FOR: {
return this.parseForStatement(tn); statement = this.parseForStatement(tn);
break;
} }
case Token.IF: { case Token.IF: {
return this.parseIfStatement(tn); statement = this.parseIfStatement(tn);
break;
} }
case Token.LET: { case Token.LET: {
return this.parseVariable(tn, [ statement = this.parseVariable(tn, [
Node.createModifier(ModifierKind.LET, tn.range()) Node.createModifier(ModifierKind.LET, tn.range())
], null); ], null);
break;
} }
case Token.VAR: { case Token.VAR: {
return this.parseVariable(tn, null, null); statement = this.parseVariable(tn, null, null);
break;
} }
case Token.OPENBRACE: { case Token.OPENBRACE: {
return this.parseBlockStatement(tn, topLevel); statement = this.parseBlockStatement(tn, topLevel);
break;
} }
case Token.RETURN: { case Token.RETURN: {
if (topLevel) { if (topLevel) {
@@ -1966,34 +1976,49 @@ export class Parser extends DiagnosticEmitter {
tn.range() tn.range()
); // recoverable ); // recoverable
} }
return this.parseReturn(tn); statement = this.parseReturn(tn);
break;
} }
case Token.SEMICOLON: { case Token.SEMICOLON: {
return Node.createEmptyStatement(tn.range(tn.tokenPos)); return Node.createEmptyStatement(tn.range(tn.tokenPos));
} }
case Token.SWITCH: { case Token.SWITCH: {
return this.parseSwitchStatement(tn); statement = this.parseSwitchStatement(tn);
break;
} }
case Token.THROW: { case Token.THROW: {
return this.parseThrowStatement(tn); statement = this.parseThrowStatement(tn);
break;
} }
case Token.TRY: { case Token.TRY: {
return this.parseTryStatement(tn); statement = this.parseTryStatement(tn);
break;
} }
case Token.TYPE: { case Token.TYPE: {
return this.parseTypeDeclaration(tn); statement = this.parseTypeDeclaration(tn);
break;
} }
case Token.VOID: { case Token.VOID: {
return this.parseVoidStatement(tn); statement = this.parseVoidStatement(tn);
break;
} }
case Token.WHILE: { case Token.WHILE: {
return this.parseWhileStatement(tn); statement = this.parseWhileStatement(tn);
break;
} }
default: { default: {
tn.reset(state); tn.reset(state);
return this.parseExpressionStatement(tn); statement = this.parseExpressionStatement(tn);
break;
} }
} }
if (!statement) { // has been reported
tn.reset(state);
this.skipStatement(tn);
} else {
tn.discard(state);
}
return statement;
} }
parseBlockStatement( parseBlockStatement(
@@ -2006,10 +2031,16 @@ export class Parser extends DiagnosticEmitter {
var startPos = tn.tokenPos; var startPos = tn.tokenPos;
var statements = new Array<Statement>(); var statements = new Array<Statement>();
while (!tn.skip(Token.CLOSEBRACE)) { while (!tn.skip(Token.CLOSEBRACE)) {
let state = tn.mark();
let statement = this.parseStatement(tn, topLevel); let statement = this.parseStatement(tn, topLevel);
if (!statement) return null; if (!statement) {
tn.reset(state);
this.skipStatement(tn);
} else {
tn.discard(state);
statements.push(statement); statements.push(statement);
} }
}
var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos)); var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));
tn.skip(Token.SEMICOLON); tn.skip(Token.SEMICOLON);
return ret; return ret;
@@ -2964,6 +2995,59 @@ export class Parser extends DiagnosticEmitter {
} }
return expr; return expr;
} }
/** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */
skipStatement(tn: Tokenizer): void {
tn.peek(true);
if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line
do {
let nextToken = tn.peek(true);
if (
nextToken == Token.ENDOFFILE || // next step should handle this
nextToken == Token.CLOSEBRACE // current step should handle this
) {
break;
}
if (nextToken == Token.SEMICOLON) { // end of the statement for sure
tn.next();
break;
}
if (tn.nextTokenOnNewLine) break; // end of the statement maybe
switch (tn.next()) {
case Token.IDENTIFIER: {
tn.readIdentifier();
break;
}
case Token.STRINGLITERAL: {
tn.readString();
break;
}
case Token.INTEGERLITERAL: {
tn.readInteger();
break;
}
case Token.FLOATLITERAL: {
tn.readFloat();
break;
}
}
} while (true);
}
/** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */
// skipBlock(tn: Tokenizer): void {
// var depth = 0;
// var token: Token;
// do {
// token = tn.next();
// if (token == Token.OPENBRACE) {
// ++depth;
// } else if (token == Token.CLOSEBRACE) {
// if (depth) --depth;
// if (!depth) break; // done
// }
// } while (token != Token.ENDOFFILE);
// }
} }
/** Operator precedence from least to largest. */ /** Operator precedence from least to largest. */

@@ -871,17 +871,6 @@ export class Tokenizer extends DiagnosticEmitter {
} }
} }
// skipUntil(token1: Token, token2: Token = -1): bool {
// var next: Token;
// do {
// if ((next = this.peek()) == Token.ENDOFFILE)
// return false;
// if (next == token1 || next == token2)
// return true;
// this.next();
// } while (true);
// }
mark(): State { mark(): State {
var state: State; var state: State;
if (reusableState) { if (reusableState) {

@@ -1,5 +1,4 @@
; ;
;
a; a;
from; from;
"./other"; "./other";
@@ -8,5 +7,3 @@ do {
} while (false); } while (false);
// ERROR 1003: "Identifier expected." in continue-on-error.ts @ 0,3 // ERROR 1003: "Identifier expected." in continue-on-error.ts @ 0,3
// ERROR 1005: "'(' expected." in continue-on-error.ts @ 5,10 // ERROR 1005: "'(' expected." in continue-on-error.ts @ 5,10
// ERROR 1005: "'(' expected." in continue-on-error.ts @ 11,14
// ERROR 1003: "Identifier expected." in continue-on-error.ts @ 15,18

@@ -2,7 +2,6 @@
/(abc)\//; /(abc)\//;
var re = /(abc)\//ig; var re = /(abc)\//ig;
var noRe = !/(abc)\//i; var noRe = !/(abc)\//i;
b / ig;
/(abc)\//iig; /(abc)\//iig;
/(abc)\//iX; /(abc)\//iX;
false && /abc/gX.test(someString) || true; false && /abc/gX.test(someString) || true;