mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-14 15:31:31 +00:00
Fix parsing of properties and field names using semi-reserved keywords
This commit is contained in:
@ -2114,7 +2114,7 @@ export class Parser extends DiagnosticEmitter {
|
||||
let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());
|
||||
let asIdentifier: IdentifierExpression | null = null;
|
||||
if (tn.skip(Token.AS)) {
|
||||
if (tn.skipIdentifierName()) {
|
||||
if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {
|
||||
asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());
|
||||
} else {
|
||||
this.error(
|
||||
@ -2230,7 +2230,7 @@ export class Parser extends DiagnosticEmitter {
|
||||
|
||||
// before: Identifier ('as' Identifier)?
|
||||
|
||||
if (tn.skipIdentifierName()) {
|
||||
if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {
|
||||
let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());
|
||||
let asIdentifier: IdentifierExpression | null = null;
|
||||
if (tn.skip(Token.AS)) {
|
||||
@ -3401,15 +3401,19 @@ export class Parser extends DiagnosticEmitter {
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
next = this.parseExpression(tn,
|
||||
isRightAssociative(token)
|
||||
? nextPrecedence
|
||||
: nextPrecedence + 1
|
||||
);
|
||||
if (!next) return null;
|
||||
|
||||
// PropertyAccessExpression
|
||||
if (token == Token.DOT) {
|
||||
if (tn.skipIdentifier()) {
|
||||
next = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());
|
||||
} else {
|
||||
next = this.parseExpression(tn,
|
||||
isRightAssociative(token)
|
||||
? nextPrecedence
|
||||
: nextPrecedence + 1
|
||||
);
|
||||
if (!next) return null;
|
||||
}
|
||||
if (next.kind == NodeKind.IDENTIFIER) { // expr '.' Identifier
|
||||
expr = Node.createPropertyAccessExpression(
|
||||
expr,
|
||||
@ -3429,6 +3433,12 @@ export class Parser extends DiagnosticEmitter {
|
||||
|
||||
// BinaryExpression
|
||||
} else {
|
||||
next = this.parseExpression(tn,
|
||||
isRightAssociative(token)
|
||||
? nextPrecedence
|
||||
: nextPrecedence + 1
|
||||
);
|
||||
if (!next) return null;
|
||||
expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));
|
||||
}
|
||||
break;
|
||||
|
@ -356,7 +356,8 @@ export function tokenIsAlsoIdentifier(token: Token): bool {
|
||||
case Token.NAMESPACE:
|
||||
case Token.READONLY:
|
||||
case Token.SET:
|
||||
case Token.TYPE: return true;
|
||||
case Token.TYPE:
|
||||
case Token.VOID: return true;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
@ -972,12 +973,8 @@ export class Tokenizer extends DiagnosticEmitter {
|
||||
return this.nextToken;
|
||||
}
|
||||
|
||||
skipIdentifier(): bool {
|
||||
return this.skip(Token.IDENTIFIER, IdentifierHandling.PREFER);
|
||||
}
|
||||
|
||||
skipIdentifierName(): bool {
|
||||
return this.skip(Token.IDENTIFIER, IdentifierHandling.ALWAYS);
|
||||
skipIdentifier(identifierHandling: IdentifierHandling = IdentifierHandling.PREFER): bool {
|
||||
return this.skip(Token.IDENTIFIER, identifierHandling);
|
||||
}
|
||||
|
||||
skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {
|
||||
|
Reference in New Issue
Block a user