Index: pkg/analyzer/lib/src/generated/parser.dart |
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart |
index b12d26f888fc2c56a0fffacfc3ca62cc08bd5c93..d9e8d6e841f1b31a9f959bb4a71b9d2db07fa5e2 100644 |
--- a/pkg/analyzer/lib/src/generated/parser.dart |
+++ b/pkg/analyzer/lib/src/generated/parser.dart |
@@ -780,6 +780,13 @@ class Parser { |
} |
Token operator = getAndAdvance(); |
return new PropertyAccess(prefix, operator, parseSimpleIdentifier()); |
+ } else if (type == TokenType.INDEX) { |
+ _splitIndex(); |
+ Token leftBracket = getAndAdvance(); |
+ Expression index = parseSimpleIdentifier(); |
+ Token rightBracket = getAndAdvance(); |
+ return new IndexExpression.forTarget( |
+ prefix, leftBracket, index, rightBracket); |
} else { |
if (!optional) { |
// Report the missing selector. |
@@ -3510,19 +3517,9 @@ class Parser { |
*/ |
ListLiteral parseListLiteral(Token modifier, TypeArgumentList typeArguments) { |
if (_matches(TokenType.INDEX)) { |
- // Split the token into two separate tokens. |
- BeginToken leftBracket = _createToken( |
- _currentToken, TokenType.OPEN_SQUARE_BRACKET, |
- isBegin: true); |
- Token rightBracket = |
- new Token(TokenType.CLOSE_SQUARE_BRACKET, _currentToken.offset + 1); |
- leftBracket.endToken = rightBracket; |
- rightBracket.setNext(_currentToken.next); |
- leftBracket.setNext(rightBracket); |
- _currentToken.previous.setNext(leftBracket); |
- _currentToken = _currentToken.next; |
+ _splitIndex(); |
return new ListLiteral( |
- modifier, typeArguments, leftBracket, null, rightBracket); |
+ modifier, typeArguments, getAndAdvance(), null, getAndAdvance()); |
} |
Token leftBracket = getAndAdvance(); |
if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { |
@@ -4119,7 +4116,8 @@ class Parser { |
type == TokenType.PERIOD || |
type == TokenType.QUESTION_PERIOD || |
type == TokenType.OPEN_PAREN || |
- (parseGenericMethods && type == TokenType.LT)) { |
+ (parseGenericMethods && type == TokenType.LT) || |
+ type == TokenType.INDEX) { |
do { |
if (_isLikelyArgumentList()) { |
TypeArgumentList typeArguments = _parseOptionalTypeArguments(); |
@@ -4143,7 +4141,8 @@ class Parser { |
} while (type == TokenType.OPEN_SQUARE_BRACKET || |
type == TokenType.PERIOD || |
type == TokenType.QUESTION_PERIOD || |
- type == TokenType.OPEN_PAREN); |
+ type == TokenType.OPEN_PAREN || |
+ type == TokenType.INDEX); |
return operand; |
} |
if (!_currentToken.type.isIncrementOperator) { |
@@ -7585,6 +7584,24 @@ class Parser { |
} |
/** |
+ * Assuming that the current token is an index token ('[]'), split it into two |
+ * tokens ('[' and ']'), leaving the left bracket as the current token. |
+ */ |
+ void _splitIndex() { |
+ // Split the token into two separate tokens. |
+ BeginToken leftBracket = _createToken( |
+ _currentToken, TokenType.OPEN_SQUARE_BRACKET, |
+ isBegin: true); |
+ Token rightBracket = |
+ new Token(TokenType.CLOSE_SQUARE_BRACKET, _currentToken.offset + 1); |
+ leftBracket.endToken = rightBracket; |
+ rightBracket.setNext(_currentToken.next); |
+ leftBracket.setNext(rightBracket); |
+ _currentToken.previous.setNext(leftBracket); |
+ _currentToken = leftBracket; |
+ } |
+ |
+ /** |
* Return `true` if the given [token] has the given [type]. |
*/ |
bool _tokenMatches(Token token, TokenType type) => token.type == type; |