mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-04-28 16:32:15 +00:00
Reduce unnecessary diagnostic noise
This commit is contained in:
parent
507482adb2
commit
8e7bad7459
2
dist/assemblyscript.js
vendored
2
dist/assemblyscript.js
vendored
File diff suppressed because one or more lines are too long
2
dist/assemblyscript.js.map
vendored
2
dist/assemblyscript.js.map
vendored
File diff suppressed because one or more lines are too long
120
src/parser.ts
120
src/parser.ts
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user