Skip to content

Commit 583bcea

Browse files
author
Andy
authored
Always parse an argument for an ElementAccessExpression (microsoft#23683)
1 parent 5280d23 commit 583bcea

35 files changed

+145
-109
lines changed

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
"category": "Error",
2424
"code": 1010
2525
},
26+
"An element access expression should take an argument.": {
27+
"category": "Error",
28+
"code": 1011
29+
},
2630
"Unexpected token.": {
2731
"category": "Error",
2832
"code": 1012

src/compiler/parser.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,7 +1240,7 @@ namespace ts {
12401240
if (reportAtCurrentPosition) {
12411241
parseErrorAtPosition(scanner.getStartPos(), 0, diagnosticMessage, arg0);
12421242
}
1243-
else {
1243+
else if (diagnosticMessage) {
12441244
parseErrorAtCurrentToken(diagnosticMessage, arg0);
12451245
}
12461246

@@ -4348,14 +4348,15 @@ namespace ts {
43484348
const indexedAccess = <ElementAccessExpression>createNode(SyntaxKind.ElementAccessExpression, expression.pos);
43494349
indexedAccess.expression = expression;
43504350

4351-
// It's not uncommon for a user to write: "new Type[]".
4352-
// Check for that common pattern and report a better error message.
4353-
if (token() !== SyntaxKind.CloseBracketToken) {
4354-
indexedAccess.argumentExpression = allowInAnd(parseExpression);
4355-
if (indexedAccess.argumentExpression.kind === SyntaxKind.StringLiteral || indexedAccess.argumentExpression.kind === SyntaxKind.NumericLiteral) {
4356-
const literal = <LiteralExpression>indexedAccess.argumentExpression;
4357-
literal.text = internIdentifier(literal.text);
4351+
if (token() === SyntaxKind.CloseBracketToken) {
4352+
indexedAccess.argumentExpression = createMissingNode(SyntaxKind.Identifier, /*reportAtCurrentPosition*/ true, Diagnostics.An_element_access_expression_should_take_an_argument);
4353+
}
4354+
else {
4355+
const argument = allowInAnd(parseExpression);
4356+
if (isStringOrNumericLiteral(argument)) {
4357+
argument.text = internIdentifier(argument.text);
43584358
}
4359+
indexedAccess.argumentExpression = argument;
43594360
}
43604361

43614362
parseExpected(SyntaxKind.CloseBracketToken);

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1685,7 +1685,7 @@ namespace ts {
16851685
export interface ElementAccessExpression extends MemberExpression {
16861686
kind: SyntaxKind.ElementAccessExpression;
16871687
expression: LeftHandSideExpression;
1688-
argumentExpression?: Expression;
1688+
argumentExpression: Expression;
16891689
}
16901690

16911691
export interface SuperElementAccessExpression extends ElementAccessExpression {

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ declare namespace ts {
10191019
interface ElementAccessExpression extends MemberExpression {
10201020
kind: SyntaxKind.ElementAccessExpression;
10211021
expression: LeftHandSideExpression;
1022-
argumentExpression?: Expression;
1022+
argumentExpression: Expression;
10231023
}
10241024
interface SuperElementAccessExpression extends ElementAccessExpression {
10251025
expression: SuperExpression;

tests/baselines/reference/api/typescript.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ declare namespace ts {
10191019
interface ElementAccessExpression extends MemberExpression {
10201020
kind: SyntaxKind.ElementAccessExpression;
10211021
expression: LeftHandSideExpression;
1022-
argumentExpression?: Expression;
1022+
argumentExpression: Expression;
10231023
}
10241024
interface SuperElementAccessExpression extends ElementAccessExpression {
10251025
expression: SuperExpression;
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
tests/cases/compiler/badArrayIndex.ts(1,15): error TS2693: 'number' only refers to a type, but is being used as a value here.
2-
tests/cases/compiler/badArrayIndex.ts(1,22): error TS1109: Expression expected.
2+
tests/cases/compiler/badArrayIndex.ts(1,22): error TS1011: An element access expression should take an argument.
33

44

55
==== tests/cases/compiler/badArrayIndex.ts (2 errors) ====
66
var results = number[];
77
~~~~~~
88
!!! error TS2693: 'number' only refers to a type, but is being used as a value here.
9-
~
10-
!!! error TS1109: Expression expected.
9+
10+
!!! error TS1011: An element access expression should take an argument.

tests/baselines/reference/badArrayIndex.types

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ var results = number[];
33
>results : any
44
>number[] : any
55
>number : any
6+
> : any
67

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
tests/cases/compiler/badArraySyntax.ts(6,15): error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
2-
tests/cases/compiler/badArraySyntax.ts(7,15): error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
3-
tests/cases/compiler/badArraySyntax.ts(8,20): error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
4-
tests/cases/compiler/badArraySyntax.ts(9,20): error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
5-
tests/cases/compiler/badArraySyntax.ts(10,36): error TS1109: Expression expected.
6-
tests/cases/compiler/badArraySyntax.ts(10,40): error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
1+
tests/cases/compiler/badArraySyntax.ts(6,16): error TS1011: An element access expression should take an argument.
2+
tests/cases/compiler/badArraySyntax.ts(7,16): error TS1011: An element access expression should take an argument.
3+
tests/cases/compiler/badArraySyntax.ts(8,21): error TS1011: An element access expression should take an argument.
4+
tests/cases/compiler/badArraySyntax.ts(9,21): error TS1011: An element access expression should take an argument.
5+
tests/cases/compiler/badArraySyntax.ts(10,30): error TS1011: An element access expression should take an argument.
6+
tests/cases/compiler/badArraySyntax.ts(10,41): error TS1011: An element access expression should take an argument.
77

88

99
==== tests/cases/compiler/badArraySyntax.ts (6 errors) ====
@@ -13,20 +13,20 @@ tests/cases/compiler/badArraySyntax.ts(10,40): error TS1150: 'new T[]' cannot be
1313

1414
var a1: Z[] = [];
1515
var a2 = new Z[];
16-
~~
17-
!!! error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
16+
17+
!!! error TS1011: An element access expression should take an argument.
1818
var a3 = new Z[]();
19-
~~
20-
!!! error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
19+
20+
!!! error TS1011: An element access expression should take an argument.
2121
var a4: Z[] = new Z[];
22-
~~
23-
!!! error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
22+
23+
!!! error TS1011: An element access expression should take an argument.
2424
var a5: Z[] = new Z[]();
25-
~~
26-
!!! error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
25+
26+
!!! error TS1011: An element access expression should take an argument.
2727
var a6: Z[][] = new Z [ ] [ ];
28-
~
29-
!!! error TS1109: Expression expected.
30-
~~~~
31-
!!! error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
28+
29+
!!! error TS1011: An element access expression should take an argument.
30+
31+
!!! error TS1011: An element access expression should take an argument.
3232

tests/baselines/reference/badArraySyntax.types

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,30 @@ var a2 = new Z[];
1717
>new Z[] : any
1818
>Z[] : any
1919
>Z : typeof Z
20+
> : any
2021

2122
var a3 = new Z[]();
2223
>a3 : any
2324
>new Z[]() : any
2425
>Z[] : any
2526
>Z : typeof Z
27+
> : any
2628

2729
var a4: Z[] = new Z[];
2830
>a4 : Z[]
2931
>Z : Z
3032
>new Z[] : any
3133
>Z[] : any
3234
>Z : typeof Z
35+
> : any
3336

3437
var a5: Z[] = new Z[]();
3538
>a5 : Z[]
3639
>Z : Z
3740
>new Z[]() : any
3841
>Z[] : any
3942
>Z : typeof Z
43+
> : any
4044

4145
var a6: Z[][] = new Z [ ] [ ];
4246
>a6 : Z[][]
@@ -45,4 +49,6 @@ var a6: Z[][] = new Z [ ] [ ];
4549
>Z [ ] [ ] : any
4650
>Z [ ] : any
4751
>Z : typeof Z
52+
> : any
53+
> : any
4854

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
tests/cases/compiler/cannotInvokeNewOnErrorExpression.ts(5,15): error TS2339: Property 'ClassA' does not exist on type 'typeof M'.
2-
tests/cases/compiler/cannotInvokeNewOnErrorExpression.ts(5,21): error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
2+
tests/cases/compiler/cannotInvokeNewOnErrorExpression.ts(5,22): error TS1011: An element access expression should take an argument.
33

44

55
==== tests/cases/compiler/cannotInvokeNewOnErrorExpression.ts (2 errors) ====
@@ -10,5 +10,5 @@ tests/cases/compiler/cannotInvokeNewOnErrorExpression.ts(5,21): error TS1150: 'n
1010
var t = new M.ClassA[];
1111
~~~~~~
1212
!!! error TS2339: Property 'ClassA' does not exist on type 'typeof M'.
13-
~~
14-
!!! error TS1150: 'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.
13+
14+
!!! error TS1011: An element access expression should take an argument.

0 commit comments

Comments
 (0)