Always parse an argument for an ElementAccessExpression (#23683)

This commit is contained in:
Andy
2018-04-25 10:08:35 -07:00
committed by GitHub
parent 5280d23b63
commit 583bcea603
35 changed files with 145 additions and 109 deletions
+4
View File
@@ -23,6 +23,10 @@
"category": "Error",
"code": 1010
},
"An element access expression should take an argument.": {
"category": "Error",
"code": 1011
},
"Unexpected token.": {
"category": "Error",
"code": 1012
+9 -8
View File
@@ -1240,7 +1240,7 @@ namespace ts {
if (reportAtCurrentPosition) {
parseErrorAtPosition(scanner.getStartPos(), 0, diagnosticMessage, arg0);
}
else {
else if (diagnosticMessage) {
parseErrorAtCurrentToken(diagnosticMessage, arg0);
}
@@ -4348,14 +4348,15 @@ namespace ts {
const indexedAccess = <ElementAccessExpression>createNode(SyntaxKind.ElementAccessExpression, expression.pos);
indexedAccess.expression = expression;
// It's not uncommon for a user to write: "new Type[]".
// Check for that common pattern and report a better error message.
if (token() !== SyntaxKind.CloseBracketToken) {
indexedAccess.argumentExpression = allowInAnd(parseExpression);
if (indexedAccess.argumentExpression.kind === SyntaxKind.StringLiteral || indexedAccess.argumentExpression.kind === SyntaxKind.NumericLiteral) {
const literal = <LiteralExpression>indexedAccess.argumentExpression;
literal.text = internIdentifier(literal.text);
if (token() === SyntaxKind.CloseBracketToken) {
indexedAccess.argumentExpression = createMissingNode(SyntaxKind.Identifier, /*reportAtCurrentPosition*/ true, Diagnostics.An_element_access_expression_should_take_an_argument);
}
else {
const argument = allowInAnd(parseExpression);
if (isStringOrNumericLiteral(argument)) {
argument.text = internIdentifier(argument.text);
}
indexedAccess.argumentExpression = argument;
}
parseExpected(SyntaxKind.CloseBracketToken);
+1 -1
View File
@@ -1685,7 +1685,7 @@ namespace ts {
export interface ElementAccessExpression extends MemberExpression {
kind: SyntaxKind.ElementAccessExpression;
expression: LeftHandSideExpression;
argumentExpression?: Expression;
argumentExpression: Expression;
}
export interface SuperElementAccessExpression extends ElementAccessExpression {