| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
| 6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
| 7 | 7 |
| 8 library engine.parser; | 8 library engine.parser; |
| 9 | 9 |
| 10 import "dart:math" as math; | 10 import "dart:math" as math; |
| 11 import 'dart:collection'; | 11 import 'dart:collection'; |
| 12 | 12 |
| 13 import 'ast.dart'; | 13 import 'ast.dart'; |
| 14 import 'engine.dart' show AnalysisEngine, AnalysisOptionsImpl; | 14 import 'engine.dart' show AnalysisEngine, AnalysisOptionsImpl; |
| 15 import 'error.dart'; | 15 import 'error.dart'; |
| 16 import 'java_core.dart'; | 16 import 'java_core.dart'; |
| 17 import 'java_engine.dart'; | 17 import 'java_engine.dart'; |
| 18 import 'scanner.dart'; | 18 import 'scanner.dart'; |
| 19 import 'source.dart'; | 19 import 'source.dart'; |
| 20 import 'utilities_collection.dart' show TokenMap; | 20 import 'utilities_collection.dart' show TokenMap; |
| 21 import 'utilities_dart.dart'; | 21 import 'utilities_dart.dart'; |
| 22 | 22 |
| 23 Map<String, MethodTrampoline> methodTable_Parser = <String, MethodTrampoline>{ | 23 Map<String, MethodTrampoline> methodTable_Parser = <String, MethodTrampoline>{ |
| 24 'parseCompilationUnit_1': new MethodTrampoline( | 24 'parseCompilationUnit_1': new MethodTrampoline( |
| 25 1, | 25 1, (Parser target, arg0) => target.parseCompilationUnit(arg0)), |
| 26 (Parser target, arg0) => target.parseCompilationUnit(arg0)), | |
| 27 'parseDirectives_1': new MethodTrampoline( | 26 'parseDirectives_1': new MethodTrampoline( |
| 28 1, | 27 1, (Parser target, arg0) => target.parseDirectives(arg0)), |
| 29 (Parser target, arg0) => target.parseDirectives(arg0)), | |
| 30 'parseExpression_1': new MethodTrampoline( | 28 'parseExpression_1': new MethodTrampoline( |
| 31 1, | 29 1, (Parser target, arg0) => target.parseExpression(arg0)), |
| 32 (Parser target, arg0) => target.parseExpression(arg0)), | |
| 33 'parseStatement_1': new MethodTrampoline( | 30 'parseStatement_1': new MethodTrampoline( |
| 34 1, | 31 1, (Parser target, arg0) => target.parseStatement(arg0)), |
| 35 (Parser target, arg0) => target.parseStatement(arg0)), | |
| 36 'parseStatements_1': new MethodTrampoline( | 32 'parseStatements_1': new MethodTrampoline( |
| 37 1, | 33 1, (Parser target, arg0) => target.parseStatements(arg0)), |
| 38 (Parser target, arg0) => target.parseStatements(arg0)), | 34 'parseAnnotation_0': |
| 39 'parseAnnotation_0': new MethodTrampoline( | 35 new MethodTrampoline(0, (Parser target) => target.parseAnnotation()), |
| 40 0, | 36 'parseArgument_0': |
| 41 (Parser target) => target.parseAnnotation()), | 37 new MethodTrampoline(0, (Parser target) => target.parseArgument()), |
| 42 'parseArgument_0': new MethodTrampoline( | 38 'parseArgumentList_0': |
| 43 0, | 39 new MethodTrampoline(0, (Parser target) => target.parseArgumentList()), |
| 44 (Parser target) => target.parseArgument()), | |
| 45 'parseArgumentList_0': new MethodTrampoline( | |
| 46 0, | |
| 47 (Parser target) => target.parseArgumentList()), | |
| 48 'parseBitwiseOrExpression_0': new MethodTrampoline( | 40 'parseBitwiseOrExpression_0': new MethodTrampoline( |
| 49 0, | 41 0, (Parser target) => target.parseBitwiseOrExpression()), |
| 50 (Parser target) => target.parseBitwiseOrExpression()), | 42 'parseBlock_0': |
| 51 'parseBlock_0': new MethodTrampoline( | 43 new MethodTrampoline(0, (Parser target) => target.parseBlock()), |
| 52 0, | |
| 53 (Parser target) => target.parseBlock()), | |
| 54 'parseClassMember_1': new MethodTrampoline( | 44 'parseClassMember_1': new MethodTrampoline( |
| 55 1, | 45 1, (Parser target, arg0) => target.parseClassMember(arg0)), |
| 56 (Parser target, arg0) => target.parseClassMember(arg0)), | |
| 57 'parseCompilationUnit_0': new MethodTrampoline( | 46 'parseCompilationUnit_0': new MethodTrampoline( |
| 58 0, | 47 0, (Parser target) => target.parseCompilationUnit2()), |
| 59 (Parser target) => target.parseCompilationUnit2()), | |
| 60 'parseConditionalExpression_0': new MethodTrampoline( | 48 'parseConditionalExpression_0': new MethodTrampoline( |
| 61 0, | 49 0, (Parser target) => target.parseConditionalExpression()), |
| 62 (Parser target) => target.parseConditionalExpression()), | 50 'parseConstructorName_0': |
| 63 'parseConstructorName_0': new MethodTrampoline( | 51 new MethodTrampoline(0, (Parser target) => target.parseConstructorName()), |
| 64 0, | 52 'parseExpression_0': |
| 65 (Parser target) => target.parseConstructorName()), | 53 new MethodTrampoline(0, (Parser target) => target.parseExpression2()), |
| 66 'parseExpression_0': new MethodTrampoline( | |
| 67 0, | |
| 68 (Parser target) => target.parseExpression2()), | |
| 69 'parseExpressionWithoutCascade_0': new MethodTrampoline( | 54 'parseExpressionWithoutCascade_0': new MethodTrampoline( |
| 70 0, | 55 0, (Parser target) => target.parseExpressionWithoutCascade()), |
| 71 (Parser target) => target.parseExpressionWithoutCascade()), | 56 'parseExtendsClause_0': |
| 72 'parseExtendsClause_0': new MethodTrampoline( | 57 new MethodTrampoline(0, (Parser target) => target.parseExtendsClause()), |
| 73 0, | |
| 74 (Parser target) => target.parseExtendsClause()), | |
| 75 'parseFormalParameterList_0': new MethodTrampoline( | 58 'parseFormalParameterList_0': new MethodTrampoline( |
| 76 0, | 59 0, (Parser target) => target.parseFormalParameterList()), |
| 77 (Parser target) => target.parseFormalParameterList()), | |
| 78 'parseFunctionExpression_0': new MethodTrampoline( | 60 'parseFunctionExpression_0': new MethodTrampoline( |
| 79 0, | 61 0, (Parser target) => target.parseFunctionExpression()), |
| 80 (Parser target) => target.parseFunctionExpression()), | |
| 81 'parseImplementsClause_0': new MethodTrampoline( | 62 'parseImplementsClause_0': new MethodTrampoline( |
| 82 0, | 63 0, (Parser target) => target.parseImplementsClause()), |
| 83 (Parser target) => target.parseImplementsClause()), | 64 'parseLabel_0': |
| 84 'parseLabel_0': new MethodTrampoline( | 65 new MethodTrampoline(0, (Parser target) => target.parseLabel()), |
| 85 0, | |
| 86 (Parser target) => target.parseLabel()), | |
| 87 'parseLibraryIdentifier_0': new MethodTrampoline( | 66 'parseLibraryIdentifier_0': new MethodTrampoline( |
| 88 0, | 67 0, (Parser target) => target.parseLibraryIdentifier()), |
| 89 (Parser target) => target.parseLibraryIdentifier()), | |
| 90 'parseLogicalOrExpression_0': new MethodTrampoline( | 68 'parseLogicalOrExpression_0': new MethodTrampoline( |
| 91 0, | 69 0, (Parser target) => target.parseLogicalOrExpression()), |
| 92 (Parser target) => target.parseLogicalOrExpression()), | 70 'parseMapLiteralEntry_0': |
| 93 'parseMapLiteralEntry_0': new MethodTrampoline( | 71 new MethodTrampoline(0, (Parser target) => target.parseMapLiteralEntry()), |
| 94 0, | |
| 95 (Parser target) => target.parseMapLiteralEntry()), | |
| 96 'parseNormalFormalParameter_0': new MethodTrampoline( | 72 'parseNormalFormalParameter_0': new MethodTrampoline( |
| 97 0, | 73 0, (Parser target) => target.parseNormalFormalParameter()), |
| 98 (Parser target) => target.parseNormalFormalParameter()), | |
| 99 'parsePrefixedIdentifier_0': new MethodTrampoline( | 74 'parsePrefixedIdentifier_0': new MethodTrampoline( |
| 100 0, | 75 0, (Parser target) => target.parsePrefixedIdentifier()), |
| 101 (Parser target) => target.parsePrefixedIdentifier()), | 76 'parseReturnType_0': |
| 102 'parseReturnType_0': new MethodTrampoline( | 77 new MethodTrampoline(0, (Parser target) => target.parseReturnType()), |
| 103 0, | |
| 104 (Parser target) => target.parseReturnType()), | |
| 105 'parseSimpleIdentifier_0': new MethodTrampoline( | 78 'parseSimpleIdentifier_0': new MethodTrampoline( |
| 106 0, | 79 0, (Parser target) => target.parseSimpleIdentifier()), |
| 107 (Parser target) => target.parseSimpleIdentifier()), | 80 'parseStatement_0': |
| 108 'parseStatement_0': new MethodTrampoline( | 81 new MethodTrampoline(0, (Parser target) => target.parseStatement2()), |
| 109 0, | 82 'parseStringLiteral_0': |
| 110 (Parser target) => target.parseStatement2()), | 83 new MethodTrampoline(0, (Parser target) => target.parseStringLiteral()), |
| 111 'parseStringLiteral_0': new MethodTrampoline( | |
| 112 0, | |
| 113 (Parser target) => target.parseStringLiteral()), | |
| 114 'parseTypeArgumentList_0': new MethodTrampoline( | 84 'parseTypeArgumentList_0': new MethodTrampoline( |
| 115 0, | 85 0, (Parser target) => target.parseTypeArgumentList()), |
| 116 (Parser target) => target.parseTypeArgumentList()), | 86 'parseTypeName_0': |
| 117 'parseTypeName_0': new MethodTrampoline( | 87 new MethodTrampoline(0, (Parser target) => target.parseTypeName()), |
| 118 0, | 88 'parseTypeParameter_0': |
| 119 (Parser target) => target.parseTypeName()), | 89 new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()), |
| 120 'parseTypeParameter_0': new MethodTrampoline( | |
| 121 0, | |
| 122 (Parser target) => target.parseTypeParameter()), | |
| 123 'parseTypeParameterList_0': new MethodTrampoline( | 90 'parseTypeParameterList_0': new MethodTrampoline( |
| 124 0, | 91 0, (Parser target) => target.parseTypeParameterList()), |
| 125 (Parser target) => target.parseTypeParameterList()), | 92 'parseWithClause_0': |
| 126 'parseWithClause_0': new MethodTrampoline( | 93 new MethodTrampoline(0, (Parser target) => target.parseWithClause()), |
| 127 0, | |
| 128 (Parser target) => target.parseWithClause()), | |
| 129 'advance_0': new MethodTrampoline(0, (Parser target) => target._advance()), | 94 'advance_0': new MethodTrampoline(0, (Parser target) => target._advance()), |
| 130 'appendScalarValue_5': new MethodTrampoline( | 95 'appendScalarValue_5': new MethodTrampoline(5, (Parser target, arg0, arg1, |
| 131 5, | 96 arg2, arg3, |
| 132 (Parser target, arg0, arg1, arg2, arg3, arg4) => | 97 arg4) => target._appendScalarValue(arg0, arg1, arg2, arg3, arg4)), |
| 133 target._appendScalarValue(arg0, arg1, arg2, arg3, arg4)), | 98 'computeStringValue_3': new MethodTrampoline(3, (Parser target, arg0, arg1, |
| 134 'computeStringValue_3': new MethodTrampoline( | 99 arg2) => target._computeStringValue(arg0, arg1, arg2)), |
| 135 3, | |
| 136 (Parser target, arg0, arg1, arg2) => | |
| 137 target._computeStringValue(arg0, arg1, arg2)), | |
| 138 'convertToFunctionDeclaration_1': new MethodTrampoline( | 100 'convertToFunctionDeclaration_1': new MethodTrampoline( |
| 139 1, | 101 1, (Parser target, arg0) => target._convertToFunctionDeclaration(arg0)), |
| 140 (Parser target, arg0) => target._convertToFunctionDeclaration(arg0)), | |
| 141 'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline( | 102 'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline( |
| 142 0, | 103 0, (Parser target) => target._couldBeStartOfCompilationUnitMember()), |
| 143 (Parser target) => target._couldBeStartOfCompilationUnitMember()), | |
| 144 'createSyntheticIdentifier_0': new MethodTrampoline( | 104 'createSyntheticIdentifier_0': new MethodTrampoline( |
| 145 0, | 105 0, (Parser target) => target._createSyntheticIdentifier()), |
| 146 (Parser target) => target._createSyntheticIdentifier()), | |
| 147 'createSyntheticKeyword_1': new MethodTrampoline( | 106 'createSyntheticKeyword_1': new MethodTrampoline( |
| 148 1, | 107 1, (Parser target, arg0) => target._createSyntheticKeyword(arg0)), |
| 149 (Parser target, arg0) => target._createSyntheticKeyword(arg0)), | |
| 150 'createSyntheticStringLiteral_0': new MethodTrampoline( | 108 'createSyntheticStringLiteral_0': new MethodTrampoline( |
| 151 0, | 109 0, (Parser target) => target._createSyntheticStringLiteral()), |
| 152 (Parser target) => target._createSyntheticStringLiteral()), | |
| 153 'createSyntheticToken_1': new MethodTrampoline( | 110 'createSyntheticToken_1': new MethodTrampoline( |
| 154 1, | 111 1, (Parser target, arg0) => target._createSyntheticToken(arg0)), |
| 155 (Parser target, arg0) => target._createSyntheticToken(arg0)), | |
| 156 'ensureAssignable_1': new MethodTrampoline( | 112 'ensureAssignable_1': new MethodTrampoline( |
| 157 1, | 113 1, (Parser target, arg0) => target._ensureAssignable(arg0)), |
| 158 (Parser target, arg0) => target._ensureAssignable(arg0)), | 114 'expect_1': |
| 159 'expect_1': new MethodTrampoline( | 115 new MethodTrampoline(1, (Parser target, arg0) => target._expect(arg0)), |
| 160 1, | |
| 161 (Parser target, arg0) => target._expect(arg0)), | |
| 162 'expectGt_0': new MethodTrampoline(0, (Parser target) => target._expectGt()), | 116 'expectGt_0': new MethodTrampoline(0, (Parser target) => target._expectGt()), |
| 163 'expectKeyword_1': new MethodTrampoline( | 117 'expectKeyword_1': new MethodTrampoline( |
| 164 1, | 118 1, (Parser target, arg0) => target._expectKeyword(arg0)), |
| 165 (Parser target, arg0) => target._expectKeyword(arg0)), | 119 'expectSemicolon_0': |
| 166 'expectSemicolon_0': new MethodTrampoline( | 120 new MethodTrampoline(0, (Parser target) => target._expectSemicolon()), |
| 167 0, | |
| 168 (Parser target) => target._expectSemicolon()), | |
| 169 'findRange_2': new MethodTrampoline( | 121 'findRange_2': new MethodTrampoline( |
| 170 2, | 122 2, (Parser target, arg0, arg1) => target._findRange(arg0, arg1)), |
| 171 (Parser target, arg0, arg1) => target._findRange(arg0, arg1)), | |
| 172 'getCodeBlockRanges_1': new MethodTrampoline( | 123 'getCodeBlockRanges_1': new MethodTrampoline( |
| 173 1, | 124 1, (Parser target, arg0) => target._getCodeBlockRanges(arg0)), |
| 174 (Parser target, arg0) => target._getCodeBlockRanges(arg0)), | |
| 175 'getEndToken_1': new MethodTrampoline( | 125 'getEndToken_1': new MethodTrampoline( |
| 176 1, | 126 1, (Parser target, arg0) => target._getEndToken(arg0)), |
| 177 (Parser target, arg0) => target._getEndToken(arg0)), | |
| 178 'injectToken_1': new MethodTrampoline( | 127 'injectToken_1': new MethodTrampoline( |
| 179 1, | 128 1, (Parser target, arg0) => target._injectToken(arg0)), |
| 180 (Parser target, arg0) => target._injectToken(arg0)), | |
| 181 'isFunctionDeclaration_0': new MethodTrampoline( | 129 'isFunctionDeclaration_0': new MethodTrampoline( |
| 182 0, | 130 0, (Parser target) => target._isFunctionDeclaration()), |
| 183 (Parser target) => target._isFunctionDeclaration()), | |
| 184 'isFunctionExpression_1': new MethodTrampoline( | 131 'isFunctionExpression_1': new MethodTrampoline( |
| 185 1, | 132 1, (Parser target, arg0) => target._isFunctionExpression(arg0)), |
| 186 (Parser target, arg0) => target._isFunctionExpression(arg0)), | |
| 187 'isHexDigit_1': new MethodTrampoline( | 133 'isHexDigit_1': new MethodTrampoline( |
| 188 1, | 134 1, (Parser target, arg0) => target._isHexDigit(arg0)), |
| 189 (Parser target, arg0) => target._isHexDigit(arg0)), | |
| 190 'isInitializedVariableDeclaration_0': new MethodTrampoline( | 135 'isInitializedVariableDeclaration_0': new MethodTrampoline( |
| 191 0, | 136 0, (Parser target) => target._isInitializedVariableDeclaration()), |
| 192 (Parser target) => target._isInitializedVariableDeclaration()), | |
| 193 'isLinkText_2': new MethodTrampoline( | 137 'isLinkText_2': new MethodTrampoline( |
| 194 2, | 138 2, (Parser target, arg0, arg1) => target._isLinkText(arg0, arg1)), |
| 195 (Parser target, arg0, arg1) => target._isLinkText(arg0, arg1)), | |
| 196 'isOperator_1': new MethodTrampoline( | 139 'isOperator_1': new MethodTrampoline( |
| 197 1, | 140 1, (Parser target, arg0) => target._isOperator(arg0)), |
| 198 (Parser target, arg0) => target._isOperator(arg0)), | 141 'isSwitchMember_0': |
| 199 'isSwitchMember_0': new MethodTrampoline( | 142 new MethodTrampoline(0, (Parser target) => target._isSwitchMember()), |
| 200 0, | |
| 201 (Parser target) => target._isSwitchMember()), | |
| 202 'isTypedIdentifier_1': new MethodTrampoline( | 143 'isTypedIdentifier_1': new MethodTrampoline( |
| 203 1, | 144 1, (Parser target, arg0) => target._isTypedIdentifier(arg0)), |
| 204 (Parser target, arg0) => target._isTypedIdentifier(arg0)), | 145 'lockErrorListener_0': |
| 205 'lockErrorListener_0': new MethodTrampoline( | 146 new MethodTrampoline(0, (Parser target) => target._lockErrorListener()), |
| 206 0, | 147 'matches_1': |
| 207 (Parser target) => target._lockErrorListener()), | 148 new MethodTrampoline(1, (Parser target, arg0) => target._matches(arg0)), |
| 208 'matches_1': new MethodTrampoline( | 149 'matchesGt_0': |
| 209 1, | 150 new MethodTrampoline(0, (Parser target) => target._matchesGt()), |
| 210 (Parser target, arg0) => target._matches(arg0)), | 151 'matchesIdentifier_0': |
| 211 'matchesGt_0': new MethodTrampoline( | 152 new MethodTrampoline(0, (Parser target) => target._matchesIdentifier()), |
| 212 0, | |
| 213 (Parser target) => target._matchesGt()), | |
| 214 'matchesIdentifier_0': new MethodTrampoline( | |
| 215 0, | |
| 216 (Parser target) => target._matchesIdentifier()), | |
| 217 'matchesKeyword_1': new MethodTrampoline( | 153 'matchesKeyword_1': new MethodTrampoline( |
| 218 1, | 154 1, (Parser target, arg0) => target._matchesKeyword(arg0)), |
| 219 (Parser target, arg0) => target._matchesKeyword(arg0)), | |
| 220 'matchesString_1': new MethodTrampoline( | 155 'matchesString_1': new MethodTrampoline( |
| 221 1, | 156 1, (Parser target, arg0) => target._matchesString(arg0)), |
| 222 (Parser target, arg0) => target._matchesString(arg0)), | 157 'optional_1': |
| 223 'optional_1': new MethodTrampoline( | 158 new MethodTrampoline(1, (Parser target, arg0) => target._optional(arg0)), |
| 224 1, | |
| 225 (Parser target, arg0) => target._optional(arg0)), | |
| 226 'parseAdditiveExpression_0': new MethodTrampoline( | 159 'parseAdditiveExpression_0': new MethodTrampoline( |
| 227 0, | 160 0, (Parser target) => target._parseAdditiveExpression()), |
| 228 (Parser target) => target._parseAdditiveExpression()), | |
| 229 'parseAssertStatement_0': new MethodTrampoline( | 161 'parseAssertStatement_0': new MethodTrampoline( |
| 230 0, | 162 0, (Parser target) => target._parseAssertStatement()), |
| 231 (Parser target) => target._parseAssertStatement()), | |
| 232 'parseAssignableExpression_1': new MethodTrampoline( | 163 'parseAssignableExpression_1': new MethodTrampoline( |
| 233 1, | 164 1, (Parser target, arg0) => target._parseAssignableExpression(arg0)), |
| 234 (Parser target, arg0) => target._parseAssignableExpression(arg0)), | 165 'parseAssignableSelector_2': new MethodTrampoline(2, (Parser target, arg0, |
| 235 'parseAssignableSelector_2': new MethodTrampoline( | 166 arg1) => target._parseAssignableSelector(arg0, arg1)), |
| 236 2, | |
| 237 (Parser target, arg0, arg1) => target._parseAssignableSelector(arg0, arg1)
), | |
| 238 'parseAwaitExpression_0': new MethodTrampoline( | 167 'parseAwaitExpression_0': new MethodTrampoline( |
| 239 0, | 168 0, (Parser target) => target._parseAwaitExpression()), |
| 240 (Parser target) => target._parseAwaitExpression()), | |
| 241 'parseBitwiseAndExpression_0': new MethodTrampoline( | 169 'parseBitwiseAndExpression_0': new MethodTrampoline( |
| 242 0, | 170 0, (Parser target) => target._parseBitwiseAndExpression()), |
| 243 (Parser target) => target._parseBitwiseAndExpression()), | |
| 244 'parseBitwiseXorExpression_0': new MethodTrampoline( | 171 'parseBitwiseXorExpression_0': new MethodTrampoline( |
| 245 0, | 172 0, (Parser target) => target._parseBitwiseXorExpression()), |
| 246 (Parser target) => target._parseBitwiseXorExpression()), | 173 'parseBreakStatement_0': |
| 247 'parseBreakStatement_0': new MethodTrampoline( | 174 new MethodTrampoline(0, (Parser target) => target._parseBreakStatement()), |
| 248 0, | 175 'parseCascadeSection_0': |
| 249 (Parser target) => target._parseBreakStatement()), | 176 new MethodTrampoline(0, (Parser target) => target._parseCascadeSection()), |
| 250 'parseCascadeSection_0': new MethodTrampoline( | 177 'parseClassDeclaration_2': new MethodTrampoline(2, |
| 251 0, | |
| 252 (Parser target) => target._parseCascadeSection()), | |
| 253 'parseClassDeclaration_2': new MethodTrampoline( | |
| 254 2, | |
| 255 (Parser target, arg0, arg1) => target._parseClassDeclaration(arg0, arg1)), | 178 (Parser target, arg0, arg1) => target._parseClassDeclaration(arg0, arg1)), |
| 256 'parseClassMembers_2': new MethodTrampoline( | 179 'parseClassMembers_2': new MethodTrampoline( |
| 257 2, | 180 2, (Parser target, arg0, arg1) => target._parseClassMembers(arg0, arg1)), |
| 258 (Parser target, arg0, arg1) => target._parseClassMembers(arg0, arg1)), | 181 'parseClassTypeAlias_3': new MethodTrampoline(3, (Parser target, arg0, arg1, |
| 259 'parseClassTypeAlias_3': new MethodTrampoline( | 182 arg2) => target._parseClassTypeAlias(arg0, arg1, arg2)), |
| 260 3, | 183 'parseCombinator_0': |
| 261 (Parser target, arg0, arg1, arg2) => | 184 new MethodTrampoline(0, (Parser target) => target.parseCombinator()), |
| 262 target._parseClassTypeAlias(arg0, arg1, arg2)), | 185 'parseCombinators_0': |
| 263 'parseCombinator_0': new MethodTrampoline( | 186 new MethodTrampoline(0, (Parser target) => target._parseCombinators()), |
| 264 0, | |
| 265 (Parser target) => target.parseCombinator()), | |
| 266 'parseCombinators_0': new MethodTrampoline( | |
| 267 0, | |
| 268 (Parser target) => target._parseCombinators()), | |
| 269 'parseCommentAndMetadata_0': new MethodTrampoline( | 187 'parseCommentAndMetadata_0': new MethodTrampoline( |
| 270 0, | 188 0, (Parser target) => target._parseCommentAndMetadata()), |
| 271 (Parser target) => target._parseCommentAndMetadata()), | 189 'parseCommentReference_2': new MethodTrampoline(2, |
| 272 'parseCommentReference_2': new MethodTrampoline( | |
| 273 2, | |
| 274 (Parser target, arg0, arg1) => target._parseCommentReference(arg0, arg1)), | 190 (Parser target, arg0, arg1) => target._parseCommentReference(arg0, arg1)), |
| 275 'parseCommentReferences_1': new MethodTrampoline( | 191 'parseCommentReferences_1': new MethodTrampoline( |
| 276 1, | 192 1, (Parser target, arg0) => target._parseCommentReferences(arg0)), |
| 277 (Parser target, arg0) => target._parseCommentReferences(arg0)), | |
| 278 'parseCompilationUnitMember_1': new MethodTrampoline( | 193 'parseCompilationUnitMember_1': new MethodTrampoline( |
| 279 1, | 194 1, (Parser target, arg0) => target._parseCompilationUnitMember(arg0)), |
| 280 (Parser target, arg0) => target._parseCompilationUnitMember(arg0)), | |
| 281 'parseConstExpression_0': new MethodTrampoline( | 195 'parseConstExpression_0': new MethodTrampoline( |
| 282 0, | 196 0, (Parser target) => target._parseConstExpression()), |
| 283 (Parser target) => target._parseConstExpression()), | 197 'parseConstructor_8': new MethodTrampoline(8, (Parser target, arg0, arg1, |
| 284 'parseConstructor_8': new MethodTrampoline( | 198 arg2, arg3, arg4, arg5, arg6, arg7) => |
| 285 8, | 199 target._parseConstructor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)), |
| 286 (Parser target, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) => | |
| 287 target._parseConstructor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg
7)), | |
| 288 'parseConstructorFieldInitializer_0': new MethodTrampoline( | 200 'parseConstructorFieldInitializer_0': new MethodTrampoline( |
| 289 0, | 201 0, (Parser target) => target._parseConstructorFieldInitializer()), |
| 290 (Parser target) => target._parseConstructorFieldInitializer()), | |
| 291 'parseContinueStatement_0': new MethodTrampoline( | 202 'parseContinueStatement_0': new MethodTrampoline( |
| 292 0, | 203 0, (Parser target) => target._parseContinueStatement()), |
| 293 (Parser target) => target._parseContinueStatement()), | |
| 294 'parseDirective_1': new MethodTrampoline( | 204 'parseDirective_1': new MethodTrampoline( |
| 295 1, | 205 1, (Parser target, arg0) => target._parseDirective(arg0)), |
| 296 (Parser target, arg0) => target._parseDirective(arg0)), | 206 'parseDirectives_0': |
| 297 'parseDirectives_0': new MethodTrampoline( | 207 new MethodTrampoline(0, (Parser target) => target._parseDirectives()), |
| 298 0, | |
| 299 (Parser target) => target._parseDirectives()), | |
| 300 'parseDocumentationComment_0': new MethodTrampoline( | 208 'parseDocumentationComment_0': new MethodTrampoline( |
| 301 0, | 209 0, (Parser target) => target._parseDocumentationComment()), |
| 302 (Parser target) => target._parseDocumentationComment()), | 210 'parseDoStatement_0': |
| 303 'parseDoStatement_0': new MethodTrampoline( | 211 new MethodTrampoline(0, (Parser target) => target._parseDoStatement()), |
| 304 0, | 212 'parseEmptyStatement_0': |
| 305 (Parser target) => target._parseDoStatement()), | 213 new MethodTrampoline(0, (Parser target) => target._parseEmptyStatement()), |
| 306 'parseEmptyStatement_0': new MethodTrampoline( | |
| 307 0, | |
| 308 (Parser target) => target._parseEmptyStatement()), | |
| 309 'parseEnumConstantDeclaration_0': new MethodTrampoline( | 214 'parseEnumConstantDeclaration_0': new MethodTrampoline( |
| 310 0, | 215 0, (Parser target) => target._parseEnumConstantDeclaration()), |
| 311 (Parser target) => target._parseEnumConstantDeclaration()), | |
| 312 'parseEnumDeclaration_1': new MethodTrampoline( | 216 'parseEnumDeclaration_1': new MethodTrampoline( |
| 313 1, | 217 1, (Parser target, arg0) => target._parseEnumDeclaration(arg0)), |
| 314 (Parser target, arg0) => target._parseEnumDeclaration(arg0)), | |
| 315 'parseEqualityExpression_0': new MethodTrampoline( | 218 'parseEqualityExpression_0': new MethodTrampoline( |
| 316 0, | 219 0, (Parser target) => target._parseEqualityExpression()), |
| 317 (Parser target) => target._parseEqualityExpression()), | |
| 318 'parseExportDirective_1': new MethodTrampoline( | 220 'parseExportDirective_1': new MethodTrampoline( |
| 319 1, | 221 1, (Parser target, arg0) => target._parseExportDirective(arg0)), |
| 320 (Parser target, arg0) => target._parseExportDirective(arg0)), | 222 'parseExpressionList_0': |
| 321 'parseExpressionList_0': new MethodTrampoline( | 223 new MethodTrampoline(0, (Parser target) => target._parseExpressionList()), |
| 322 0, | |
| 323 (Parser target) => target._parseExpressionList()), | |
| 324 'parseFinalConstVarOrType_1': new MethodTrampoline( | 224 'parseFinalConstVarOrType_1': new MethodTrampoline( |
| 325 1, | 225 1, (Parser target, arg0) => target._parseFinalConstVarOrType(arg0)), |
| 326 (Parser target, arg0) => target._parseFinalConstVarOrType(arg0)), | |
| 327 'parseFormalParameter_1': new MethodTrampoline( | 226 'parseFormalParameter_1': new MethodTrampoline( |
| 328 1, | 227 1, (Parser target, arg0) => target._parseFormalParameter(arg0)), |
| 329 (Parser target, arg0) => target._parseFormalParameter(arg0)), | 228 'parseForStatement_0': |
| 330 'parseForStatement_0': new MethodTrampoline( | 229 new MethodTrampoline(0, (Parser target) => target._parseForStatement()), |
| 331 0, | 230 'parseFunctionBody_3': new MethodTrampoline(3, (Parser target, arg0, arg1, |
| 332 (Parser target) => target._parseForStatement()), | 231 arg2) => target._parseFunctionBody(arg0, arg1, arg2)), |
| 333 'parseFunctionBody_3': new MethodTrampoline( | 232 'parseFunctionDeclaration_3': new MethodTrampoline(3, (Parser target, arg0, |
| 334 3, | 233 arg1, arg2) => target._parseFunctionDeclaration(arg0, arg1, arg2)), |
| 335 (Parser target, arg0, arg1, arg2) => | |
| 336 target._parseFunctionBody(arg0, arg1, arg2)), | |
| 337 'parseFunctionDeclaration_3': new MethodTrampoline( | |
| 338 3, | |
| 339 (Parser target, arg0, arg1, arg2) => | |
| 340 target._parseFunctionDeclaration(arg0, arg1, arg2)), | |
| 341 'parseFunctionDeclarationStatement_0': new MethodTrampoline( | 234 'parseFunctionDeclarationStatement_0': new MethodTrampoline( |
| 342 0, | 235 0, (Parser target) => target._parseFunctionDeclarationStatement()), |
| 343 (Parser target) => target._parseFunctionDeclarationStatement()), | 236 'parseFunctionDeclarationStatementAfterReturnType_2': new MethodTrampoline(2, |
| 344 'parseFunctionDeclarationStatementAfterReturnType_2': new MethodTrampoline( | |
| 345 2, | |
| 346 (Parser target, arg0, arg1) => | 237 (Parser target, arg0, arg1) => |
| 347 target._parseFunctionDeclarationStatementAfterReturnType(arg0, arg1)), | 238 target._parseFunctionDeclarationStatementAfterReturnType(arg0, arg1)), |
| 348 'parseFunctionTypeAlias_2': new MethodTrampoline( | 239 'parseFunctionTypeAlias_2': new MethodTrampoline(2, (Parser target, arg0, |
| 349 2, | 240 arg1) => target._parseFunctionTypeAlias(arg0, arg1)), |
| 350 (Parser target, arg0, arg1) => target._parseFunctionTypeAlias(arg0, arg1))
, | 241 'parseGetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, |
| 351 'parseGetter_4': new MethodTrampoline( | 242 arg3) => target._parseGetter(arg0, arg1, arg2, arg3)), |
| 352 4, | 243 'parseIdentifierList_0': |
| 353 (Parser target, arg0, arg1, arg2, arg3) => | 244 new MethodTrampoline(0, (Parser target) => target._parseIdentifierList()), |
| 354 target._parseGetter(arg0, arg1, arg2, arg3)), | 245 'parseIfStatement_0': |
| 355 'parseIdentifierList_0': new MethodTrampoline( | 246 new MethodTrampoline(0, (Parser target) => target._parseIfStatement()), |
| 356 0, | |
| 357 (Parser target) => target._parseIdentifierList()), | |
| 358 'parseIfStatement_0': new MethodTrampoline( | |
| 359 0, | |
| 360 (Parser target) => target._parseIfStatement()), | |
| 361 'parseImportDirective_1': new MethodTrampoline( | 247 'parseImportDirective_1': new MethodTrampoline( |
| 362 1, | 248 1, (Parser target, arg0) => target._parseImportDirective(arg0)), |
| 363 (Parser target, arg0) => target._parseImportDirective(arg0)), | 249 'parseInitializedIdentifierList_4': new MethodTrampoline(4, |
| 364 'parseInitializedIdentifierList_4': new MethodTrampoline( | |
| 365 4, | |
| 366 (Parser target, arg0, arg1, arg2, arg3) => | 250 (Parser target, arg0, arg1, arg2, arg3) => |
| 367 target._parseInitializedIdentifierList(arg0, arg1, arg2, arg3)), | 251 target._parseInitializedIdentifierList(arg0, arg1, arg2, arg3)), |
| 368 'parseInstanceCreationExpression_1': new MethodTrampoline( | 252 'parseInstanceCreationExpression_1': new MethodTrampoline(1, |
| 369 1, | |
| 370 (Parser target, arg0) => target._parseInstanceCreationExpression(arg0)), | 253 (Parser target, arg0) => target._parseInstanceCreationExpression(arg0)), |
| 371 'parseLibraryDirective_1': new MethodTrampoline( | 254 'parseLibraryDirective_1': new MethodTrampoline( |
| 372 1, | 255 1, (Parser target, arg0) => target._parseLibraryDirective(arg0)), |
| 373 (Parser target, arg0) => target._parseLibraryDirective(arg0)), | |
| 374 'parseLibraryName_2': new MethodTrampoline( | 256 'parseLibraryName_2': new MethodTrampoline( |
| 375 2, | 257 2, (Parser target, arg0, arg1) => target._parseLibraryName(arg0, arg1)), |
| 376 (Parser target, arg0, arg1) => target._parseLibraryName(arg0, arg1)), | |
| 377 'parseListLiteral_2': new MethodTrampoline( | 258 'parseListLiteral_2': new MethodTrampoline( |
| 378 2, | 259 2, (Parser target, arg0, arg1) => target._parseListLiteral(arg0, arg1)), |
| 379 (Parser target, arg0, arg1) => target._parseListLiteral(arg0, arg1)), | |
| 380 'parseListOrMapLiteral_1': new MethodTrampoline( | 260 'parseListOrMapLiteral_1': new MethodTrampoline( |
| 381 1, | 261 1, (Parser target, arg0) => target._parseListOrMapLiteral(arg0)), |
| 382 (Parser target, arg0) => target._parseListOrMapLiteral(arg0)), | |
| 383 'parseLogicalAndExpression_0': new MethodTrampoline( | 262 'parseLogicalAndExpression_0': new MethodTrampoline( |
| 384 0, | 263 0, (Parser target) => target._parseLogicalAndExpression()), |
| 385 (Parser target) => target._parseLogicalAndExpression()), | |
| 386 'parseMapLiteral_2': new MethodTrampoline( | 264 'parseMapLiteral_2': new MethodTrampoline( |
| 387 2, | 265 2, (Parser target, arg0, arg1) => target._parseMapLiteral(arg0, arg1)), |
| 388 (Parser target, arg0, arg1) => target._parseMapLiteral(arg0, arg1)), | 266 'parseMethodDeclarationAfterParameters_6': new MethodTrampoline(6, |
| 389 'parseMethodDeclarationAfterParameters_6': new MethodTrampoline( | 267 (Parser target, arg0, arg1, arg2, arg3, arg4, arg5) => target |
| 390 6, | 268 ._parseMethodDeclarationAfterParameters( |
| 391 (Parser target, arg0, arg1, arg2, arg3, arg4, arg5) => | 269 arg0, arg1, arg2, arg3, arg4, arg5)), |
| 392 target._parseMethodDeclarationAfterParameters( | 270 'parseMethodDeclarationAfterReturnType_4': new MethodTrampoline(4, |
| 393 arg0, | 271 (Parser target, arg0, arg1, arg2, arg3) => target |
| 394 arg1, | 272 ._parseMethodDeclarationAfterReturnType(arg0, arg1, arg2, arg3)), |
| 395 arg2, | 273 'parseModifiers_0': |
| 396 arg3, | 274 new MethodTrampoline(0, (Parser target) => target._parseModifiers()), |
| 397 arg4, | |
| 398 arg5)), | |
| 399 'parseMethodDeclarationAfterReturnType_4': new MethodTrampoline( | |
| 400 4, | |
| 401 (Parser target, arg0, arg1, arg2, arg3) => | |
| 402 target._parseMethodDeclarationAfterReturnType(arg0, arg1, arg2, arg3))
, | |
| 403 'parseModifiers_0': new MethodTrampoline( | |
| 404 0, | |
| 405 (Parser target) => target._parseModifiers()), | |
| 406 'parseMultiplicativeExpression_0': new MethodTrampoline( | 275 'parseMultiplicativeExpression_0': new MethodTrampoline( |
| 407 0, | 276 0, (Parser target) => target._parseMultiplicativeExpression()), |
| 408 (Parser target) => target._parseMultiplicativeExpression()), | 277 'parseNativeClause_0': |
| 409 'parseNativeClause_0': new MethodTrampoline( | 278 new MethodTrampoline(0, (Parser target) => target._parseNativeClause()), |
| 410 0, | 279 'parseNewExpression_0': |
| 411 (Parser target) => target._parseNativeClause()), | 280 new MethodTrampoline(0, (Parser target) => target._parseNewExpression()), |
| 412 'parseNewExpression_0': new MethodTrampoline( | |
| 413 0, | |
| 414 (Parser target) => target._parseNewExpression()), | |
| 415 'parseNonLabeledStatement_0': new MethodTrampoline( | 281 'parseNonLabeledStatement_0': new MethodTrampoline( |
| 416 0, | 282 0, (Parser target) => target._parseNonLabeledStatement()), |
| 417 (Parser target) => target._parseNonLabeledStatement()), | 283 'parseOperator_3': new MethodTrampoline(3, (Parser target, arg0, arg1, |
| 418 'parseOperator_3': new MethodTrampoline( | 284 arg2) => target._parseOperator(arg0, arg1, arg2)), |
| 419 3, | |
| 420 (Parser target, arg0, arg1, arg2) => target._parseOperator(arg0, arg1, arg
2)), | |
| 421 'parseOptionalReturnType_0': new MethodTrampoline( | 285 'parseOptionalReturnType_0': new MethodTrampoline( |
| 422 0, | 286 0, (Parser target) => target._parseOptionalReturnType()), |
| 423 (Parser target) => target._parseOptionalReturnType()), | |
| 424 'parsePartDirective_1': new MethodTrampoline( | 287 'parsePartDirective_1': new MethodTrampoline( |
| 425 1, | 288 1, (Parser target, arg0) => target._parsePartDirective(arg0)), |
| 426 (Parser target, arg0) => target._parsePartDirective(arg0)), | |
| 427 'parsePostfixExpression_0': new MethodTrampoline( | 289 'parsePostfixExpression_0': new MethodTrampoline( |
| 428 0, | 290 0, (Parser target) => target._parsePostfixExpression()), |
| 429 (Parser target) => target._parsePostfixExpression()), | |
| 430 'parsePrimaryExpression_0': new MethodTrampoline( | 291 'parsePrimaryExpression_0': new MethodTrampoline( |
| 431 0, | 292 0, (Parser target) => target._parsePrimaryExpression()), |
| 432 (Parser target) => target._parsePrimaryExpression()), | |
| 433 'parseRedirectingConstructorInvocation_0': new MethodTrampoline( | 293 'parseRedirectingConstructorInvocation_0': new MethodTrampoline( |
| 434 0, | 294 0, (Parser target) => target._parseRedirectingConstructorInvocation()), |
| 435 (Parser target) => target._parseRedirectingConstructorInvocation()), | |
| 436 'parseRelationalExpression_0': new MethodTrampoline( | 295 'parseRelationalExpression_0': new MethodTrampoline( |
| 437 0, | 296 0, (Parser target) => target._parseRelationalExpression()), |
| 438 (Parser target) => target._parseRelationalExpression()), | |
| 439 'parseRethrowExpression_0': new MethodTrampoline( | 297 'parseRethrowExpression_0': new MethodTrampoline( |
| 440 0, | 298 0, (Parser target) => target._parseRethrowExpression()), |
| 441 (Parser target) => target._parseRethrowExpression()), | |
| 442 'parseReturnStatement_0': new MethodTrampoline( | 299 'parseReturnStatement_0': new MethodTrampoline( |
| 443 0, | 300 0, (Parser target) => target._parseReturnStatement()), |
| 444 (Parser target) => target._parseReturnStatement()), | 301 'parseSetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, |
| 445 'parseSetter_4': new MethodTrampoline( | 302 arg3) => target._parseSetter(arg0, arg1, arg2, arg3)), |
| 446 4, | |
| 447 (Parser target, arg0, arg1, arg2, arg3) => | |
| 448 target._parseSetter(arg0, arg1, arg2, arg3)), | |
| 449 'parseShiftExpression_0': new MethodTrampoline( | 303 'parseShiftExpression_0': new MethodTrampoline( |
| 450 0, | 304 0, (Parser target) => target._parseShiftExpression()), |
| 451 (Parser target) => target._parseShiftExpression()), | 305 'parseStatementList_0': |
| 452 'parseStatementList_0': new MethodTrampoline( | 306 new MethodTrampoline(0, (Parser target) => target._parseStatementList()), |
| 453 0, | |
| 454 (Parser target) => target._parseStatementList()), | |
| 455 'parseStringInterpolation_1': new MethodTrampoline( | 307 'parseStringInterpolation_1': new MethodTrampoline( |
| 456 1, | 308 1, (Parser target, arg0) => target._parseStringInterpolation(arg0)), |
| 457 (Parser target, arg0) => target._parseStringInterpolation(arg0)), | |
| 458 'parseSuperConstructorInvocation_0': new MethodTrampoline( | 309 'parseSuperConstructorInvocation_0': new MethodTrampoline( |
| 459 0, | 310 0, (Parser target) => target._parseSuperConstructorInvocation()), |
| 460 (Parser target) => target._parseSuperConstructorInvocation()), | |
| 461 'parseSwitchStatement_0': new MethodTrampoline( | 311 'parseSwitchStatement_0': new MethodTrampoline( |
| 462 0, | 312 0, (Parser target) => target._parseSwitchStatement()), |
| 463 (Parser target) => target._parseSwitchStatement()), | 313 'parseSymbolLiteral_0': |
| 464 'parseSymbolLiteral_0': new MethodTrampoline( | 314 new MethodTrampoline(0, (Parser target) => target._parseSymbolLiteral()), |
| 465 0, | |
| 466 (Parser target) => target._parseSymbolLiteral()), | |
| 467 'parseThrowExpression_0': new MethodTrampoline( | 315 'parseThrowExpression_0': new MethodTrampoline( |
| 468 0, | 316 0, (Parser target) => target._parseThrowExpression()), |
| 469 (Parser target) => target._parseThrowExpression()), | |
| 470 'parseThrowExpressionWithoutCascade_0': new MethodTrampoline( | 317 'parseThrowExpressionWithoutCascade_0': new MethodTrampoline( |
| 471 0, | 318 0, (Parser target) => target._parseThrowExpressionWithoutCascade()), |
| 472 (Parser target) => target._parseThrowExpressionWithoutCascade()), | 319 'parseTryStatement_0': |
| 473 'parseTryStatement_0': new MethodTrampoline( | 320 new MethodTrampoline(0, (Parser target) => target._parseTryStatement()), |
| 474 0, | |
| 475 (Parser target) => target._parseTryStatement()), | |
| 476 'parseTypeAlias_1': new MethodTrampoline( | 321 'parseTypeAlias_1': new MethodTrampoline( |
| 477 1, | 322 1, (Parser target, arg0) => target._parseTypeAlias(arg0)), |
| 478 (Parser target, arg0) => target._parseTypeAlias(arg0)), | |
| 479 'parseUnaryExpression_0': new MethodTrampoline( | 323 'parseUnaryExpression_0': new MethodTrampoline( |
| 480 0, | 324 0, (Parser target) => target._parseUnaryExpression()), |
| 481 (Parser target) => target._parseUnaryExpression()), | |
| 482 'parseVariableDeclaration_0': new MethodTrampoline( | 325 'parseVariableDeclaration_0': new MethodTrampoline( |
| 483 0, | 326 0, (Parser target) => target._parseVariableDeclaration()), |
| 484 (Parser target) => target._parseVariableDeclaration()), | 327 'parseVariableDeclarationListAfterMetadata_1': new MethodTrampoline(1, |
| 485 'parseVariableDeclarationListAfterMetadata_1': new MethodTrampoline( | |
| 486 1, | |
| 487 (Parser target, arg0) => | 328 (Parser target, arg0) => |
| 488 target._parseVariableDeclarationListAfterMetadata(arg0)), | 329 target._parseVariableDeclarationListAfterMetadata(arg0)), |
| 489 'parseVariableDeclarationListAfterType_3': new MethodTrampoline( | 330 'parseVariableDeclarationListAfterType_3': new MethodTrampoline(3, |
| 490 3, | |
| 491 (Parser target, arg0, arg1, arg2) => | 331 (Parser target, arg0, arg1, arg2) => |
| 492 target._parseVariableDeclarationListAfterType(arg0, arg1, arg2)), | 332 target._parseVariableDeclarationListAfterType(arg0, arg1, arg2)), |
| 493 'parseVariableDeclarationStatementAfterMetadata_1': new MethodTrampoline( | 333 'parseVariableDeclarationStatementAfterMetadata_1': new MethodTrampoline(1, |
| 494 1, | |
| 495 (Parser target, arg0) => | 334 (Parser target, arg0) => |
| 496 target._parseVariableDeclarationStatementAfterMetadata(arg0)), | 335 target._parseVariableDeclarationStatementAfterMetadata(arg0)), |
| 497 'parseVariableDeclarationStatementAfterType_3': new MethodTrampoline( | 336 'parseVariableDeclarationStatementAfterType_3': new MethodTrampoline(3, |
| 498 3, | |
| 499 (Parser target, arg0, arg1, arg2) => | 337 (Parser target, arg0, arg1, arg2) => |
| 500 target._parseVariableDeclarationStatementAfterType(arg0, arg1, arg2)), | 338 target._parseVariableDeclarationStatementAfterType(arg0, arg1, arg2)), |
| 501 'parseWhileStatement_0': new MethodTrampoline( | 339 'parseWhileStatement_0': |
| 502 0, | 340 new MethodTrampoline(0, (Parser target) => target._parseWhileStatement()), |
| 503 (Parser target) => target._parseWhileStatement()), | 341 'parseYieldStatement_0': |
| 504 'parseYieldStatement_0': new MethodTrampoline( | 342 new MethodTrampoline(0, (Parser target) => target._parseYieldStatement()), |
| 505 0, | |
| 506 (Parser target) => target._parseYieldStatement()), | |
| 507 'peek_0': new MethodTrampoline(0, (Parser target) => target._peek()), | 343 'peek_0': new MethodTrampoline(0, (Parser target) => target._peek()), |
| 508 'peekAt_1': new MethodTrampoline( | 344 'peekAt_1': |
| 509 1, | 345 new MethodTrampoline(1, (Parser target, arg0) => target._peekAt(arg0)), |
| 510 (Parser target, arg0) => target._peekAt(arg0)), | |
| 511 'reportError_1': new MethodTrampoline( | 346 'reportError_1': new MethodTrampoline( |
| 512 1, | 347 1, (Parser target, arg0) => target._reportError(arg0)), |
| 513 (Parser target, arg0) => target._reportError(arg0)), | 348 'reportErrorForCurrentToken_2': new MethodTrampoline(2, (Parser target, arg0, |
| 514 'reportErrorForCurrentToken_2': new MethodTrampoline( | 349 arg1) => target._reportErrorForCurrentToken(arg0, arg1)), |
| 515 2, | 350 'reportErrorForNode_3': new MethodTrampoline(3, (Parser target, arg0, arg1, |
| 516 (Parser target, arg0, arg1) => target._reportErrorForCurrentToken(arg0, ar
g1)), | 351 arg2) => target._reportErrorForNode(arg0, arg1, arg2)), |
| 517 'reportErrorForNode_3': new MethodTrampoline( | 352 'reportErrorForToken_3': new MethodTrampoline(3, (Parser target, arg0, arg1, |
| 518 3, | 353 arg2) => target._reportErrorForToken(arg0, arg1, arg2)), |
| 519 (Parser target, arg0, arg1, arg2) => | 354 'skipBlock_0': |
| 520 target._reportErrorForNode(arg0, arg1, arg2)), | 355 new MethodTrampoline(0, (Parser target) => target._skipBlock()), |
| 521 'reportErrorForToken_3': new MethodTrampoline( | |
| 522 3, | |
| 523 (Parser target, arg0, arg1, arg2) => | |
| 524 target._reportErrorForToken(arg0, arg1, arg2)), | |
| 525 'skipBlock_0': new MethodTrampoline( | |
| 526 0, | |
| 527 (Parser target) => target._skipBlock()), | |
| 528 'skipFinalConstVarOrType_1': new MethodTrampoline( | 356 'skipFinalConstVarOrType_1': new MethodTrampoline( |
| 529 1, | 357 1, (Parser target, arg0) => target._skipFinalConstVarOrType(arg0)), |
| 530 (Parser target, arg0) => target._skipFinalConstVarOrType(arg0)), | |
| 531 'skipFormalParameterList_1': new MethodTrampoline( | 358 'skipFormalParameterList_1': new MethodTrampoline( |
| 532 1, | 359 1, (Parser target, arg0) => target._skipFormalParameterList(arg0)), |
| 533 (Parser target, arg0) => target._skipFormalParameterList(arg0)), | |
| 534 'skipPastMatchingToken_1': new MethodTrampoline( | 360 'skipPastMatchingToken_1': new MethodTrampoline( |
| 535 1, | 361 1, (Parser target, arg0) => target._skipPastMatchingToken(arg0)), |
| 536 (Parser target, arg0) => target._skipPastMatchingToken(arg0)), | |
| 537 'skipPrefixedIdentifier_1': new MethodTrampoline( | 362 'skipPrefixedIdentifier_1': new MethodTrampoline( |
| 538 1, | 363 1, (Parser target, arg0) => target._skipPrefixedIdentifier(arg0)), |
| 539 (Parser target, arg0) => target._skipPrefixedIdentifier(arg0)), | |
| 540 'skipReturnType_1': new MethodTrampoline( | 364 'skipReturnType_1': new MethodTrampoline( |
| 541 1, | 365 1, (Parser target, arg0) => target._skipReturnType(arg0)), |
| 542 (Parser target, arg0) => target._skipReturnType(arg0)), | |
| 543 'skipSimpleIdentifier_1': new MethodTrampoline( | 366 'skipSimpleIdentifier_1': new MethodTrampoline( |
| 544 1, | 367 1, (Parser target, arg0) => target._skipSimpleIdentifier(arg0)), |
| 545 (Parser target, arg0) => target._skipSimpleIdentifier(arg0)), | |
| 546 'skipStringInterpolation_1': new MethodTrampoline( | 368 'skipStringInterpolation_1': new MethodTrampoline( |
| 547 1, | 369 1, (Parser target, arg0) => target._skipStringInterpolation(arg0)), |
| 548 (Parser target, arg0) => target._skipStringInterpolation(arg0)), | |
| 549 'skipStringLiteral_1': new MethodTrampoline( | 370 'skipStringLiteral_1': new MethodTrampoline( |
| 550 1, | 371 1, (Parser target, arg0) => target._skipStringLiteral(arg0)), |
| 551 (Parser target, arg0) => target._skipStringLiteral(arg0)), | |
| 552 'skipTypeArgumentList_1': new MethodTrampoline( | 372 'skipTypeArgumentList_1': new MethodTrampoline( |
| 553 1, | 373 1, (Parser target, arg0) => target._skipTypeArgumentList(arg0)), |
| 554 (Parser target, arg0) => target._skipTypeArgumentList(arg0)), | |
| 555 'skipTypeName_1': new MethodTrampoline( | 374 'skipTypeName_1': new MethodTrampoline( |
| 556 1, | 375 1, (Parser target, arg0) => target._skipTypeName(arg0)), |
| 557 (Parser target, arg0) => target._skipTypeName(arg0)), | |
| 558 'skipTypeParameterList_1': new MethodTrampoline( | 376 'skipTypeParameterList_1': new MethodTrampoline( |
| 559 1, | 377 1, (Parser target, arg0) => target._skipTypeParameterList(arg0)), |
| 560 (Parser target, arg0) => target._skipTypeParameterList(arg0)), | |
| 561 'tokenMatches_2': new MethodTrampoline( | 378 'tokenMatches_2': new MethodTrampoline( |
| 562 2, | 379 2, (Parser target, arg0, arg1) => target._tokenMatches(arg0, arg1)), |
| 563 (Parser target, arg0, arg1) => target._tokenMatches(arg0, arg1)), | |
| 564 'tokenMatchesIdentifier_1': new MethodTrampoline( | 380 'tokenMatchesIdentifier_1': new MethodTrampoline( |
| 565 1, | 381 1, (Parser target, arg0) => target._tokenMatchesIdentifier(arg0)), |
| 566 (Parser target, arg0) => target._tokenMatchesIdentifier(arg0)), | 382 'tokenMatchesKeyword_2': new MethodTrampoline(2, |
| 567 'tokenMatchesKeyword_2': new MethodTrampoline( | |
| 568 2, | |
| 569 (Parser target, arg0, arg1) => target._tokenMatchesKeyword(arg0, arg1)), | 383 (Parser target, arg0, arg1) => target._tokenMatchesKeyword(arg0, arg1)), |
| 570 'tokenMatchesString_2': new MethodTrampoline( | 384 'tokenMatchesString_2': new MethodTrampoline( |
| 571 2, | 385 2, (Parser target, arg0, arg1) => target._tokenMatchesString(arg0, arg1)), |
| 572 (Parser target, arg0, arg1) => target._tokenMatchesString(arg0, arg1)), | 386 'translateCharacter_3': new MethodTrampoline(3, (Parser target, arg0, arg1, |
| 573 'translateCharacter_3': new MethodTrampoline( | 387 arg2) => target._translateCharacter(arg0, arg1, arg2)), |
| 574 3, | 388 'unlockErrorListener_0': |
| 575 (Parser target, arg0, arg1, arg2) => | 389 new MethodTrampoline(0, (Parser target) => target._unlockErrorListener()), |
| 576 target._translateCharacter(arg0, arg1, arg2)), | |
| 577 'unlockErrorListener_0': new MethodTrampoline( | |
| 578 0, | |
| 579 (Parser target) => target._unlockErrorListener()), | |
| 580 'validateFormalParameterList_1': new MethodTrampoline( | 390 'validateFormalParameterList_1': new MethodTrampoline( |
| 581 1, | 391 1, (Parser target, arg0) => target._validateFormalParameterList(arg0)), |
| 582 (Parser target, arg0) => target._validateFormalParameterList(arg0)), | |
| 583 'validateModifiersForClass_1': new MethodTrampoline( | 392 'validateModifiersForClass_1': new MethodTrampoline( |
| 584 1, | 393 1, (Parser target, arg0) => target._validateModifiersForClass(arg0)), |
| 585 (Parser target, arg0) => target._validateModifiersForClass(arg0)), | 394 'validateModifiersForConstructor_1': new MethodTrampoline(1, |
| 586 'validateModifiersForConstructor_1': new MethodTrampoline( | |
| 587 1, | |
| 588 (Parser target, arg0) => target._validateModifiersForConstructor(arg0)), | 395 (Parser target, arg0) => target._validateModifiersForConstructor(arg0)), |
| 589 'validateModifiersForEnum_1': new MethodTrampoline( | 396 'validateModifiersForEnum_1': new MethodTrampoline( |
| 590 1, | 397 1, (Parser target, arg0) => target._validateModifiersForEnum(arg0)), |
| 591 (Parser target, arg0) => target._validateModifiersForEnum(arg0)), | |
| 592 'validateModifiersForField_1': new MethodTrampoline( | 398 'validateModifiersForField_1': new MethodTrampoline( |
| 593 1, | 399 1, (Parser target, arg0) => target._validateModifiersForField(arg0)), |
| 594 (Parser target, arg0) => target._validateModifiersForField(arg0)), | 400 'validateModifiersForFunctionDeclarationStatement_1': new MethodTrampoline(1, |
| 595 'validateModifiersForFunctionDeclarationStatement_1': new MethodTrampoline( | |
| 596 1, | |
| 597 (Parser target, arg0) => | 401 (Parser target, arg0) => |
| 598 target._validateModifiersForFunctionDeclarationStatement(arg0)), | 402 target._validateModifiersForFunctionDeclarationStatement(arg0)), |
| 599 'validateModifiersForGetterOrSetterOrMethod_1': new MethodTrampoline( | 403 'validateModifiersForGetterOrSetterOrMethod_1': new MethodTrampoline(1, |
| 600 1, | |
| 601 (Parser target, arg0) => | 404 (Parser target, arg0) => |
| 602 target._validateModifiersForGetterOrSetterOrMethod(arg0)), | 405 target._validateModifiersForGetterOrSetterOrMethod(arg0)), |
| 603 'validateModifiersForOperator_1': new MethodTrampoline( | 406 'validateModifiersForOperator_1': new MethodTrampoline( |
| 604 1, | 407 1, (Parser target, arg0) => target._validateModifiersForOperator(arg0)), |
| 605 (Parser target, arg0) => target._validateModifiersForOperator(arg0)), | 408 'validateModifiersForTopLevelDeclaration_1': new MethodTrampoline(1, |
| 606 'validateModifiersForTopLevelDeclaration_1': new MethodTrampoline( | 409 (Parser target, arg0) => |
| 607 1, | 410 target._validateModifiersForTopLevelDeclaration(arg0)), |
| 608 (Parser target, arg0) => target._validateModifiersForTopLevelDeclaration(a
rg0)), | 411 'validateModifiersForTopLevelFunction_1': new MethodTrampoline(1, |
| 609 'validateModifiersForTopLevelFunction_1': new MethodTrampoline( | 412 (Parser target, arg0) => |
| 610 1, | 413 target._validateModifiersForTopLevelFunction(arg0)), |
| 611 (Parser target, arg0) => target._validateModifiersForTopLevelFunction(arg0
)), | 414 'validateModifiersForTopLevelVariable_1': new MethodTrampoline(1, |
| 612 'validateModifiersForTopLevelVariable_1': new MethodTrampoline( | 415 (Parser target, arg0) => |
| 613 1, | 416 target._validateModifiersForTopLevelVariable(arg0)), |
| 614 (Parser target, arg0) => target._validateModifiersForTopLevelVariable(arg0
)), | |
| 615 'validateModifiersForTypedef_1': new MethodTrampoline( | 417 'validateModifiersForTypedef_1': new MethodTrampoline( |
| 616 1, | 418 1, (Parser target, arg0) => target._validateModifiersForTypedef(arg0)), |
| 617 (Parser target, arg0) => target._validateModifiersForTypedef(arg0)), | |
| 618 }; | 419 }; |
| 619 | 420 |
| 620 Object invokeParserMethodImpl(Parser parser, String methodName, | 421 Object invokeParserMethodImpl( |
| 621 List<Object> objects, Token tokenStream) { | 422 Parser parser, String methodName, List<Object> objects, Token tokenStream) { |
| 622 parser.currentToken = tokenStream; | 423 parser.currentToken = tokenStream; |
| 623 MethodTrampoline method = | 424 MethodTrampoline method = |
| 624 methodTable_Parser['${methodName}_${objects.length}']; | 425 methodTable_Parser['${methodName}_${objects.length}']; |
| 625 return method.invoke(parser, objects); | 426 return method.invoke(parser, objects); |
| 626 } | 427 } |
| 627 | 428 |
| 628 /** | 429 /** |
| 629 * Instances of the class `CommentAndMetadata` implement a simple data-holder fo
r a method | 430 * Instances of the class `CommentAndMetadata` implement a simple data-holder fo
r a method |
| 630 * that needs to return multiple values. | 431 * that needs to return multiple values. |
| 631 */ | 432 */ |
| (...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1503 AstNode visitPropertyAccess(PropertyAccess node) { | 1304 AstNode visitPropertyAccess(PropertyAccess node) { |
| 1504 if (identical(_oldNode, node.target)) { | 1305 if (identical(_oldNode, node.target)) { |
| 1505 throw new InsufficientContextException(); | 1306 throw new InsufficientContextException(); |
| 1506 } else if (identical(_oldNode, node.propertyName)) { | 1307 } else if (identical(_oldNode, node.propertyName)) { |
| 1507 return _parser.parseSimpleIdentifier(); | 1308 return _parser.parseSimpleIdentifier(); |
| 1508 } | 1309 } |
| 1509 return _notAChild(node); | 1310 return _notAChild(node); |
| 1510 } | 1311 } |
| 1511 | 1312 |
| 1512 @override | 1313 @override |
| 1513 AstNode | 1314 AstNode visitRedirectingConstructorInvocation( |
| 1514 visitRedirectingConstructorInvocation(RedirectingConstructorInvocation nod
e) { | 1315 RedirectingConstructorInvocation node) { |
| 1515 if (identical(_oldNode, node.constructorName)) { | 1316 if (identical(_oldNode, node.constructorName)) { |
| 1516 return _parser.parseSimpleIdentifier(); | 1317 return _parser.parseSimpleIdentifier(); |
| 1517 } else if (identical(_oldNode, node.argumentList)) { | 1318 } else if (identical(_oldNode, node.argumentList)) { |
| 1518 return _parser.parseArgumentList(); | 1319 return _parser.parseArgumentList(); |
| 1519 } | 1320 } |
| 1520 return _notAChild(node); | 1321 return _notAChild(node); |
| 1521 } | 1322 } |
| 1522 | 1323 |
| 1523 @override | 1324 @override |
| 1524 AstNode visitRethrowExpression(RethrowExpression node) => _notAChild(node); | 1325 AstNode visitRethrowExpression(RethrowExpression node) => _notAChild(node); |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1893 firstToken = leftToken; | 1694 firstToken = leftToken; |
| 1894 } | 1695 } |
| 1895 // | 1696 // |
| 1896 // Find the smallest AST node that encompasses the range of re-scanned | 1697 // Find the smallest AST node that encompasses the range of re-scanned |
| 1897 // tokens. | 1698 // tokens. |
| 1898 // | 1699 // |
| 1899 if (originalEnd < originalStart) { | 1700 if (originalEnd < originalStart) { |
| 1900 oldNode = | 1701 oldNode = |
| 1901 new NodeLocator.con1(originalStart).searchWithin(originalStructure); | 1702 new NodeLocator.con1(originalStart).searchWithin(originalStructure); |
| 1902 } else { | 1703 } else { |
| 1903 oldNode = new NodeLocator.con2( | 1704 oldNode = new NodeLocator.con2(originalStart, originalEnd) |
| 1904 originalStart, | 1705 .searchWithin(originalStructure); |
| 1905 originalEnd).searchWithin(originalStructure); | |
| 1906 } | 1706 } |
| 1907 // | 1707 // |
| 1908 // Find the token at which parsing is to begin. | 1708 // Find the token at which parsing is to begin. |
| 1909 // | 1709 // |
| 1910 int originalOffset = oldNode.offset; | 1710 int originalOffset = oldNode.offset; |
| 1911 Token parseToken = _findTokenAt(firstToken, originalOffset); | 1711 Token parseToken = _findTokenAt(firstToken, originalOffset); |
| 1912 if (parseToken == null) { | 1712 if (parseToken == null) { |
| 1913 return null; | 1713 return null; |
| 1914 } | 1714 } |
| 1915 // | 1715 // |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2137 case 0: | 1937 case 0: |
| 2138 return trampoline(target); | 1938 return trampoline(target); |
| 2139 case 1: | 1939 case 1: |
| 2140 return trampoline(target, arguments[0]); | 1940 return trampoline(target, arguments[0]); |
| 2141 case 2: | 1941 case 2: |
| 2142 return trampoline(target, arguments[0], arguments[1]); | 1942 return trampoline(target, arguments[0], arguments[1]); |
| 2143 case 3: | 1943 case 3: |
| 2144 return trampoline(target, arguments[0], arguments[1], arguments[2]); | 1944 return trampoline(target, arguments[0], arguments[1], arguments[2]); |
| 2145 case 4: | 1945 case 4: |
| 2146 return trampoline( | 1946 return trampoline( |
| 2147 target, | 1947 target, arguments[0], arguments[1], arguments[2], arguments[3]); |
| 2148 arguments[0], | |
| 2149 arguments[1], | |
| 2150 arguments[2], | |
| 2151 arguments[3]); | |
| 2152 default: | 1948 default: |
| 2153 throw new IllegalArgumentException("Not implemented for > 4 arguments"); | 1949 throw new IllegalArgumentException("Not implemented for > 4 arguments"); |
| 2154 } | 1950 } |
| 2155 } | 1951 } |
| 2156 } | 1952 } |
| 2157 | 1953 |
| 2158 /** | 1954 /** |
| 2159 * Instances of the class `Modifiers` implement a simple data-holder for a metho
d that needs | 1955 * Instances of the class `Modifiers` implement a simple data-holder for a metho
d that needs |
| 2160 * to return multiple values. | 1956 * to return multiple values. |
| 2161 */ | 1957 */ |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2458 _inInitializer = false; | 2254 _inInitializer = false; |
| 2459 try { | 2255 try { |
| 2460 Expression argument = parseArgument(); | 2256 Expression argument = parseArgument(); |
| 2461 arguments.add(argument); | 2257 arguments.add(argument); |
| 2462 bool foundNamedArgument = argument is NamedExpression; | 2258 bool foundNamedArgument = argument is NamedExpression; |
| 2463 bool generatedError = false; | 2259 bool generatedError = false; |
| 2464 while (_optional(TokenType.COMMA)) { | 2260 while (_optional(TokenType.COMMA)) { |
| 2465 argument = parseArgument(); | 2261 argument = parseArgument(); |
| 2466 arguments.add(argument); | 2262 arguments.add(argument); |
| 2467 if (foundNamedArgument) { | 2263 if (foundNamedArgument) { |
| 2468 bool blankArgument = | 2264 bool blankArgument = argument is SimpleIdentifier && |
| 2469 argument is SimpleIdentifier && | |
| 2470 (argument as SimpleIdentifier).name.isEmpty; | 2265 (argument as SimpleIdentifier).name.isEmpty; |
| 2471 if (!generatedError && | 2266 if (!generatedError && |
| 2472 !(argument is NamedExpression && !blankArgument)) { | 2267 !(argument is NamedExpression && !blankArgument)) { |
| 2473 // Report the error, once, but allow the arguments to be in any | 2268 // Report the error, once, but allow the arguments to be in any |
| 2474 // order in the AST. | 2269 // order in the AST. |
| 2475 _reportErrorForCurrentToken( | 2270 _reportErrorForCurrentToken( |
| 2476 ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT); | 2271 ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT); |
| 2477 generatedError = true; | 2272 generatedError = true; |
| 2478 } | 2273 } |
| 2479 } else if (argument is NamedExpression) { | 2274 } else if (argument is NamedExpression) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2504 Expression parseBitwiseOrExpression() { | 2299 Expression parseBitwiseOrExpression() { |
| 2505 Expression expression; | 2300 Expression expression; |
| 2506 if (_matchesKeyword(Keyword.SUPER) && | 2301 if (_matchesKeyword(Keyword.SUPER) && |
| 2507 _tokenMatches(_peek(), TokenType.BAR)) { | 2302 _tokenMatches(_peek(), TokenType.BAR)) { |
| 2508 expression = new SuperExpression(getAndAdvance()); | 2303 expression = new SuperExpression(getAndAdvance()); |
| 2509 } else { | 2304 } else { |
| 2510 expression = _parseBitwiseXorExpression(); | 2305 expression = _parseBitwiseXorExpression(); |
| 2511 } | 2306 } |
| 2512 while (_matches(TokenType.BAR)) { | 2307 while (_matches(TokenType.BAR)) { |
| 2513 Token operator = getAndAdvance(); | 2308 Token operator = getAndAdvance(); |
| 2514 expression = | 2309 expression = new BinaryExpression( |
| 2515 new BinaryExpression(expression, operator, _parseBitwiseXorExpression(
)); | 2310 expression, operator, _parseBitwiseXorExpression()); |
| 2516 } | 2311 } |
| 2517 return expression; | 2312 return expression; |
| 2518 } | 2313 } |
| 2519 | 2314 |
| 2520 /** | 2315 /** |
| 2521 * Parse a block. | 2316 * Parse a block. |
| 2522 * | 2317 * |
| 2523 * <pre> | 2318 * <pre> |
| 2524 * block ::= | 2319 * block ::= |
| 2525 * '{' statements '}' | 2320 * '{' statements '}' |
| 2526 * </pre> | 2321 * </pre> |
| 2527 * | 2322 * |
| 2528 * @return the block that was parsed | 2323 * @return the block that was parsed |
| 2529 */ | 2324 */ |
| 2530 Block parseBlock() { | 2325 Block parseBlock() { |
| 2531 Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); | 2326 Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); |
| 2532 List<Statement> statements = new List<Statement>(); | 2327 List<Statement> statements = new List<Statement>(); |
| 2533 Token statementStart = _currentToken; | 2328 Token statementStart = _currentToken; |
| 2534 while (!_matches(TokenType.EOF) && | 2329 while ( |
| 2535 !_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 2330 !_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 2536 Statement statement = parseStatement2(); | 2331 Statement statement = parseStatement2(); |
| 2537 if (statement != null) { | 2332 if (statement != null) { |
| 2538 statements.add(statement); | 2333 statements.add(statement); |
| 2539 } | 2334 } |
| 2540 if (identical(_currentToken, statementStart)) { | 2335 if (identical(_currentToken, statementStart)) { |
| 2541 // Ensure that we are making progress and report an error if we're not. | 2336 // Ensure that we are making progress and report an error if we're not. |
| 2542 _reportErrorForToken( | 2337 _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, |
| 2543 ParserErrorCode.UNEXPECTED_TOKEN, | |
| 2544 _currentToken, | |
| 2545 [_currentToken.lexeme]); | 2338 [_currentToken.lexeme]); |
| 2546 _advance(); | 2339 _advance(); |
| 2547 } | 2340 } |
| 2548 statementStart = _currentToken; | 2341 statementStart = _currentToken; |
| 2549 } | 2342 } |
| 2550 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 2343 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 2551 return new Block(leftBracket, statements, rightBracket); | 2344 return new Block(leftBracket, statements, rightBracket); |
| 2552 } | 2345 } |
| 2553 | 2346 |
| 2554 /** | 2347 /** |
| 2555 * Parse a class member. | 2348 * Parse a class member. |
| 2556 * | 2349 * |
| 2557 * <pre> | 2350 * <pre> |
| 2558 * classMemberDefinition ::= | 2351 * classMemberDefinition ::= |
| 2559 * declaration ';' | 2352 * declaration ';' |
| 2560 * | methodSignature functionBody | 2353 * | methodSignature functionBody |
| 2561 * </pre> | 2354 * </pre> |
| 2562 * | 2355 * |
| 2563 * @param className the name of the class containing the member being parsed | 2356 * @param className the name of the class containing the member being parsed |
| 2564 * @return the class member that was parsed, or `null` if what was found was n
ot a valid | 2357 * @return the class member that was parsed, or `null` if what was found was n
ot a valid |
| 2565 * class member | 2358 * class member |
| 2566 */ | 2359 */ |
| 2567 ClassMember parseClassMember(String className) { | 2360 ClassMember parseClassMember(String className) { |
| 2568 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 2361 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 2569 Modifiers modifiers = _parseModifiers(); | 2362 Modifiers modifiers = _parseModifiers(); |
| 2570 if (_matchesKeyword(Keyword.VOID)) { | 2363 if (_matchesKeyword(Keyword.VOID)) { |
| 2571 TypeName returnType = parseReturnType(); | 2364 TypeName returnType = parseReturnType(); |
| 2572 if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) { | 2365 if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) { |
| 2573 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2366 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2574 return _parseGetter( | 2367 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, |
| 2575 commentAndMetadata, | 2368 modifiers.staticKeyword, returnType); |
| 2576 modifiers.externalKeyword, | |
| 2577 modifiers.staticKeyword, | |
| 2578 returnType); | |
| 2579 } else if (_matchesKeyword(Keyword.SET) && | 2369 } else if (_matchesKeyword(Keyword.SET) && |
| 2580 _tokenMatchesIdentifier(_peek())) { | 2370 _tokenMatchesIdentifier(_peek())) { |
| 2581 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2371 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2582 return _parseSetter( | 2372 return _parseSetter(commentAndMetadata, modifiers.externalKeyword, |
| 2583 commentAndMetadata, | 2373 modifiers.staticKeyword, returnType); |
| 2584 modifiers.externalKeyword, | |
| 2585 modifiers.staticKeyword, | |
| 2586 returnType); | |
| 2587 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 2374 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 2588 _validateModifiersForOperator(modifiers); | 2375 _validateModifiersForOperator(modifiers); |
| 2589 return _parseOperator( | 2376 return _parseOperator( |
| 2590 commentAndMetadata, | 2377 commentAndMetadata, modifiers.externalKeyword, returnType); |
| 2591 modifiers.externalKeyword, | |
| 2592 returnType); | |
| 2593 } else if (_matchesIdentifier() && | 2378 } else if (_matchesIdentifier() && |
| 2594 _peek().matchesAny( | 2379 _peek().matchesAny([ |
| 2595 [TokenType.OPEN_PAREN, TokenType.OPEN_CURLY_BRACKET, TokenType.FUN
CTION])) { | 2380 TokenType.OPEN_PAREN, |
| 2381 TokenType.OPEN_CURLY_BRACKET, |
| 2382 TokenType.FUNCTION |
| 2383 ])) { |
| 2596 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2384 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2597 return _parseMethodDeclarationAfterReturnType( | 2385 return _parseMethodDeclarationAfterReturnType(commentAndMetadata, |
| 2598 commentAndMetadata, | 2386 modifiers.externalKeyword, modifiers.staticKeyword, returnType); |
| 2599 modifiers.externalKeyword, | |
| 2600 modifiers.staticKeyword, | |
| 2601 returnType); | |
| 2602 } else { | 2387 } else { |
| 2603 // | 2388 // |
| 2604 // We have found an error of some kind. Try to recover. | 2389 // We have found an error of some kind. Try to recover. |
| 2605 // | 2390 // |
| 2606 if (_matchesIdentifier()) { | 2391 if (_matchesIdentifier()) { |
| 2607 if (_peek().matchesAny( | 2392 if (_peek().matchesAny( |
| 2608 [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { | 2393 [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { |
| 2609 // | 2394 // |
| 2610 // We appear to have a variable declaration with a type of "void". | 2395 // We appear to have a variable declaration with a type of "void". |
| 2611 // | 2396 // |
| 2612 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); | 2397 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); |
| 2613 return _parseInitializedIdentifierList( | 2398 return _parseInitializedIdentifierList(commentAndMetadata, |
| 2614 commentAndMetadata, | 2399 modifiers.staticKeyword, _validateModifiersForField(modifiers), |
| 2615 modifiers.staticKeyword, | |
| 2616 _validateModifiersForField(modifiers), | |
| 2617 returnType); | 2400 returnType); |
| 2618 } | 2401 } |
| 2619 } | 2402 } |
| 2620 if (_isOperator(_currentToken)) { | 2403 if (_isOperator(_currentToken)) { |
| 2621 // | 2404 // |
| 2622 // We appear to have found an operator declaration without the | 2405 // We appear to have found an operator declaration without the |
| 2623 // 'operator' keyword. | 2406 // 'operator' keyword. |
| 2624 // | 2407 // |
| 2625 _validateModifiersForOperator(modifiers); | 2408 _validateModifiersForOperator(modifiers); |
| 2626 return _parseOperator( | 2409 return _parseOperator( |
| 2627 commentAndMetadata, | 2410 commentAndMetadata, modifiers.externalKeyword, returnType); |
| 2628 modifiers.externalKeyword, | |
| 2629 returnType); | |
| 2630 } | 2411 } |
| 2631 _reportErrorForToken( | 2412 _reportErrorForToken( |
| 2632 ParserErrorCode.EXPECTED_EXECUTABLE, | 2413 ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken); |
| 2633 _currentToken); | |
| 2634 return null; | 2414 return null; |
| 2635 } | 2415 } |
| 2636 } else if (_matchesKeyword(Keyword.GET) && | 2416 } else if (_matchesKeyword(Keyword.GET) && |
| 2637 _tokenMatchesIdentifier(_peek())) { | 2417 _tokenMatchesIdentifier(_peek())) { |
| 2638 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2418 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2639 return _parseGetter( | 2419 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, |
| 2640 commentAndMetadata, | 2420 modifiers.staticKeyword, null); |
| 2641 modifiers.externalKeyword, | |
| 2642 modifiers.staticKeyword, | |
| 2643 null); | |
| 2644 } else if (_matchesKeyword(Keyword.SET) && | 2421 } else if (_matchesKeyword(Keyword.SET) && |
| 2645 _tokenMatchesIdentifier(_peek())) { | 2422 _tokenMatchesIdentifier(_peek())) { |
| 2646 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2423 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2647 return _parseSetter( | 2424 return _parseSetter(commentAndMetadata, modifiers.externalKeyword, |
| 2648 commentAndMetadata, | 2425 modifiers.staticKeyword, null); |
| 2649 modifiers.externalKeyword, | |
| 2650 modifiers.staticKeyword, | |
| 2651 null); | |
| 2652 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 2426 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 2653 _validateModifiersForOperator(modifiers); | 2427 _validateModifiersForOperator(modifiers); |
| 2654 return _parseOperator( | 2428 return _parseOperator( |
| 2655 commentAndMetadata, | 2429 commentAndMetadata, modifiers.externalKeyword, null); |
| 2656 modifiers.externalKeyword, | |
| 2657 null); | |
| 2658 } else if (!_matchesIdentifier()) { | 2430 } else if (!_matchesIdentifier()) { |
| 2659 // | 2431 // |
| 2660 // Recover from an error. | 2432 // Recover from an error. |
| 2661 // | 2433 // |
| 2662 if (_matchesKeyword(Keyword.CLASS)) { | 2434 if (_matchesKeyword(Keyword.CLASS)) { |
| 2663 _reportErrorForCurrentToken(ParserErrorCode.CLASS_IN_CLASS); | 2435 _reportErrorForCurrentToken(ParserErrorCode.CLASS_IN_CLASS); |
| 2664 // TODO(brianwilkerson) We don't currently have any way to capture the | 2436 // TODO(brianwilkerson) We don't currently have any way to capture the |
| 2665 // class that was parsed. | 2437 // class that was parsed. |
| 2666 _parseClassDeclaration(commentAndMetadata, null); | 2438 _parseClassDeclaration(commentAndMetadata, null); |
| 2667 return null; | 2439 return null; |
| 2668 } else if (_matchesKeyword(Keyword.ABSTRACT) && | 2440 } else if (_matchesKeyword(Keyword.ABSTRACT) && |
| 2669 _tokenMatchesKeyword(_peek(), Keyword.CLASS)) { | 2441 _tokenMatchesKeyword(_peek(), Keyword.CLASS)) { |
| 2670 _reportErrorForToken(ParserErrorCode.CLASS_IN_CLASS, _peek()); | 2442 _reportErrorForToken(ParserErrorCode.CLASS_IN_CLASS, _peek()); |
| 2671 // TODO(brianwilkerson) We don't currently have any way to capture the | 2443 // TODO(brianwilkerson) We don't currently have any way to capture the |
| 2672 // class that was parsed. | 2444 // class that was parsed. |
| 2673 _parseClassDeclaration(commentAndMetadata, getAndAdvance()); | 2445 _parseClassDeclaration(commentAndMetadata, getAndAdvance()); |
| 2674 return null; | 2446 return null; |
| 2675 } else if (_isOperator(_currentToken)) { | 2447 } else if (_isOperator(_currentToken)) { |
| 2676 // | 2448 // |
| 2677 // We appear to have found an operator declaration without the | 2449 // We appear to have found an operator declaration without the |
| 2678 // 'operator' keyword. | 2450 // 'operator' keyword. |
| 2679 // | 2451 // |
| 2680 _validateModifiersForOperator(modifiers); | 2452 _validateModifiersForOperator(modifiers); |
| 2681 return _parseOperator( | 2453 return _parseOperator( |
| 2682 commentAndMetadata, | 2454 commentAndMetadata, modifiers.externalKeyword, null); |
| 2683 modifiers.externalKeyword, | |
| 2684 null); | |
| 2685 } | 2455 } |
| 2686 Token keyword = modifiers.varKeyword; | 2456 Token keyword = modifiers.varKeyword; |
| 2687 if (keyword == null) { | 2457 if (keyword == null) { |
| 2688 keyword = modifiers.finalKeyword; | 2458 keyword = modifiers.finalKeyword; |
| 2689 } | 2459 } |
| 2690 if (keyword == null) { | 2460 if (keyword == null) { |
| 2691 keyword = modifiers.constKeyword; | 2461 keyword = modifiers.constKeyword; |
| 2692 } | 2462 } |
| 2693 if (keyword != null) { | 2463 if (keyword != null) { |
| 2694 // | 2464 // |
| 2695 // We appear to have found an incomplete field declaration. | 2465 // We appear to have found an incomplete field declaration. |
| 2696 // | 2466 // |
| 2697 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); | 2467 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 2698 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 2468 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 2699 variables.add( | 2469 variables.add(new VariableDeclaration( |
| 2700 new VariableDeclaration(null, null, _createSyntheticIdentifier(), nu
ll, null)); | 2470 null, null, _createSyntheticIdentifier(), null, null)); |
| 2701 return new FieldDeclaration( | 2471 return new FieldDeclaration(commentAndMetadata.comment, |
| 2702 commentAndMetadata.comment, | 2472 commentAndMetadata.metadata, null, |
| 2703 commentAndMetadata.metadata, | |
| 2704 null, | |
| 2705 new VariableDeclarationList(null, null, keyword, null, variables), | 2473 new VariableDeclarationList(null, null, keyword, null, variables), |
| 2706 _expectSemicolon()); | 2474 _expectSemicolon()); |
| 2707 } | 2475 } |
| 2708 _reportErrorForToken( | 2476 _reportErrorForToken( |
| 2709 ParserErrorCode.EXPECTED_CLASS_MEMBER, | 2477 ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken); |
| 2710 _currentToken); | |
| 2711 if (commentAndMetadata.comment != null || | 2478 if (commentAndMetadata.comment != null || |
| 2712 !commentAndMetadata.metadata.isEmpty) { | 2479 !commentAndMetadata.metadata.isEmpty) { |
| 2713 // | 2480 // |
| 2714 // We appear to have found an incomplete declaration at the end of the | 2481 // We appear to have found an incomplete declaration at the end of the |
| 2715 // class. At this point it consists of a metadata, which we don't want | 2482 // class. At this point it consists of a metadata, which we don't want |
| 2716 // to loose, so we'll treat it as a method declaration with a missing | 2483 // to loose, so we'll treat it as a method declaration with a missing |
| 2717 // name, parameters and empty body. | 2484 // name, parameters and empty body. |
| 2718 // | 2485 // |
| 2719 return new MethodDeclaration( | 2486 return new MethodDeclaration(commentAndMetadata.comment, |
| 2720 commentAndMetadata.comment, | 2487 commentAndMetadata.metadata, null, null, null, null, null, |
| 2721 commentAndMetadata.metadata, | 2488 _createSyntheticIdentifier(), new FormalParameterList( |
| 2722 null, | 2489 null, new List<FormalParameter>(), null, null, null), |
| 2723 null, | |
| 2724 null, | |
| 2725 null, | |
| 2726 null, | |
| 2727 _createSyntheticIdentifier(), | |
| 2728 new FormalParameterList(null, new List<FormalParameter>(), null, nul
l, null), | |
| 2729 new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))); | 2490 new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))); |
| 2730 } | 2491 } |
| 2731 return null; | 2492 return null; |
| 2732 } else if (_tokenMatches(_peek(), TokenType.PERIOD) && | 2493 } else if (_tokenMatches(_peek(), TokenType.PERIOD) && |
| 2733 _tokenMatchesIdentifier(_peekAt(2)) && | 2494 _tokenMatchesIdentifier(_peekAt(2)) && |
| 2734 _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) { | 2495 _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) { |
| 2735 return _parseConstructor( | 2496 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, |
| 2736 commentAndMetadata, | 2497 _validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, |
| 2737 modifiers.externalKeyword, | 2498 parseSimpleIdentifier(), getAndAdvance(), parseSimpleIdentifier(), |
| 2738 _validateModifiersForConstructor(modifiers), | |
| 2739 modifiers.factoryKeyword, | |
| 2740 parseSimpleIdentifier(), | |
| 2741 getAndAdvance(), | |
| 2742 parseSimpleIdentifier(), | |
| 2743 parseFormalParameterList()); | 2499 parseFormalParameterList()); |
| 2744 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 2500 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 2745 SimpleIdentifier methodName = parseSimpleIdentifier(); | 2501 SimpleIdentifier methodName = parseSimpleIdentifier(); |
| 2746 FormalParameterList parameters = parseFormalParameterList(); | 2502 FormalParameterList parameters = parseFormalParameterList(); |
| 2747 if (_matches(TokenType.COLON) || | 2503 if (_matches(TokenType.COLON) || |
| 2748 modifiers.factoryKeyword != null || | 2504 modifiers.factoryKeyword != null || |
| 2749 methodName.name == className) { | 2505 methodName.name == className) { |
| 2750 return _parseConstructor( | 2506 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, |
| 2751 commentAndMetadata, | |
| 2752 modifiers.externalKeyword, | |
| 2753 _validateModifiersForConstructor(modifiers), | 2507 _validateModifiersForConstructor(modifiers), |
| 2754 modifiers.factoryKeyword, | 2508 modifiers.factoryKeyword, methodName, null, null, parameters); |
| 2755 methodName, | |
| 2756 null, | |
| 2757 null, | |
| 2758 parameters); | |
| 2759 } | 2509 } |
| 2760 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2510 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2761 _validateFormalParameterList(parameters); | 2511 _validateFormalParameterList(parameters); |
| 2762 return _parseMethodDeclarationAfterParameters( | 2512 return _parseMethodDeclarationAfterParameters(commentAndMetadata, |
| 2763 commentAndMetadata, | 2513 modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, |
| 2764 modifiers.externalKeyword, | |
| 2765 modifiers.staticKeyword, | |
| 2766 null, | |
| 2767 methodName, | |
| 2768 parameters); | 2514 parameters); |
| 2769 } else if (_peek().matchesAny( | 2515 } else if (_peek() |
| 2770 [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { | 2516 .matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { |
| 2771 if (modifiers.constKeyword == null && | 2517 if (modifiers.constKeyword == null && |
| 2772 modifiers.finalKeyword == null && | 2518 modifiers.finalKeyword == null && |
| 2773 modifiers.varKeyword == null) { | 2519 modifiers.varKeyword == null) { |
| 2774 _reportErrorForCurrentToken( | 2520 _reportErrorForCurrentToken( |
| 2775 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE); | 2521 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE); |
| 2776 } | 2522 } |
| 2777 return _parseInitializedIdentifierList( | 2523 return _parseInitializedIdentifierList(commentAndMetadata, |
| 2778 commentAndMetadata, | 2524 modifiers.staticKeyword, _validateModifiersForField(modifiers), null); |
| 2779 modifiers.staticKeyword, | |
| 2780 _validateModifiersForField(modifiers), | |
| 2781 null); | |
| 2782 } else if (_matchesKeyword(Keyword.TYPEDEF)) { | 2525 } else if (_matchesKeyword(Keyword.TYPEDEF)) { |
| 2783 _reportErrorForCurrentToken(ParserErrorCode.TYPEDEF_IN_CLASS); | 2526 _reportErrorForCurrentToken(ParserErrorCode.TYPEDEF_IN_CLASS); |
| 2784 // TODO(brianwilkerson) We don't currently have any way to capture the | 2527 // TODO(brianwilkerson) We don't currently have any way to capture the |
| 2785 // function type alias that was parsed. | 2528 // function type alias that was parsed. |
| 2786 _parseFunctionTypeAlias(commentAndMetadata, getAndAdvance()); | 2529 _parseFunctionTypeAlias(commentAndMetadata, getAndAdvance()); |
| 2787 return null; | 2530 return null; |
| 2788 } | 2531 } |
| 2789 TypeName type = parseTypeName(); | 2532 TypeName type = parseTypeName(); |
| 2790 if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) { | 2533 if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) { |
| 2791 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2534 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2792 return _parseGetter( | 2535 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, |
| 2793 commentAndMetadata, | 2536 modifiers.staticKeyword, type); |
| 2794 modifiers.externalKeyword, | |
| 2795 modifiers.staticKeyword, | |
| 2796 type); | |
| 2797 } else if (_matchesKeyword(Keyword.SET) && | 2537 } else if (_matchesKeyword(Keyword.SET) && |
| 2798 _tokenMatchesIdentifier(_peek())) { | 2538 _tokenMatchesIdentifier(_peek())) { |
| 2799 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2539 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2800 return _parseSetter( | 2540 return _parseSetter(commentAndMetadata, modifiers.externalKeyword, |
| 2801 commentAndMetadata, | 2541 modifiers.staticKeyword, type); |
| 2802 modifiers.externalKeyword, | |
| 2803 modifiers.staticKeyword, | |
| 2804 type); | |
| 2805 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 2542 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 2806 _validateModifiersForOperator(modifiers); | 2543 _validateModifiersForOperator(modifiers); |
| 2807 return _parseOperator( | 2544 return _parseOperator( |
| 2808 commentAndMetadata, | 2545 commentAndMetadata, modifiers.externalKeyword, type); |
| 2809 modifiers.externalKeyword, | |
| 2810 type); | |
| 2811 } else if (!_matchesIdentifier()) { | 2546 } else if (!_matchesIdentifier()) { |
| 2812 if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 2547 if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 2813 // | 2548 // |
| 2814 // We appear to have found an incomplete declaration at the end of the | 2549 // We appear to have found an incomplete declaration at the end of the |
| 2815 // class. At this point it consists of a type name, so we'll treat it as | 2550 // class. At this point it consists of a type name, so we'll treat it as |
| 2816 // a field declaration with a missing field name and semicolon. | 2551 // a field declaration with a missing field name and semicolon. |
| 2817 // | 2552 // |
| 2818 return _parseInitializedIdentifierList( | 2553 return _parseInitializedIdentifierList(commentAndMetadata, |
| 2819 commentAndMetadata, | 2554 modifiers.staticKeyword, _validateModifiersForField(modifiers), |
| 2820 modifiers.staticKeyword, | |
| 2821 _validateModifiersForField(modifiers), | |
| 2822 type); | 2555 type); |
| 2823 } | 2556 } |
| 2824 if (_isOperator(_currentToken)) { | 2557 if (_isOperator(_currentToken)) { |
| 2825 // | 2558 // |
| 2826 // We appear to have found an operator declaration without the | 2559 // We appear to have found an operator declaration without the |
| 2827 // 'operator' keyword. | 2560 // 'operator' keyword. |
| 2828 // | 2561 // |
| 2829 _validateModifiersForOperator(modifiers); | 2562 _validateModifiersForOperator(modifiers); |
| 2830 return _parseOperator( | 2563 return _parseOperator( |
| 2831 commentAndMetadata, | 2564 commentAndMetadata, modifiers.externalKeyword, type); |
| 2832 modifiers.externalKeyword, | |
| 2833 type); | |
| 2834 } | 2565 } |
| 2835 // | 2566 // |
| 2836 // We appear to have found an incomplete declaration before another | 2567 // We appear to have found an incomplete declaration before another |
| 2837 // declaration. At this point it consists of a type name, so we'll treat | 2568 // declaration. At this point it consists of a type name, so we'll treat |
| 2838 // it as a field declaration with a missing field name and semicolon. | 2569 // it as a field declaration with a missing field name and semicolon. |
| 2839 // | 2570 // |
| 2840 _reportErrorForToken( | 2571 _reportErrorForToken( |
| 2841 ParserErrorCode.EXPECTED_CLASS_MEMBER, | 2572 ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken); |
| 2842 _currentToken); | |
| 2843 try { | 2573 try { |
| 2844 _lockErrorListener(); | 2574 _lockErrorListener(); |
| 2845 return _parseInitializedIdentifierList( | 2575 return _parseInitializedIdentifierList(commentAndMetadata, |
| 2846 commentAndMetadata, | 2576 modifiers.staticKeyword, _validateModifiersForField(modifiers), |
| 2847 modifiers.staticKeyword, | |
| 2848 _validateModifiersForField(modifiers), | |
| 2849 type); | 2577 type); |
| 2850 } finally { | 2578 } finally { |
| 2851 _unlockErrorListener(); | 2579 _unlockErrorListener(); |
| 2852 } | 2580 } |
| 2853 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 2581 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 2854 SimpleIdentifier methodName = parseSimpleIdentifier(); | 2582 SimpleIdentifier methodName = parseSimpleIdentifier(); |
| 2855 FormalParameterList parameters = parseFormalParameterList(); | 2583 FormalParameterList parameters = parseFormalParameterList(); |
| 2856 if (methodName.name == className) { | 2584 if (methodName.name == className) { |
| 2857 _reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type); | 2585 _reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type); |
| 2858 return _parseConstructor( | 2586 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, |
| 2859 commentAndMetadata, | |
| 2860 modifiers.externalKeyword, | |
| 2861 _validateModifiersForConstructor(modifiers), | 2587 _validateModifiersForConstructor(modifiers), |
| 2862 modifiers.factoryKeyword, | 2588 modifiers.factoryKeyword, methodName, null, null, parameters); |
| 2863 methodName, | |
| 2864 null, | |
| 2865 null, | |
| 2866 parameters); | |
| 2867 } | 2589 } |
| 2868 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2590 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2869 _validateFormalParameterList(parameters); | 2591 _validateFormalParameterList(parameters); |
| 2870 return _parseMethodDeclarationAfterParameters( | 2592 return _parseMethodDeclarationAfterParameters(commentAndMetadata, |
| 2871 commentAndMetadata, | 2593 modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, |
| 2872 modifiers.externalKeyword, | |
| 2873 modifiers.staticKeyword, | |
| 2874 type, | |
| 2875 methodName, | |
| 2876 parameters); | 2594 parameters); |
| 2877 } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) { | 2595 } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) { |
| 2878 // We have found "TypeName identifier {", and are guessing that this is a | 2596 // We have found "TypeName identifier {", and are guessing that this is a |
| 2879 // getter without the keyword 'get'. | 2597 // getter without the keyword 'get'. |
| 2880 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2598 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2881 _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET); | 2599 _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET); |
| 2882 _currentToken = _injectToken( | 2600 _currentToken = _injectToken( |
| 2883 new Parser_SyntheticKeywordToken(Keyword.GET, _currentToken.offset)); | 2601 new Parser_SyntheticKeywordToken(Keyword.GET, _currentToken.offset)); |
| 2884 return _parseGetter( | 2602 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, |
| 2885 commentAndMetadata, | 2603 modifiers.staticKeyword, type); |
| 2886 modifiers.externalKeyword, | |
| 2887 modifiers.staticKeyword, | |
| 2888 type); | |
| 2889 } | 2604 } |
| 2890 return _parseInitializedIdentifierList( | 2605 return _parseInitializedIdentifierList(commentAndMetadata, |
| 2891 commentAndMetadata, | 2606 modifiers.staticKeyword, _validateModifiersForField(modifiers), type); |
| 2892 modifiers.staticKeyword, | |
| 2893 _validateModifiersForField(modifiers), | |
| 2894 type); | |
| 2895 } | 2607 } |
| 2896 | 2608 |
| 2897 /** | 2609 /** |
| 2898 * Parse a single import combinator. If no combinator is found, return | 2610 * Parse a single import combinator. If no combinator is found, return |
| 2899 * `null`. | 2611 * `null`. |
| 2900 * | 2612 * |
| 2901 * <pre> | 2613 * <pre> |
| 2902 * combinator ::= | 2614 * combinator ::= |
| 2903 * 'show' identifier (',' identifier)* | 2615 * 'show' identifier (',' identifier)* |
| 2904 * | 'hide' identifier (',' identifier)* | 2616 * | 'hide' identifier (',' identifier)* |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2965 bool partOfDirectiveFound = false; | 2677 bool partOfDirectiveFound = false; |
| 2966 bool partDirectiveFound = false; | 2678 bool partDirectiveFound = false; |
| 2967 bool directiveFoundAfterDeclaration = false; | 2679 bool directiveFoundAfterDeclaration = false; |
| 2968 List<Directive> directives = new List<Directive>(); | 2680 List<Directive> directives = new List<Directive>(); |
| 2969 List<CompilationUnitMember> declarations = | 2681 List<CompilationUnitMember> declarations = |
| 2970 new List<CompilationUnitMember>(); | 2682 new List<CompilationUnitMember>(); |
| 2971 Token memberStart = _currentToken; | 2683 Token memberStart = _currentToken; |
| 2972 while (!_matches(TokenType.EOF)) { | 2684 while (!_matches(TokenType.EOF)) { |
| 2973 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 2685 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 2974 if ((_matchesKeyword(Keyword.IMPORT) || | 2686 if ((_matchesKeyword(Keyword.IMPORT) || |
| 2975 _matchesKeyword(Keyword.EXPORT) || | 2687 _matchesKeyword(Keyword.EXPORT) || |
| 2976 _matchesKeyword(Keyword.LIBRARY) || | 2688 _matchesKeyword(Keyword.LIBRARY) || |
| 2977 _matchesKeyword(Keyword.PART)) && | 2689 _matchesKeyword(Keyword.PART)) && |
| 2978 !_tokenMatches(_peek(), TokenType.PERIOD) && | 2690 !_tokenMatches(_peek(), TokenType.PERIOD) && |
| 2979 !_tokenMatches(_peek(), TokenType.LT) && | 2691 !_tokenMatches(_peek(), TokenType.LT) && |
| 2980 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 2692 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 2981 Directive directive = _parseDirective(commentAndMetadata); | 2693 Directive directive = _parseDirective(commentAndMetadata); |
| 2982 if (declarations.length > 0 && !directiveFoundAfterDeclaration) { | 2694 if (declarations.length > 0 && !directiveFoundAfterDeclaration) { |
| 2983 _reportErrorForCurrentToken( | 2695 _reportErrorForCurrentToken( |
| 2984 ParserErrorCode.DIRECTIVE_AFTER_DECLARATION); | 2696 ParserErrorCode.DIRECTIVE_AFTER_DECLARATION); |
| 2985 directiveFoundAfterDeclaration = true; | 2697 directiveFoundAfterDeclaration = true; |
| 2986 } | 2698 } |
| 2987 if (directive is LibraryDirective) { | 2699 if (directive is LibraryDirective) { |
| 2988 if (libraryDirectiveFound) { | 2700 if (libraryDirectiveFound) { |
| 2989 _reportErrorForCurrentToken( | 2701 _reportErrorForCurrentToken( |
| 2990 ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES); | 2702 ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES); |
| 2991 } else { | 2703 } else { |
| 2992 if (directives.length > 0) { | 2704 if (directives.length > 0) { |
| 2993 _reportErrorForToken( | 2705 _reportErrorForToken(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, |
| 2994 ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, | |
| 2995 directive.libraryKeyword); | 2706 directive.libraryKeyword); |
| 2996 } | 2707 } |
| 2997 libraryDirectiveFound = true; | 2708 libraryDirectiveFound = true; |
| 2998 } | 2709 } |
| 2999 } else if (directive is PartDirective) { | 2710 } else if (directive is PartDirective) { |
| 3000 partDirectiveFound = true; | 2711 partDirectiveFound = true; |
| 3001 } else if (partDirectiveFound) { | 2712 } else if (partDirectiveFound) { |
| 3002 if (directive is ExportDirective) { | 2713 if (directive is ExportDirective) { |
| 3003 _reportErrorForToken( | 2714 _reportErrorForToken( |
| 3004 ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, | 2715 ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3017 int directiveCount = directives.length; | 2728 int directiveCount = directives.length; |
| 3018 for (int i = 0; i < directiveCount; i++) { | 2729 for (int i = 0; i < directiveCount; i++) { |
| 3019 _reportErrorForToken( | 2730 _reportErrorForToken( |
| 3020 ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, | 2731 ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, |
| 3021 directives[i].keyword); | 2732 directives[i].keyword); |
| 3022 } | 2733 } |
| 3023 partOfDirectiveFound = true; | 2734 partOfDirectiveFound = true; |
| 3024 } | 2735 } |
| 3025 } else { | 2736 } else { |
| 3026 if (partOfDirectiveFound) { | 2737 if (partOfDirectiveFound) { |
| 3027 _reportErrorForToken( | 2738 _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, |
| 3028 ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, | |
| 3029 directive.keyword); | 2739 directive.keyword); |
| 3030 } | 2740 } |
| 3031 } | 2741 } |
| 3032 directives.add(directive); | 2742 directives.add(directive); |
| 3033 } else if (_matches(TokenType.SEMICOLON)) { | 2743 } else if (_matches(TokenType.SEMICOLON)) { |
| 3034 _reportErrorForToken( | 2744 _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [ |
| 3035 ParserErrorCode.UNEXPECTED_TOKEN, | 2745 _currentToken.lexeme |
| 3036 _currentToken, | 2746 ]); |
| 3037 [_currentToken.lexeme]); | |
| 3038 _advance(); | 2747 _advance(); |
| 3039 } else { | 2748 } else { |
| 3040 CompilationUnitMember member = | 2749 CompilationUnitMember member = |
| 3041 _parseCompilationUnitMember(commentAndMetadata); | 2750 _parseCompilationUnitMember(commentAndMetadata); |
| 3042 if (member != null) { | 2751 if (member != null) { |
| 3043 declarations.add(member); | 2752 declarations.add(member); |
| 3044 } | 2753 } |
| 3045 } | 2754 } |
| 3046 if (identical(_currentToken, memberStart)) { | 2755 if (identical(_currentToken, memberStart)) { |
| 3047 _reportErrorForToken( | 2756 _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [ |
| 3048 ParserErrorCode.UNEXPECTED_TOKEN, | 2757 _currentToken.lexeme |
| 3049 _currentToken, | 2758 ]); |
| 3050 [_currentToken.lexeme]); | |
| 3051 _advance(); | 2759 _advance(); |
| 3052 while (!_matches(TokenType.EOF) && | 2760 while (!_matches(TokenType.EOF) && |
| 3053 !_couldBeStartOfCompilationUnitMember()) { | 2761 !_couldBeStartOfCompilationUnitMember()) { |
| 3054 _advance(); | 2762 _advance(); |
| 3055 } | 2763 } |
| 3056 } | 2764 } |
| 3057 memberStart = _currentToken; | 2765 memberStart = _currentToken; |
| 3058 } | 2766 } |
| 3059 return new CompilationUnit( | 2767 return new CompilationUnit( |
| 3060 firstToken, | 2768 firstToken, scriptTag, directives, declarations, _currentToken); |
| 3061 scriptTag, | |
| 3062 directives, | |
| 3063 declarations, | |
| 3064 _currentToken); | |
| 3065 } | 2769 } |
| 3066 | 2770 |
| 3067 /** | 2771 /** |
| 3068 * Parse a conditional expression. | 2772 * Parse a conditional expression. |
| 3069 * | 2773 * |
| 3070 * <pre> | 2774 * <pre> |
| 3071 * conditionalExpression ::= | 2775 * conditionalExpression ::= |
| 3072 * logicalOrExpression ('?' expressionWithoutCascade ':' expressionWithout
Cascade)? | 2776 * logicalOrExpression ('?' expressionWithoutCascade ':' expressionWithout
Cascade)? |
| 3073 * </pre> | 2777 * </pre> |
| 3074 * | 2778 * |
| 3075 * @return the conditional expression that was parsed | 2779 * @return the conditional expression that was parsed |
| 3076 */ | 2780 */ |
| 3077 Expression parseConditionalExpression() { | 2781 Expression parseConditionalExpression() { |
| 3078 Expression condition = parseLogicalOrExpression(); | 2782 Expression condition = parseLogicalOrExpression(); |
| 3079 if (!_matches(TokenType.QUESTION)) { | 2783 if (!_matches(TokenType.QUESTION)) { |
| 3080 return condition; | 2784 return condition; |
| 3081 } | 2785 } |
| 3082 Token question = getAndAdvance(); | 2786 Token question = getAndAdvance(); |
| 3083 Expression thenExpression = parseExpressionWithoutCascade(); | 2787 Expression thenExpression = parseExpressionWithoutCascade(); |
| 3084 Token colon = _expect(TokenType.COLON); | 2788 Token colon = _expect(TokenType.COLON); |
| 3085 Expression elseExpression = parseExpressionWithoutCascade(); | 2789 Expression elseExpression = parseExpressionWithoutCascade(); |
| 3086 return new ConditionalExpression( | 2790 return new ConditionalExpression( |
| 3087 condition, | 2791 condition, question, thenExpression, colon, elseExpression); |
| 3088 question, | |
| 3089 thenExpression, | |
| 3090 colon, | |
| 3091 elseExpression); | |
| 3092 } | 2792 } |
| 3093 | 2793 |
| 3094 /** | 2794 /** |
| 3095 * Parse the name of a constructor. | 2795 * Parse the name of a constructor. |
| 3096 * | 2796 * |
| 3097 * <pre> | 2797 * <pre> |
| 3098 * constructorName: | 2798 * constructorName: |
| 3099 * type ('.' identifier)? | 2799 * type ('.' identifier)? |
| 3100 * </pre> | 2800 * </pre> |
| 3101 * | 2801 * |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3204 // assignableExpression is a subset of conditionalExpression, so we can | 2904 // assignableExpression is a subset of conditionalExpression, so we can |
| 3205 // parse a conditional expression and then determine whether it is followed | 2905 // parse a conditional expression and then determine whether it is followed |
| 3206 // by an assignmentOperator, checking for conformance to the restricted | 2906 // by an assignmentOperator, checking for conformance to the restricted |
| 3207 // grammar after making that determination. | 2907 // grammar after making that determination. |
| 3208 // | 2908 // |
| 3209 Expression expression = parseConditionalExpression(); | 2909 Expression expression = parseConditionalExpression(); |
| 3210 if (_currentToken.type.isAssignmentOperator) { | 2910 if (_currentToken.type.isAssignmentOperator) { |
| 3211 Token operator = getAndAdvance(); | 2911 Token operator = getAndAdvance(); |
| 3212 _ensureAssignable(expression); | 2912 _ensureAssignable(expression); |
| 3213 expression = new AssignmentExpression( | 2913 expression = new AssignmentExpression( |
| 3214 expression, | 2914 expression, operator, parseExpressionWithoutCascade()); |
| 3215 operator, | |
| 3216 parseExpressionWithoutCascade()); | |
| 3217 } | 2915 } |
| 3218 return expression; | 2916 return expression; |
| 3219 } | 2917 } |
| 3220 | 2918 |
| 3221 /** | 2919 /** |
| 3222 * Parse a class extends clause. | 2920 * Parse a class extends clause. |
| 3223 * | 2921 * |
| 3224 * <pre> | 2922 * <pre> |
| 3225 * classExtendsClause ::= | 2923 * classExtendsClause ::= |
| 3226 * 'extends' type | 2924 * 'extends' type |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3256 * namedFormalParameters ::= | 2954 * namedFormalParameters ::= |
| 3257 * '{' defaultNamedParameter (',' defaultNamedParameter)* '}' | 2955 * '{' defaultNamedParameter (',' defaultNamedParameter)* '}' |
| 3258 * </pre> | 2956 * </pre> |
| 3259 * | 2957 * |
| 3260 * @return the formal parameters that were parsed | 2958 * @return the formal parameters that were parsed |
| 3261 */ | 2959 */ |
| 3262 FormalParameterList parseFormalParameterList() { | 2960 FormalParameterList parseFormalParameterList() { |
| 3263 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); | 2961 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); |
| 3264 if (_matches(TokenType.CLOSE_PAREN)) { | 2962 if (_matches(TokenType.CLOSE_PAREN)) { |
| 3265 return new FormalParameterList( | 2963 return new FormalParameterList( |
| 3266 leftParenthesis, | 2964 leftParenthesis, null, null, null, getAndAdvance()); |
| 3267 null, | |
| 3268 null, | |
| 3269 null, | |
| 3270 getAndAdvance()); | |
| 3271 } | 2965 } |
| 3272 // | 2966 // |
| 3273 // Even though it is invalid to have default parameters outside of brackets, | 2967 // Even though it is invalid to have default parameters outside of brackets, |
| 3274 // required parameters inside of brackets, or multiple groups of default and | 2968 // required parameters inside of brackets, or multiple groups of default and |
| 3275 // named parameters, we allow all of these cases so that we can recover | 2969 // named parameters, we allow all of these cases so that we can recover |
| 3276 // better. | 2970 // better. |
| 3277 // | 2971 // |
| 3278 List<FormalParameter> parameters = new List<FormalParameter>(); | 2972 List<FormalParameter> parameters = new List<FormalParameter>(); |
| 3279 List<FormalParameter> normalParameters = new List<FormalParameter>(); | 2973 List<FormalParameter> normalParameters = new List<FormalParameter>(); |
| 3280 List<FormalParameter> positionalParameters = new List<FormalParameter>(); | 2974 List<FormalParameter> positionalParameters = new List<FormalParameter>(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3292 bool wasOptionalParameter = false; | 2986 bool wasOptionalParameter = false; |
| 3293 Token initialToken = null; | 2987 Token initialToken = null; |
| 3294 do { | 2988 do { |
| 3295 if (firstParameter) { | 2989 if (firstParameter) { |
| 3296 firstParameter = false; | 2990 firstParameter = false; |
| 3297 } else if (!_optional(TokenType.COMMA)) { | 2991 } else if (!_optional(TokenType.COMMA)) { |
| 3298 // TODO(brianwilkerson) The token is wrong, we need to recover from this | 2992 // TODO(brianwilkerson) The token is wrong, we need to recover from this |
| 3299 // case. | 2993 // case. |
| 3300 if (_getEndToken(leftParenthesis) != null) { | 2994 if (_getEndToken(leftParenthesis) != null) { |
| 3301 _reportErrorForCurrentToken( | 2995 _reportErrorForCurrentToken( |
| 3302 ParserErrorCode.EXPECTED_TOKEN, | 2996 ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]); |
| 3303 [TokenType.COMMA.lexeme]); | |
| 3304 } else { | 2997 } else { |
| 3305 _reportErrorForToken( | 2998 _reportErrorForToken(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, |
| 3306 ParserErrorCode.MISSING_CLOSING_PARENTHESIS, | |
| 3307 _currentToken.previous); | 2999 _currentToken.previous); |
| 3308 break; | 3000 break; |
| 3309 } | 3001 } |
| 3310 } | 3002 } |
| 3311 initialToken = _currentToken; | 3003 initialToken = _currentToken; |
| 3312 // | 3004 // |
| 3313 // Handle the beginning of parameter groups. | 3005 // Handle the beginning of parameter groups. |
| 3314 // | 3006 // |
| 3315 if (_matches(TokenType.OPEN_SQUARE_BRACKET)) { | 3007 if (_matches(TokenType.OPEN_SQUARE_BRACKET)) { |
| 3316 wasOptionalParameter = true; | 3008 wasOptionalParameter = true; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 3342 kind = ParameterKind.NAMED; | 3034 kind = ParameterKind.NAMED; |
| 3343 } | 3035 } |
| 3344 // | 3036 // |
| 3345 // Parse and record the parameter. | 3037 // Parse and record the parameter. |
| 3346 // | 3038 // |
| 3347 FormalParameter parameter = _parseFormalParameter(kind); | 3039 FormalParameter parameter = _parseFormalParameter(kind); |
| 3348 parameters.add(parameter); | 3040 parameters.add(parameter); |
| 3349 currentParameters.add(parameter); | 3041 currentParameters.add(parameter); |
| 3350 if (kind == ParameterKind.REQUIRED && wasOptionalParameter) { | 3042 if (kind == ParameterKind.REQUIRED && wasOptionalParameter) { |
| 3351 _reportErrorForNode( | 3043 _reportErrorForNode( |
| 3352 ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, | 3044 ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter); |
| 3353 parameter); | |
| 3354 } | 3045 } |
| 3355 // | 3046 // |
| 3356 // Handle the end of parameter groups. | 3047 // Handle the end of parameter groups. |
| 3357 // | 3048 // |
| 3358 // TODO(brianwilkerson) Improve the detection and reporting of missing and | 3049 // TODO(brianwilkerson) Improve the detection and reporting of missing and |
| 3359 // mismatched delimiters. | 3050 // mismatched delimiters. |
| 3360 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { | 3051 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { |
| 3361 rightSquareBracket = getAndAdvance(); | 3052 rightSquareBracket = getAndAdvance(); |
| 3362 currentParameters = normalParameters; | 3053 currentParameters = normalParameters; |
| 3363 if (leftSquareBracket == null) { | 3054 if (leftSquareBracket == null) { |
| 3364 if (leftCurlyBracket != null) { | 3055 if (leftCurlyBracket != null) { |
| 3365 _reportErrorForCurrentToken( | 3056 _reportErrorForCurrentToken( |
| 3366 ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, | 3057 ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]); |
| 3367 ["}"]); | |
| 3368 rightCurlyBracket = rightSquareBracket; | 3058 rightCurlyBracket = rightSquareBracket; |
| 3369 rightSquareBracket = null; | 3059 rightSquareBracket = null; |
| 3370 } else { | 3060 } else { |
| 3371 _reportErrorForCurrentToken( | 3061 _reportErrorForCurrentToken( |
| 3372 ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, | 3062 ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, [ |
| 3373 ["["]); | 3063 "[" |
| 3064 ]); |
| 3374 } | 3065 } |
| 3375 } | 3066 } |
| 3376 kind = ParameterKind.REQUIRED; | 3067 kind = ParameterKind.REQUIRED; |
| 3377 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 3068 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 3378 rightCurlyBracket = getAndAdvance(); | 3069 rightCurlyBracket = getAndAdvance(); |
| 3379 currentParameters = normalParameters; | 3070 currentParameters = normalParameters; |
| 3380 if (leftCurlyBracket == null) { | 3071 if (leftCurlyBracket == null) { |
| 3381 if (leftSquareBracket != null) { | 3072 if (leftSquareBracket != null) { |
| 3382 _reportErrorForCurrentToken( | 3073 _reportErrorForCurrentToken( |
| 3383 ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, | 3074 ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]); |
| 3384 ["]"]); | |
| 3385 rightSquareBracket = rightCurlyBracket; | 3075 rightSquareBracket = rightCurlyBracket; |
| 3386 rightCurlyBracket = null; | 3076 rightCurlyBracket = null; |
| 3387 } else { | 3077 } else { |
| 3388 _reportErrorForCurrentToken( | 3078 _reportErrorForCurrentToken( |
| 3389 ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, | 3079 ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, [ |
| 3390 ["{"]); | 3080 "{" |
| 3081 ]); |
| 3391 } | 3082 } |
| 3392 } | 3083 } |
| 3393 kind = ParameterKind.REQUIRED; | 3084 kind = ParameterKind.REQUIRED; |
| 3394 } | 3085 } |
| 3395 } while (!_matches(TokenType.CLOSE_PAREN) && | 3086 } while (!_matches(TokenType.CLOSE_PAREN) && |
| 3396 !identical(initialToken, _currentToken)); | 3087 !identical(initialToken, _currentToken)); |
| 3397 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 3088 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 3398 // | 3089 // |
| 3399 // Check that the groups were closed correctly. | 3090 // Check that the groups were closed correctly. |
| 3400 // | 3091 // |
| 3401 if (leftSquareBracket != null && rightSquareBracket == null) { | 3092 if (leftSquareBracket != null && rightSquareBracket == null) { |
| 3402 _reportErrorForCurrentToken( | 3093 _reportErrorForCurrentToken( |
| 3403 ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, | 3094 ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]); |
| 3404 ["]"]); | |
| 3405 } | 3095 } |
| 3406 if (leftCurlyBracket != null && rightCurlyBracket == null) { | 3096 if (leftCurlyBracket != null && rightCurlyBracket == null) { |
| 3407 _reportErrorForCurrentToken( | 3097 _reportErrorForCurrentToken( |
| 3408 ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, | 3098 ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]); |
| 3409 ["}"]); | |
| 3410 } | 3099 } |
| 3411 // | 3100 // |
| 3412 // Build the parameter list. | 3101 // Build the parameter list. |
| 3413 // | 3102 // |
| 3414 if (leftSquareBracket == null) { | 3103 if (leftSquareBracket == null) { |
| 3415 leftSquareBracket = leftCurlyBracket; | 3104 leftSquareBracket = leftCurlyBracket; |
| 3416 } | 3105 } |
| 3417 if (rightSquareBracket == null) { | 3106 if (rightSquareBracket == null) { |
| 3418 rightSquareBracket = rightCurlyBracket; | 3107 rightSquareBracket = rightCurlyBracket; |
| 3419 } | 3108 } |
| 3420 return new FormalParameterList( | 3109 return new FormalParameterList(leftParenthesis, parameters, |
| 3421 leftParenthesis, | 3110 leftSquareBracket, rightSquareBracket, rightParenthesis); |
| 3422 parameters, | |
| 3423 leftSquareBracket, | |
| 3424 rightSquareBracket, | |
| 3425 rightParenthesis); | |
| 3426 } | 3111 } |
| 3427 | 3112 |
| 3428 /** | 3113 /** |
| 3429 * Parse a function expression. | 3114 * Parse a function expression. |
| 3430 * | 3115 * |
| 3431 * <pre> | 3116 * <pre> |
| 3432 * functionExpression ::= | 3117 * functionExpression ::= |
| 3433 * formalParameterList functionExpressionBody | 3118 * formalParameterList functionExpressionBody |
| 3434 * </pre> | 3119 * </pre> |
| 3435 * | 3120 * |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3506 * logicalOrExpression ::= | 3191 * logicalOrExpression ::= |
| 3507 * logicalAndExpression ('||' logicalAndExpression)* | 3192 * logicalAndExpression ('||' logicalAndExpression)* |
| 3508 * </pre> | 3193 * </pre> |
| 3509 * | 3194 * |
| 3510 * @return the logical or expression that was parsed | 3195 * @return the logical or expression that was parsed |
| 3511 */ | 3196 */ |
| 3512 Expression parseLogicalOrExpression() { | 3197 Expression parseLogicalOrExpression() { |
| 3513 Expression expression = _parseLogicalAndExpression(); | 3198 Expression expression = _parseLogicalAndExpression(); |
| 3514 while (_matches(TokenType.BAR_BAR)) { | 3199 while (_matches(TokenType.BAR_BAR)) { |
| 3515 Token operator = getAndAdvance(); | 3200 Token operator = getAndAdvance(); |
| 3516 expression = | 3201 expression = new BinaryExpression( |
| 3517 new BinaryExpression(expression, operator, _parseLogicalAndExpression(
)); | 3202 expression, operator, _parseLogicalAndExpression()); |
| 3518 } | 3203 } |
| 3519 return expression; | 3204 return expression; |
| 3520 } | 3205 } |
| 3521 | 3206 |
| 3522 /** | 3207 /** |
| 3523 * Parse a map literal entry. | 3208 * Parse a map literal entry. |
| 3524 * | 3209 * |
| 3525 * <pre> | 3210 * <pre> |
| 3526 * mapLiteralEntry ::= | 3211 * mapLiteralEntry ::= |
| 3527 * expression ':' expression | 3212 * expression ':' expression |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3565 if (_matchesKeyword(Keyword.THIS)) { | 3250 if (_matchesKeyword(Keyword.THIS)) { |
| 3566 thisKeyword = getAndAdvance(); | 3251 thisKeyword = getAndAdvance(); |
| 3567 period = _expect(TokenType.PERIOD); | 3252 period = _expect(TokenType.PERIOD); |
| 3568 } | 3253 } |
| 3569 SimpleIdentifier identifier = parseSimpleIdentifier(); | 3254 SimpleIdentifier identifier = parseSimpleIdentifier(); |
| 3570 if (_matches(TokenType.OPEN_PAREN)) { | 3255 if (_matches(TokenType.OPEN_PAREN)) { |
| 3571 FormalParameterList parameters = parseFormalParameterList(); | 3256 FormalParameterList parameters = parseFormalParameterList(); |
| 3572 if (thisKeyword == null) { | 3257 if (thisKeyword == null) { |
| 3573 if (holder.keyword != null) { | 3258 if (holder.keyword != null) { |
| 3574 _reportErrorForToken( | 3259 _reportErrorForToken( |
| 3575 ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, | 3260 ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword); |
| 3576 holder.keyword); | |
| 3577 } | 3261 } |
| 3578 return new FunctionTypedFormalParameter( | 3262 return new FunctionTypedFormalParameter(commentAndMetadata.comment, |
| 3579 commentAndMetadata.comment, | 3263 commentAndMetadata.metadata, holder.type, identifier, parameters); |
| 3580 commentAndMetadata.metadata, | |
| 3581 holder.type, | |
| 3582 identifier, | |
| 3583 parameters); | |
| 3584 } else { | 3264 } else { |
| 3585 return new FieldFormalParameter( | 3265 return new FieldFormalParameter(commentAndMetadata.comment, |
| 3586 commentAndMetadata.comment, | 3266 commentAndMetadata.metadata, holder.keyword, holder.type, |
| 3587 commentAndMetadata.metadata, | 3267 thisKeyword, period, identifier, parameters); |
| 3588 holder.keyword, | |
| 3589 holder.type, | |
| 3590 thisKeyword, | |
| 3591 period, | |
| 3592 identifier, | |
| 3593 parameters); | |
| 3594 } | 3268 } |
| 3595 } | 3269 } |
| 3596 TypeName type = holder.type; | 3270 TypeName type = holder.type; |
| 3597 if (type != null) { | 3271 if (type != null) { |
| 3598 if (_tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) { | 3272 if (_tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) { |
| 3599 _reportErrorForToken( | 3273 _reportErrorForToken( |
| 3600 ParserErrorCode.VOID_PARAMETER, | 3274 ParserErrorCode.VOID_PARAMETER, type.name.beginToken); |
| 3601 type.name.beginToken); | |
| 3602 } else if (holder.keyword != null && | 3275 } else if (holder.keyword != null && |
| 3603 _tokenMatchesKeyword(holder.keyword, Keyword.VAR)) { | 3276 _tokenMatchesKeyword(holder.keyword, Keyword.VAR)) { |
| 3604 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword); | 3277 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword); |
| 3605 } | 3278 } |
| 3606 } | 3279 } |
| 3607 if (thisKeyword != null) { | 3280 if (thisKeyword != null) { |
| 3608 return new FieldFormalParameter( | 3281 return new FieldFormalParameter(commentAndMetadata.comment, |
| 3609 commentAndMetadata.comment, | 3282 commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, |
| 3610 commentAndMetadata.metadata, | 3283 period, identifier, null); |
| 3611 holder.keyword, | |
| 3612 holder.type, | |
| 3613 thisKeyword, | |
| 3614 period, | |
| 3615 identifier, | |
| 3616 null); | |
| 3617 } | 3284 } |
| 3618 return new SimpleFormalParameter( | 3285 return new SimpleFormalParameter(commentAndMetadata.comment, |
| 3619 commentAndMetadata.comment, | 3286 commentAndMetadata.metadata, holder.keyword, holder.type, identifier); |
| 3620 commentAndMetadata.metadata, | |
| 3621 holder.keyword, | |
| 3622 holder.type, | |
| 3623 identifier); | |
| 3624 } | 3287 } |
| 3625 | 3288 |
| 3626 /** | 3289 /** |
| 3627 * Parse a prefixed identifier. | 3290 * Parse a prefixed identifier. |
| 3628 * | 3291 * |
| 3629 * <pre> | 3292 * <pre> |
| 3630 * prefixedIdentifier ::= | 3293 * prefixedIdentifier ::= |
| 3631 * identifier ('.' identifier)? | 3294 * identifier ('.' identifier)? |
| 3632 * </pre> | 3295 * </pre> |
| 3633 * | 3296 * |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3744 * @return the string literal that was parsed | 3407 * @return the string literal that was parsed |
| 3745 */ | 3408 */ |
| 3746 StringLiteral parseStringLiteral() { | 3409 StringLiteral parseStringLiteral() { |
| 3747 List<StringLiteral> strings = new List<StringLiteral>(); | 3410 List<StringLiteral> strings = new List<StringLiteral>(); |
| 3748 while (_matches(TokenType.STRING)) { | 3411 while (_matches(TokenType.STRING)) { |
| 3749 Token string = getAndAdvance(); | 3412 Token string = getAndAdvance(); |
| 3750 if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || | 3413 if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || |
| 3751 _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER)) { | 3414 _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER)) { |
| 3752 strings.add(_parseStringInterpolation(string)); | 3415 strings.add(_parseStringInterpolation(string)); |
| 3753 } else { | 3416 } else { |
| 3754 strings.add( | 3417 strings.add(new SimpleStringLiteral( |
| 3755 new SimpleStringLiteral( | 3418 string, _computeStringValue(string.lexeme, true, true))); |
| 3756 string, | |
| 3757 _computeStringValue(string.lexeme, true, true))); | |
| 3758 } | 3419 } |
| 3759 } | 3420 } |
| 3760 if (strings.length < 1) { | 3421 if (strings.length < 1) { |
| 3761 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL); | 3422 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL); |
| 3762 return _createSyntheticStringLiteral(); | 3423 return _createSyntheticStringLiteral(); |
| 3763 } else if (strings.length == 1) { | 3424 } else if (strings.length == 1) { |
| 3764 return strings[0]; | 3425 return strings[0]; |
| 3765 } else { | 3426 } else { |
| 3766 return new AdjacentStrings(strings); | 3427 return new AdjacentStrings(strings); |
| 3767 } | 3428 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3828 * </pre> | 3489 * </pre> |
| 3829 * | 3490 * |
| 3830 * @return the type parameter that was parsed | 3491 * @return the type parameter that was parsed |
| 3831 */ | 3492 */ |
| 3832 TypeParameter parseTypeParameter() { | 3493 TypeParameter parseTypeParameter() { |
| 3833 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 3494 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 3834 SimpleIdentifier name = parseSimpleIdentifier(); | 3495 SimpleIdentifier name = parseSimpleIdentifier(); |
| 3835 if (_matchesKeyword(Keyword.EXTENDS)) { | 3496 if (_matchesKeyword(Keyword.EXTENDS)) { |
| 3836 Token keyword = getAndAdvance(); | 3497 Token keyword = getAndAdvance(); |
| 3837 TypeName bound = parseTypeName(); | 3498 TypeName bound = parseTypeName(); |
| 3838 return new TypeParameter( | 3499 return new TypeParameter(commentAndMetadata.comment, |
| 3839 commentAndMetadata.comment, | 3500 commentAndMetadata.metadata, name, keyword, bound); |
| 3840 commentAndMetadata.metadata, | |
| 3841 name, | |
| 3842 keyword, | |
| 3843 bound); | |
| 3844 } | 3501 } |
| 3845 return new TypeParameter( | 3502 return new TypeParameter(commentAndMetadata.comment, |
| 3846 commentAndMetadata.comment, | 3503 commentAndMetadata.metadata, name, null, null); |
| 3847 commentAndMetadata.metadata, | |
| 3848 name, | |
| 3849 null, | |
| 3850 null); | |
| 3851 } | 3504 } |
| 3852 | 3505 |
| 3853 /** | 3506 /** |
| 3854 * Parse a list of type parameters. | 3507 * Parse a list of type parameters. |
| 3855 * | 3508 * |
| 3856 * <pre> | 3509 * <pre> |
| 3857 * typeParameterList ::= | 3510 * typeParameterList ::= |
| 3858 * '<' typeParameter (',' typeParameter)* '>' | 3511 * '<' typeParameter (',' typeParameter)* '>' |
| 3859 * </pre> | 3512 * </pre> |
| 3860 * | 3513 * |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3908 * @param scalarValue the value to be appended | 3561 * @param scalarValue the value to be appended |
| 3909 * @param startIndex the index of the first character representing the scalar
value | 3562 * @param startIndex the index of the first character representing the scalar
value |
| 3910 * @param endIndex the index of the last character representing the scalar val
ue | 3563 * @param endIndex the index of the last character representing the scalar val
ue |
| 3911 */ | 3564 */ |
| 3912 void _appendScalarValue(StringBuffer buffer, String escapeSequence, | 3565 void _appendScalarValue(StringBuffer buffer, String escapeSequence, |
| 3913 int scalarValue, int startIndex, int endIndex) { | 3566 int scalarValue, int startIndex, int endIndex) { |
| 3914 if (scalarValue < 0 || | 3567 if (scalarValue < 0 || |
| 3915 scalarValue > Character.MAX_CODE_POINT || | 3568 scalarValue > Character.MAX_CODE_POINT || |
| 3916 (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) { | 3569 (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) { |
| 3917 _reportErrorForCurrentToken( | 3570 _reportErrorForCurrentToken( |
| 3918 ParserErrorCode.INVALID_CODE_POINT, | 3571 ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]); |
| 3919 [escapeSequence]); | |
| 3920 return; | 3572 return; |
| 3921 } | 3573 } |
| 3922 if (scalarValue < Character.MAX_VALUE) { | 3574 if (scalarValue < Character.MAX_VALUE) { |
| 3923 buffer.writeCharCode(scalarValue); | 3575 buffer.writeCharCode(scalarValue); |
| 3924 } else { | 3576 } else { |
| 3925 buffer.write(Character.toChars(scalarValue)); | 3577 buffer.write(Character.toChars(scalarValue)); |
| 3926 } | 3578 } |
| 3927 } | 3579 } |
| 3928 | 3580 |
| 3929 /** | 3581 /** |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3981 } | 3633 } |
| 3982 | 3634 |
| 3983 /** | 3635 /** |
| 3984 * Convert the given method declaration into the nearest valid top-level funct
ion declaration. | 3636 * Convert the given method declaration into the nearest valid top-level funct
ion declaration. |
| 3985 * | 3637 * |
| 3986 * @param method the method to be converted | 3638 * @param method the method to be converted |
| 3987 * @return the function declaration that most closely captures the components
of the given method | 3639 * @return the function declaration that most closely captures the components
of the given method |
| 3988 * declaration | 3640 * declaration |
| 3989 */ | 3641 */ |
| 3990 FunctionDeclaration _convertToFunctionDeclaration(MethodDeclaration method) => | 3642 FunctionDeclaration _convertToFunctionDeclaration(MethodDeclaration method) => |
| 3991 new FunctionDeclaration( | 3643 new FunctionDeclaration(method.documentationComment, method.metadata, |
| 3992 method.documentationComment, | 3644 method.externalKeyword, method.returnType, method.propertyKeyword, |
| 3993 method.metadata, | 3645 method.name, new FunctionExpression(method.parameters, method.body)); |
| 3994 method.externalKeyword, | |
| 3995 method.returnType, | |
| 3996 method.propertyKeyword, | |
| 3997 method.name, | |
| 3998 new FunctionExpression(method.parameters, method.body)); | |
| 3999 | 3646 |
| 4000 /** | 3647 /** |
| 4001 * Return `true` if the current token could be the start of a compilation unit
member. This | 3648 * Return `true` if the current token could be the start of a compilation unit
member. This |
| 4002 * method is used for recovery purposes to decide when to stop skipping tokens
after finding an | 3649 * method is used for recovery purposes to decide when to stop skipping tokens
after finding an |
| 4003 * error while parsing a compilation unit member. | 3650 * error while parsing a compilation unit member. |
| 4004 * | 3651 * |
| 4005 * @return `true` if the current token could be the start of a compilation uni
t member | 3652 * @return `true` if the current token could be the start of a compilation uni
t member |
| 4006 */ | 3653 */ |
| 4007 bool _couldBeStartOfCompilationUnitMember() { | 3654 bool _couldBeStartOfCompilationUnitMember() { |
| 4008 if ((_matchesKeyword(Keyword.IMPORT) || | 3655 if ((_matchesKeyword(Keyword.IMPORT) || |
| 4009 _matchesKeyword(Keyword.EXPORT) || | 3656 _matchesKeyword(Keyword.EXPORT) || |
| 4010 _matchesKeyword(Keyword.LIBRARY) || | 3657 _matchesKeyword(Keyword.LIBRARY) || |
| 4011 _matchesKeyword(Keyword.PART)) && | 3658 _matchesKeyword(Keyword.PART)) && |
| 4012 !_tokenMatches(_peek(), TokenType.PERIOD) && | 3659 !_tokenMatches(_peek(), TokenType.PERIOD) && |
| 4013 !_tokenMatches(_peek(), TokenType.LT)) { | 3660 !_tokenMatches(_peek(), TokenType.LT)) { |
| 4014 // This looks like the start of a directive | 3661 // This looks like the start of a directive |
| 4015 return true; | 3662 return true; |
| 4016 } else if (_matchesKeyword(Keyword.CLASS)) { | 3663 } else if (_matchesKeyword(Keyword.CLASS)) { |
| 4017 // This looks like the start of a class definition | 3664 // This looks like the start of a class definition |
| 4018 return true; | 3665 return true; |
| 4019 } else if (_matchesKeyword(Keyword.TYPEDEF) && | 3666 } else if (_matchesKeyword(Keyword.TYPEDEF) && |
| 4020 !_tokenMatches(_peek(), TokenType.PERIOD) && | 3667 !_tokenMatches(_peek(), TokenType.PERIOD) && |
| 4021 !_tokenMatches(_peek(), TokenType.LT)) { | 3668 !_tokenMatches(_peek(), TokenType.LT)) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 4052 * @return the synthetic identifier that was created | 3699 * @return the synthetic identifier that was created |
| 4053 */ | 3700 */ |
| 4054 SimpleIdentifier _createSyntheticIdentifier() { | 3701 SimpleIdentifier _createSyntheticIdentifier() { |
| 4055 Token syntheticToken; | 3702 Token syntheticToken; |
| 4056 if (_currentToken.type == TokenType.KEYWORD) { | 3703 if (_currentToken.type == TokenType.KEYWORD) { |
| 4057 // Consider current keyword token as an identifier. | 3704 // Consider current keyword token as an identifier. |
| 4058 // It is not always true, e.g. "^is T" where "^" is place the place for | 3705 // It is not always true, e.g. "^is T" where "^" is place the place for |
| 4059 // synthetic identifier. By creating SyntheticStringToken we can | 3706 // synthetic identifier. By creating SyntheticStringToken we can |
| 4060 // distinguish a real identifier from synthetic. In the code completion | 3707 // distinguish a real identifier from synthetic. In the code completion |
| 4061 // behavior will depend on a cursor position - before or on "is". | 3708 // behavior will depend on a cursor position - before or on "is". |
| 4062 syntheticToken = _injectToken( | 3709 syntheticToken = _injectToken(new SyntheticStringToken( |
| 4063 new SyntheticStringToken( | 3710 TokenType.IDENTIFIER, _currentToken.lexeme, _currentToken.offset)); |
| 4064 TokenType.IDENTIFIER, | |
| 4065 _currentToken.lexeme, | |
| 4066 _currentToken.offset)); | |
| 4067 } else { | 3711 } else { |
| 4068 syntheticToken = _createSyntheticToken(TokenType.IDENTIFIER); | 3712 syntheticToken = _createSyntheticToken(TokenType.IDENTIFIER); |
| 4069 } | 3713 } |
| 4070 return new SimpleIdentifier(syntheticToken); | 3714 return new SimpleIdentifier(syntheticToken); |
| 4071 } | 3715 } |
| 4072 | 3716 |
| 4073 /** | 3717 /** |
| 4074 * Create a synthetic token representing the given keyword. | 3718 * Create a synthetic token representing the given keyword. |
| 4075 * | 3719 * |
| 4076 * @return the synthetic token that was created | 3720 * @return the synthetic token that was created |
| 4077 */ | 3721 */ |
| 4078 Token _createSyntheticKeyword(Keyword keyword) => | 3722 Token _createSyntheticKeyword(Keyword keyword) => _injectToken( |
| 4079 _injectToken(new Parser_SyntheticKeywordToken(keyword, _currentToken.offse
t)); | 3723 new Parser_SyntheticKeywordToken(keyword, _currentToken.offset)); |
| 4080 | 3724 |
| 4081 /** | 3725 /** |
| 4082 * Create a synthetic string literal. | 3726 * Create a synthetic string literal. |
| 4083 * | 3727 * |
| 4084 * @return the synthetic string literal that was created | 3728 * @return the synthetic string literal that was created |
| 4085 */ | 3729 */ |
| 4086 SimpleStringLiteral _createSyntheticStringLiteral() => | 3730 SimpleStringLiteral _createSyntheticStringLiteral() => |
| 4087 new SimpleStringLiteral(_createSyntheticToken(TokenType.STRING), ""); | 3731 new SimpleStringLiteral(_createSyntheticToken(TokenType.STRING), ""); |
| 4088 | 3732 |
| 4089 /** | 3733 /** |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4147 */ | 3791 */ |
| 4148 Token _expect(TokenType type) { | 3792 Token _expect(TokenType type) { |
| 4149 if (_matches(type)) { | 3793 if (_matches(type)) { |
| 4150 return getAndAdvance(); | 3794 return getAndAdvance(); |
| 4151 } | 3795 } |
| 4152 // Remove uses of this method in favor of matches? | 3796 // Remove uses of this method in favor of matches? |
| 4153 // Pass in the error code to use to report the error? | 3797 // Pass in the error code to use to report the error? |
| 4154 if (type == TokenType.SEMICOLON) { | 3798 if (type == TokenType.SEMICOLON) { |
| 4155 if (_tokenMatches(_currentToken.next, TokenType.SEMICOLON)) { | 3799 if (_tokenMatches(_currentToken.next, TokenType.SEMICOLON)) { |
| 4156 _reportErrorForCurrentToken( | 3800 _reportErrorForCurrentToken( |
| 4157 ParserErrorCode.UNEXPECTED_TOKEN, | 3801 ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]); |
| 4158 [_currentToken.lexeme]); | |
| 4159 _advance(); | 3802 _advance(); |
| 4160 return getAndAdvance(); | 3803 return getAndAdvance(); |
| 4161 } | 3804 } |
| 4162 _reportErrorForToken( | 3805 _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, |
| 4163 ParserErrorCode.EXPECTED_TOKEN, | 3806 _currentToken.previous, [type.lexeme]); |
| 4164 _currentToken.previous, | |
| 4165 [type.lexeme]); | |
| 4166 } else { | 3807 } else { |
| 4167 _reportErrorForCurrentToken( | 3808 _reportErrorForCurrentToken( |
| 4168 ParserErrorCode.EXPECTED_TOKEN, | 3809 ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]); |
| 4169 [type.lexeme]); | |
| 4170 } | 3810 } |
| 4171 return _currentToken; | 3811 return _currentToken; |
| 4172 } | 3812 } |
| 4173 | 3813 |
| 4174 /** | 3814 /** |
| 4175 * If the current token has the type [TokenType.GT], return it after advancing
to the next | 3815 * If the current token has the type [TokenType.GT], return it after advancing
to the next |
| 4176 * token. Otherwise report an error and return the current token without advan
cing. | 3816 * token. Otherwise report an error and return the current token without advan
cing. |
| 4177 * | 3817 * |
| 4178 * @return the token that matched the given type | 3818 * @return the token that matched the given type |
| 4179 */ | 3819 */ |
| 4180 Token _expectGt() { | 3820 Token _expectGt() { |
| 4181 if (_matchesGt()) { | 3821 if (_matchesGt()) { |
| 4182 return getAndAdvance(); | 3822 return getAndAdvance(); |
| 4183 } | 3823 } |
| 4184 _reportErrorForCurrentToken( | 3824 _reportErrorForCurrentToken( |
| 4185 ParserErrorCode.EXPECTED_TOKEN, | 3825 ParserErrorCode.EXPECTED_TOKEN, [TokenType.GT.lexeme]); |
| 4186 [TokenType.GT.lexeme]); | |
| 4187 return _currentToken; | 3826 return _currentToken; |
| 4188 } | 3827 } |
| 4189 | 3828 |
| 4190 /** | 3829 /** |
| 4191 * If the current token is a keyword matching the given string, return it afte
r advancing to the | 3830 * If the current token is a keyword matching the given string, return it afte
r advancing to the |
| 4192 * next token. Otherwise report an error and return the current token without
advancing. | 3831 * next token. Otherwise report an error and return the current token without
advancing. |
| 4193 * | 3832 * |
| 4194 * @param keyword the keyword that is expected | 3833 * @param keyword the keyword that is expected |
| 4195 * @return the token that matched the given type | 3834 * @return the token that matched the given type |
| 4196 */ | 3835 */ |
| 4197 Token _expectKeyword(Keyword keyword) { | 3836 Token _expectKeyword(Keyword keyword) { |
| 4198 if (_matchesKeyword(keyword)) { | 3837 if (_matchesKeyword(keyword)) { |
| 4199 return getAndAdvance(); | 3838 return getAndAdvance(); |
| 4200 } | 3839 } |
| 4201 // Remove uses of this method in favor of matches? | 3840 // Remove uses of this method in favor of matches? |
| 4202 // Pass in the error code to use to report the error? | 3841 // Pass in the error code to use to report the error? |
| 4203 _reportErrorForCurrentToken( | 3842 _reportErrorForCurrentToken( |
| 4204 ParserErrorCode.EXPECTED_TOKEN, | 3843 ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]); |
| 4205 [keyword.syntax]); | |
| 4206 return _currentToken; | 3844 return _currentToken; |
| 4207 } | 3845 } |
| 4208 | 3846 |
| 4209 /** | 3847 /** |
| 4210 * If [currentToken] is a semicolon, returns it; otherwise reports error and c
reates a | 3848 * If [currentToken] is a semicolon, returns it; otherwise reports error and c
reates a |
| 4211 * synthetic one. | 3849 * synthetic one. |
| 4212 * | 3850 * |
| 4213 * TODO(scheglov) consider pushing this into [expect] | 3851 * TODO(scheglov) consider pushing this into [expect] |
| 4214 */ | 3852 */ |
| 4215 Token _expectSemicolon() { | 3853 Token _expectSemicolon() { |
| 4216 if (_matches(TokenType.SEMICOLON)) { | 3854 if (_matches(TokenType.SEMICOLON)) { |
| 4217 return getAndAdvance(); | 3855 return getAndAdvance(); |
| 4218 } else { | 3856 } else { |
| 4219 _reportErrorForToken( | 3857 _reportErrorForToken( |
| 4220 ParserErrorCode.EXPECTED_TOKEN, | 3858 ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [";"]); |
| 4221 _currentToken.previous, | |
| 4222 [";"]); | |
| 4223 return _createSyntheticToken(TokenType.SEMICOLON); | 3859 return _createSyntheticToken(TokenType.SEMICOLON); |
| 4224 } | 3860 } |
| 4225 } | 3861 } |
| 4226 | 3862 |
| 4227 /** | 3863 /** |
| 4228 * Search the given list of ranges for a range that contains the given index.
Return the range | 3864 * Search the given list of ranges for a range that contains the given index.
Return the range |
| 4229 * that was found, or `null` if none of the ranges contain the index. | 3865 * that was found, or `null` if none of the ranges contain the index. |
| 4230 * | 3866 * |
| 4231 * @param ranges the ranges to be searched | 3867 * @param ranges the ranges to be searched |
| 4232 * @param index the index contained in the returned range | 3868 * @param index the index contained in the returned range |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4270 } | 3906 } |
| 4271 while (index < length) { | 3907 while (index < length) { |
| 4272 int currentChar = comment.codeUnitAt(index); | 3908 int currentChar = comment.codeUnitAt(index); |
| 4273 if (currentChar == 0xD || currentChar == 0xA) { | 3909 if (currentChar == 0xD || currentChar == 0xA) { |
| 4274 index = index + 1; | 3910 index = index + 1; |
| 4275 while (index < length && | 3911 while (index < length && |
| 4276 Character.isWhitespace(comment.codeUnitAt(index))) { | 3912 Character.isWhitespace(comment.codeUnitAt(index))) { |
| 4277 index = index + 1; | 3913 index = index + 1; |
| 4278 } | 3914 } |
| 4279 if (StringUtilities.startsWith6( | 3915 if (StringUtilities.startsWith6( |
| 4280 comment, | 3916 comment, index, 0x2A, 0x20, 0x20, 0x20, 0x20, 0x20)) { |
| 4281 index, | |
| 4282 0x2A, | |
| 4283 0x20, | |
| 4284 0x20, | |
| 4285 0x20, | |
| 4286 0x20, | |
| 4287 0x20)) { | |
| 4288 int end = index + 6; | 3917 int end = index + 6; |
| 4289 while (end < length && | 3918 while (end < length && |
| 4290 comment.codeUnitAt(end) != 0xD && | 3919 comment.codeUnitAt(end) != 0xD && |
| 4291 comment.codeUnitAt(end) != 0xA) { | 3920 comment.codeUnitAt(end) != 0xA) { |
| 4292 end = end + 1; | 3921 end = end + 1; |
| 4293 } | 3922 } |
| 4294 ranges.add(<int>[index, end]); | 3923 ranges.add(<int>[index, end]); |
| 4295 index = end; | 3924 index = end; |
| 4296 } | 3925 } |
| 4297 } else if (index + 1 < length && | 3926 } else if (index + 1 < length && |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4391 */ | 4020 */ |
| 4392 bool _isFunctionExpression(Token startToken) { | 4021 bool _isFunctionExpression(Token startToken) { |
| 4393 // Function expressions aren't allowed in initializer lists. | 4022 // Function expressions aren't allowed in initializer lists. |
| 4394 if (_inInitializer) { | 4023 if (_inInitializer) { |
| 4395 return false; | 4024 return false; |
| 4396 } | 4025 } |
| 4397 Token afterParameters = _skipFormalParameterList(startToken); | 4026 Token afterParameters = _skipFormalParameterList(startToken); |
| 4398 if (afterParameters == null) { | 4027 if (afterParameters == null) { |
| 4399 return false; | 4028 return false; |
| 4400 } | 4029 } |
| 4401 if (afterParameters.matchesAny( | 4030 if (afterParameters |
| 4402 [TokenType.OPEN_CURLY_BRACKET, TokenType.FUNCTION])) { | 4031 .matchesAny([TokenType.OPEN_CURLY_BRACKET, TokenType.FUNCTION])) { |
| 4403 return true; | 4032 return true; |
| 4404 } | 4033 } |
| 4405 String lexeme = afterParameters.lexeme; | 4034 String lexeme = afterParameters.lexeme; |
| 4406 return lexeme == ASYNC || lexeme == SYNC; | 4035 return lexeme == ASYNC || lexeme == SYNC; |
| 4407 } | 4036 } |
| 4408 | 4037 |
| 4409 /** | 4038 /** |
| 4410 * Return `true` if the given character is a valid hexadecimal digit. | 4039 * Return `true` if the given character is a valid hexadecimal digit. |
| 4411 * | 4040 * |
| 4412 * @param character the character being tested | 4041 * @param character the character being tested |
| 4413 * @return `true` if the character is a valid hexadecimal digit | 4042 * @return `true` if the character is a valid hexadecimal digit |
| 4414 */ | 4043 */ |
| 4415 bool _isHexDigit(int character) => | 4044 bool _isHexDigit(int character) => (0x30 <= character && character <= 0x39) || |
| 4416 (0x30 <= character && character <= 0x39) || | 4045 (0x41 <= character && character <= 0x46) || |
| 4417 (0x41 <= character && character <= 0x46) || | 4046 (0x61 <= character && character <= 0x66); |
| 4418 (0x61 <= character && character <= 0x66); | |
| 4419 | 4047 |
| 4420 /** | 4048 /** |
| 4421 * Return `true` if the current token is the first token in an initialized var
iable | 4049 * Return `true` if the current token is the first token in an initialized var
iable |
| 4422 * declaration rather than an expression. This method assumes that we have alr
eady skipped past | 4050 * declaration rather than an expression. This method assumes that we have alr
eady skipped past |
| 4423 * any metadata that might be associated with the declaration. | 4051 * any metadata that might be associated with the declaration. |
| 4424 * | 4052 * |
| 4425 * <pre> | 4053 * <pre> |
| 4426 * initializedVariableDeclaration ::= | 4054 * initializedVariableDeclaration ::= |
| 4427 * declaredIdentifier ('=' expression)? (',' initializedIdentifier)* | 4055 * declaredIdentifier ('=' expression)? (',' initializedIdentifier)* |
| 4428 * | 4056 * |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4447 */ | 4075 */ |
| 4448 bool _isInitializedVariableDeclaration() { | 4076 bool _isInitializedVariableDeclaration() { |
| 4449 if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.VAR)) { | 4077 if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.VAR)) { |
| 4450 // An expression cannot start with a keyword other than 'const', | 4078 // An expression cannot start with a keyword other than 'const', |
| 4451 // 'rethrow', or 'throw'. | 4079 // 'rethrow', or 'throw'. |
| 4452 return true; | 4080 return true; |
| 4453 } | 4081 } |
| 4454 if (_matchesKeyword(Keyword.CONST)) { | 4082 if (_matchesKeyword(Keyword.CONST)) { |
| 4455 // Look to see whether we might be at the start of a list or map literal, | 4083 // Look to see whether we might be at the start of a list or map literal, |
| 4456 // otherwise this should be the start of a variable declaration. | 4084 // otherwise this should be the start of a variable declaration. |
| 4457 return !_peek().matchesAny( | 4085 return !_peek().matchesAny([ |
| 4458 [ | 4086 TokenType.LT, |
| 4459 TokenType.LT, | 4087 TokenType.OPEN_CURLY_BRACKET, |
| 4460 TokenType.OPEN_CURLY_BRACKET, | 4088 TokenType.OPEN_SQUARE_BRACKET, |
| 4461 TokenType.OPEN_SQUARE_BRACKET, | 4089 TokenType.INDEX |
| 4462 TokenType.INDEX]); | 4090 ]); |
| 4463 } | 4091 } |
| 4464 // We know that we have an identifier, and need to see whether it might be | 4092 // We know that we have an identifier, and need to see whether it might be |
| 4465 // a type name. | 4093 // a type name. |
| 4466 Token token = _skipTypeName(_currentToken); | 4094 Token token = _skipTypeName(_currentToken); |
| 4467 if (token == null) { | 4095 if (token == null) { |
| 4468 // There was no type name, so this can't be a declaration. | 4096 // There was no type name, so this can't be a declaration. |
| 4469 return false; | 4097 return false; |
| 4470 } | 4098 } |
| 4471 token = _skipSimpleIdentifier(token); | 4099 token = _skipSimpleIdentifier(token); |
| 4472 if (token == null) { | 4100 if (token == null) { |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4697 Expression _parseAdditiveExpression() { | 4325 Expression _parseAdditiveExpression() { |
| 4698 Expression expression; | 4326 Expression expression; |
| 4699 if (_matchesKeyword(Keyword.SUPER) && | 4327 if (_matchesKeyword(Keyword.SUPER) && |
| 4700 _currentToken.next.type.isAdditiveOperator) { | 4328 _currentToken.next.type.isAdditiveOperator) { |
| 4701 expression = new SuperExpression(getAndAdvance()); | 4329 expression = new SuperExpression(getAndAdvance()); |
| 4702 } else { | 4330 } else { |
| 4703 expression = _parseMultiplicativeExpression(); | 4331 expression = _parseMultiplicativeExpression(); |
| 4704 } | 4332 } |
| 4705 while (_currentToken.type.isAdditiveOperator) { | 4333 while (_currentToken.type.isAdditiveOperator) { |
| 4706 Token operator = getAndAdvance(); | 4334 Token operator = getAndAdvance(); |
| 4707 expression = | 4335 expression = new BinaryExpression( |
| 4708 new BinaryExpression(expression, operator, _parseMultiplicativeExpress
ion()); | 4336 expression, operator, _parseMultiplicativeExpression()); |
| 4709 } | 4337 } |
| 4710 return expression; | 4338 return expression; |
| 4711 } | 4339 } |
| 4712 | 4340 |
| 4713 /** | 4341 /** |
| 4714 * Parse an assert statement. | 4342 * Parse an assert statement. |
| 4715 * | 4343 * |
| 4716 * <pre> | 4344 * <pre> |
| 4717 * assertStatement ::= | 4345 * assertStatement ::= |
| 4718 * 'assert' '(' conditionalExpression ')' ';' | 4346 * 'assert' '(' conditionalExpression ')' ';' |
| 4719 * </pre> | 4347 * </pre> |
| 4720 * | 4348 * |
| 4721 * @return the assert statement | 4349 * @return the assert statement |
| 4722 */ | 4350 */ |
| 4723 AssertStatement _parseAssertStatement() { | 4351 AssertStatement _parseAssertStatement() { |
| 4724 Token keyword = _expectKeyword(Keyword.ASSERT); | 4352 Token keyword = _expectKeyword(Keyword.ASSERT); |
| 4725 Token leftParen = _expect(TokenType.OPEN_PAREN); | 4353 Token leftParen = _expect(TokenType.OPEN_PAREN); |
| 4726 Expression expression = parseExpression2(); | 4354 Expression expression = parseExpression2(); |
| 4727 if (expression is AssignmentExpression) { | 4355 if (expression is AssignmentExpression) { |
| 4728 _reportErrorForNode( | 4356 _reportErrorForNode( |
| 4729 ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT, | 4357 ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT, expression); |
| 4730 expression); | |
| 4731 } else if (expression is CascadeExpression) { | 4358 } else if (expression is CascadeExpression) { |
| 4732 _reportErrorForNode( | 4359 _reportErrorForNode( |
| 4733 ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE, | 4360 ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE, expression); |
| 4734 expression); | |
| 4735 } else if (expression is ThrowExpression) { | 4361 } else if (expression is ThrowExpression) { |
| 4736 _reportErrorForNode( | 4362 _reportErrorForNode( |
| 4737 ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW, | 4363 ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW, expression); |
| 4738 expression); | |
| 4739 } else if (expression is RethrowExpression) { | 4364 } else if (expression is RethrowExpression) { |
| 4740 _reportErrorForNode( | 4365 _reportErrorForNode( |
| 4741 ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW, | 4366 ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW, expression); |
| 4742 expression); | |
| 4743 } | 4367 } |
| 4744 Token rightParen = _expect(TokenType.CLOSE_PAREN); | 4368 Token rightParen = _expect(TokenType.CLOSE_PAREN); |
| 4745 Token semicolon = _expect(TokenType.SEMICOLON); | 4369 Token semicolon = _expect(TokenType.SEMICOLON); |
| 4746 return new AssertStatement( | 4370 return new AssertStatement( |
| 4747 keyword, | 4371 keyword, leftParen, expression, rightParen, semicolon); |
| 4748 leftParen, | |
| 4749 expression, | |
| 4750 rightParen, | |
| 4751 semicolon); | |
| 4752 } | 4372 } |
| 4753 | 4373 |
| 4754 /** | 4374 /** |
| 4755 * Parse an assignable expression. | 4375 * Parse an assignable expression. |
| 4756 * | 4376 * |
| 4757 * <pre> | 4377 * <pre> |
| 4758 * assignableExpression ::= | 4378 * assignableExpression ::= |
| 4759 * primary (arguments* assignableSelector)+ | 4379 * primary (arguments* assignableSelector)+ |
| 4760 * | 'super' assignableSelector | 4380 * | 'super' assignableSelector |
| 4761 * | identifier | 4381 * | identifier |
| 4762 * </pre> | 4382 * </pre> |
| 4763 * | 4383 * |
| 4764 * @param primaryAllowed `true` if the expression is allowed to be a primary w
ithout any | 4384 * @param primaryAllowed `true` if the expression is allowed to be a primary w
ithout any |
| 4765 * assignable selector | 4385 * assignable selector |
| 4766 * @return the assignable expression that was parsed | 4386 * @return the assignable expression that was parsed |
| 4767 */ | 4387 */ |
| 4768 Expression _parseAssignableExpression(bool primaryAllowed) { | 4388 Expression _parseAssignableExpression(bool primaryAllowed) { |
| 4769 if (_matchesKeyword(Keyword.SUPER)) { | 4389 if (_matchesKeyword(Keyword.SUPER)) { |
| 4770 return _parseAssignableSelector( | 4390 return _parseAssignableSelector( |
| 4771 new SuperExpression(getAndAdvance()), | 4391 new SuperExpression(getAndAdvance()), false); |
| 4772 false); | |
| 4773 } | 4392 } |
| 4774 // | 4393 // |
| 4775 // A primary expression can start with an identifier. We resolve the | 4394 // A primary expression can start with an identifier. We resolve the |
| 4776 // ambiguity by determining whether the primary consists of anything other | 4395 // ambiguity by determining whether the primary consists of anything other |
| 4777 // than an identifier and/or is followed by an assignableSelector. | 4396 // than an identifier and/or is followed by an assignableSelector. |
| 4778 // | 4397 // |
| 4779 Expression expression = _parsePrimaryExpression(); | 4398 Expression expression = _parsePrimaryExpression(); |
| 4780 bool isOptional = primaryAllowed || expression is SimpleIdentifier; | 4399 bool isOptional = primaryAllowed || expression is SimpleIdentifier; |
| 4781 while (true) { | 4400 while (true) { |
| 4782 while (_matches(TokenType.OPEN_PAREN)) { | 4401 while (_matches(TokenType.OPEN_PAREN)) { |
| 4783 ArgumentList argumentList = parseArgumentList(); | 4402 ArgumentList argumentList = parseArgumentList(); |
| 4784 if (expression is SimpleIdentifier) { | 4403 if (expression is SimpleIdentifier) { |
| 4785 expression = | 4404 expression = new MethodInvocation( |
| 4786 new MethodInvocation(null, null, expression as SimpleIdentifier, a
rgumentList); | 4405 null, null, expression as SimpleIdentifier, argumentList); |
| 4787 } else if (expression is PrefixedIdentifier) { | 4406 } else if (expression is PrefixedIdentifier) { |
| 4788 PrefixedIdentifier identifier = expression as PrefixedIdentifier; | 4407 PrefixedIdentifier identifier = expression as PrefixedIdentifier; |
| 4789 expression = new MethodInvocation( | 4408 expression = new MethodInvocation(identifier.prefix, |
| 4790 identifier.prefix, | 4409 identifier.period, identifier.identifier, argumentList); |
| 4791 identifier.period, | |
| 4792 identifier.identifier, | |
| 4793 argumentList); | |
| 4794 } else if (expression is PropertyAccess) { | 4410 } else if (expression is PropertyAccess) { |
| 4795 PropertyAccess access = expression as PropertyAccess; | 4411 PropertyAccess access = expression as PropertyAccess; |
| 4796 expression = new MethodInvocation( | 4412 expression = new MethodInvocation(access.target, access.operator, |
| 4797 access.target, | 4413 access.propertyName, argumentList); |
| 4798 access.operator, | |
| 4799 access.propertyName, | |
| 4800 argumentList); | |
| 4801 } else { | 4414 } else { |
| 4802 expression = | 4415 expression = |
| 4803 new FunctionExpressionInvocation(expression, argumentList); | 4416 new FunctionExpressionInvocation(expression, argumentList); |
| 4804 } | 4417 } |
| 4805 if (!primaryAllowed) { | 4418 if (!primaryAllowed) { |
| 4806 isOptional = false; | 4419 isOptional = false; |
| 4807 } | 4420 } |
| 4808 } | 4421 } |
| 4809 Expression selectorExpression = _parseAssignableSelector( | 4422 Expression selectorExpression = _parseAssignableSelector( |
| 4810 expression, | 4423 expression, isOptional || (expression is PrefixedIdentifier)); |
| 4811 isOptional || (expression is PrefixedIdentifier)); | |
| 4812 if (identical(selectorExpression, expression)) { | 4424 if (identical(selectorExpression, expression)) { |
| 4813 if (!isOptional && (expression is PrefixedIdentifier)) { | 4425 if (!isOptional && (expression is PrefixedIdentifier)) { |
| 4814 PrefixedIdentifier identifier = expression as PrefixedIdentifier; | 4426 PrefixedIdentifier identifier = expression as PrefixedIdentifier; |
| 4815 expression = new PropertyAccess( | 4427 expression = new PropertyAccess( |
| 4816 identifier.prefix, | 4428 identifier.prefix, identifier.period, identifier.identifier); |
| 4817 identifier.period, | |
| 4818 identifier.identifier); | |
| 4819 } | 4429 } |
| 4820 return expression; | 4430 return expression; |
| 4821 } | 4431 } |
| 4822 expression = selectorExpression; | 4432 expression = selectorExpression; |
| 4823 isOptional = true; | 4433 isOptional = true; |
| 4824 } | 4434 } |
| 4825 } | 4435 } |
| 4826 | 4436 |
| 4827 /** | 4437 /** |
| 4828 * Parse an assignable selector. | 4438 * Parse an assignable selector. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4840 */ | 4450 */ |
| 4841 Expression _parseAssignableSelector(Expression prefix, bool optional) { | 4451 Expression _parseAssignableSelector(Expression prefix, bool optional) { |
| 4842 if (_matches(TokenType.OPEN_SQUARE_BRACKET)) { | 4452 if (_matches(TokenType.OPEN_SQUARE_BRACKET)) { |
| 4843 Token leftBracket = getAndAdvance(); | 4453 Token leftBracket = getAndAdvance(); |
| 4844 bool wasInInitializer = _inInitializer; | 4454 bool wasInInitializer = _inInitializer; |
| 4845 _inInitializer = false; | 4455 _inInitializer = false; |
| 4846 try { | 4456 try { |
| 4847 Expression index = parseExpression2(); | 4457 Expression index = parseExpression2(); |
| 4848 Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET); | 4458 Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET); |
| 4849 return new IndexExpression.forTarget( | 4459 return new IndexExpression.forTarget( |
| 4850 prefix, | 4460 prefix, leftBracket, index, rightBracket); |
| 4851 leftBracket, | |
| 4852 index, | |
| 4853 rightBracket); | |
| 4854 } finally { | 4461 } finally { |
| 4855 _inInitializer = wasInInitializer; | 4462 _inInitializer = wasInInitializer; |
| 4856 } | 4463 } |
| 4857 } else if (_matches(TokenType.PERIOD)) { | 4464 } else if (_matches(TokenType.PERIOD)) { |
| 4858 Token period = getAndAdvance(); | 4465 Token period = getAndAdvance(); |
| 4859 return new PropertyAccess(prefix, period, parseSimpleIdentifier()); | 4466 return new PropertyAccess(prefix, period, parseSimpleIdentifier()); |
| 4860 } else { | 4467 } else { |
| 4861 if (!optional) { | 4468 if (!optional) { |
| 4862 // Report the missing selector. | 4469 // Report the missing selector. |
| 4863 _reportErrorForCurrentToken( | 4470 _reportErrorForCurrentToken( |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4924 Expression _parseBitwiseXorExpression() { | 4531 Expression _parseBitwiseXorExpression() { |
| 4925 Expression expression; | 4532 Expression expression; |
| 4926 if (_matchesKeyword(Keyword.SUPER) && | 4533 if (_matchesKeyword(Keyword.SUPER) && |
| 4927 _tokenMatches(_peek(), TokenType.CARET)) { | 4534 _tokenMatches(_peek(), TokenType.CARET)) { |
| 4928 expression = new SuperExpression(getAndAdvance()); | 4535 expression = new SuperExpression(getAndAdvance()); |
| 4929 } else { | 4536 } else { |
| 4930 expression = _parseBitwiseAndExpression(); | 4537 expression = _parseBitwiseAndExpression(); |
| 4931 } | 4538 } |
| 4932 while (_matches(TokenType.CARET)) { | 4539 while (_matches(TokenType.CARET)) { |
| 4933 Token operator = getAndAdvance(); | 4540 Token operator = getAndAdvance(); |
| 4934 expression = | 4541 expression = new BinaryExpression( |
| 4935 new BinaryExpression(expression, operator, _parseBitwiseAndExpression(
)); | 4542 expression, operator, _parseBitwiseAndExpression()); |
| 4936 } | 4543 } |
| 4937 return expression; | 4544 return expression; |
| 4938 } | 4545 } |
| 4939 | 4546 |
| 4940 /** | 4547 /** |
| 4941 * Parse a break statement. | 4548 * Parse a break statement. |
| 4942 * | 4549 * |
| 4943 * <pre> | 4550 * <pre> |
| 4944 * breakStatement ::= | 4551 * breakStatement ::= |
| 4945 * 'break' identifier? ';' | 4552 * 'break' identifier? ';' |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4983 SimpleIdentifier functionName = null; | 4590 SimpleIdentifier functionName = null; |
| 4984 if (_matchesIdentifier()) { | 4591 if (_matchesIdentifier()) { |
| 4985 functionName = parseSimpleIdentifier(); | 4592 functionName = parseSimpleIdentifier(); |
| 4986 } else if (_currentToken.type == TokenType.OPEN_SQUARE_BRACKET) { | 4593 } else if (_currentToken.type == TokenType.OPEN_SQUARE_BRACKET) { |
| 4987 Token leftBracket = getAndAdvance(); | 4594 Token leftBracket = getAndAdvance(); |
| 4988 bool wasInInitializer = _inInitializer; | 4595 bool wasInInitializer = _inInitializer; |
| 4989 _inInitializer = false; | 4596 _inInitializer = false; |
| 4990 try { | 4597 try { |
| 4991 Expression index = parseExpression2(); | 4598 Expression index = parseExpression2(); |
| 4992 Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET); | 4599 Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET); |
| 4993 expression = | 4600 expression = new IndexExpression.forCascade( |
| 4994 new IndexExpression.forCascade(period, leftBracket, index, rightBrac
ket); | 4601 period, leftBracket, index, rightBracket); |
| 4995 period = null; | 4602 period = null; |
| 4996 } finally { | 4603 } finally { |
| 4997 _inInitializer = wasInInitializer; | 4604 _inInitializer = wasInInitializer; |
| 4998 } | 4605 } |
| 4999 } else { | 4606 } else { |
| 5000 _reportErrorForToken( | 4607 _reportErrorForToken(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [ |
| 5001 ParserErrorCode.MISSING_IDENTIFIER, | 4608 _currentToken.lexeme |
| 5002 _currentToken, | 4609 ]); |
| 5003 [_currentToken.lexeme]); | |
| 5004 functionName = _createSyntheticIdentifier(); | 4610 functionName = _createSyntheticIdentifier(); |
| 5005 } | 4611 } |
| 5006 assert((expression == null && functionName != null) || | 4612 assert((expression == null && functionName != null) || |
| 5007 (expression != null && functionName == null)); | 4613 (expression != null && functionName == null)); |
| 5008 if (_currentToken.type == TokenType.OPEN_PAREN) { | 4614 if (_currentToken.type == TokenType.OPEN_PAREN) { |
| 5009 while (_currentToken.type == TokenType.OPEN_PAREN) { | 4615 while (_currentToken.type == TokenType.OPEN_PAREN) { |
| 5010 if (functionName != null) { | 4616 if (functionName != null) { |
| 5011 expression = | 4617 expression = new MethodInvocation( |
| 5012 new MethodInvocation(expression, period, functionName, parseArgume
ntList()); | 4618 expression, period, functionName, parseArgumentList()); |
| 5013 period = null; | 4619 period = null; |
| 5014 functionName = null; | 4620 functionName = null; |
| 5015 } else if (expression == null) { | 4621 } else if (expression == null) { |
| 5016 // It should not be possible to get here. | 4622 // It should not be possible to get here. |
| 5017 expression = new MethodInvocation( | 4623 expression = new MethodInvocation(expression, period, |
| 5018 expression, | 4624 _createSyntheticIdentifier(), parseArgumentList()); |
| 5019 period, | |
| 5020 _createSyntheticIdentifier(), | |
| 5021 parseArgumentList()); | |
| 5022 } else { | 4625 } else { |
| 5023 expression = | 4626 expression = |
| 5024 new FunctionExpressionInvocation(expression, parseArgumentList()); | 4627 new FunctionExpressionInvocation(expression, parseArgumentList()); |
| 5025 } | 4628 } |
| 5026 } | 4629 } |
| 5027 } else if (functionName != null) { | 4630 } else if (functionName != null) { |
| 5028 expression = new PropertyAccess(expression, period, functionName); | 4631 expression = new PropertyAccess(expression, period, functionName); |
| 5029 period = null; | 4632 period = null; |
| 5030 } | 4633 } |
| 5031 assert(expression != null); | 4634 assert(expression != null); |
| 5032 bool progress = true; | 4635 bool progress = true; |
| 5033 while (progress) { | 4636 while (progress) { |
| 5034 progress = false; | 4637 progress = false; |
| 5035 Expression selector = _parseAssignableSelector(expression, true); | 4638 Expression selector = _parseAssignableSelector(expression, true); |
| 5036 if (!identical(selector, expression)) { | 4639 if (!identical(selector, expression)) { |
| 5037 expression = selector; | 4640 expression = selector; |
| 5038 progress = true; | 4641 progress = true; |
| 5039 while (_currentToken.type == TokenType.OPEN_PAREN) { | 4642 while (_currentToken.type == TokenType.OPEN_PAREN) { |
| 5040 if (expression is PropertyAccess) { | 4643 if (expression is PropertyAccess) { |
| 5041 PropertyAccess propertyAccess = expression as PropertyAccess; | 4644 PropertyAccess propertyAccess = expression as PropertyAccess; |
| 5042 expression = new MethodInvocation( | 4645 expression = new MethodInvocation(propertyAccess.target, |
| 5043 propertyAccess.target, | 4646 propertyAccess.operator, propertyAccess.propertyName, |
| 5044 propertyAccess.operator, | |
| 5045 propertyAccess.propertyName, | |
| 5046 parseArgumentList()); | 4647 parseArgumentList()); |
| 5047 } else { | 4648 } else { |
| 5048 expression = | 4649 expression = new FunctionExpressionInvocation( |
| 5049 new FunctionExpressionInvocation(expression, parseArgumentList()
); | 4650 expression, parseArgumentList()); |
| 5050 } | 4651 } |
| 5051 } | 4652 } |
| 5052 } | 4653 } |
| 5053 } | 4654 } |
| 5054 if (_currentToken.type.isAssignmentOperator) { | 4655 if (_currentToken.type.isAssignmentOperator) { |
| 5055 Token operator = getAndAdvance(); | 4656 Token operator = getAndAdvance(); |
| 5056 _ensureAssignable(expression); | 4657 _ensureAssignable(expression); |
| 5057 expression = new AssignmentExpression( | 4658 expression = new AssignmentExpression( |
| 5058 expression, | 4659 expression, operator, parseExpressionWithoutCascade()); |
| 5059 operator, | |
| 5060 parseExpressionWithoutCascade()); | |
| 5061 } | 4660 } |
| 5062 return expression; | 4661 return expression; |
| 5063 } | 4662 } |
| 5064 | 4663 |
| 5065 /** | 4664 /** |
| 5066 * Parse a class declaration. | 4665 * Parse a class declaration. |
| 5067 * | 4666 * |
| 5068 * <pre> | 4667 * <pre> |
| 5069 * classDeclaration ::= | 4668 * classDeclaration ::= |
| 5070 * metadata 'abstract'? 'class' name typeParameterList? (extendsClause wit
hClause?)? implementsClause? '{' classMembers '}' | | 4669 * metadata 'abstract'? 'class' name typeParameterList? (extendsClause wit
hClause?)? implementsClause? '{' classMembers '}' | |
| 5071 * metadata 'abstract'? 'class' mixinApplicationClass | 4670 * metadata 'abstract'? 'class' mixinApplicationClass |
| 5072 * </pre> | 4671 * </pre> |
| 5073 * | 4672 * |
| 5074 * @param commentAndMetadata the metadata to be associated with the member | 4673 * @param commentAndMetadata the metadata to be associated with the member |
| 5075 * @param abstractKeyword the token for the keyword 'abstract', or `null` if t
he keyword was | 4674 * @param abstractKeyword the token for the keyword 'abstract', or `null` if t
he keyword was |
| 5076 * not given | 4675 * not given |
| 5077 * @return the class declaration that was parsed | 4676 * @return the class declaration that was parsed |
| 5078 */ | 4677 */ |
| 5079 CompilationUnitMember | 4678 CompilationUnitMember _parseClassDeclaration( |
| 5080 _parseClassDeclaration(CommentAndMetadata commentAndMetadata, | 4679 CommentAndMetadata commentAndMetadata, Token abstractKeyword) { |
| 5081 Token abstractKeyword) { | |
| 5082 Token keyword = _expectKeyword(Keyword.CLASS); | 4680 Token keyword = _expectKeyword(Keyword.CLASS); |
| 5083 if (_matchesIdentifier()) { | 4681 if (_matchesIdentifier()) { |
| 5084 Token next = _peek(); | 4682 Token next = _peek(); |
| 5085 if (_tokenMatches(next, TokenType.LT)) { | 4683 if (_tokenMatches(next, TokenType.LT)) { |
| 5086 next = _skipTypeParameterList(next); | 4684 next = _skipTypeParameterList(next); |
| 5087 if (next != null && _tokenMatches(next, TokenType.EQ)) { | 4685 if (next != null && _tokenMatches(next, TokenType.EQ)) { |
| 5088 return _parseClassTypeAlias( | 4686 return _parseClassTypeAlias( |
| 5089 commentAndMetadata, | 4687 commentAndMetadata, abstractKeyword, keyword); |
| 5090 abstractKeyword, | |
| 5091 keyword); | |
| 5092 } | 4688 } |
| 5093 } else if (_tokenMatches(next, TokenType.EQ)) { | 4689 } else if (_tokenMatches(next, TokenType.EQ)) { |
| 5094 return _parseClassTypeAlias( | 4690 return _parseClassTypeAlias( |
| 5095 commentAndMetadata, | 4691 commentAndMetadata, abstractKeyword, keyword); |
| 5096 abstractKeyword, | |
| 5097 keyword); | |
| 5098 } | 4692 } |
| 5099 } | 4693 } |
| 5100 SimpleIdentifier name = parseSimpleIdentifier(); | 4694 SimpleIdentifier name = parseSimpleIdentifier(); |
| 5101 String className = name.name; | 4695 String className = name.name; |
| 5102 TypeParameterList typeParameters = null; | 4696 TypeParameterList typeParameters = null; |
| 5103 if (_matches(TokenType.LT)) { | 4697 if (_matches(TokenType.LT)) { |
| 5104 typeParameters = parseTypeParameterList(); | 4698 typeParameters = parseTypeParameterList(); |
| 5105 } | 4699 } |
| 5106 // | 4700 // |
| 5107 // Parse the clauses. The parser accepts clauses in any order, but will | 4701 // Parse the clauses. The parser accepts clauses in any order, but will |
| 5108 // generate errors if they are not in the order required by the | 4702 // generate errors if they are not in the order required by the |
| 5109 // specification. | 4703 // specification. |
| 5110 // | 4704 // |
| 5111 ExtendsClause extendsClause = null; | 4705 ExtendsClause extendsClause = null; |
| 5112 WithClause withClause = null; | 4706 WithClause withClause = null; |
| 5113 ImplementsClause implementsClause = null; | 4707 ImplementsClause implementsClause = null; |
| 5114 bool foundClause = true; | 4708 bool foundClause = true; |
| 5115 while (foundClause) { | 4709 while (foundClause) { |
| 5116 if (_matchesKeyword(Keyword.EXTENDS)) { | 4710 if (_matchesKeyword(Keyword.EXTENDS)) { |
| 5117 if (extendsClause == null) { | 4711 if (extendsClause == null) { |
| 5118 extendsClause = parseExtendsClause(); | 4712 extendsClause = parseExtendsClause(); |
| 5119 if (withClause != null) { | 4713 if (withClause != null) { |
| 5120 _reportErrorForToken( | 4714 _reportErrorForToken( |
| 5121 ParserErrorCode.WITH_BEFORE_EXTENDS, | 4715 ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword); |
| 5122 withClause.withKeyword); | |
| 5123 } else if (implementsClause != null) { | 4716 } else if (implementsClause != null) { |
| 5124 _reportErrorForToken( | 4717 _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, |
| 5125 ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, | |
| 5126 implementsClause.implementsKeyword); | 4718 implementsClause.implementsKeyword); |
| 5127 } | 4719 } |
| 5128 } else { | 4720 } else { |
| 5129 _reportErrorForToken( | 4721 _reportErrorForToken(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, |
| 5130 ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, | |
| 5131 extendsClause.extendsKeyword); | 4722 extendsClause.extendsKeyword); |
| 5132 parseExtendsClause(); | 4723 parseExtendsClause(); |
| 5133 } | 4724 } |
| 5134 } else if (_matchesKeyword(Keyword.WITH)) { | 4725 } else if (_matchesKeyword(Keyword.WITH)) { |
| 5135 if (withClause == null) { | 4726 if (withClause == null) { |
| 5136 withClause = parseWithClause(); | 4727 withClause = parseWithClause(); |
| 5137 if (implementsClause != null) { | 4728 if (implementsClause != null) { |
| 5138 _reportErrorForToken( | 4729 _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, |
| 5139 ParserErrorCode.IMPLEMENTS_BEFORE_WITH, | |
| 5140 implementsClause.implementsKeyword); | 4730 implementsClause.implementsKeyword); |
| 5141 } | 4731 } |
| 5142 } else { | 4732 } else { |
| 5143 _reportErrorForToken( | 4733 _reportErrorForToken( |
| 5144 ParserErrorCode.MULTIPLE_WITH_CLAUSES, | 4734 ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword); |
| 5145 withClause.withKeyword); | |
| 5146 parseWithClause(); | 4735 parseWithClause(); |
| 5147 // TODO(brianwilkerson) Should we merge the list of applied mixins | 4736 // TODO(brianwilkerson) Should we merge the list of applied mixins |
| 5148 // into a single list? | 4737 // into a single list? |
| 5149 } | 4738 } |
| 5150 } else if (_matchesKeyword(Keyword.IMPLEMENTS)) { | 4739 } else if (_matchesKeyword(Keyword.IMPLEMENTS)) { |
| 5151 if (implementsClause == null) { | 4740 if (implementsClause == null) { |
| 5152 implementsClause = parseImplementsClause(); | 4741 implementsClause = parseImplementsClause(); |
| 5153 } else { | 4742 } else { |
| 5154 _reportErrorForToken( | 4743 _reportErrorForToken(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, |
| 5155 ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, | |
| 5156 implementsClause.implementsKeyword); | 4744 implementsClause.implementsKeyword); |
| 5157 parseImplementsClause(); | 4745 parseImplementsClause(); |
| 5158 // TODO(brianwilkerson) Should we merge the list of implemented | 4746 // TODO(brianwilkerson) Should we merge the list of implemented |
| 5159 // classes into a single list? | 4747 // classes into a single list? |
| 5160 } | 4748 } |
| 5161 } else { | 4749 } else { |
| 5162 foundClause = false; | 4750 foundClause = false; |
| 5163 } | 4751 } |
| 5164 } | 4752 } |
| 5165 if (withClause != null && extendsClause == null) { | 4753 if (withClause != null && extendsClause == null) { |
| 5166 _reportErrorForToken( | 4754 _reportErrorForToken( |
| 5167 ParserErrorCode.WITH_WITHOUT_EXTENDS, | 4755 ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword); |
| 5168 withClause.withKeyword); | |
| 5169 } | 4756 } |
| 5170 // | 4757 // |
| 5171 // Look for and skip over the extra-lingual 'native' specification. | 4758 // Look for and skip over the extra-lingual 'native' specification. |
| 5172 // | 4759 // |
| 5173 NativeClause nativeClause = null; | 4760 NativeClause nativeClause = null; |
| 5174 if (_matchesString(_NATIVE) && _tokenMatches(_peek(), TokenType.STRING)) { | 4761 if (_matchesString(_NATIVE) && _tokenMatches(_peek(), TokenType.STRING)) { |
| 5175 nativeClause = _parseNativeClause(); | 4762 nativeClause = _parseNativeClause(); |
| 5176 } | 4763 } |
| 5177 // | 4764 // |
| 5178 // Parse the body of the class. | 4765 // Parse the body of the class. |
| 5179 // | 4766 // |
| 5180 Token leftBracket = null; | 4767 Token leftBracket = null; |
| 5181 List<ClassMember> members = null; | 4768 List<ClassMember> members = null; |
| 5182 Token rightBracket = null; | 4769 Token rightBracket = null; |
| 5183 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 4770 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 5184 leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); | 4771 leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); |
| 5185 members = _parseClassMembers(className, _getEndToken(leftBracket)); | 4772 members = _parseClassMembers(className, _getEndToken(leftBracket)); |
| 5186 rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 4773 rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 5187 } else { | 4774 } else { |
| 5188 leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET); | 4775 leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET); |
| 5189 rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET); | 4776 rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET); |
| 5190 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CLASS_BODY); | 4777 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CLASS_BODY); |
| 5191 } | 4778 } |
| 5192 ClassDeclaration classDeclaration = new ClassDeclaration( | 4779 ClassDeclaration classDeclaration = new ClassDeclaration( |
| 5193 commentAndMetadata.comment, | 4780 commentAndMetadata.comment, commentAndMetadata.metadata, |
| 5194 commentAndMetadata.metadata, | 4781 abstractKeyword, keyword, name, typeParameters, extendsClause, |
| 5195 abstractKeyword, | 4782 withClause, implementsClause, leftBracket, members, rightBracket); |
| 5196 keyword, | |
| 5197 name, | |
| 5198 typeParameters, | |
| 5199 extendsClause, | |
| 5200 withClause, | |
| 5201 implementsClause, | |
| 5202 leftBracket, | |
| 5203 members, | |
| 5204 rightBracket); | |
| 5205 classDeclaration.nativeClause = nativeClause; | 4783 classDeclaration.nativeClause = nativeClause; |
| 5206 return classDeclaration; | 4784 return classDeclaration; |
| 5207 } | 4785 } |
| 5208 | 4786 |
| 5209 /** | 4787 /** |
| 5210 * Parse a list of class members. | 4788 * Parse a list of class members. |
| 5211 * | 4789 * |
| 5212 * <pre> | 4790 * <pre> |
| 5213 * classMembers ::= | 4791 * classMembers ::= |
| 5214 * (metadata memberDefinition)* | 4792 * (metadata memberDefinition)* |
| 5215 * </pre> | 4793 * </pre> |
| 5216 * | 4794 * |
| 5217 * @param className the name of the class whose members are being parsed | 4795 * @param className the name of the class whose members are being parsed |
| 5218 * @param closingBracket the closing bracket for the class, or `null` if the c
losing bracket | 4796 * @param closingBracket the closing bracket for the class, or `null` if the c
losing bracket |
| 5219 * is missing | 4797 * is missing |
| 5220 * @return the list of class members that were parsed | 4798 * @return the list of class members that were parsed |
| 5221 */ | 4799 */ |
| 5222 List<ClassMember> _parseClassMembers(String className, Token closingBracket) { | 4800 List<ClassMember> _parseClassMembers(String className, Token closingBracket) { |
| 5223 List<ClassMember> members = new List<ClassMember>(); | 4801 List<ClassMember> members = new List<ClassMember>(); |
| 5224 Token memberStart = _currentToken; | 4802 Token memberStart = _currentToken; |
| 5225 while (!_matches(TokenType.EOF) && | 4803 while (!_matches(TokenType.EOF) && |
| 5226 !_matches(TokenType.CLOSE_CURLY_BRACKET) && | 4804 !_matches(TokenType.CLOSE_CURLY_BRACKET) && |
| 5227 (closingBracket != null || | 4805 (closingBracket != null || |
| 5228 (!_matchesKeyword(Keyword.CLASS) && !_matchesKeyword(Keyword.TYPEDEF
)))) { | 4806 (!_matchesKeyword(Keyword.CLASS) && |
| 4807 !_matchesKeyword(Keyword.TYPEDEF)))) { |
| 5229 if (_matches(TokenType.SEMICOLON)) { | 4808 if (_matches(TokenType.SEMICOLON)) { |
| 5230 _reportErrorForToken( | 4809 _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [ |
| 5231 ParserErrorCode.UNEXPECTED_TOKEN, | 4810 _currentToken.lexeme |
| 5232 _currentToken, | 4811 ]); |
| 5233 [_currentToken.lexeme]); | |
| 5234 _advance(); | 4812 _advance(); |
| 5235 } else { | 4813 } else { |
| 5236 ClassMember member = parseClassMember(className); | 4814 ClassMember member = parseClassMember(className); |
| 5237 if (member != null) { | 4815 if (member != null) { |
| 5238 members.add(member); | 4816 members.add(member); |
| 5239 } | 4817 } |
| 5240 } | 4818 } |
| 5241 if (identical(_currentToken, memberStart)) { | 4819 if (identical(_currentToken, memberStart)) { |
| 5242 _reportErrorForToken( | 4820 _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [ |
| 5243 ParserErrorCode.UNEXPECTED_TOKEN, | 4821 _currentToken.lexeme |
| 5244 _currentToken, | 4822 ]); |
| 5245 [_currentToken.lexeme]); | |
| 5246 _advance(); | 4823 _advance(); |
| 5247 } | 4824 } |
| 5248 memberStart = _currentToken; | 4825 memberStart = _currentToken; |
| 5249 } | 4826 } |
| 5250 return members; | 4827 return members; |
| 5251 } | 4828 } |
| 5252 | 4829 |
| 5253 /** | 4830 /** |
| 5254 * Parse a class type alias. | 4831 * Parse a class type alias. |
| 5255 * | 4832 * |
| (...skipping 17 matching lines...) Expand all Loading... |
| 5273 if (_matches(TokenType.LT)) { | 4850 if (_matches(TokenType.LT)) { |
| 5274 typeParameters = parseTypeParameterList(); | 4851 typeParameters = parseTypeParameterList(); |
| 5275 } | 4852 } |
| 5276 Token equals = _expect(TokenType.EQ); | 4853 Token equals = _expect(TokenType.EQ); |
| 5277 TypeName superclass = parseTypeName(); | 4854 TypeName superclass = parseTypeName(); |
| 5278 WithClause withClause = null; | 4855 WithClause withClause = null; |
| 5279 if (_matchesKeyword(Keyword.WITH)) { | 4856 if (_matchesKeyword(Keyword.WITH)) { |
| 5280 withClause = parseWithClause(); | 4857 withClause = parseWithClause(); |
| 5281 } else { | 4858 } else { |
| 5282 _reportErrorForCurrentToken( | 4859 _reportErrorForCurrentToken( |
| 5283 ParserErrorCode.EXPECTED_TOKEN, | 4860 ParserErrorCode.EXPECTED_TOKEN, [Keyword.WITH.syntax]); |
| 5284 [Keyword.WITH.syntax]); | |
| 5285 } | 4861 } |
| 5286 ImplementsClause implementsClause = null; | 4862 ImplementsClause implementsClause = null; |
| 5287 if (_matchesKeyword(Keyword.IMPLEMENTS)) { | 4863 if (_matchesKeyword(Keyword.IMPLEMENTS)) { |
| 5288 implementsClause = parseImplementsClause(); | 4864 implementsClause = parseImplementsClause(); |
| 5289 } | 4865 } |
| 5290 Token semicolon; | 4866 Token semicolon; |
| 5291 if (_matches(TokenType.SEMICOLON)) { | 4867 if (_matches(TokenType.SEMICOLON)) { |
| 5292 semicolon = getAndAdvance(); | 4868 semicolon = getAndAdvance(); |
| 5293 } else { | 4869 } else { |
| 5294 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 4870 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 5295 _reportErrorForCurrentToken( | 4871 _reportErrorForCurrentToken( |
| 5296 ParserErrorCode.EXPECTED_TOKEN, | 4872 ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]); |
| 5297 [TokenType.SEMICOLON.lexeme]); | |
| 5298 Token leftBracket = getAndAdvance(); | 4873 Token leftBracket = getAndAdvance(); |
| 5299 _parseClassMembers(className.name, _getEndToken(leftBracket)); | 4874 _parseClassMembers(className.name, _getEndToken(leftBracket)); |
| 5300 _expect(TokenType.CLOSE_CURLY_BRACKET); | 4875 _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 5301 } else { | 4876 } else { |
| 5302 _reportErrorForToken( | 4877 _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, |
| 5303 ParserErrorCode.EXPECTED_TOKEN, | 4878 _currentToken.previous, [TokenType.SEMICOLON.lexeme]); |
| 5304 _currentToken.previous, | |
| 5305 [TokenType.SEMICOLON.lexeme]); | |
| 5306 } | 4879 } |
| 5307 semicolon = _createSyntheticToken(TokenType.SEMICOLON); | 4880 semicolon = _createSyntheticToken(TokenType.SEMICOLON); |
| 5308 } | 4881 } |
| 5309 return new ClassTypeAlias( | 4882 return new ClassTypeAlias(commentAndMetadata.comment, |
| 5310 commentAndMetadata.comment, | 4883 commentAndMetadata.metadata, classKeyword, className, typeParameters, |
| 5311 commentAndMetadata.metadata, | 4884 equals, abstractKeyword, superclass, withClause, implementsClause, |
| 5312 classKeyword, | |
| 5313 className, | |
| 5314 typeParameters, | |
| 5315 equals, | |
| 5316 abstractKeyword, | |
| 5317 superclass, | |
| 5318 withClause, | |
| 5319 implementsClause, | |
| 5320 semicolon); | 4885 semicolon); |
| 5321 } | 4886 } |
| 5322 | 4887 |
| 5323 /** | 4888 /** |
| 5324 * Parse a list of combinators in a directive. | 4889 * Parse a list of combinators in a directive. |
| 5325 * | 4890 * |
| 5326 * <pre> | 4891 * <pre> |
| 5327 * combinator ::= | 4892 * combinator ::= |
| 5328 * 'show' identifier (',' identifier)* | 4893 * 'show' identifier (',' identifier)* |
| 5329 * | 'hide' identifier (',' identifier)* | 4894 * | 'hide' identifier (',' identifier)* |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5374 * <pre> | 4939 * <pre> |
| 5375 * commentReference ::= | 4940 * commentReference ::= |
| 5376 * 'new'? prefixedIdentifier | 4941 * 'new'? prefixedIdentifier |
| 5377 * </pre> | 4942 * </pre> |
| 5378 * | 4943 * |
| 5379 * @param referenceSource the source occurring between the square brackets wit
hin a documentation | 4944 * @param referenceSource the source occurring between the square brackets wit
hin a documentation |
| 5380 * comment | 4945 * comment |
| 5381 * @param sourceOffset the offset of the first character of the reference sour
ce | 4946 * @param sourceOffset the offset of the first character of the reference sour
ce |
| 5382 * @return the comment reference that was parsed, or `null` if no reference co
uld be found | 4947 * @return the comment reference that was parsed, or `null` if no reference co
uld be found |
| 5383 */ | 4948 */ |
| 5384 CommentReference _parseCommentReference(String referenceSource, | 4949 CommentReference _parseCommentReference( |
| 5385 int sourceOffset) { | 4950 String referenceSource, int sourceOffset) { |
| 5386 // TODO(brianwilkerson) The errors are not getting the right offset/length | 4951 // TODO(brianwilkerson) The errors are not getting the right offset/length |
| 5387 // and are being duplicated. | 4952 // and are being duplicated. |
| 5388 if (referenceSource.length == 0) { | 4953 if (referenceSource.length == 0) { |
| 5389 Token syntheticToken = | 4954 Token syntheticToken = |
| 5390 new SyntheticStringToken(TokenType.IDENTIFIER, "", sourceOffset); | 4955 new SyntheticStringToken(TokenType.IDENTIFIER, "", sourceOffset); |
| 5391 return new CommentReference(null, new SimpleIdentifier(syntheticToken)); | 4956 return new CommentReference(null, new SimpleIdentifier(syntheticToken)); |
| 5392 } | 4957 } |
| 5393 try { | 4958 try { |
| 5394 BooleanErrorListener listener = new BooleanErrorListener(); | 4959 BooleanErrorListener listener = new BooleanErrorListener(); |
| 5395 Scanner scanner = new Scanner( | 4960 Scanner scanner = new Scanner( |
| 5396 null, | 4961 null, new SubSequenceReader(referenceSource, sourceOffset), listener); |
| 5397 new SubSequenceReader(referenceSource, sourceOffset), | |
| 5398 listener); | |
| 5399 scanner.setSourceStart(1, 1); | 4962 scanner.setSourceStart(1, 1); |
| 5400 Token firstToken = scanner.tokenize(); | 4963 Token firstToken = scanner.tokenize(); |
| 5401 if (listener.errorReported) { | 4964 if (listener.errorReported) { |
| 5402 return null; | 4965 return null; |
| 5403 } | 4966 } |
| 5404 Token newKeyword = null; | 4967 Token newKeyword = null; |
| 5405 if (_tokenMatchesKeyword(firstToken, Keyword.NEW)) { | 4968 if (_tokenMatchesKeyword(firstToken, Keyword.NEW)) { |
| 5406 newKeyword = firstToken; | 4969 newKeyword = firstToken; |
| 5407 firstToken = firstToken.next; | 4970 firstToken = firstToken.next; |
| 5408 } | 4971 } |
| 5409 if (_tokenMatchesIdentifier(firstToken)) { | 4972 if (_tokenMatchesIdentifier(firstToken)) { |
| 5410 Token secondToken = firstToken.next; | 4973 Token secondToken = firstToken.next; |
| 5411 Token thirdToken = secondToken.next; | 4974 Token thirdToken = secondToken.next; |
| 5412 Token nextToken; | 4975 Token nextToken; |
| 5413 Identifier identifier; | 4976 Identifier identifier; |
| 5414 if (_tokenMatches(secondToken, TokenType.PERIOD) && | 4977 if (_tokenMatches(secondToken, TokenType.PERIOD) && |
| 5415 _tokenMatchesIdentifier(thirdToken)) { | 4978 _tokenMatchesIdentifier(thirdToken)) { |
| 5416 identifier = new PrefixedIdentifier( | 4979 identifier = new PrefixedIdentifier(new SimpleIdentifier(firstToken), |
| 5417 new SimpleIdentifier(firstToken), | 4980 secondToken, new SimpleIdentifier(thirdToken)); |
| 5418 secondToken, | |
| 5419 new SimpleIdentifier(thirdToken)); | |
| 5420 nextToken = thirdToken.next; | 4981 nextToken = thirdToken.next; |
| 5421 } else { | 4982 } else { |
| 5422 identifier = new SimpleIdentifier(firstToken); | 4983 identifier = new SimpleIdentifier(firstToken); |
| 5423 nextToken = firstToken.next; | 4984 nextToken = firstToken.next; |
| 5424 } | 4985 } |
| 5425 if (nextToken.type != TokenType.EOF) { | 4986 if (nextToken.type != TokenType.EOF) { |
| 5426 return null; | 4987 return null; |
| 5427 } | 4988 } |
| 5428 return new CommentReference(newKeyword, identifier); | 4989 return new CommentReference(newKeyword, identifier); |
| 5429 } else if (_tokenMatchesKeyword(firstToken, Keyword.THIS) || | 4990 } else if (_tokenMatchesKeyword(firstToken, Keyword.THIS) || |
| (...skipping 20 matching lines...) Expand all Loading... |
| 5450 * commentReference ::= | 5011 * commentReference ::= |
| 5451 * '[' 'new'? qualified ']' libraryReference? | 5012 * '[' 'new'? qualified ']' libraryReference? |
| 5452 * | 5013 * |
| 5453 * libraryReference ::= | 5014 * libraryReference ::= |
| 5454 * '(' stringLiteral ')' | 5015 * '(' stringLiteral ')' |
| 5455 * </pre> | 5016 * </pre> |
| 5456 * | 5017 * |
| 5457 * @param tokens the comment tokens representing the documentation comments to
be parsed | 5018 * @param tokens the comment tokens representing the documentation comments to
be parsed |
| 5458 * @return the comment references that were parsed | 5019 * @return the comment references that were parsed |
| 5459 */ | 5020 */ |
| 5460 List<CommentReference> | 5021 List<CommentReference> _parseCommentReferences( |
| 5461 _parseCommentReferences(List<DocumentationCommentToken> tokens) { | 5022 List<DocumentationCommentToken> tokens) { |
| 5462 List<CommentReference> references = new List<CommentReference>(); | 5023 List<CommentReference> references = new List<CommentReference>(); |
| 5463 for (DocumentationCommentToken token in tokens) { | 5024 for (DocumentationCommentToken token in tokens) { |
| 5464 String comment = token.lexeme; | 5025 String comment = token.lexeme; |
| 5465 int length = comment.length; | 5026 int length = comment.length; |
| 5466 List<List<int>> codeBlockRanges = _getCodeBlockRanges(comment); | 5027 List<List<int>> codeBlockRanges = _getCodeBlockRanges(comment); |
| 5467 int leftIndex = comment.indexOf('['); | 5028 int leftIndex = comment.indexOf('['); |
| 5468 while (leftIndex >= 0 && leftIndex + 1 < length) { | 5029 while (leftIndex >= 0 && leftIndex + 1 < length) { |
| 5469 List<int> range = _findRange(codeBlockRanges, leftIndex); | 5030 List<int> range = _findRange(codeBlockRanges, leftIndex); |
| 5470 if (range == null) { | 5031 if (range == null) { |
| 5471 int nameOffset = token.offset + leftIndex + 1; | 5032 int nameOffset = token.offset + leftIndex + 1; |
| 5472 int rightIndex = JavaString.indexOf(comment, ']', leftIndex); | 5033 int rightIndex = JavaString.indexOf(comment, ']', leftIndex); |
| 5473 if (rightIndex >= 0) { | 5034 if (rightIndex >= 0) { |
| 5474 int firstChar = comment.codeUnitAt(leftIndex + 1); | 5035 int firstChar = comment.codeUnitAt(leftIndex + 1); |
| 5475 if (firstChar != 0x27 && firstChar != 0x22) { | 5036 if (firstChar != 0x27 && firstChar != 0x22) { |
| 5476 if (_isLinkText(comment, rightIndex)) { | 5037 if (_isLinkText(comment, rightIndex)) { |
| 5477 // TODO(brianwilkerson) Handle the case where there's a library | 5038 // TODO(brianwilkerson) Handle the case where there's a library |
| 5478 // URI in the link text. | 5039 // URI in the link text. |
| 5479 } else { | 5040 } else { |
| 5480 CommentReference reference = _parseCommentReference( | 5041 CommentReference reference = _parseCommentReference( |
| 5481 comment.substring(leftIndex + 1, rightIndex), | 5042 comment.substring(leftIndex + 1, rightIndex), nameOffset); |
| 5482 nameOffset); | |
| 5483 if (reference != null) { | 5043 if (reference != null) { |
| 5484 references.add(reference); | 5044 references.add(reference); |
| 5485 token.references.add(reference.beginToken); | 5045 token.references.add(reference.beginToken); |
| 5486 } | 5046 } |
| 5487 } | 5047 } |
| 5488 } | 5048 } |
| 5489 } else { | 5049 } else { |
| 5490 // terminating ']' is not typed yet | 5050 // terminating ']' is not typed yet |
| 5491 int charAfterLeft = comment.codeUnitAt(leftIndex + 1); | 5051 int charAfterLeft = comment.codeUnitAt(leftIndex + 1); |
| 5492 if (Character.isLetterOrDigit(charAfterLeft)) { | 5052 if (Character.isLetterOrDigit(charAfterLeft)) { |
| 5493 int nameEnd = | 5053 int nameEnd = StringUtilities.indexOfFirstNotLetterDigit( |
| 5494 StringUtilities.indexOfFirstNotLetterDigit(comment, leftIndex
+ 1); | 5054 comment, leftIndex + 1); |
| 5495 String name = comment.substring(leftIndex + 1, nameEnd); | 5055 String name = comment.substring(leftIndex + 1, nameEnd); |
| 5496 Token nameToken = | 5056 Token nameToken = |
| 5497 new StringToken(TokenType.IDENTIFIER, name, nameOffset); | 5057 new StringToken(TokenType.IDENTIFIER, name, nameOffset); |
| 5498 references.add( | 5058 references.add( |
| 5499 new CommentReference(null, new SimpleIdentifier(nameToken))); | 5059 new CommentReference(null, new SimpleIdentifier(nameToken))); |
| 5500 } else { | 5060 } else { |
| 5501 Token nameToken = | 5061 Token nameToken = new SyntheticStringToken( |
| 5502 new SyntheticStringToken(TokenType.IDENTIFIER, "", nameOffset)
; | 5062 TokenType.IDENTIFIER, "", nameOffset); |
| 5503 references.add( | 5063 references.add( |
| 5504 new CommentReference(null, new SimpleIdentifier(nameToken))); | 5064 new CommentReference(null, new SimpleIdentifier(nameToken))); |
| 5505 } | 5065 } |
| 5506 // next character | 5066 // next character |
| 5507 rightIndex = leftIndex + 1; | 5067 rightIndex = leftIndex + 1; |
| 5508 } | 5068 } |
| 5509 leftIndex = JavaString.indexOf(comment, '[', rightIndex); | 5069 leftIndex = JavaString.indexOf(comment, '[', rightIndex); |
| 5510 } else { | 5070 } else { |
| 5511 leftIndex = JavaString.indexOf(comment, '[', range[1] + 1); | 5071 leftIndex = JavaString.indexOf(comment, '[', range[1] + 1); |
| 5512 } | 5072 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 5528 * | functionSignature functionBody | 5088 * | functionSignature functionBody |
| 5529 * | returnType? getOrSet identifier formalParameterList functionBody | 5089 * | returnType? getOrSet identifier formalParameterList functionBody |
| 5530 * | (final | const) type? staticFinalDeclarationList ';' | 5090 * | (final | const) type? staticFinalDeclarationList ';' |
| 5531 * | variableDeclaration ';' | 5091 * | variableDeclaration ';' |
| 5532 * </pre> | 5092 * </pre> |
| 5533 * | 5093 * |
| 5534 * @param commentAndMetadata the metadata to be associated with the member | 5094 * @param commentAndMetadata the metadata to be associated with the member |
| 5535 * @return the compilation unit member that was parsed, or `null` if what was
parsed could | 5095 * @return the compilation unit member that was parsed, or `null` if what was
parsed could |
| 5536 * not be represented as a compilation unit member | 5096 * not be represented as a compilation unit member |
| 5537 */ | 5097 */ |
| 5538 CompilationUnitMember | 5098 CompilationUnitMember _parseCompilationUnitMember( |
| 5539 _parseCompilationUnitMember(CommentAndMetadata commentAndMetadata) { | 5099 CommentAndMetadata commentAndMetadata) { |
| 5540 Modifiers modifiers = _parseModifiers(); | 5100 Modifiers modifiers = _parseModifiers(); |
| 5541 if (_matchesKeyword(Keyword.CLASS)) { | 5101 if (_matchesKeyword(Keyword.CLASS)) { |
| 5542 return _parseClassDeclaration( | 5102 return _parseClassDeclaration( |
| 5543 commentAndMetadata, | 5103 commentAndMetadata, _validateModifiersForClass(modifiers)); |
| 5544 _validateModifiersForClass(modifiers)); | |
| 5545 } else if (_matchesKeyword(Keyword.TYPEDEF) && | 5104 } else if (_matchesKeyword(Keyword.TYPEDEF) && |
| 5546 !_tokenMatches(_peek(), TokenType.PERIOD) && | 5105 !_tokenMatches(_peek(), TokenType.PERIOD) && |
| 5547 !_tokenMatches(_peek(), TokenType.LT) && | 5106 !_tokenMatches(_peek(), TokenType.LT) && |
| 5548 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 5107 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 5549 _validateModifiersForTypedef(modifiers); | 5108 _validateModifiersForTypedef(modifiers); |
| 5550 return _parseTypeAlias(commentAndMetadata); | 5109 return _parseTypeAlias(commentAndMetadata); |
| 5551 } else if (_matchesKeyword(Keyword.ENUM)) { | 5110 } else if (_matchesKeyword(Keyword.ENUM)) { |
| 5552 _validateModifiersForEnum(modifiers); | 5111 _validateModifiersForEnum(modifiers); |
| 5553 return _parseEnumDeclaration(commentAndMetadata); | 5112 return _parseEnumDeclaration(commentAndMetadata); |
| 5554 } | 5113 } |
| 5555 if (_matchesKeyword(Keyword.VOID)) { | 5114 if (_matchesKeyword(Keyword.VOID)) { |
| 5556 TypeName returnType = parseReturnType(); | 5115 TypeName returnType = parseReturnType(); |
| 5557 if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && | 5116 if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && |
| 5558 _tokenMatchesIdentifier(_peek())) { | 5117 _tokenMatchesIdentifier(_peek())) { |
| 5559 _validateModifiersForTopLevelFunction(modifiers); | 5118 _validateModifiersForTopLevelFunction(modifiers); |
| 5560 return _parseFunctionDeclaration( | 5119 return _parseFunctionDeclaration( |
| 5561 commentAndMetadata, | 5120 commentAndMetadata, modifiers.externalKeyword, returnType); |
| 5562 modifiers.externalKeyword, | |
| 5563 returnType); | |
| 5564 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 5121 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 5565 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); | 5122 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); |
| 5566 return _convertToFunctionDeclaration( | 5123 return _convertToFunctionDeclaration(_parseOperator( |
| 5567 _parseOperator(commentAndMetadata, modifiers.externalKeyword, return
Type)); | 5124 commentAndMetadata, modifiers.externalKeyword, returnType)); |
| 5568 } else if (_matchesIdentifier() && | 5125 } else if (_matchesIdentifier() && |
| 5569 _peek().matchesAny( | 5126 _peek().matchesAny([ |
| 5570 [TokenType.OPEN_PAREN, TokenType.OPEN_CURLY_BRACKET, TokenType.FUN
CTION])) { | 5127 TokenType.OPEN_PAREN, |
| 5128 TokenType.OPEN_CURLY_BRACKET, |
| 5129 TokenType.FUNCTION |
| 5130 ])) { |
| 5571 _validateModifiersForTopLevelFunction(modifiers); | 5131 _validateModifiersForTopLevelFunction(modifiers); |
| 5572 return _parseFunctionDeclaration( | 5132 return _parseFunctionDeclaration( |
| 5573 commentAndMetadata, | 5133 commentAndMetadata, modifiers.externalKeyword, returnType); |
| 5574 modifiers.externalKeyword, | |
| 5575 returnType); | |
| 5576 } else { | 5134 } else { |
| 5577 // | 5135 // |
| 5578 // We have found an error of some kind. Try to recover. | 5136 // We have found an error of some kind. Try to recover. |
| 5579 // | 5137 // |
| 5580 if (_matchesIdentifier()) { | 5138 if (_matchesIdentifier()) { |
| 5581 if (_peek().matchesAny( | 5139 if (_peek().matchesAny( |
| 5582 [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { | 5140 [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { |
| 5583 // | 5141 // |
| 5584 // We appear to have a variable declaration with a type of "void". | 5142 // We appear to have a variable declaration with a type of "void". |
| 5585 // | 5143 // |
| 5586 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); | 5144 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); |
| 5587 return new TopLevelVariableDeclaration( | 5145 return new TopLevelVariableDeclaration(commentAndMetadata.comment, |
| 5588 commentAndMetadata.comment, | |
| 5589 commentAndMetadata.metadata, | 5146 commentAndMetadata.metadata, |
| 5590 _parseVariableDeclarationListAfterType( | 5147 _parseVariableDeclarationListAfterType(null, |
| 5591 null, | 5148 _validateModifiersForTopLevelVariable(modifiers), null), |
| 5592 _validateModifiersForTopLevelVariable(modifiers), | |
| 5593 null), | |
| 5594 _expect(TokenType.SEMICOLON)); | 5149 _expect(TokenType.SEMICOLON)); |
| 5595 } | 5150 } |
| 5596 } | 5151 } |
| 5597 _reportErrorForToken( | 5152 _reportErrorForToken( |
| 5598 ParserErrorCode.EXPECTED_EXECUTABLE, | 5153 ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken); |
| 5599 _currentToken); | |
| 5600 return null; | 5154 return null; |
| 5601 } | 5155 } |
| 5602 } else if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && | 5156 } else if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && |
| 5603 _tokenMatchesIdentifier(_peek())) { | 5157 _tokenMatchesIdentifier(_peek())) { |
| 5604 _validateModifiersForTopLevelFunction(modifiers); | 5158 _validateModifiersForTopLevelFunction(modifiers); |
| 5605 return _parseFunctionDeclaration( | 5159 return _parseFunctionDeclaration( |
| 5606 commentAndMetadata, | 5160 commentAndMetadata, modifiers.externalKeyword, null); |
| 5607 modifiers.externalKeyword, | |
| 5608 null); | |
| 5609 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 5161 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 5610 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); | 5162 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); |
| 5611 return _convertToFunctionDeclaration( | 5163 return _convertToFunctionDeclaration( |
| 5612 _parseOperator(commentAndMetadata, modifiers.externalKeyword, null)); | 5164 _parseOperator(commentAndMetadata, modifiers.externalKeyword, null)); |
| 5613 } else if (!_matchesIdentifier()) { | 5165 } else if (!_matchesIdentifier()) { |
| 5614 Token keyword = modifiers.varKeyword; | 5166 Token keyword = modifiers.varKeyword; |
| 5615 if (keyword == null) { | 5167 if (keyword == null) { |
| 5616 keyword = modifiers.finalKeyword; | 5168 keyword = modifiers.finalKeyword; |
| 5617 } | 5169 } |
| 5618 if (keyword == null) { | 5170 if (keyword == null) { |
| 5619 keyword = modifiers.constKeyword; | 5171 keyword = modifiers.constKeyword; |
| 5620 } | 5172 } |
| 5621 if (keyword != null) { | 5173 if (keyword != null) { |
| 5622 // | 5174 // |
| 5623 // We appear to have found an incomplete top-level variable declaration. | 5175 // We appear to have found an incomplete top-level variable declaration. |
| 5624 // | 5176 // |
| 5625 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); | 5177 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 5626 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 5178 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 5627 variables.add( | 5179 variables.add(new VariableDeclaration( |
| 5628 new VariableDeclaration(null, null, _createSyntheticIdentifier(), nu
ll, null)); | 5180 null, null, _createSyntheticIdentifier(), null, null)); |
| 5629 return new TopLevelVariableDeclaration( | 5181 return new TopLevelVariableDeclaration(commentAndMetadata.comment, |
| 5630 commentAndMetadata.comment, | |
| 5631 commentAndMetadata.metadata, | 5182 commentAndMetadata.metadata, |
| 5632 new VariableDeclarationList(null, null, keyword, null, variables), | 5183 new VariableDeclarationList(null, null, keyword, null, variables), |
| 5633 _expectSemicolon()); | 5184 _expectSemicolon()); |
| 5634 } | 5185 } |
| 5635 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken); | 5186 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken); |
| 5636 return null; | 5187 return null; |
| 5637 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 5188 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 5638 _validateModifiersForTopLevelFunction(modifiers); | 5189 _validateModifiersForTopLevelFunction(modifiers); |
| 5639 return _parseFunctionDeclaration( | 5190 return _parseFunctionDeclaration( |
| 5640 commentAndMetadata, | 5191 commentAndMetadata, modifiers.externalKeyword, null); |
| 5641 modifiers.externalKeyword, | 5192 } else if (_peek() |
| 5642 null); | 5193 .matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { |
| 5643 } else if (_peek().matchesAny( | |
| 5644 [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { | |
| 5645 if (modifiers.constKeyword == null && | 5194 if (modifiers.constKeyword == null && |
| 5646 modifiers.finalKeyword == null && | 5195 modifiers.finalKeyword == null && |
| 5647 modifiers.varKeyword == null) { | 5196 modifiers.varKeyword == null) { |
| 5648 _reportErrorForCurrentToken( | 5197 _reportErrorForCurrentToken( |
| 5649 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE); | 5198 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE); |
| 5650 } | 5199 } |
| 5651 return new TopLevelVariableDeclaration( | 5200 return new TopLevelVariableDeclaration(commentAndMetadata.comment, |
| 5652 commentAndMetadata.comment, | 5201 commentAndMetadata.metadata, _parseVariableDeclarationListAfterType( |
| 5653 commentAndMetadata.metadata, | 5202 null, _validateModifiersForTopLevelVariable(modifiers), null), |
| 5654 _parseVariableDeclarationListAfterType( | |
| 5655 null, | |
| 5656 _validateModifiersForTopLevelVariable(modifiers), | |
| 5657 null), | |
| 5658 _expect(TokenType.SEMICOLON)); | 5203 _expect(TokenType.SEMICOLON)); |
| 5659 } | 5204 } |
| 5660 TypeName returnType = parseReturnType(); | 5205 TypeName returnType = parseReturnType(); |
| 5661 if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && | 5206 if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && |
| 5662 _tokenMatchesIdentifier(_peek())) { | 5207 _tokenMatchesIdentifier(_peek())) { |
| 5663 _validateModifiersForTopLevelFunction(modifiers); | 5208 _validateModifiersForTopLevelFunction(modifiers); |
| 5664 return _parseFunctionDeclaration( | 5209 return _parseFunctionDeclaration( |
| 5665 commentAndMetadata, | 5210 commentAndMetadata, modifiers.externalKeyword, returnType); |
| 5666 modifiers.externalKeyword, | |
| 5667 returnType); | |
| 5668 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 5211 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 5669 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); | 5212 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); |
| 5670 return _convertToFunctionDeclaration( | 5213 return _convertToFunctionDeclaration(_parseOperator( |
| 5671 _parseOperator(commentAndMetadata, modifiers.externalKeyword, returnTy
pe)); | 5214 commentAndMetadata, modifiers.externalKeyword, returnType)); |
| 5672 } else if (_matches(TokenType.AT)) { | 5215 } else if (_matches(TokenType.AT)) { |
| 5673 return new TopLevelVariableDeclaration( | 5216 return new TopLevelVariableDeclaration(commentAndMetadata.comment, |
| 5674 commentAndMetadata.comment, | 5217 commentAndMetadata.metadata, _parseVariableDeclarationListAfterType( |
| 5675 commentAndMetadata.metadata, | 5218 null, _validateModifiersForTopLevelVariable(modifiers), |
| 5676 _parseVariableDeclarationListAfterType( | 5219 returnType), _expect(TokenType.SEMICOLON)); |
| 5677 null, | |
| 5678 _validateModifiersForTopLevelVariable(modifiers), | |
| 5679 returnType), | |
| 5680 _expect(TokenType.SEMICOLON)); | |
| 5681 } else if (!_matchesIdentifier()) { | 5220 } else if (!_matchesIdentifier()) { |
| 5682 // TODO(brianwilkerson) Generalize this error. We could also be parsing a | 5221 // TODO(brianwilkerson) Generalize this error. We could also be parsing a |
| 5683 // top-level variable at this point. | 5222 // top-level variable at this point. |
| 5684 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken); | 5223 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken); |
| 5685 Token semicolon; | 5224 Token semicolon; |
| 5686 if (_matches(TokenType.SEMICOLON)) { | 5225 if (_matches(TokenType.SEMICOLON)) { |
| 5687 semicolon = getAndAdvance(); | 5226 semicolon = getAndAdvance(); |
| 5688 } else { | 5227 } else { |
| 5689 semicolon = _createSyntheticToken(TokenType.SEMICOLON); | 5228 semicolon = _createSyntheticToken(TokenType.SEMICOLON); |
| 5690 } | 5229 } |
| 5691 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 5230 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 5692 variables.add( | 5231 variables.add(new VariableDeclaration( |
| 5693 new VariableDeclaration(null, null, _createSyntheticIdentifier(), null
, null)); | 5232 null, null, _createSyntheticIdentifier(), null, null)); |
| 5694 return new TopLevelVariableDeclaration( | 5233 return new TopLevelVariableDeclaration(commentAndMetadata.comment, |
| 5695 commentAndMetadata.comment, | |
| 5696 commentAndMetadata.metadata, | 5234 commentAndMetadata.metadata, |
| 5697 new VariableDeclarationList(null, null, null, returnType, variables), | 5235 new VariableDeclarationList(null, null, null, returnType, variables), |
| 5698 semicolon); | 5236 semicolon); |
| 5699 } | 5237 } |
| 5700 if (_peek().matchesAny( | 5238 if (_peek().matchesAny([ |
| 5701 [TokenType.OPEN_PAREN, TokenType.FUNCTION, TokenType.OPEN_CURLY_BRACKET]
)) { | 5239 TokenType.OPEN_PAREN, |
| 5240 TokenType.FUNCTION, |
| 5241 TokenType.OPEN_CURLY_BRACKET |
| 5242 ])) { |
| 5702 _validateModifiersForTopLevelFunction(modifiers); | 5243 _validateModifiersForTopLevelFunction(modifiers); |
| 5703 return _parseFunctionDeclaration( | 5244 return _parseFunctionDeclaration( |
| 5704 commentAndMetadata, | 5245 commentAndMetadata, modifiers.externalKeyword, returnType); |
| 5705 modifiers.externalKeyword, | |
| 5706 returnType); | |
| 5707 } | 5246 } |
| 5708 return new TopLevelVariableDeclaration( | 5247 return new TopLevelVariableDeclaration(commentAndMetadata.comment, |
| 5709 commentAndMetadata.comment, | 5248 commentAndMetadata.metadata, _parseVariableDeclarationListAfterType( |
| 5710 commentAndMetadata.metadata, | 5249 null, _validateModifiersForTopLevelVariable(modifiers), returnType), |
| 5711 _parseVariableDeclarationListAfterType( | |
| 5712 null, | |
| 5713 _validateModifiersForTopLevelVariable(modifiers), | |
| 5714 returnType), | |
| 5715 _expect(TokenType.SEMICOLON)); | 5250 _expect(TokenType.SEMICOLON)); |
| 5716 } | 5251 } |
| 5717 | 5252 |
| 5718 /** | 5253 /** |
| 5719 * Parse a const expression. | 5254 * Parse a const expression. |
| 5720 * | 5255 * |
| 5721 * <pre> | 5256 * <pre> |
| 5722 * constExpression ::= | 5257 * constExpression ::= |
| 5723 * instanceCreationExpression | 5258 * instanceCreationExpression |
| 5724 * | listLiteral | 5259 * | listLiteral |
| 5725 * | mapLiteral | 5260 * | mapLiteral |
| 5726 * </pre> | 5261 * </pre> |
| 5727 * | 5262 * |
| 5728 * @return the const expression that was parsed | 5263 * @return the const expression that was parsed |
| 5729 */ | 5264 */ |
| 5730 Expression _parseConstExpression() { | 5265 Expression _parseConstExpression() { |
| 5731 Token keyword = _expectKeyword(Keyword.CONST); | 5266 Token keyword = _expectKeyword(Keyword.CONST); |
| 5732 if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.INDEX)) { | 5267 if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.INDEX)) { |
| 5733 return _parseListLiteral(keyword, null); | 5268 return _parseListLiteral(keyword, null); |
| 5734 } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 5269 } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 5735 return _parseMapLiteral(keyword, null); | 5270 return _parseMapLiteral(keyword, null); |
| 5736 } else if (_matches(TokenType.LT)) { | 5271 } else if (_matches(TokenType.LT)) { |
| 5737 return _parseListOrMapLiteral(keyword); | 5272 return _parseListOrMapLiteral(keyword); |
| 5738 } | 5273 } |
| 5739 return _parseInstanceCreationExpression(keyword); | 5274 return _parseInstanceCreationExpression(keyword); |
| 5740 } | 5275 } |
| 5741 | 5276 |
| 5742 ConstructorDeclaration | 5277 ConstructorDeclaration _parseConstructor( |
| 5743 _parseConstructor(CommentAndMetadata commentAndMetadata, Token externalKey
word, | 5278 CommentAndMetadata commentAndMetadata, Token externalKeyword, |
| 5744 Token constKeyword, Token factoryKeyword, SimpleIdentifier returnType, | 5279 Token constKeyword, Token factoryKeyword, SimpleIdentifier returnType, |
| 5745 Token period, SimpleIdentifier name, FormalParameterList parameters) { | 5280 Token period, SimpleIdentifier name, FormalParameterList parameters) { |
| 5746 bool bodyAllowed = externalKeyword == null; | 5281 bool bodyAllowed = externalKeyword == null; |
| 5747 Token separator = null; | 5282 Token separator = null; |
| 5748 List<ConstructorInitializer> initializers = null; | 5283 List<ConstructorInitializer> initializers = null; |
| 5749 if (_matches(TokenType.COLON)) { | 5284 if (_matches(TokenType.COLON)) { |
| 5750 separator = getAndAdvance(); | 5285 separator = getAndAdvance(); |
| 5751 initializers = new List<ConstructorInitializer>(); | 5286 initializers = new List<ConstructorInitializer>(); |
| 5752 do { | 5287 do { |
| 5753 if (_matchesKeyword(Keyword.THIS)) { | 5288 if (_matchesKeyword(Keyword.THIS)) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 5765 initializers.add(_parseSuperConstructorInvocation()); | 5300 initializers.add(_parseSuperConstructorInvocation()); |
| 5766 } else if (_matches(TokenType.OPEN_CURLY_BRACKET) || | 5301 } else if (_matches(TokenType.OPEN_CURLY_BRACKET) || |
| 5767 _matches(TokenType.FUNCTION)) { | 5302 _matches(TokenType.FUNCTION)) { |
| 5768 _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER); | 5303 _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER); |
| 5769 } else { | 5304 } else { |
| 5770 initializers.add(_parseConstructorFieldInitializer()); | 5305 initializers.add(_parseConstructorFieldInitializer()); |
| 5771 } | 5306 } |
| 5772 } while (_optional(TokenType.COMMA)); | 5307 } while (_optional(TokenType.COMMA)); |
| 5773 if (factoryKeyword != null) { | 5308 if (factoryKeyword != null) { |
| 5774 _reportErrorForToken( | 5309 _reportErrorForToken( |
| 5775 ParserErrorCode.FACTORY_WITH_INITIALIZERS, | 5310 ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryKeyword); |
| 5776 factoryKeyword); | |
| 5777 } | 5311 } |
| 5778 } | 5312 } |
| 5779 ConstructorName redirectedConstructor = null; | 5313 ConstructorName redirectedConstructor = null; |
| 5780 FunctionBody body; | 5314 FunctionBody body; |
| 5781 if (_matches(TokenType.EQ)) { | 5315 if (_matches(TokenType.EQ)) { |
| 5782 separator = getAndAdvance(); | 5316 separator = getAndAdvance(); |
| 5783 redirectedConstructor = parseConstructorName(); | 5317 redirectedConstructor = parseConstructorName(); |
| 5784 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); | 5318 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); |
| 5785 if (factoryKeyword == null) { | 5319 if (factoryKeyword == null) { |
| 5786 _reportErrorForNode( | 5320 _reportErrorForNode( |
| 5787 ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR, | 5321 ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR, |
| 5788 redirectedConstructor); | 5322 redirectedConstructor); |
| 5789 } | 5323 } |
| 5790 } else { | 5324 } else { |
| 5791 body = | 5325 body = _parseFunctionBody( |
| 5792 _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false)
; | 5326 true, ParserErrorCode.MISSING_FUNCTION_BODY, false); |
| 5793 if (constKeyword != null && | 5327 if (constKeyword != null && |
| 5794 factoryKeyword != null && | 5328 factoryKeyword != null && |
| 5795 externalKeyword == null) { | 5329 externalKeyword == null) { |
| 5796 _reportErrorForToken(ParserErrorCode.CONST_FACTORY, factoryKeyword); | 5330 _reportErrorForToken(ParserErrorCode.CONST_FACTORY, factoryKeyword); |
| 5797 } else if (body is EmptyFunctionBody) { | 5331 } else if (body is EmptyFunctionBody) { |
| 5798 if (factoryKeyword != null && externalKeyword == null) { | 5332 if (factoryKeyword != null && externalKeyword == null) { |
| 5799 _reportErrorForToken( | 5333 _reportErrorForToken( |
| 5800 ParserErrorCode.FACTORY_WITHOUT_BODY, | 5334 ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword); |
| 5801 factoryKeyword); | |
| 5802 } | 5335 } |
| 5803 } else { | 5336 } else { |
| 5804 if (constKeyword != null) { | 5337 if (constKeyword != null) { |
| 5805 _reportErrorForNode( | 5338 _reportErrorForNode( |
| 5806 ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, | 5339 ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, body); |
| 5807 body); | |
| 5808 } else if (!bodyAllowed) { | 5340 } else if (!bodyAllowed) { |
| 5809 _reportErrorForNode( | 5341 _reportErrorForNode( |
| 5810 ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, | 5342 ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, body); |
| 5811 body); | |
| 5812 } | 5343 } |
| 5813 } | 5344 } |
| 5814 } | 5345 } |
| 5815 return new ConstructorDeclaration( | 5346 return new ConstructorDeclaration(commentAndMetadata.comment, |
| 5816 commentAndMetadata.comment, | 5347 commentAndMetadata.metadata, externalKeyword, constKeyword, |
| 5817 commentAndMetadata.metadata, | 5348 factoryKeyword, returnType, period, name, parameters, separator, |
| 5818 externalKeyword, | 5349 initializers, redirectedConstructor, body); |
| 5819 constKeyword, | |
| 5820 factoryKeyword, | |
| 5821 returnType, | |
| 5822 period, | |
| 5823 name, | |
| 5824 parameters, | |
| 5825 separator, | |
| 5826 initializers, | |
| 5827 redirectedConstructor, | |
| 5828 body); | |
| 5829 } | 5350 } |
| 5830 | 5351 |
| 5831 /** | 5352 /** |
| 5832 * Parse a field initializer within a constructor. | 5353 * Parse a field initializer within a constructor. |
| 5833 * | 5354 * |
| 5834 * <pre> | 5355 * <pre> |
| 5835 * fieldInitializer: | 5356 * fieldInitializer: |
| 5836 * ('this' '.')? identifier '=' conditionalExpression cascadeSection* | 5357 * ('this' '.')? identifier '=' conditionalExpression cascadeSection* |
| 5837 * </pre> | 5358 * </pre> |
| 5838 * | 5359 * |
| (...skipping 13 matching lines...) Expand all Loading... |
| 5852 } else if (!_matchesKeyword(Keyword.THIS) && | 5373 } else if (!_matchesKeyword(Keyword.THIS) && |
| 5853 !_matchesKeyword(Keyword.SUPER) && | 5374 !_matchesKeyword(Keyword.SUPER) && |
| 5854 !_matches(TokenType.OPEN_CURLY_BRACKET) && | 5375 !_matches(TokenType.OPEN_CURLY_BRACKET) && |
| 5855 !_matches(TokenType.FUNCTION)) { | 5376 !_matches(TokenType.FUNCTION)) { |
| 5856 _reportErrorForCurrentToken( | 5377 _reportErrorForCurrentToken( |
| 5857 ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER); | 5378 ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER); |
| 5858 equals = _createSyntheticToken(TokenType.EQ); | 5379 equals = _createSyntheticToken(TokenType.EQ); |
| 5859 } else { | 5380 } else { |
| 5860 _reportErrorForCurrentToken( | 5381 _reportErrorForCurrentToken( |
| 5861 ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER); | 5382 ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER); |
| 5862 return new ConstructorFieldInitializer( | 5383 return new ConstructorFieldInitializer(keyword, period, fieldName, |
| 5863 keyword, | 5384 _createSyntheticToken(TokenType.EQ), _createSyntheticIdentifier()); |
| 5864 period, | |
| 5865 fieldName, | |
| 5866 _createSyntheticToken(TokenType.EQ), | |
| 5867 _createSyntheticIdentifier()); | |
| 5868 } | 5385 } |
| 5869 bool wasInInitializer = _inInitializer; | 5386 bool wasInInitializer = _inInitializer; |
| 5870 _inInitializer = true; | 5387 _inInitializer = true; |
| 5871 try { | 5388 try { |
| 5872 Expression expression = parseConditionalExpression(); | 5389 Expression expression = parseConditionalExpression(); |
| 5873 TokenType tokenType = _currentToken.type; | 5390 TokenType tokenType = _currentToken.type; |
| 5874 if (tokenType == TokenType.PERIOD_PERIOD) { | 5391 if (tokenType == TokenType.PERIOD_PERIOD) { |
| 5875 List<Expression> cascadeSections = new List<Expression>(); | 5392 List<Expression> cascadeSections = new List<Expression>(); |
| 5876 while (tokenType == TokenType.PERIOD_PERIOD) { | 5393 while (tokenType == TokenType.PERIOD_PERIOD) { |
| 5877 Expression section = _parseCascadeSection(); | 5394 Expression section = _parseCascadeSection(); |
| 5878 if (section != null) { | 5395 if (section != null) { |
| 5879 cascadeSections.add(section); | 5396 cascadeSections.add(section); |
| 5880 } | 5397 } |
| 5881 tokenType = _currentToken.type; | 5398 tokenType = _currentToken.type; |
| 5882 } | 5399 } |
| 5883 expression = new CascadeExpression(expression, cascadeSections); | 5400 expression = new CascadeExpression(expression, cascadeSections); |
| 5884 } | 5401 } |
| 5885 return new ConstructorFieldInitializer( | 5402 return new ConstructorFieldInitializer( |
| 5886 keyword, | 5403 keyword, period, fieldName, equals, expression); |
| 5887 period, | |
| 5888 fieldName, | |
| 5889 equals, | |
| 5890 expression); | |
| 5891 } finally { | 5404 } finally { |
| 5892 _inInitializer = wasInInitializer; | 5405 _inInitializer = wasInInitializer; |
| 5893 } | 5406 } |
| 5894 } | 5407 } |
| 5895 | 5408 |
| 5896 /** | 5409 /** |
| 5897 * Parse a continue statement. | 5410 * Parse a continue statement. |
| 5898 * | 5411 * |
| 5899 * <pre> | 5412 * <pre> |
| 5900 * continueStatement ::= | 5413 * continueStatement ::= |
| 5901 * 'continue' identifier? ';' | 5414 * 'continue' identifier? ';' |
| 5902 * </pre> | 5415 * </pre> |
| 5903 * | 5416 * |
| 5904 * @return the continue statement that was parsed | 5417 * @return the continue statement that was parsed |
| 5905 */ | 5418 */ |
| 5906 Statement _parseContinueStatement() { | 5419 Statement _parseContinueStatement() { |
| 5907 Token continueKeyword = _expectKeyword(Keyword.CONTINUE); | 5420 Token continueKeyword = _expectKeyword(Keyword.CONTINUE); |
| 5908 if (!_inLoop && !_inSwitch) { | 5421 if (!_inLoop && !_inSwitch) { |
| 5909 _reportErrorForToken( | 5422 _reportErrorForToken( |
| 5910 ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, | 5423 ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword); |
| 5911 continueKeyword); | |
| 5912 } | 5424 } |
| 5913 SimpleIdentifier label = null; | 5425 SimpleIdentifier label = null; |
| 5914 if (_matchesIdentifier()) { | 5426 if (_matchesIdentifier()) { |
| 5915 label = parseSimpleIdentifier(); | 5427 label = parseSimpleIdentifier(); |
| 5916 } | 5428 } |
| 5917 if (_inSwitch && !_inLoop && label == null) { | 5429 if (_inSwitch && !_inLoop && label == null) { |
| 5918 _reportErrorForToken( | 5430 _reportErrorForToken( |
| 5919 ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, | 5431 ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword); |
| 5920 continueKeyword); | |
| 5921 } | 5432 } |
| 5922 Token semicolon = _expect(TokenType.SEMICOLON); | 5433 Token semicolon = _expect(TokenType.SEMICOLON); |
| 5923 return new ContinueStatement(continueKeyword, label, semicolon); | 5434 return new ContinueStatement(continueKeyword, label, semicolon); |
| 5924 } | 5435 } |
| 5925 | 5436 |
| 5926 /** | 5437 /** |
| 5927 * Parse a directive. | 5438 * Parse a directive. |
| 5928 * | 5439 * |
| 5929 * <pre> | 5440 * <pre> |
| 5930 * directive ::= | 5441 * directive ::= |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5969 CompilationUnit _parseDirectives() { | 5480 CompilationUnit _parseDirectives() { |
| 5970 Token firstToken = _currentToken; | 5481 Token firstToken = _currentToken; |
| 5971 ScriptTag scriptTag = null; | 5482 ScriptTag scriptTag = null; |
| 5972 if (_matches(TokenType.SCRIPT_TAG)) { | 5483 if (_matches(TokenType.SCRIPT_TAG)) { |
| 5973 scriptTag = new ScriptTag(getAndAdvance()); | 5484 scriptTag = new ScriptTag(getAndAdvance()); |
| 5974 } | 5485 } |
| 5975 List<Directive> directives = new List<Directive>(); | 5486 List<Directive> directives = new List<Directive>(); |
| 5976 while (!_matches(TokenType.EOF)) { | 5487 while (!_matches(TokenType.EOF)) { |
| 5977 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 5488 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 5978 if ((_matchesKeyword(Keyword.IMPORT) || | 5489 if ((_matchesKeyword(Keyword.IMPORT) || |
| 5979 _matchesKeyword(Keyword.EXPORT) || | 5490 _matchesKeyword(Keyword.EXPORT) || |
| 5980 _matchesKeyword(Keyword.LIBRARY) || | 5491 _matchesKeyword(Keyword.LIBRARY) || |
| 5981 _matchesKeyword(Keyword.PART)) && | 5492 _matchesKeyword(Keyword.PART)) && |
| 5982 !_tokenMatches(_peek(), TokenType.PERIOD) && | 5493 !_tokenMatches(_peek(), TokenType.PERIOD) && |
| 5983 !_tokenMatches(_peek(), TokenType.LT) && | 5494 !_tokenMatches(_peek(), TokenType.LT) && |
| 5984 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 5495 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 5985 directives.add(_parseDirective(commentAndMetadata)); | 5496 directives.add(_parseDirective(commentAndMetadata)); |
| 5986 } else if (_matches(TokenType.SEMICOLON)) { | 5497 } else if (_matches(TokenType.SEMICOLON)) { |
| 5987 _advance(); | 5498 _advance(); |
| 5988 } else { | 5499 } else { |
| 5989 while (!_matches(TokenType.EOF)) { | 5500 while (!_matches(TokenType.EOF)) { |
| 5990 _advance(); | 5501 _advance(); |
| 5991 } | 5502 } |
| 5992 return new CompilationUnit( | 5503 return new CompilationUnit(firstToken, scriptTag, directives, |
| 5993 firstToken, | 5504 new List<CompilationUnitMember>(), _currentToken); |
| 5994 scriptTag, | |
| 5995 directives, | |
| 5996 new List<CompilationUnitMember>(), | |
| 5997 _currentToken); | |
| 5998 } | 5505 } |
| 5999 } | 5506 } |
| 6000 return new CompilationUnit( | 5507 return new CompilationUnit(firstToken, scriptTag, directives, |
| 6001 firstToken, | 5508 new List<CompilationUnitMember>(), _currentToken); |
| 6002 scriptTag, | |
| 6003 directives, | |
| 6004 new List<CompilationUnitMember>(), | |
| 6005 _currentToken); | |
| 6006 } | 5509 } |
| 6007 | 5510 |
| 6008 /** | 5511 /** |
| 6009 * Parse a documentation comment. | 5512 * Parse a documentation comment. |
| 6010 * | 5513 * |
| 6011 * <pre> | 5514 * <pre> |
| 6012 * documentationComment ::= | 5515 * documentationComment ::= |
| 6013 * multiLineComment? | 5516 * multiLineComment? |
| 6014 * | singleLineComment* | 5517 * | singleLineComment* |
| 6015 * </pre> | 5518 * </pre> |
| 6016 * | 5519 * |
| 6017 * @return the documentation comment that was parsed, or `null` if there was n
o comment | 5520 * @return the documentation comment that was parsed, or `null` if there was n
o comment |
| 6018 */ | 5521 */ |
| 6019 Comment _parseDocumentationComment() { | 5522 Comment _parseDocumentationComment() { |
| 6020 List<DocumentationCommentToken> documentationTokens = | 5523 List<DocumentationCommentToken> documentationTokens = |
| 6021 <DocumentationCommentToken>[ | 5524 <DocumentationCommentToken>[]; |
| 6022 ]; | |
| 6023 CommentToken commentToken = _currentToken.precedingComments; | 5525 CommentToken commentToken = _currentToken.precedingComments; |
| 6024 while (commentToken != null) { | 5526 while (commentToken != null) { |
| 6025 if (commentToken is DocumentationCommentToken) { | 5527 if (commentToken is DocumentationCommentToken) { |
| 6026 if (documentationTokens.isNotEmpty) { | 5528 if (documentationTokens.isNotEmpty) { |
| 6027 if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) { | 5529 if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) { |
| 6028 if (documentationTokens[0].type != TokenType.SINGLE_LINE_COMMENT) { | 5530 if (documentationTokens[0].type != TokenType.SINGLE_LINE_COMMENT) { |
| 6029 documentationTokens.clear(); | 5531 documentationTokens.clear(); |
| 6030 } | 5532 } |
| 6031 } else { | 5533 } else { |
| 6032 documentationTokens.clear(); | 5534 documentationTokens.clear(); |
| 6033 } | 5535 } |
| 6034 } | 5536 } |
| 6035 documentationTokens.add(commentToken); | 5537 documentationTokens.add(commentToken); |
| 6036 } | 5538 } |
| 6037 commentToken = commentToken.next; | 5539 commentToken = commentToken.next; |
| 6038 } | 5540 } |
| 6039 if (documentationTokens.isEmpty) { | 5541 if (documentationTokens.isEmpty) { |
| 6040 return null; | 5542 return null; |
| 6041 } | 5543 } |
| 6042 List<CommentReference> references = | 5544 List<CommentReference> references = |
| 6043 _parseCommentReferences(documentationTokens); | 5545 _parseCommentReferences(documentationTokens); |
| 6044 return Comment.createDocumentationCommentWithReferences( | 5546 return Comment.createDocumentationCommentWithReferences( |
| 6045 documentationTokens, | 5547 documentationTokens, references); |
| 6046 references); | |
| 6047 } | 5548 } |
| 6048 | 5549 |
| 6049 /** | 5550 /** |
| 6050 * Parse a do statement. | 5551 * Parse a do statement. |
| 6051 * | 5552 * |
| 6052 * <pre> | 5553 * <pre> |
| 6053 * doStatement ::= | 5554 * doStatement ::= |
| 6054 * 'do' statement 'while' '(' expression ')' ';' | 5555 * 'do' statement 'while' '(' expression ')' ';' |
| 6055 * </pre> | 5556 * </pre> |
| 6056 * | 5557 * |
| 6057 * @return the do statement that was parsed | 5558 * @return the do statement that was parsed |
| 6058 */ | 5559 */ |
| 6059 Statement _parseDoStatement() { | 5560 Statement _parseDoStatement() { |
| 6060 bool wasInLoop = _inLoop; | 5561 bool wasInLoop = _inLoop; |
| 6061 _inLoop = true; | 5562 _inLoop = true; |
| 6062 try { | 5563 try { |
| 6063 Token doKeyword = _expectKeyword(Keyword.DO); | 5564 Token doKeyword = _expectKeyword(Keyword.DO); |
| 6064 Statement body = parseStatement2(); | 5565 Statement body = parseStatement2(); |
| 6065 Token whileKeyword = _expectKeyword(Keyword.WHILE); | 5566 Token whileKeyword = _expectKeyword(Keyword.WHILE); |
| 6066 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); | 5567 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); |
| 6067 Expression condition = parseExpression2(); | 5568 Expression condition = parseExpression2(); |
| 6068 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 5569 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 6069 Token semicolon = _expect(TokenType.SEMICOLON); | 5570 Token semicolon = _expect(TokenType.SEMICOLON); |
| 6070 return new DoStatement( | 5571 return new DoStatement(doKeyword, body, whileKeyword, leftParenthesis, |
| 6071 doKeyword, | 5572 condition, rightParenthesis, semicolon); |
| 6072 body, | |
| 6073 whileKeyword, | |
| 6074 leftParenthesis, | |
| 6075 condition, | |
| 6076 rightParenthesis, | |
| 6077 semicolon); | |
| 6078 } finally { | 5573 } finally { |
| 6079 _inLoop = wasInLoop; | 5574 _inLoop = wasInLoop; |
| 6080 } | 5575 } |
| 6081 } | 5576 } |
| 6082 | 5577 |
| 6083 /** | 5578 /** |
| 6084 * Parse an empty statement. | 5579 * Parse an empty statement. |
| 6085 * | 5580 * |
| 6086 * <pre> | 5581 * <pre> |
| 6087 * emptyStatement ::= | 5582 * emptyStatement ::= |
| 6088 * ';' | 5583 * ';' |
| 6089 * </pre> | 5584 * </pre> |
| 6090 * | 5585 * |
| 6091 * @return the empty statement that was parsed | 5586 * @return the empty statement that was parsed |
| 6092 */ | 5587 */ |
| 6093 Statement _parseEmptyStatement() => new EmptyStatement(getAndAdvance()); | 5588 Statement _parseEmptyStatement() => new EmptyStatement(getAndAdvance()); |
| 6094 | 5589 |
| 6095 EnumConstantDeclaration _parseEnumConstantDeclaration() { | 5590 EnumConstantDeclaration _parseEnumConstantDeclaration() { |
| 6096 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 5591 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 6097 SimpleIdentifier name; | 5592 SimpleIdentifier name; |
| 6098 if (_matchesIdentifier()) { | 5593 if (_matchesIdentifier()) { |
| 6099 name = parseSimpleIdentifier(); | 5594 name = parseSimpleIdentifier(); |
| 6100 } else { | 5595 } else { |
| 6101 name = _createSyntheticIdentifier(); | 5596 name = _createSyntheticIdentifier(); |
| 6102 } | 5597 } |
| 6103 if (commentAndMetadata.metadata.isNotEmpty) { | 5598 if (commentAndMetadata.metadata.isNotEmpty) { |
| 6104 _reportErrorForNode( | 5599 _reportErrorForNode(ParserErrorCode.ANNOTATION_ON_ENUM_CONSTANT, |
| 6105 ParserErrorCode.ANNOTATION_ON_ENUM_CONSTANT, | |
| 6106 commentAndMetadata.metadata[0]); | 5600 commentAndMetadata.metadata[0]); |
| 6107 } | 5601 } |
| 6108 return new EnumConstantDeclaration( | 5602 return new EnumConstantDeclaration( |
| 6109 commentAndMetadata.comment, | 5603 commentAndMetadata.comment, commentAndMetadata.metadata, name); |
| 6110 commentAndMetadata.metadata, | |
| 6111 name); | |
| 6112 } | 5604 } |
| 6113 | 5605 |
| 6114 /** | 5606 /** |
| 6115 * Parse an enum declaration. | 5607 * Parse an enum declaration. |
| 6116 * | 5608 * |
| 6117 * <pre> | 5609 * <pre> |
| 6118 * enumType ::= | 5610 * enumType ::= |
| 6119 * metadata 'enum' id '{' id (',' id)* (',')? '}' | 5611 * metadata 'enum' id '{' id (',' id)* (',')? '}' |
| 6120 * </pre> | 5612 * </pre> |
| 6121 * | 5613 * |
| (...skipping 24 matching lines...) Expand all Loading... |
| 6146 break; | 5638 break; |
| 6147 } | 5639 } |
| 6148 constants.add(_parseEnumConstantDeclaration()); | 5640 constants.add(_parseEnumConstantDeclaration()); |
| 6149 } | 5641 } |
| 6150 rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 5642 rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 6151 } else { | 5643 } else { |
| 6152 leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET); | 5644 leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET); |
| 6153 rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET); | 5645 rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET); |
| 6154 _reportErrorForCurrentToken(ParserErrorCode.MISSING_ENUM_BODY); | 5646 _reportErrorForCurrentToken(ParserErrorCode.MISSING_ENUM_BODY); |
| 6155 } | 5647 } |
| 6156 return new EnumDeclaration( | 5648 return new EnumDeclaration(commentAndMetadata.comment, |
| 6157 commentAndMetadata.comment, | 5649 commentAndMetadata.metadata, keyword, name, leftBracket, constants, |
| 6158 commentAndMetadata.metadata, | |
| 6159 keyword, | |
| 6160 name, | |
| 6161 leftBracket, | |
| 6162 constants, | |
| 6163 rightBracket); | 5650 rightBracket); |
| 6164 } | 5651 } |
| 6165 | 5652 |
| 6166 /** | 5653 /** |
| 6167 * Parse an equality expression. | 5654 * Parse an equality expression. |
| 6168 * | 5655 * |
| 6169 * <pre> | 5656 * <pre> |
| 6170 * equalityExpression ::= | 5657 * equalityExpression ::= |
| 6171 * relationalExpression (equalityOperator relationalExpression)? | 5658 * relationalExpression (equalityOperator relationalExpression)? |
| 6172 * | 'super' equalityOperator relationalExpression | 5659 * | 'super' equalityOperator relationalExpression |
| 6173 * </pre> | 5660 * </pre> |
| 6174 * | 5661 * |
| 6175 * @return the equality expression that was parsed | 5662 * @return the equality expression that was parsed |
| 6176 */ | 5663 */ |
| 6177 Expression _parseEqualityExpression() { | 5664 Expression _parseEqualityExpression() { |
| 6178 Expression expression; | 5665 Expression expression; |
| 6179 if (_matchesKeyword(Keyword.SUPER) && | 5666 if (_matchesKeyword(Keyword.SUPER) && |
| 6180 _currentToken.next.type.isEqualityOperator) { | 5667 _currentToken.next.type.isEqualityOperator) { |
| 6181 expression = new SuperExpression(getAndAdvance()); | 5668 expression = new SuperExpression(getAndAdvance()); |
| 6182 } else { | 5669 } else { |
| 6183 expression = _parseRelationalExpression(); | 5670 expression = _parseRelationalExpression(); |
| 6184 } | 5671 } |
| 6185 bool leftEqualityExpression = false; | 5672 bool leftEqualityExpression = false; |
| 6186 while (_currentToken.type.isEqualityOperator) { | 5673 while (_currentToken.type.isEqualityOperator) { |
| 6187 Token operator = getAndAdvance(); | 5674 Token operator = getAndAdvance(); |
| 6188 if (leftEqualityExpression) { | 5675 if (leftEqualityExpression) { |
| 6189 _reportErrorForNode( | 5676 _reportErrorForNode( |
| 6190 ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, | 5677 ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, expression); |
| 6191 expression); | |
| 6192 } | 5678 } |
| 6193 expression = | 5679 expression = new BinaryExpression( |
| 6194 new BinaryExpression(expression, operator, _parseRelationalExpression(
)); | 5680 expression, operator, _parseRelationalExpression()); |
| 6195 leftEqualityExpression = true; | 5681 leftEqualityExpression = true; |
| 6196 } | 5682 } |
| 6197 return expression; | 5683 return expression; |
| 6198 } | 5684 } |
| 6199 | 5685 |
| 6200 /** | 5686 /** |
| 6201 * Parse an export directive. | 5687 * Parse an export directive. |
| 6202 * | 5688 * |
| 6203 * <pre> | 5689 * <pre> |
| 6204 * exportDirective ::= | 5690 * exportDirective ::= |
| 6205 * metadata 'export' stringLiteral combinator*';' | 5691 * metadata 'export' stringLiteral combinator*';' |
| 6206 * </pre> | 5692 * </pre> |
| 6207 * | 5693 * |
| 6208 * @param commentAndMetadata the metadata to be associated with the directive | 5694 * @param commentAndMetadata the metadata to be associated with the directive |
| 6209 * @return the export directive that was parsed | 5695 * @return the export directive that was parsed |
| 6210 */ | 5696 */ |
| 6211 ExportDirective _parseExportDirective(CommentAndMetadata commentAndMetadata) { | 5697 ExportDirective _parseExportDirective(CommentAndMetadata commentAndMetadata) { |
| 6212 Token exportKeyword = _expectKeyword(Keyword.EXPORT); | 5698 Token exportKeyword = _expectKeyword(Keyword.EXPORT); |
| 6213 StringLiteral libraryUri = _parseUri(); | 5699 StringLiteral libraryUri = _parseUri(); |
| 6214 List<Combinator> combinators = _parseCombinators(); | 5700 List<Combinator> combinators = _parseCombinators(); |
| 6215 Token semicolon = _expectSemicolon(); | 5701 Token semicolon = _expectSemicolon(); |
| 6216 return new ExportDirective( | 5702 return new ExportDirective(commentAndMetadata.comment, |
| 6217 commentAndMetadata.comment, | 5703 commentAndMetadata.metadata, exportKeyword, libraryUri, combinators, |
| 6218 commentAndMetadata.metadata, | |
| 6219 exportKeyword, | |
| 6220 libraryUri, | |
| 6221 combinators, | |
| 6222 semicolon); | 5704 semicolon); |
| 6223 } | 5705 } |
| 6224 | 5706 |
| 6225 /** | 5707 /** |
| 6226 * Parse a list of expressions. | 5708 * Parse a list of expressions. |
| 6227 * | 5709 * |
| 6228 * <pre> | 5710 * <pre> |
| 6229 * expressionList ::= | 5711 * expressionList ::= |
| 6230 * expression (',' expression)* | 5712 * expression (',' expression)* |
| 6231 * </pre> | 5713 * </pre> |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6292 * delimiters | 5774 * delimiters |
| 6293 * @return the formal parameter that was parsed | 5775 * @return the formal parameter that was parsed |
| 6294 */ | 5776 */ |
| 6295 FormalParameter _parseFormalParameter(ParameterKind kind) { | 5777 FormalParameter _parseFormalParameter(ParameterKind kind) { |
| 6296 NormalFormalParameter parameter = parseNormalFormalParameter(); | 5778 NormalFormalParameter parameter = parseNormalFormalParameter(); |
| 6297 if (_matches(TokenType.EQ)) { | 5779 if (_matches(TokenType.EQ)) { |
| 6298 Token seperator = getAndAdvance(); | 5780 Token seperator = getAndAdvance(); |
| 6299 Expression defaultValue = parseExpression2(); | 5781 Expression defaultValue = parseExpression2(); |
| 6300 if (kind == ParameterKind.NAMED) { | 5782 if (kind == ParameterKind.NAMED) { |
| 6301 _reportErrorForToken( | 5783 _reportErrorForToken( |
| 6302 ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, | 5784 ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator); |
| 6303 seperator); | |
| 6304 } else if (kind == ParameterKind.REQUIRED) { | 5785 } else if (kind == ParameterKind.REQUIRED) { |
| 6305 _reportErrorForNode( | 5786 _reportErrorForNode( |
| 6306 ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, | 5787 ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter); |
| 6307 parameter); | |
| 6308 } | 5788 } |
| 6309 return new DefaultFormalParameter( | 5789 return new DefaultFormalParameter( |
| 6310 parameter, | 5790 parameter, kind, seperator, defaultValue); |
| 6311 kind, | |
| 6312 seperator, | |
| 6313 defaultValue); | |
| 6314 } else if (_matches(TokenType.COLON)) { | 5791 } else if (_matches(TokenType.COLON)) { |
| 6315 Token seperator = getAndAdvance(); | 5792 Token seperator = getAndAdvance(); |
| 6316 Expression defaultValue = parseExpression2(); | 5793 Expression defaultValue = parseExpression2(); |
| 6317 if (kind == ParameterKind.POSITIONAL) { | 5794 if (kind == ParameterKind.POSITIONAL) { |
| 6318 _reportErrorForToken( | 5795 _reportErrorForToken( |
| 6319 ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, | 5796 ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, |
| 6320 seperator); | 5797 seperator); |
| 6321 } else if (kind == ParameterKind.REQUIRED) { | 5798 } else if (kind == ParameterKind.REQUIRED) { |
| 6322 _reportErrorForNode( | 5799 _reportErrorForNode( |
| 6323 ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, | 5800 ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter); |
| 6324 parameter); | |
| 6325 } | 5801 } |
| 6326 return new DefaultFormalParameter( | 5802 return new DefaultFormalParameter( |
| 6327 parameter, | 5803 parameter, kind, seperator, defaultValue); |
| 6328 kind, | |
| 6329 seperator, | |
| 6330 defaultValue); | |
| 6331 } else if (kind != ParameterKind.REQUIRED) { | 5804 } else if (kind != ParameterKind.REQUIRED) { |
| 6332 return new DefaultFormalParameter(parameter, kind, null, null); | 5805 return new DefaultFormalParameter(parameter, kind, null, null); |
| 6333 } | 5806 } |
| 6334 return parameter; | 5807 return parameter; |
| 6335 } | 5808 } |
| 6336 | 5809 |
| 6337 /** | 5810 /** |
| 6338 * Parse a for statement. | 5811 * Parse a for statement. |
| 6339 * | 5812 * |
| 6340 * <pre> | 5813 * <pre> |
| (...skipping 26 matching lines...) Expand all Loading... |
| 6367 Expression initialization = null; | 5840 Expression initialization = null; |
| 6368 if (!_matches(TokenType.SEMICOLON)) { | 5841 if (!_matches(TokenType.SEMICOLON)) { |
| 6369 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 5842 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 6370 if (_matchesIdentifier() && | 5843 if (_matchesIdentifier() && |
| 6371 (_tokenMatchesKeyword(_peek(), Keyword.IN) || | 5844 (_tokenMatchesKeyword(_peek(), Keyword.IN) || |
| 6372 _tokenMatches(_peek(), TokenType.COLON))) { | 5845 _tokenMatches(_peek(), TokenType.COLON))) { |
| 6373 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 5846 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 6374 SimpleIdentifier variableName = parseSimpleIdentifier(); | 5847 SimpleIdentifier variableName = parseSimpleIdentifier(); |
| 6375 variables.add( | 5848 variables.add( |
| 6376 new VariableDeclaration(null, null, variableName, null, null)); | 5849 new VariableDeclaration(null, null, variableName, null, null)); |
| 6377 variableList = new VariableDeclarationList( | 5850 variableList = new VariableDeclarationList(commentAndMetadata.comment, |
| 6378 commentAndMetadata.comment, | 5851 commentAndMetadata.metadata, null, null, variables); |
| 6379 commentAndMetadata.metadata, | |
| 6380 null, | |
| 6381 null, | |
| 6382 variables); | |
| 6383 } else if (_isInitializedVariableDeclaration()) { | 5852 } else if (_isInitializedVariableDeclaration()) { |
| 6384 variableList = | 5853 variableList = |
| 6385 _parseVariableDeclarationListAfterMetadata(commentAndMetadata); | 5854 _parseVariableDeclarationListAfterMetadata(commentAndMetadata); |
| 6386 } else { | 5855 } else { |
| 6387 initialization = parseExpression2(); | 5856 initialization = parseExpression2(); |
| 6388 } | 5857 } |
| 6389 if (_matchesKeyword(Keyword.IN) || _matches(TokenType.COLON)) { | 5858 if (_matchesKeyword(Keyword.IN) || _matches(TokenType.COLON)) { |
| 6390 if (_matches(TokenType.COLON)) { | 5859 if (_matches(TokenType.COLON)) { |
| 6391 _reportErrorForCurrentToken(ParserErrorCode.COLON_IN_PLACE_OF_IN); | 5860 _reportErrorForCurrentToken(ParserErrorCode.COLON_IN_PLACE_OF_IN); |
| 6392 } | 5861 } |
| 6393 DeclaredIdentifier loopVariable = null; | 5862 DeclaredIdentifier loopVariable = null; |
| 6394 SimpleIdentifier identifier = null; | 5863 SimpleIdentifier identifier = null; |
| 6395 if (variableList == null) { | 5864 if (variableList == null) { |
| 6396 // We found: <expression> 'in' | 5865 // We found: <expression> 'in' |
| 6397 _reportErrorForCurrentToken( | 5866 _reportErrorForCurrentToken( |
| 6398 ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH); | 5867 ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH); |
| 6399 } else { | 5868 } else { |
| 6400 NodeList<VariableDeclaration> variables = variableList.variables; | 5869 NodeList<VariableDeclaration> variables = variableList.variables; |
| 6401 if (variables.length > 1) { | 5870 if (variables.length > 1) { |
| 6402 _reportErrorForCurrentToken( | 5871 _reportErrorForCurrentToken( |
| 6403 ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, | 5872 ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [ |
| 6404 [variables.length.toString()]); | 5873 variables.length.toString() |
| 5874 ]); |
| 6405 } | 5875 } |
| 6406 VariableDeclaration variable = variables[0]; | 5876 VariableDeclaration variable = variables[0]; |
| 6407 if (variable.initializer != null) { | 5877 if (variable.initializer != null) { |
| 6408 _reportErrorForCurrentToken( | 5878 _reportErrorForCurrentToken( |
| 6409 ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH); | 5879 ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH); |
| 6410 } | 5880 } |
| 6411 Token keyword = variableList.keyword; | 5881 Token keyword = variableList.keyword; |
| 6412 TypeName type = variableList.type; | 5882 TypeName type = variableList.type; |
| 6413 if (keyword != null || type != null) { | 5883 if (keyword != null || type != null) { |
| 6414 loopVariable = new DeclaredIdentifier( | 5884 loopVariable = new DeclaredIdentifier(commentAndMetadata.comment, |
| 6415 commentAndMetadata.comment, | 5885 commentAndMetadata.metadata, keyword, type, variable.name); |
| 6416 commentAndMetadata.metadata, | |
| 6417 keyword, | |
| 6418 type, | |
| 6419 variable.name); | |
| 6420 } else { | 5886 } else { |
| 6421 if (!commentAndMetadata.metadata.isEmpty) { | 5887 if (!commentAndMetadata.metadata.isEmpty) { |
| 6422 // TODO(jwren) metadata isn't allowed before the identifier in | 5888 // TODO(jwren) metadata isn't allowed before the identifier in |
| 6423 // "identifier in expression", add warning if commentAndMetadata | 5889 // "identifier in expression", add warning if commentAndMetadata |
| 6424 // has content | 5890 // has content |
| 6425 } | 5891 } |
| 6426 identifier = variable.name; | 5892 identifier = variable.name; |
| 6427 } | 5893 } |
| 6428 } | 5894 } |
| 6429 Token inKeyword = getAndAdvance(); | 5895 Token inKeyword = getAndAdvance(); |
| 6430 Expression iterator = parseExpression2(); | 5896 Expression iterator = parseExpression2(); |
| 6431 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 5897 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 6432 Statement body = parseStatement2(); | 5898 Statement body = parseStatement2(); |
| 6433 if (loopVariable == null) { | 5899 if (loopVariable == null) { |
| 6434 return new ForEachStatement.con2( | 5900 return new ForEachStatement.con2(awaitKeyword, forKeyword, |
| 6435 awaitKeyword, | 5901 leftParenthesis, identifier, inKeyword, iterator, |
| 6436 forKeyword, | 5902 rightParenthesis, body); |
| 6437 leftParenthesis, | |
| 6438 identifier, | |
| 6439 inKeyword, | |
| 6440 iterator, | |
| 6441 rightParenthesis, | |
| 6442 body); | |
| 6443 } | 5903 } |
| 6444 return new ForEachStatement.con1( | 5904 return new ForEachStatement.con1(awaitKeyword, forKeyword, |
| 6445 awaitKeyword, | 5905 leftParenthesis, loopVariable, inKeyword, iterator, |
| 6446 forKeyword, | 5906 rightParenthesis, body); |
| 6447 leftParenthesis, | |
| 6448 loopVariable, | |
| 6449 inKeyword, | |
| 6450 iterator, | |
| 6451 rightParenthesis, | |
| 6452 body); | |
| 6453 } | 5907 } |
| 6454 } | 5908 } |
| 6455 if (awaitKeyword != null) { | 5909 if (awaitKeyword != null) { |
| 6456 _reportErrorForToken( | 5910 _reportErrorForToken( |
| 6457 ParserErrorCode.INVALID_AWAIT_IN_FOR, | 5911 ParserErrorCode.INVALID_AWAIT_IN_FOR, awaitKeyword); |
| 6458 awaitKeyword); | |
| 6459 } | 5912 } |
| 6460 Token leftSeparator = _expect(TokenType.SEMICOLON); | 5913 Token leftSeparator = _expect(TokenType.SEMICOLON); |
| 6461 Expression condition = null; | 5914 Expression condition = null; |
| 6462 if (!_matches(TokenType.SEMICOLON)) { | 5915 if (!_matches(TokenType.SEMICOLON)) { |
| 6463 condition = parseExpression2(); | 5916 condition = parseExpression2(); |
| 6464 } | 5917 } |
| 6465 Token rightSeparator = _expect(TokenType.SEMICOLON); | 5918 Token rightSeparator = _expect(TokenType.SEMICOLON); |
| 6466 List<Expression> updaters = null; | 5919 List<Expression> updaters = null; |
| 6467 if (!_matches(TokenType.CLOSE_PAREN)) { | 5920 if (!_matches(TokenType.CLOSE_PAREN)) { |
| 6468 updaters = _parseExpressionList(); | 5921 updaters = _parseExpressionList(); |
| 6469 } | 5922 } |
| 6470 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 5923 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 6471 Statement body = parseStatement2(); | 5924 Statement body = parseStatement2(); |
| 6472 return new ForStatement( | 5925 return new ForStatement(forKeyword, leftParenthesis, variableList, |
| 6473 forKeyword, | 5926 initialization, leftSeparator, condition, rightSeparator, updaters, |
| 6474 leftParenthesis, | 5927 rightParenthesis, body); |
| 6475 variableList, | |
| 6476 initialization, | |
| 6477 leftSeparator, | |
| 6478 condition, | |
| 6479 rightSeparator, | |
| 6480 updaters, | |
| 6481 rightParenthesis, | |
| 6482 body); | |
| 6483 } finally { | 5928 } finally { |
| 6484 _inLoop = wasInLoop; | 5929 _inLoop = wasInLoop; |
| 6485 } | 5930 } |
| 6486 } | 5931 } |
| 6487 | 5932 |
| 6488 /** | 5933 /** |
| 6489 * Parse a function body. | 5934 * Parse a function body. |
| 6490 * | 5935 * |
| 6491 * <pre> | 5936 * <pre> |
| 6492 * functionBody ::= | 5937 * functionBody ::= |
| 6493 * '=>' expression ';' | 5938 * '=>' expression ';' |
| 6494 * | block | 5939 * | block |
| 6495 * | 5940 * |
| 6496 * functionExpressionBody ::= | 5941 * functionExpressionBody ::= |
| 6497 * '=>' expression | 5942 * '=>' expression |
| 6498 * | block | 5943 * | block |
| 6499 * </pre> | 5944 * </pre> |
| 6500 * | 5945 * |
| 6501 * @param mayBeEmpty `true` if the function body is allowed to be empty | 5946 * @param mayBeEmpty `true` if the function body is allowed to be empty |
| 6502 * @param emptyErrorCode the error code to report if function body expected, b
ut not found | 5947 * @param emptyErrorCode the error code to report if function body expected, b
ut not found |
| 6503 * @param inExpression `true` if the function body is being parsed as part of
an expression | 5948 * @param inExpression `true` if the function body is being parsed as part of
an expression |
| 6504 * and therefore does not have a terminating semicolon | 5949 * and therefore does not have a terminating semicolon |
| 6505 * @return the function body that was parsed | 5950 * @return the function body that was parsed |
| 6506 */ | 5951 */ |
| 6507 FunctionBody _parseFunctionBody(bool mayBeEmpty, | 5952 FunctionBody _parseFunctionBody( |
| 6508 ParserErrorCode emptyErrorCode, bool inExpression) { | 5953 bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) { |
| 6509 bool wasInAsync = _inAsync; | 5954 bool wasInAsync = _inAsync; |
| 6510 bool wasInGenerator = _inGenerator; | 5955 bool wasInGenerator = _inGenerator; |
| 6511 bool wasInLoop = _inLoop; | 5956 bool wasInLoop = _inLoop; |
| 6512 bool wasInSwitch = _inSwitch; | 5957 bool wasInSwitch = _inSwitch; |
| 6513 _inAsync = false; | 5958 _inAsync = false; |
| 6514 _inGenerator = false; | 5959 _inGenerator = false; |
| 6515 _inLoop = false; | 5960 _inLoop = false; |
| 6516 _inSwitch = false; | 5961 _inSwitch = false; |
| 6517 try { | 5962 try { |
| 6518 if (_matches(TokenType.SEMICOLON)) { | 5963 if (_matches(TokenType.SEMICOLON)) { |
| 6519 if (!mayBeEmpty) { | 5964 if (!mayBeEmpty) { |
| 6520 _reportErrorForCurrentToken(emptyErrorCode); | 5965 _reportErrorForCurrentToken(emptyErrorCode); |
| 6521 } | 5966 } |
| 6522 return new EmptyFunctionBody(getAndAdvance()); | 5967 return new EmptyFunctionBody(getAndAdvance()); |
| 6523 } else if (_matchesString(_NATIVE)) { | 5968 } else if (_matchesString(_NATIVE)) { |
| 6524 Token nativeToken = getAndAdvance(); | 5969 Token nativeToken = getAndAdvance(); |
| 6525 StringLiteral stringLiteral = null; | 5970 StringLiteral stringLiteral = null; |
| 6526 if (_matches(TokenType.STRING)) { | 5971 if (_matches(TokenType.STRING)) { |
| 6527 stringLiteral = parseStringLiteral(); | 5972 stringLiteral = parseStringLiteral(); |
| 6528 } | 5973 } |
| 6529 return new NativeFunctionBody( | 5974 return new NativeFunctionBody( |
| 6530 nativeToken, | 5975 nativeToken, stringLiteral, _expect(TokenType.SEMICOLON)); |
| 6531 stringLiteral, | |
| 6532 _expect(TokenType.SEMICOLON)); | |
| 6533 } | 5976 } |
| 6534 Token keyword = null; | 5977 Token keyword = null; |
| 6535 Token star = null; | 5978 Token star = null; |
| 6536 if (_matchesString(ASYNC)) { | 5979 if (_matchesString(ASYNC)) { |
| 6537 keyword = getAndAdvance(); | 5980 keyword = getAndAdvance(); |
| 6538 if (_matches(TokenType.STAR)) { | 5981 if (_matches(TokenType.STAR)) { |
| 6539 star = getAndAdvance(); | 5982 star = getAndAdvance(); |
| 6540 _inGenerator = true; | 5983 _inGenerator = true; |
| 6541 } | 5984 } |
| 6542 _inAsync = true; | 5985 _inAsync = true; |
| 6543 } else if (_matchesString(SYNC)) { | 5986 } else if (_matchesString(SYNC)) { |
| 6544 keyword = getAndAdvance(); | 5987 keyword = getAndAdvance(); |
| 6545 if (_matches(TokenType.STAR)) { | 5988 if (_matches(TokenType.STAR)) { |
| 6546 star = getAndAdvance(); | 5989 star = getAndAdvance(); |
| 6547 _inGenerator = true; | 5990 _inGenerator = true; |
| 6548 } | 5991 } |
| 6549 } | 5992 } |
| 6550 if (_matches(TokenType.FUNCTION)) { | 5993 if (_matches(TokenType.FUNCTION)) { |
| 6551 if (keyword != null) { | 5994 if (keyword != null) { |
| 6552 if (!_tokenMatchesString(keyword, ASYNC)) { | 5995 if (!_tokenMatchesString(keyword, ASYNC)) { |
| 6553 _reportErrorForToken(ParserErrorCode.INVALID_SYNC, keyword); | 5996 _reportErrorForToken(ParserErrorCode.INVALID_SYNC, keyword); |
| 6554 keyword = null; | 5997 keyword = null; |
| 6555 } else if (star != null) { | 5998 } else if (star != null) { |
| 6556 _reportErrorForToken( | 5999 _reportErrorForToken( |
| 6557 ParserErrorCode.INVALID_STAR_AFTER_ASYNC, | 6000 ParserErrorCode.INVALID_STAR_AFTER_ASYNC, star); |
| 6558 star); | |
| 6559 } | 6001 } |
| 6560 } | 6002 } |
| 6561 Token functionDefinition = getAndAdvance(); | 6003 Token functionDefinition = getAndAdvance(); |
| 6562 if (_matchesKeyword(Keyword.RETURN)) { | 6004 if (_matchesKeyword(Keyword.RETURN)) { |
| 6563 _reportErrorForToken( | 6005 _reportErrorForToken( |
| 6564 ParserErrorCode.UNEXPECTED_TOKEN, | 6006 ParserErrorCode.UNEXPECTED_TOKEN, getAndAdvance()); |
| 6565 getAndAdvance()); | |
| 6566 } | 6007 } |
| 6567 Expression expression = parseExpression2(); | 6008 Expression expression = parseExpression2(); |
| 6568 Token semicolon = null; | 6009 Token semicolon = null; |
| 6569 if (!inExpression) { | 6010 if (!inExpression) { |
| 6570 semicolon = _expect(TokenType.SEMICOLON); | 6011 semicolon = _expect(TokenType.SEMICOLON); |
| 6571 } | 6012 } |
| 6572 if (!_parseFunctionBodies) { | 6013 if (!_parseFunctionBodies) { |
| 6573 return new EmptyFunctionBody( | 6014 return new EmptyFunctionBody( |
| 6574 _createSyntheticToken(TokenType.SEMICOLON)); | 6015 _createSyntheticToken(TokenType.SEMICOLON)); |
| 6575 } | 6016 } |
| 6576 return new ExpressionFunctionBody( | 6017 return new ExpressionFunctionBody( |
| 6577 keyword, | 6018 keyword, functionDefinition, expression, semicolon); |
| 6578 functionDefinition, | |
| 6579 expression, | |
| 6580 semicolon); | |
| 6581 } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 6019 } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 6582 if (keyword != null) { | 6020 if (keyword != null) { |
| 6583 if (_tokenMatchesString(keyword, SYNC) && star == null) { | 6021 if (_tokenMatchesString(keyword, SYNC) && star == null) { |
| 6584 _reportErrorForToken( | 6022 _reportErrorForToken( |
| 6585 ParserErrorCode.MISSING_STAR_AFTER_SYNC, | 6023 ParserErrorCode.MISSING_STAR_AFTER_SYNC, keyword); |
| 6586 keyword); | |
| 6587 } | 6024 } |
| 6588 } | 6025 } |
| 6589 if (!_parseFunctionBodies) { | 6026 if (!_parseFunctionBodies) { |
| 6590 _skipBlock(); | 6027 _skipBlock(); |
| 6591 return new EmptyFunctionBody( | 6028 return new EmptyFunctionBody( |
| 6592 _createSyntheticToken(TokenType.SEMICOLON)); | 6029 _createSyntheticToken(TokenType.SEMICOLON)); |
| 6593 } | 6030 } |
| 6594 return new BlockFunctionBody(keyword, star, parseBlock()); | 6031 return new BlockFunctionBody(keyword, star, parseBlock()); |
| 6595 } else { | 6032 } else { |
| 6596 // Invalid function body | 6033 // Invalid function body |
| (...skipping 18 matching lines...) Expand all Loading... |
| 6615 * | returnType? getOrSet identifier formalParameterList functionBody | 6052 * | returnType? getOrSet identifier formalParameterList functionBody |
| 6616 * </pre> | 6053 * </pre> |
| 6617 * | 6054 * |
| 6618 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the | 6055 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the |
| 6619 * declaration | 6056 * declaration |
| 6620 * @param externalKeyword the 'external' keyword, or `null` if the function is
not external | 6057 * @param externalKeyword the 'external' keyword, or `null` if the function is
not external |
| 6621 * @param returnType the return type, or `null` if there is no return type | 6058 * @param returnType the return type, or `null` if there is no return type |
| 6622 * @param isStatement `true` if the function declaration is being parsed as a
statement | 6059 * @param isStatement `true` if the function declaration is being parsed as a
statement |
| 6623 * @return the function declaration that was parsed | 6060 * @return the function declaration that was parsed |
| 6624 */ | 6061 */ |
| 6625 FunctionDeclaration | 6062 FunctionDeclaration _parseFunctionDeclaration( |
| 6626 _parseFunctionDeclaration(CommentAndMetadata commentAndMetadata, | 6063 CommentAndMetadata commentAndMetadata, Token externalKeyword, |
| 6627 Token externalKeyword, TypeName returnType) { | 6064 TypeName returnType) { |
| 6628 Token keyword = null; | 6065 Token keyword = null; |
| 6629 bool isGetter = false; | 6066 bool isGetter = false; |
| 6630 if (_matchesKeyword(Keyword.GET) && | 6067 if (_matchesKeyword(Keyword.GET) && |
| 6631 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 6068 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 6632 keyword = getAndAdvance(); | 6069 keyword = getAndAdvance(); |
| 6633 isGetter = true; | 6070 isGetter = true; |
| 6634 } else if (_matchesKeyword(Keyword.SET) && | 6071 } else if (_matchesKeyword(Keyword.SET) && |
| 6635 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 6072 !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 6636 keyword = getAndAdvance(); | 6073 keyword = getAndAdvance(); |
| 6637 } | 6074 } |
| 6638 SimpleIdentifier name = parseSimpleIdentifier(); | 6075 SimpleIdentifier name = parseSimpleIdentifier(); |
| 6639 FormalParameterList parameters = null; | 6076 FormalParameterList parameters = null; |
| 6640 if (!isGetter) { | 6077 if (!isGetter) { |
| 6641 if (_matches(TokenType.OPEN_PAREN)) { | 6078 if (_matches(TokenType.OPEN_PAREN)) { |
| 6642 parameters = parseFormalParameterList(); | 6079 parameters = parseFormalParameterList(); |
| 6643 _validateFormalParameterList(parameters); | 6080 _validateFormalParameterList(parameters); |
| 6644 } else { | 6081 } else { |
| 6645 _reportErrorForCurrentToken( | 6082 _reportErrorForCurrentToken( |
| 6646 ParserErrorCode.MISSING_FUNCTION_PARAMETERS); | 6083 ParserErrorCode.MISSING_FUNCTION_PARAMETERS); |
| 6647 } | 6084 } |
| 6648 } else if (_matches(TokenType.OPEN_PAREN)) { | 6085 } else if (_matches(TokenType.OPEN_PAREN)) { |
| 6649 _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS); | 6086 _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS); |
| 6650 parseFormalParameterList(); | 6087 parseFormalParameterList(); |
| 6651 } | 6088 } |
| 6652 FunctionBody body; | 6089 FunctionBody body; |
| 6653 if (externalKeyword == null) { | 6090 if (externalKeyword == null) { |
| 6654 body = | 6091 body = _parseFunctionBody( |
| 6655 _parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, false
); | 6092 false, ParserErrorCode.MISSING_FUNCTION_BODY, false); |
| 6656 } else { | 6093 } else { |
| 6657 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); | 6094 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); |
| 6658 } | 6095 } |
| 6659 // if (!isStatement && matches(TokenType.SEMICOLON)) { | 6096 // if (!isStatement && matches(TokenType.SEMICOLON)) { |
| 6660 // // TODO(brianwilkerson) Improve this error message. | 6097 // // TODO(brianwilkerson) Improve this error message. |
| 6661 // reportError(ParserErrorCode.UNEXPECTED_TOKEN, currentToken.getLexeme
()); | 6098 // reportError(ParserErrorCode.UNEXPECTED_TOKEN, currentToken.getLexeme
()); |
| 6662 // advance(); | 6099 // advance(); |
| 6663 // } | 6100 // } |
| 6664 return new FunctionDeclaration( | 6101 return new FunctionDeclaration(commentAndMetadata.comment, |
| 6665 commentAndMetadata.comment, | 6102 commentAndMetadata.metadata, externalKeyword, returnType, keyword, name, |
| 6666 commentAndMetadata.metadata, | |
| 6667 externalKeyword, | |
| 6668 returnType, | |
| 6669 keyword, | |
| 6670 name, | |
| 6671 new FunctionExpression(parameters, body)); | 6103 new FunctionExpression(parameters, body)); |
| 6672 } | 6104 } |
| 6673 | 6105 |
| 6674 /** | 6106 /** |
| 6675 * Parse a function declaration statement. | 6107 * Parse a function declaration statement. |
| 6676 * | 6108 * |
| 6677 * <pre> | 6109 * <pre> |
| 6678 * functionDeclarationStatement ::= | 6110 * functionDeclarationStatement ::= |
| 6679 * functionSignature functionBody | 6111 * functionSignature functionBody |
| 6680 * </pre> | 6112 * </pre> |
| 6681 * | 6113 * |
| 6682 * @return the function declaration statement that was parsed | 6114 * @return the function declaration statement that was parsed |
| 6683 */ | 6115 */ |
| 6684 Statement _parseFunctionDeclarationStatement() { | 6116 Statement _parseFunctionDeclarationStatement() { |
| 6685 Modifiers modifiers = _parseModifiers(); | 6117 Modifiers modifiers = _parseModifiers(); |
| 6686 _validateModifiersForFunctionDeclarationStatement(modifiers); | 6118 _validateModifiersForFunctionDeclarationStatement(modifiers); |
| 6687 return _parseFunctionDeclarationStatementAfterReturnType( | 6119 return _parseFunctionDeclarationStatementAfterReturnType( |
| 6688 _parseCommentAndMetadata(), | 6120 _parseCommentAndMetadata(), _parseOptionalReturnType()); |
| 6689 _parseOptionalReturnType()); | |
| 6690 } | 6121 } |
| 6691 | 6122 |
| 6692 /** | 6123 /** |
| 6693 * Parse a function declaration statement. | 6124 * Parse a function declaration statement. |
| 6694 * | 6125 * |
| 6695 * <pre> | 6126 * <pre> |
| 6696 * functionDeclarationStatement ::= | 6127 * functionDeclarationStatement ::= |
| 6697 * functionSignature functionBody | 6128 * functionSignature functionBody |
| 6698 * </pre> | 6129 * </pre> |
| 6699 * | 6130 * |
| 6700 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the | 6131 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the |
| 6701 * declaration | 6132 * declaration |
| 6702 * @param returnType the return type, or `null` if there is no return type | 6133 * @param returnType the return type, or `null` if there is no return type |
| 6703 * @return the function declaration statement that was parsed | 6134 * @return the function declaration statement that was parsed |
| 6704 */ | 6135 */ |
| 6705 Statement | 6136 Statement _parseFunctionDeclarationStatementAfterReturnType( |
| 6706 _parseFunctionDeclarationStatementAfterReturnType(CommentAndMetadata comme
ntAndMetadata, | 6137 CommentAndMetadata commentAndMetadata, TypeName returnType) { |
| 6707 TypeName returnType) { | |
| 6708 FunctionDeclaration declaration = | 6138 FunctionDeclaration declaration = |
| 6709 _parseFunctionDeclaration(commentAndMetadata, null, returnType); | 6139 _parseFunctionDeclaration(commentAndMetadata, null, returnType); |
| 6710 Token propertyKeyword = declaration.propertyKeyword; | 6140 Token propertyKeyword = declaration.propertyKeyword; |
| 6711 if (propertyKeyword != null) { | 6141 if (propertyKeyword != null) { |
| 6712 if ((propertyKeyword as KeywordToken).keyword == Keyword.GET) { | 6142 if ((propertyKeyword as KeywordToken).keyword == Keyword.GET) { |
| 6713 _reportErrorForToken( | 6143 _reportErrorForToken( |
| 6714 ParserErrorCode.GETTER_IN_FUNCTION, | 6144 ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword); |
| 6715 propertyKeyword); | |
| 6716 } else { | 6145 } else { |
| 6717 _reportErrorForToken( | 6146 _reportErrorForToken( |
| 6718 ParserErrorCode.SETTER_IN_FUNCTION, | 6147 ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword); |
| 6719 propertyKeyword); | |
| 6720 } | 6148 } |
| 6721 } | 6149 } |
| 6722 return new FunctionDeclarationStatement(declaration); | 6150 return new FunctionDeclarationStatement(declaration); |
| 6723 } | 6151 } |
| 6724 | 6152 |
| 6725 /** | 6153 /** |
| 6726 * Parse a function type alias. | 6154 * Parse a function type alias. |
| 6727 * | 6155 * |
| 6728 * <pre> | 6156 * <pre> |
| 6729 * functionTypeAlias ::= | 6157 * functionTypeAlias ::= |
| 6730 * functionPrefix typeParameterList? formalParameterList ';' | 6158 * functionPrefix typeParameterList? formalParameterList ';' |
| 6731 * | 6159 * |
| 6732 * functionPrefix ::= | 6160 * functionPrefix ::= |
| 6733 * returnType? name | 6161 * returnType? name |
| 6734 * </pre> | 6162 * </pre> |
| 6735 * | 6163 * |
| 6736 * @param commentAndMetadata the metadata to be associated with the member | 6164 * @param commentAndMetadata the metadata to be associated with the member |
| 6737 * @param keyword the token representing the 'typedef' keyword | 6165 * @param keyword the token representing the 'typedef' keyword |
| 6738 * @return the function type alias that was parsed | 6166 * @return the function type alias that was parsed |
| 6739 */ | 6167 */ |
| 6740 FunctionTypeAlias | 6168 FunctionTypeAlias _parseFunctionTypeAlias( |
| 6741 _parseFunctionTypeAlias(CommentAndMetadata commentAndMetadata, Token keywo
rd) { | 6169 CommentAndMetadata commentAndMetadata, Token keyword) { |
| 6742 TypeName returnType = null; | 6170 TypeName returnType = null; |
| 6743 if (hasReturnTypeInTypeAlias) { | 6171 if (hasReturnTypeInTypeAlias) { |
| 6744 returnType = parseReturnType(); | 6172 returnType = parseReturnType(); |
| 6745 } | 6173 } |
| 6746 SimpleIdentifier name = parseSimpleIdentifier(); | 6174 SimpleIdentifier name = parseSimpleIdentifier(); |
| 6747 TypeParameterList typeParameters = null; | 6175 TypeParameterList typeParameters = null; |
| 6748 if (_matches(TokenType.LT)) { | 6176 if (_matches(TokenType.LT)) { |
| 6749 typeParameters = parseTypeParameterList(); | 6177 typeParameters = parseTypeParameterList(); |
| 6750 } | 6178 } |
| 6751 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.EOF)) { | 6179 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.EOF)) { |
| 6752 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS); | 6180 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS); |
| 6753 FormalParameterList parameters = new FormalParameterList( | 6181 FormalParameterList parameters = new FormalParameterList( |
| 6754 _createSyntheticToken(TokenType.OPEN_PAREN), | 6182 _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, |
| 6755 null, | |
| 6756 null, | |
| 6757 null, | |
| 6758 _createSyntheticToken(TokenType.CLOSE_PAREN)); | 6183 _createSyntheticToken(TokenType.CLOSE_PAREN)); |
| 6759 Token semicolon = _expect(TokenType.SEMICOLON); | 6184 Token semicolon = _expect(TokenType.SEMICOLON); |
| 6760 return new FunctionTypeAlias( | 6185 return new FunctionTypeAlias(commentAndMetadata.comment, |
| 6761 commentAndMetadata.comment, | 6186 commentAndMetadata.metadata, keyword, returnType, name, |
| 6762 commentAndMetadata.metadata, | 6187 typeParameters, parameters, semicolon); |
| 6763 keyword, | |
| 6764 returnType, | |
| 6765 name, | |
| 6766 typeParameters, | |
| 6767 parameters, | |
| 6768 semicolon); | |
| 6769 } else if (!_matches(TokenType.OPEN_PAREN)) { | 6188 } else if (!_matches(TokenType.OPEN_PAREN)) { |
| 6770 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS); | 6189 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS); |
| 6771 // TODO(brianwilkerson) Recover from this error. At the very least we | 6190 // TODO(brianwilkerson) Recover from this error. At the very least we |
| 6772 // should skip to the start of the next valid compilation unit member, | 6191 // should skip to the start of the next valid compilation unit member, |
| 6773 // allowing for the possibility of finding the typedef parameters before | 6192 // allowing for the possibility of finding the typedef parameters before |
| 6774 // that point. | 6193 // that point. |
| 6775 return new FunctionTypeAlias( | 6194 return new FunctionTypeAlias(commentAndMetadata.comment, |
| 6776 commentAndMetadata.comment, | 6195 commentAndMetadata.metadata, keyword, returnType, name, |
| 6777 commentAndMetadata.metadata, | 6196 typeParameters, new FormalParameterList( |
| 6778 keyword, | 6197 _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, |
| 6779 returnType, | |
| 6780 name, | |
| 6781 typeParameters, | |
| 6782 new FormalParameterList( | |
| 6783 _createSyntheticToken(TokenType.OPEN_PAREN), | |
| 6784 null, | |
| 6785 null, | |
| 6786 null, | |
| 6787 _createSyntheticToken(TokenType.CLOSE_PAREN)), | 6198 _createSyntheticToken(TokenType.CLOSE_PAREN)), |
| 6788 _createSyntheticToken(TokenType.SEMICOLON)); | 6199 _createSyntheticToken(TokenType.SEMICOLON)); |
| 6789 } | 6200 } |
| 6790 FormalParameterList parameters = parseFormalParameterList(); | 6201 FormalParameterList parameters = parseFormalParameterList(); |
| 6791 _validateFormalParameterList(parameters); | 6202 _validateFormalParameterList(parameters); |
| 6792 Token semicolon = _expect(TokenType.SEMICOLON); | 6203 Token semicolon = _expect(TokenType.SEMICOLON); |
| 6793 return new FunctionTypeAlias( | 6204 return new FunctionTypeAlias(commentAndMetadata.comment, |
| 6794 commentAndMetadata.comment, | 6205 commentAndMetadata.metadata, keyword, returnType, name, typeParameters, |
| 6795 commentAndMetadata.metadata, | 6206 parameters, semicolon); |
| 6796 keyword, | |
| 6797 returnType, | |
| 6798 name, | |
| 6799 typeParameters, | |
| 6800 parameters, | |
| 6801 semicolon); | |
| 6802 } | 6207 } |
| 6803 | 6208 |
| 6804 /** | 6209 /** |
| 6805 * Parse a getter. | 6210 * Parse a getter. |
| 6806 * | 6211 * |
| 6807 * <pre> | 6212 * <pre> |
| 6808 * getter ::= | 6213 * getter ::= |
| 6809 * getterSignature functionBody? | 6214 * getterSignature functionBody? |
| 6810 * | 6215 * |
| 6811 * getterSignature ::= | 6216 * getterSignature ::= |
| (...skipping 13 matching lines...) Expand all Loading... |
| 6825 Token propertyKeyword = _expectKeyword(Keyword.GET); | 6230 Token propertyKeyword = _expectKeyword(Keyword.GET); |
| 6826 SimpleIdentifier name = parseSimpleIdentifier(); | 6231 SimpleIdentifier name = parseSimpleIdentifier(); |
| 6827 if (_matches(TokenType.OPEN_PAREN) && | 6232 if (_matches(TokenType.OPEN_PAREN) && |
| 6828 _tokenMatches(_peek(), TokenType.CLOSE_PAREN)) { | 6233 _tokenMatches(_peek(), TokenType.CLOSE_PAREN)) { |
| 6829 _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS); | 6234 _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS); |
| 6830 _advance(); | 6235 _advance(); |
| 6831 _advance(); | 6236 _advance(); |
| 6832 } | 6237 } |
| 6833 FunctionBody body = _parseFunctionBody( | 6238 FunctionBody body = _parseFunctionBody( |
| 6834 externalKeyword != null || staticKeyword == null, | 6239 externalKeyword != null || staticKeyword == null, |
| 6835 ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, | 6240 ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false); |
| 6836 false); | |
| 6837 if (externalKeyword != null && body is! EmptyFunctionBody) { | 6241 if (externalKeyword != null && body is! EmptyFunctionBody) { |
| 6838 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY); | 6242 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY); |
| 6839 } | 6243 } |
| 6840 return new MethodDeclaration( | 6244 return new MethodDeclaration(commentAndMetadata.comment, |
| 6841 commentAndMetadata.comment, | 6245 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, |
| 6842 commentAndMetadata.metadata, | 6246 propertyKeyword, null, name, null, body); |
| 6843 externalKeyword, | |
| 6844 staticKeyword, | |
| 6845 returnType, | |
| 6846 propertyKeyword, | |
| 6847 null, | |
| 6848 name, | |
| 6849 null, | |
| 6850 body); | |
| 6851 } | 6247 } |
| 6852 | 6248 |
| 6853 /** | 6249 /** |
| 6854 * Parse a list of identifiers. | 6250 * Parse a list of identifiers. |
| 6855 * | 6251 * |
| 6856 * <pre> | 6252 * <pre> |
| 6857 * identifierList ::= | 6253 * identifierList ::= |
| 6858 * identifier (',' identifier)* | 6254 * identifier (',' identifier)* |
| 6859 * </pre> | 6255 * </pre> |
| 6860 * | 6256 * |
| (...skipping 24 matching lines...) Expand all Loading... |
| 6885 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); | 6281 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); |
| 6886 Expression condition = parseExpression2(); | 6282 Expression condition = parseExpression2(); |
| 6887 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 6283 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 6888 Statement thenStatement = parseStatement2(); | 6284 Statement thenStatement = parseStatement2(); |
| 6889 Token elseKeyword = null; | 6285 Token elseKeyword = null; |
| 6890 Statement elseStatement = null; | 6286 Statement elseStatement = null; |
| 6891 if (_matchesKeyword(Keyword.ELSE)) { | 6287 if (_matchesKeyword(Keyword.ELSE)) { |
| 6892 elseKeyword = getAndAdvance(); | 6288 elseKeyword = getAndAdvance(); |
| 6893 elseStatement = parseStatement2(); | 6289 elseStatement = parseStatement2(); |
| 6894 } | 6290 } |
| 6895 return new IfStatement( | 6291 return new IfStatement(ifKeyword, leftParenthesis, condition, |
| 6896 ifKeyword, | 6292 rightParenthesis, thenStatement, elseKeyword, elseStatement); |
| 6897 leftParenthesis, | |
| 6898 condition, | |
| 6899 rightParenthesis, | |
| 6900 thenStatement, | |
| 6901 elseKeyword, | |
| 6902 elseStatement); | |
| 6903 } | 6293 } |
| 6904 | 6294 |
| 6905 /** | 6295 /** |
| 6906 * Parse an import directive. | 6296 * Parse an import directive. |
| 6907 * | 6297 * |
| 6908 * <pre> | 6298 * <pre> |
| 6909 * importDirective ::= | 6299 * importDirective ::= |
| 6910 * metadata 'import' stringLiteral ('as' identifier)? combinator*';' | 6300 * metadata 'import' stringLiteral ('as' identifier)? combinator*';' |
| 6911 * </pre> | 6301 * </pre> |
| 6912 * | 6302 * |
| (...skipping 11 matching lines...) Expand all Loading... |
| 6924 } | 6314 } |
| 6925 if (_matchesKeyword(Keyword.AS)) { | 6315 if (_matchesKeyword(Keyword.AS)) { |
| 6926 asToken = getAndAdvance(); | 6316 asToken = getAndAdvance(); |
| 6927 prefix = parseSimpleIdentifier(); | 6317 prefix = parseSimpleIdentifier(); |
| 6928 } else if (deferredToken != null) { | 6318 } else if (deferredToken != null) { |
| 6929 _reportErrorForCurrentToken( | 6319 _reportErrorForCurrentToken( |
| 6930 ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT); | 6320 ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT); |
| 6931 } | 6321 } |
| 6932 List<Combinator> combinators = _parseCombinators(); | 6322 List<Combinator> combinators = _parseCombinators(); |
| 6933 Token semicolon = _expectSemicolon(); | 6323 Token semicolon = _expectSemicolon(); |
| 6934 return new ImportDirective( | 6324 return new ImportDirective(commentAndMetadata.comment, |
| 6935 commentAndMetadata.comment, | 6325 commentAndMetadata.metadata, importKeyword, libraryUri, deferredToken, |
| 6936 commentAndMetadata.metadata, | 6326 asToken, prefix, combinators, semicolon); |
| 6937 importKeyword, | |
| 6938 libraryUri, | |
| 6939 deferredToken, | |
| 6940 asToken, | |
| 6941 prefix, | |
| 6942 combinators, | |
| 6943 semicolon); | |
| 6944 } | 6327 } |
| 6945 | 6328 |
| 6946 /** | 6329 /** |
| 6947 * Parse a list of initialized identifiers. | 6330 * Parse a list of initialized identifiers. |
| 6948 * | 6331 * |
| 6949 * <pre> | 6332 * <pre> |
| 6950 * ?? ::= | 6333 * ?? ::= |
| 6951 * 'static'? ('var' | type) initializedIdentifierList ';' | 6334 * 'static'? ('var' | type) initializedIdentifierList ';' |
| 6952 * | 'final' type? initializedIdentifierList ';' | 6335 * | 'final' type? initializedIdentifierList ';' |
| 6953 * | 6336 * |
| 6954 * initializedIdentifierList ::= | 6337 * initializedIdentifierList ::= |
| 6955 * initializedIdentifier (',' initializedIdentifier)* | 6338 * initializedIdentifier (',' initializedIdentifier)* |
| 6956 * | 6339 * |
| 6957 * initializedIdentifier ::= | 6340 * initializedIdentifier ::= |
| 6958 * identifier ('=' expression)? | 6341 * identifier ('=' expression)? |
| 6959 * </pre> | 6342 * </pre> |
| 6960 * | 6343 * |
| 6961 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the | 6344 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the |
| 6962 * declaration | 6345 * declaration |
| 6963 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic | 6346 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic |
| 6964 * @param keyword the token representing the 'final', 'const' or 'var' keyword
, or `null` if | 6347 * @param keyword the token representing the 'final', 'const' or 'var' keyword
, or `null` if |
| 6965 * there is no keyword | 6348 * there is no keyword |
| 6966 * @param type the type that has already been parsed, or `null` if 'var' was p
rovided | 6349 * @param type the type that has already been parsed, or `null` if 'var' was p
rovided |
| 6967 * @return the getter that was parsed | 6350 * @return the getter that was parsed |
| 6968 */ | 6351 */ |
| 6969 FieldDeclaration | 6352 FieldDeclaration _parseInitializedIdentifierList( |
| 6970 _parseInitializedIdentifierList(CommentAndMetadata commentAndMetadata, | 6353 CommentAndMetadata commentAndMetadata, Token staticKeyword, Token keyword, |
| 6971 Token staticKeyword, Token keyword, TypeName type) { | 6354 TypeName type) { |
| 6972 VariableDeclarationList fieldList = | 6355 VariableDeclarationList fieldList = |
| 6973 _parseVariableDeclarationListAfterType(null, keyword, type); | 6356 _parseVariableDeclarationListAfterType(null, keyword, type); |
| 6974 return new FieldDeclaration( | 6357 return new FieldDeclaration(commentAndMetadata.comment, |
| 6975 commentAndMetadata.comment, | 6358 commentAndMetadata.metadata, staticKeyword, fieldList, |
| 6976 commentAndMetadata.metadata, | |
| 6977 staticKeyword, | |
| 6978 fieldList, | |
| 6979 _expect(TokenType.SEMICOLON)); | 6359 _expect(TokenType.SEMICOLON)); |
| 6980 } | 6360 } |
| 6981 | 6361 |
| 6982 /** | 6362 /** |
| 6983 * Parse an instance creation expression. | 6363 * Parse an instance creation expression. |
| 6984 * | 6364 * |
| 6985 * <pre> | 6365 * <pre> |
| 6986 * instanceCreationExpression ::= | 6366 * instanceCreationExpression ::= |
| 6987 * ('new' | 'const') type ('.' identifier)? argumentList | 6367 * ('new' | 'const') type ('.' identifier)? argumentList |
| 6988 * </pre> | 6368 * </pre> |
| 6989 * | 6369 * |
| 6990 * @param keyword the 'new' or 'const' keyword that introduces the expression | 6370 * @param keyword the 'new' or 'const' keyword that introduces the expression |
| 6991 * @return the instance creation expression that was parsed | 6371 * @return the instance creation expression that was parsed |
| 6992 */ | 6372 */ |
| 6993 InstanceCreationExpression _parseInstanceCreationExpression(Token keyword) { | 6373 InstanceCreationExpression _parseInstanceCreationExpression(Token keyword) { |
| 6994 ConstructorName constructorName = parseConstructorName(); | 6374 ConstructorName constructorName = parseConstructorName(); |
| 6995 ArgumentList argumentList = parseArgumentList(); | 6375 ArgumentList argumentList = parseArgumentList(); |
| 6996 return new InstanceCreationExpression( | 6376 return new InstanceCreationExpression( |
| 6997 keyword, | 6377 keyword, constructorName, argumentList); |
| 6998 constructorName, | |
| 6999 argumentList); | |
| 7000 } | 6378 } |
| 7001 | 6379 |
| 7002 /** | 6380 /** |
| 7003 * Parse a library directive. | 6381 * Parse a library directive. |
| 7004 * | 6382 * |
| 7005 * <pre> | 6383 * <pre> |
| 7006 * libraryDirective ::= | 6384 * libraryDirective ::= |
| 7007 * metadata 'library' identifier ';' | 6385 * metadata 'library' identifier ';' |
| 7008 * </pre> | 6386 * </pre> |
| 7009 * | 6387 * |
| 7010 * @param commentAndMetadata the metadata to be associated with the directive | 6388 * @param commentAndMetadata the metadata to be associated with the directive |
| 7011 * @return the library directive that was parsed | 6389 * @return the library directive that was parsed |
| 7012 */ | 6390 */ |
| 7013 LibraryDirective | 6391 LibraryDirective _parseLibraryDirective( |
| 7014 _parseLibraryDirective(CommentAndMetadata commentAndMetadata) { | 6392 CommentAndMetadata commentAndMetadata) { |
| 7015 Token keyword = _expectKeyword(Keyword.LIBRARY); | 6393 Token keyword = _expectKeyword(Keyword.LIBRARY); |
| 7016 LibraryIdentifier libraryName = | 6394 LibraryIdentifier libraryName = _parseLibraryName( |
| 7017 _parseLibraryName(ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE, key
word); | 6395 ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE, keyword); |
| 7018 Token semicolon = _expect(TokenType.SEMICOLON); | 6396 Token semicolon = _expect(TokenType.SEMICOLON); |
| 7019 return new LibraryDirective( | 6397 return new LibraryDirective(commentAndMetadata.comment, |
| 7020 commentAndMetadata.comment, | 6398 commentAndMetadata.metadata, keyword, libraryName, semicolon); |
| 7021 commentAndMetadata.metadata, | |
| 7022 keyword, | |
| 7023 libraryName, | |
| 7024 semicolon); | |
| 7025 } | 6399 } |
| 7026 | 6400 |
| 7027 /** | 6401 /** |
| 7028 * Parse a library name. | 6402 * Parse a library name. |
| 7029 * | 6403 * |
| 7030 * <pre> | 6404 * <pre> |
| 7031 * libraryName ::= | 6405 * libraryName ::= |
| 7032 * libraryIdentifier | 6406 * libraryIdentifier |
| 7033 * </pre> | 6407 * </pre> |
| 7034 * | 6408 * |
| 7035 * @param missingNameError the error code to be used if the library name is mi
ssing | 6409 * @param missingNameError the error code to be used if the library name is mi
ssing |
| 7036 * @param missingNameToken the token associated with the error produced if the
library name is | 6410 * @param missingNameToken the token associated with the error produced if the
library name is |
| 7037 * missing | 6411 * missing |
| 7038 * @return the library name that was parsed | 6412 * @return the library name that was parsed |
| 7039 */ | 6413 */ |
| 7040 LibraryIdentifier _parseLibraryName(ParserErrorCode missingNameError, | 6414 LibraryIdentifier _parseLibraryName( |
| 7041 Token missingNameToken) { | 6415 ParserErrorCode missingNameError, Token missingNameToken) { |
| 7042 if (_matchesIdentifier()) { | 6416 if (_matchesIdentifier()) { |
| 7043 return parseLibraryIdentifier(); | 6417 return parseLibraryIdentifier(); |
| 7044 } else if (_matches(TokenType.STRING)) { | 6418 } else if (_matches(TokenType.STRING)) { |
| 7045 // TODO(brianwilkerson) Recovery: This should be extended to handle | 6419 // TODO(brianwilkerson) Recovery: This should be extended to handle |
| 7046 // arbitrary tokens until we can find a token that can start a compilation | 6420 // arbitrary tokens until we can find a token that can start a compilation |
| 7047 // unit member. | 6421 // unit member. |
| 7048 StringLiteral string = parseStringLiteral(); | 6422 StringLiteral string = parseStringLiteral(); |
| 7049 _reportErrorForNode(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string); | 6423 _reportErrorForNode(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string); |
| 7050 } else { | 6424 } else { |
| 7051 _reportErrorForToken(missingNameError, missingNameToken); | 6425 _reportErrorForToken(missingNameError, missingNameToken); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 7062 * listLiteral ::= | 6436 * listLiteral ::= |
| 7063 * 'const'? typeArguments? '[' (expressionList ','?)? ']' | 6437 * 'const'? typeArguments? '[' (expressionList ','?)? ']' |
| 7064 * </pre> | 6438 * </pre> |
| 7065 * | 6439 * |
| 7066 * @param modifier the 'const' modifier appearing before the literal, or `null
` if there is | 6440 * @param modifier the 'const' modifier appearing before the literal, or `null
` if there is |
| 7067 * no modifier | 6441 * no modifier |
| 7068 * @param typeArguments the type arguments appearing before the literal, or `n
ull` if there | 6442 * @param typeArguments the type arguments appearing before the literal, or `n
ull` if there |
| 7069 * are no type arguments | 6443 * are no type arguments |
| 7070 * @return the list literal that was parsed | 6444 * @return the list literal that was parsed |
| 7071 */ | 6445 */ |
| 7072 ListLiteral _parseListLiteral(Token modifier, | 6446 ListLiteral _parseListLiteral( |
| 7073 TypeArgumentList typeArguments) { | 6447 Token modifier, TypeArgumentList typeArguments) { |
| 7074 // may be empty list literal | 6448 // may be empty list literal |
| 7075 if (_matches(TokenType.INDEX)) { | 6449 if (_matches(TokenType.INDEX)) { |
| 7076 BeginToken leftBracket = | 6450 BeginToken leftBracket = _createToken( |
| 7077 _createToken(_currentToken, TokenType.OPEN_SQUARE_BRACKET, isBegin: tr
ue); | 6451 _currentToken, TokenType.OPEN_SQUARE_BRACKET, isBegin: true); |
| 7078 Token rightBracket = | 6452 Token rightBracket = |
| 7079 new Token(TokenType.CLOSE_SQUARE_BRACKET, _currentToken.offset + 1); | 6453 new Token(TokenType.CLOSE_SQUARE_BRACKET, _currentToken.offset + 1); |
| 7080 leftBracket.endToken = rightBracket; | 6454 leftBracket.endToken = rightBracket; |
| 7081 rightBracket.setNext(_currentToken.next); | 6455 rightBracket.setNext(_currentToken.next); |
| 7082 leftBracket.setNext(rightBracket); | 6456 leftBracket.setNext(rightBracket); |
| 7083 _currentToken.previous.setNext(leftBracket); | 6457 _currentToken.previous.setNext(leftBracket); |
| 7084 _currentToken = _currentToken.next; | 6458 _currentToken = _currentToken.next; |
| 7085 return new ListLiteral( | 6459 return new ListLiteral( |
| 7086 modifier, | 6460 modifier, typeArguments, leftBracket, null, rightBracket); |
| 7087 typeArguments, | |
| 7088 leftBracket, | |
| 7089 null, | |
| 7090 rightBracket); | |
| 7091 } | 6461 } |
| 7092 // open | 6462 // open |
| 7093 Token leftBracket = _expect(TokenType.OPEN_SQUARE_BRACKET); | 6463 Token leftBracket = _expect(TokenType.OPEN_SQUARE_BRACKET); |
| 7094 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { | 6464 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { |
| 7095 return new ListLiteral( | 6465 return new ListLiteral( |
| 7096 modifier, | 6466 modifier, typeArguments, leftBracket, null, getAndAdvance()); |
| 7097 typeArguments, | |
| 7098 leftBracket, | |
| 7099 null, | |
| 7100 getAndAdvance()); | |
| 7101 } | 6467 } |
| 7102 bool wasInInitializer = _inInitializer; | 6468 bool wasInInitializer = _inInitializer; |
| 7103 _inInitializer = false; | 6469 _inInitializer = false; |
| 7104 try { | 6470 try { |
| 7105 List<Expression> elements = new List<Expression>(); | 6471 List<Expression> elements = new List<Expression>(); |
| 7106 elements.add(parseExpression2()); | 6472 elements.add(parseExpression2()); |
| 7107 while (_optional(TokenType.COMMA)) { | 6473 while (_optional(TokenType.COMMA)) { |
| 7108 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { | 6474 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { |
| 7109 return new ListLiteral( | 6475 return new ListLiteral( |
| 7110 modifier, | 6476 modifier, typeArguments, leftBracket, elements, getAndAdvance()); |
| 7111 typeArguments, | |
| 7112 leftBracket, | |
| 7113 elements, | |
| 7114 getAndAdvance()); | |
| 7115 } | 6477 } |
| 7116 elements.add(parseExpression2()); | 6478 elements.add(parseExpression2()); |
| 7117 } | 6479 } |
| 7118 Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET); | 6480 Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET); |
| 7119 return new ListLiteral( | 6481 return new ListLiteral( |
| 7120 modifier, | 6482 modifier, typeArguments, leftBracket, elements, rightBracket); |
| 7121 typeArguments, | |
| 7122 leftBracket, | |
| 7123 elements, | |
| 7124 rightBracket); | |
| 7125 } finally { | 6483 } finally { |
| 7126 _inInitializer = wasInInitializer; | 6484 _inInitializer = wasInInitializer; |
| 7127 } | 6485 } |
| 7128 } | 6486 } |
| 7129 | 6487 |
| 7130 /** | 6488 /** |
| 7131 * Parse a list or map literal. | 6489 * Parse a list or map literal. |
| 7132 * | 6490 * |
| 7133 * <pre> | 6491 * <pre> |
| 7134 * listOrMapLiteral ::= | 6492 * listOrMapLiteral ::= |
| (...skipping 10 matching lines...) Expand all Loading... |
| 7145 if (_matches(TokenType.LT)) { | 6503 if (_matches(TokenType.LT)) { |
| 7146 typeArguments = parseTypeArgumentList(); | 6504 typeArguments = parseTypeArgumentList(); |
| 7147 } | 6505 } |
| 7148 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 6506 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 7149 return _parseMapLiteral(modifier, typeArguments); | 6507 return _parseMapLiteral(modifier, typeArguments); |
| 7150 } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) || | 6508 } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) || |
| 7151 _matches(TokenType.INDEX)) { | 6509 _matches(TokenType.INDEX)) { |
| 7152 return _parseListLiteral(modifier, typeArguments); | 6510 return _parseListLiteral(modifier, typeArguments); |
| 7153 } | 6511 } |
| 7154 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL); | 6512 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL); |
| 7155 return new ListLiteral( | 6513 return new ListLiteral(modifier, typeArguments, |
| 7156 modifier, | 6514 _createSyntheticToken(TokenType.OPEN_SQUARE_BRACKET), null, |
| 7157 typeArguments, | |
| 7158 _createSyntheticToken(TokenType.OPEN_SQUARE_BRACKET), | |
| 7159 null, | |
| 7160 _createSyntheticToken(TokenType.CLOSE_SQUARE_BRACKET)); | 6515 _createSyntheticToken(TokenType.CLOSE_SQUARE_BRACKET)); |
| 7161 } | 6516 } |
| 7162 | 6517 |
| 7163 /** | 6518 /** |
| 7164 * Parse a logical and expression. | 6519 * Parse a logical and expression. |
| 7165 * | 6520 * |
| 7166 * <pre> | 6521 * <pre> |
| 7167 * logicalAndExpression ::= | 6522 * logicalAndExpression ::= |
| 7168 * equalityExpression ('&&' equalityExpression)* | 6523 * equalityExpression ('&&' equalityExpression)* |
| 7169 * </pre> | 6524 * </pre> |
| 7170 * | 6525 * |
| 7171 * @return the logical and expression that was parsed | 6526 * @return the logical and expression that was parsed |
| 7172 */ | 6527 */ |
| 7173 Expression _parseLogicalAndExpression() { | 6528 Expression _parseLogicalAndExpression() { |
| 7174 Expression expression = _parseEqualityExpression(); | 6529 Expression expression = _parseEqualityExpression(); |
| 7175 while (_matches(TokenType.AMPERSAND_AMPERSAND)) { | 6530 while (_matches(TokenType.AMPERSAND_AMPERSAND)) { |
| 7176 Token operator = getAndAdvance(); | 6531 Token operator = getAndAdvance(); |
| 7177 expression = | 6532 expression = new BinaryExpression( |
| 7178 new BinaryExpression(expression, operator, _parseEqualityExpression())
; | 6533 expression, operator, _parseEqualityExpression()); |
| 7179 } | 6534 } |
| 7180 return expression; | 6535 return expression; |
| 7181 } | 6536 } |
| 7182 | 6537 |
| 7183 /** | 6538 /** |
| 7184 * Parse a map literal. | 6539 * Parse a map literal. |
| 7185 * | 6540 * |
| 7186 * <pre> | 6541 * <pre> |
| 7187 * mapLiteral ::= | 6542 * mapLiteral ::= |
| 7188 * 'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','
?)? '}' | 6543 * 'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','
?)? '}' |
| 7189 * </pre> | 6544 * </pre> |
| 7190 * | 6545 * |
| 7191 * @param modifier the 'const' modifier appearing before the literal, or `null
` if there is | 6546 * @param modifier the 'const' modifier appearing before the literal, or `null
` if there is |
| 7192 * no modifier | 6547 * no modifier |
| 7193 * @param typeArguments the type arguments that were declared, or `null` if th
ere are no | 6548 * @param typeArguments the type arguments that were declared, or `null` if th
ere are no |
| 7194 * type arguments | 6549 * type arguments |
| 7195 * @return the map literal that was parsed | 6550 * @return the map literal that was parsed |
| 7196 */ | 6551 */ |
| 7197 MapLiteral _parseMapLiteral(Token modifier, TypeArgumentList typeArguments) { | 6552 MapLiteral _parseMapLiteral(Token modifier, TypeArgumentList typeArguments) { |
| 7198 Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); | 6553 Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); |
| 7199 List<MapLiteralEntry> entries = new List<MapLiteralEntry>(); | 6554 List<MapLiteralEntry> entries = new List<MapLiteralEntry>(); |
| 7200 if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 6555 if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 7201 return new MapLiteral( | 6556 return new MapLiteral( |
| 7202 modifier, | 6557 modifier, typeArguments, leftBracket, entries, getAndAdvance()); |
| 7203 typeArguments, | |
| 7204 leftBracket, | |
| 7205 entries, | |
| 7206 getAndAdvance()); | |
| 7207 } | 6558 } |
| 7208 bool wasInInitializer = _inInitializer; | 6559 bool wasInInitializer = _inInitializer; |
| 7209 _inInitializer = false; | 6560 _inInitializer = false; |
| 7210 try { | 6561 try { |
| 7211 entries.add(parseMapLiteralEntry()); | 6562 entries.add(parseMapLiteralEntry()); |
| 7212 while (_optional(TokenType.COMMA)) { | 6563 while (_optional(TokenType.COMMA)) { |
| 7213 if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 6564 if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 7214 return new MapLiteral( | 6565 return new MapLiteral( |
| 7215 modifier, | 6566 modifier, typeArguments, leftBracket, entries, getAndAdvance()); |
| 7216 typeArguments, | |
| 7217 leftBracket, | |
| 7218 entries, | |
| 7219 getAndAdvance()); | |
| 7220 } | 6567 } |
| 7221 entries.add(parseMapLiteralEntry()); | 6568 entries.add(parseMapLiteralEntry()); |
| 7222 } | 6569 } |
| 7223 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 6570 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 7224 return new MapLiteral( | 6571 return new MapLiteral( |
| 7225 modifier, | 6572 modifier, typeArguments, leftBracket, entries, rightBracket); |
| 7226 typeArguments, | |
| 7227 leftBracket, | |
| 7228 entries, | |
| 7229 rightBracket); | |
| 7230 } finally { | 6573 } finally { |
| 7231 _inInitializer = wasInInitializer; | 6574 _inInitializer = wasInInitializer; |
| 7232 } | 6575 } |
| 7233 } | 6576 } |
| 7234 | 6577 |
| 7235 /** | 6578 /** |
| 7236 * Parse a method declaration. | 6579 * Parse a method declaration. |
| 7237 * | 6580 * |
| 7238 * <pre> | 6581 * <pre> |
| 7239 * functionDeclaration ::= | 6582 * functionDeclaration ::= |
| 7240 * ('external' 'static'?)? functionSignature functionBody | 6583 * ('external' 'static'?)? functionSignature functionBody |
| 7241 * | 'external'? functionSignature ';' | 6584 * | 'external'? functionSignature ';' |
| 7242 * </pre> | 6585 * </pre> |
| 7243 * | 6586 * |
| 7244 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the | 6587 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the |
| 7245 * declaration | 6588 * declaration |
| 7246 * @param externalKeyword the 'external' token | 6589 * @param externalKeyword the 'external' token |
| 7247 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic | 6590 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic |
| 7248 * @param returnType the return type of the method | 6591 * @param returnType the return type of the method |
| 7249 * @param name the name of the method | 6592 * @param name the name of the method |
| 7250 * @param parameters the parameters to the method | 6593 * @param parameters the parameters to the method |
| 7251 * @return the method declaration that was parsed | 6594 * @return the method declaration that was parsed |
| 7252 */ | 6595 */ |
| 7253 MethodDeclaration | 6596 MethodDeclaration _parseMethodDeclarationAfterParameters( |
| 7254 _parseMethodDeclarationAfterParameters(CommentAndMetadata commentAndMetada
ta, | 6597 CommentAndMetadata commentAndMetadata, Token externalKeyword, |
| 7255 Token externalKeyword, Token staticKeyword, TypeName returnType, | 6598 Token staticKeyword, TypeName returnType, SimpleIdentifier name, |
| 7256 SimpleIdentifier name, FormalParameterList parameters) { | 6599 FormalParameterList parameters) { |
| 7257 FunctionBody body = _parseFunctionBody( | 6600 FunctionBody body = _parseFunctionBody( |
| 7258 externalKeyword != null || staticKeyword == null, | 6601 externalKeyword != null || staticKeyword == null, |
| 7259 ParserErrorCode.MISSING_FUNCTION_BODY, | 6602 ParserErrorCode.MISSING_FUNCTION_BODY, false); |
| 7260 false); | |
| 7261 if (externalKeyword != null) { | 6603 if (externalKeyword != null) { |
| 7262 if (body is! EmptyFunctionBody) { | 6604 if (body is! EmptyFunctionBody) { |
| 7263 _reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body); | 6605 _reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body); |
| 7264 } | 6606 } |
| 7265 } else if (staticKeyword != null) { | 6607 } else if (staticKeyword != null) { |
| 7266 if (body is EmptyFunctionBody) { | 6608 if (body is EmptyFunctionBody) { |
| 7267 _reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body); | 6609 _reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body); |
| 7268 } | 6610 } |
| 7269 } | 6611 } |
| 7270 return new MethodDeclaration( | 6612 return new MethodDeclaration(commentAndMetadata.comment, |
| 7271 commentAndMetadata.comment, | 6613 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, |
| 7272 commentAndMetadata.metadata, | 6614 null, null, name, parameters, body); |
| 7273 externalKeyword, | |
| 7274 staticKeyword, | |
| 7275 returnType, | |
| 7276 null, | |
| 7277 null, | |
| 7278 name, | |
| 7279 parameters, | |
| 7280 body); | |
| 7281 } | 6615 } |
| 7282 | 6616 |
| 7283 /** | 6617 /** |
| 7284 * Parse a method declaration. | 6618 * Parse a method declaration. |
| 7285 * | 6619 * |
| 7286 * <pre> | 6620 * <pre> |
| 7287 * functionDeclaration ::= | 6621 * functionDeclaration ::= |
| 7288 * 'external'? 'static'? functionSignature functionBody | 6622 * 'external'? 'static'? functionSignature functionBody |
| 7289 * | 'external'? functionSignature ';' | 6623 * | 'external'? functionSignature ';' |
| 7290 * </pre> | 6624 * </pre> |
| 7291 * | 6625 * |
| 7292 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the | 6626 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the |
| 7293 * declaration | 6627 * declaration |
| 7294 * @param externalKeyword the 'external' token | 6628 * @param externalKeyword the 'external' token |
| 7295 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic | 6629 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic |
| 7296 * @param returnType the return type of the method | 6630 * @param returnType the return type of the method |
| 7297 * @return the method declaration that was parsed | 6631 * @return the method declaration that was parsed |
| 7298 */ | 6632 */ |
| 7299 MethodDeclaration | 6633 MethodDeclaration _parseMethodDeclarationAfterReturnType( |
| 7300 _parseMethodDeclarationAfterReturnType(CommentAndMetadata commentAndMetada
ta, | 6634 CommentAndMetadata commentAndMetadata, Token externalKeyword, |
| 7301 Token externalKeyword, Token staticKeyword, TypeName returnType) { | 6635 Token staticKeyword, TypeName returnType) { |
| 7302 SimpleIdentifier methodName = parseSimpleIdentifier(); | 6636 SimpleIdentifier methodName = parseSimpleIdentifier(); |
| 7303 FormalParameterList parameters; | 6637 FormalParameterList parameters; |
| 7304 if (!_matches(TokenType.OPEN_PAREN) && | 6638 if (!_matches(TokenType.OPEN_PAREN) && |
| 7305 (_matches(TokenType.OPEN_CURLY_BRACKET) || _matches(TokenType.FUNCTION))
) { | 6639 (_matches(TokenType.OPEN_CURLY_BRACKET) || |
| 6640 _matches(TokenType.FUNCTION))) { |
| 7306 _reportErrorForToken( | 6641 _reportErrorForToken( |
| 7307 ParserErrorCode.MISSING_METHOD_PARAMETERS, | 6642 ParserErrorCode.MISSING_METHOD_PARAMETERS, _currentToken.previous); |
| 7308 _currentToken.previous); | |
| 7309 parameters = new FormalParameterList( | 6643 parameters = new FormalParameterList( |
| 7310 _createSyntheticToken(TokenType.OPEN_PAREN), | 6644 _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, |
| 7311 null, | |
| 7312 null, | |
| 7313 null, | |
| 7314 _createSyntheticToken(TokenType.CLOSE_PAREN)); | 6645 _createSyntheticToken(TokenType.CLOSE_PAREN)); |
| 7315 } else { | 6646 } else { |
| 7316 parameters = parseFormalParameterList(); | 6647 parameters = parseFormalParameterList(); |
| 7317 } | 6648 } |
| 7318 _validateFormalParameterList(parameters); | 6649 _validateFormalParameterList(parameters); |
| 7319 return _parseMethodDeclarationAfterParameters( | 6650 return _parseMethodDeclarationAfterParameters(commentAndMetadata, |
| 7320 commentAndMetadata, | 6651 externalKeyword, staticKeyword, returnType, methodName, parameters); |
| 7321 externalKeyword, | |
| 7322 staticKeyword, | |
| 7323 returnType, | |
| 7324 methodName, | |
| 7325 parameters); | |
| 7326 } | 6652 } |
| 7327 | 6653 |
| 7328 /** | 6654 /** |
| 7329 * Parse the modifiers preceding a declaration. This method allows the modifie
rs to appear in any | 6655 * Parse the modifiers preceding a declaration. This method allows the modifie
rs to appear in any |
| 7330 * order but does generate errors for duplicated modifiers. Checks for other p
roblems, such as | 6656 * order but does generate errors for duplicated modifiers. Checks for other p
roblems, such as |
| 7331 * having the modifiers appear in the wrong order or specifying both 'const' a
nd 'final', are | 6657 * having the modifiers appear in the wrong order or specifying both 'const' a
nd 'final', are |
| 7332 * reported in one of the methods whose name is prefixed with `validateModifie
rsFor`. | 6658 * reported in one of the methods whose name is prefixed with `validateModifie
rsFor`. |
| 7333 * | 6659 * |
| 7334 * <pre> | 6660 * <pre> |
| 7335 * modifiers ::= | 6661 * modifiers ::= |
| 7336 * ('abstract' | 'const' | 'external' | 'factory' | 'final' | 'static' | '
var')* | 6662 * ('abstract' | 'const' | 'external' | 'factory' | 'final' | 'static' | '
var')* |
| 7337 * </pre> | 6663 * </pre> |
| 7338 * | 6664 * |
| 7339 * @return the modifiers that were parsed | 6665 * @return the modifiers that were parsed |
| 7340 */ | 6666 */ |
| 7341 Modifiers _parseModifiers() { | 6667 Modifiers _parseModifiers() { |
| 7342 Modifiers modifiers = new Modifiers(); | 6668 Modifiers modifiers = new Modifiers(); |
| 7343 bool progress = true; | 6669 bool progress = true; |
| 7344 while (progress) { | 6670 while (progress) { |
| 7345 if (_tokenMatches(_peek(), TokenType.PERIOD) || | 6671 if (_tokenMatches(_peek(), TokenType.PERIOD) || |
| 7346 _tokenMatches(_peek(), TokenType.LT) || | 6672 _tokenMatches(_peek(), TokenType.LT) || |
| 7347 _tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 6673 _tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 7348 return modifiers; | 6674 return modifiers; |
| 7349 } | 6675 } |
| 7350 if (_matchesKeyword(Keyword.ABSTRACT)) { | 6676 if (_matchesKeyword(Keyword.ABSTRACT)) { |
| 7351 if (modifiers.abstractKeyword != null) { | 6677 if (modifiers.abstractKeyword != null) { |
| 7352 _reportErrorForCurrentToken( | 6678 _reportErrorForCurrentToken( |
| 7353 ParserErrorCode.DUPLICATED_MODIFIER, | 6679 ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]); |
| 7354 [_currentToken.lexeme]); | |
| 7355 _advance(); | 6680 _advance(); |
| 7356 } else { | 6681 } else { |
| 7357 modifiers.abstractKeyword = getAndAdvance(); | 6682 modifiers.abstractKeyword = getAndAdvance(); |
| 7358 } | 6683 } |
| 7359 } else if (_matchesKeyword(Keyword.CONST)) { | 6684 } else if (_matchesKeyword(Keyword.CONST)) { |
| 7360 if (modifiers.constKeyword != null) { | 6685 if (modifiers.constKeyword != null) { |
| 7361 _reportErrorForCurrentToken( | 6686 _reportErrorForCurrentToken( |
| 7362 ParserErrorCode.DUPLICATED_MODIFIER, | 6687 ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]); |
| 7363 [_currentToken.lexeme]); | |
| 7364 _advance(); | 6688 _advance(); |
| 7365 } else { | 6689 } else { |
| 7366 modifiers.constKeyword = getAndAdvance(); | 6690 modifiers.constKeyword = getAndAdvance(); |
| 7367 } | 6691 } |
| 7368 } else if (_matchesKeyword(Keyword.EXTERNAL) && | 6692 } else if (_matchesKeyword(Keyword.EXTERNAL) && |
| 7369 !_tokenMatches(_peek(), TokenType.PERIOD) && | 6693 !_tokenMatches(_peek(), TokenType.PERIOD) && |
| 7370 !_tokenMatches(_peek(), TokenType.LT)) { | 6694 !_tokenMatches(_peek(), TokenType.LT)) { |
| 7371 if (modifiers.externalKeyword != null) { | 6695 if (modifiers.externalKeyword != null) { |
| 7372 _reportErrorForCurrentToken( | 6696 _reportErrorForCurrentToken( |
| 7373 ParserErrorCode.DUPLICATED_MODIFIER, | 6697 ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]); |
| 7374 [_currentToken.lexeme]); | |
| 7375 _advance(); | 6698 _advance(); |
| 7376 } else { | 6699 } else { |
| 7377 modifiers.externalKeyword = getAndAdvance(); | 6700 modifiers.externalKeyword = getAndAdvance(); |
| 7378 } | 6701 } |
| 7379 } else if (_matchesKeyword(Keyword.FACTORY) && | 6702 } else if (_matchesKeyword(Keyword.FACTORY) && |
| 7380 !_tokenMatches(_peek(), TokenType.PERIOD) && | 6703 !_tokenMatches(_peek(), TokenType.PERIOD) && |
| 7381 !_tokenMatches(_peek(), TokenType.LT)) { | 6704 !_tokenMatches(_peek(), TokenType.LT)) { |
| 7382 if (modifiers.factoryKeyword != null) { | 6705 if (modifiers.factoryKeyword != null) { |
| 7383 _reportErrorForCurrentToken( | 6706 _reportErrorForCurrentToken( |
| 7384 ParserErrorCode.DUPLICATED_MODIFIER, | 6707 ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]); |
| 7385 [_currentToken.lexeme]); | |
| 7386 _advance(); | 6708 _advance(); |
| 7387 } else { | 6709 } else { |
| 7388 modifiers.factoryKeyword = getAndAdvance(); | 6710 modifiers.factoryKeyword = getAndAdvance(); |
| 7389 } | 6711 } |
| 7390 } else if (_matchesKeyword(Keyword.FINAL)) { | 6712 } else if (_matchesKeyword(Keyword.FINAL)) { |
| 7391 if (modifiers.finalKeyword != null) { | 6713 if (modifiers.finalKeyword != null) { |
| 7392 _reportErrorForCurrentToken( | 6714 _reportErrorForCurrentToken( |
| 7393 ParserErrorCode.DUPLICATED_MODIFIER, | 6715 ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]); |
| 7394 [_currentToken.lexeme]); | |
| 7395 _advance(); | 6716 _advance(); |
| 7396 } else { | 6717 } else { |
| 7397 modifiers.finalKeyword = getAndAdvance(); | 6718 modifiers.finalKeyword = getAndAdvance(); |
| 7398 } | 6719 } |
| 7399 } else if (_matchesKeyword(Keyword.STATIC) && | 6720 } else if (_matchesKeyword(Keyword.STATIC) && |
| 7400 !_tokenMatches(_peek(), TokenType.PERIOD) && | 6721 !_tokenMatches(_peek(), TokenType.PERIOD) && |
| 7401 !_tokenMatches(_peek(), TokenType.LT)) { | 6722 !_tokenMatches(_peek(), TokenType.LT)) { |
| 7402 if (modifiers.staticKeyword != null) { | 6723 if (modifiers.staticKeyword != null) { |
| 7403 _reportErrorForCurrentToken( | 6724 _reportErrorForCurrentToken( |
| 7404 ParserErrorCode.DUPLICATED_MODIFIER, | 6725 ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]); |
| 7405 [_currentToken.lexeme]); | |
| 7406 _advance(); | 6726 _advance(); |
| 7407 } else { | 6727 } else { |
| 7408 modifiers.staticKeyword = getAndAdvance(); | 6728 modifiers.staticKeyword = getAndAdvance(); |
| 7409 } | 6729 } |
| 7410 } else if (_matchesKeyword(Keyword.VAR)) { | 6730 } else if (_matchesKeyword(Keyword.VAR)) { |
| 7411 if (modifiers.varKeyword != null) { | 6731 if (modifiers.varKeyword != null) { |
| 7412 _reportErrorForCurrentToken( | 6732 _reportErrorForCurrentToken( |
| 7413 ParserErrorCode.DUPLICATED_MODIFIER, | 6733 ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]); |
| 7414 [_currentToken.lexeme]); | |
| 7415 _advance(); | 6734 _advance(); |
| 7416 } else { | 6735 } else { |
| 7417 modifiers.varKeyword = getAndAdvance(); | 6736 modifiers.varKeyword = getAndAdvance(); |
| 7418 } | 6737 } |
| 7419 } else { | 6738 } else { |
| 7420 progress = false; | 6739 progress = false; |
| 7421 } | 6740 } |
| 7422 } | 6741 } |
| 7423 return modifiers; | 6742 return modifiers; |
| 7424 } | 6743 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7503 * @return the non-labeled statement that was parsed | 6822 * @return the non-labeled statement that was parsed |
| 7504 */ | 6823 */ |
| 7505 Statement _parseNonLabeledStatement() { | 6824 Statement _parseNonLabeledStatement() { |
| 7506 // TODO(brianwilkerson) Pass the comment and metadata on where appropriate. | 6825 // TODO(brianwilkerson) Pass the comment and metadata on where appropriate. |
| 7507 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 6826 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 7508 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 6827 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 7509 if (_tokenMatches(_peek(), TokenType.STRING)) { | 6828 if (_tokenMatches(_peek(), TokenType.STRING)) { |
| 7510 Token afterString = _skipStringLiteral(_currentToken.next); | 6829 Token afterString = _skipStringLiteral(_currentToken.next); |
| 7511 if (afterString != null && afterString.type == TokenType.COLON) { | 6830 if (afterString != null && afterString.type == TokenType.COLON) { |
| 7512 return new ExpressionStatement( | 6831 return new ExpressionStatement( |
| 7513 parseExpression2(), | 6832 parseExpression2(), _expect(TokenType.SEMICOLON)); |
| 7514 _expect(TokenType.SEMICOLON)); | |
| 7515 } | 6833 } |
| 7516 } | 6834 } |
| 7517 return parseBlock(); | 6835 return parseBlock(); |
| 7518 } else if (_matches(TokenType.KEYWORD) && | 6836 } else if (_matches(TokenType.KEYWORD) && |
| 7519 !(_currentToken as KeywordToken).keyword.isPseudoKeyword) { | 6837 !(_currentToken as KeywordToken).keyword.isPseudoKeyword) { |
| 7520 Keyword keyword = (_currentToken as KeywordToken).keyword; | 6838 Keyword keyword = (_currentToken as KeywordToken).keyword; |
| 7521 // TODO(jwren) compute some metrics to figure out a better order for this | 6839 // TODO(jwren) compute some metrics to figure out a better order for this |
| 7522 // if-then sequence to optimize performance | 6840 // if-then sequence to optimize performance |
| 7523 if (keyword == Keyword.ASSERT) { | 6841 if (keyword == Keyword.ASSERT) { |
| 7524 return _parseAssertStatement(); | 6842 return _parseAssertStatement(); |
| 7525 } else if (keyword == Keyword.BREAK) { | 6843 } else if (keyword == Keyword.BREAK) { |
| 7526 return _parseBreakStatement(); | 6844 return _parseBreakStatement(); |
| 7527 } else if (keyword == Keyword.CONTINUE) { | 6845 } else if (keyword == Keyword.CONTINUE) { |
| 7528 return _parseContinueStatement(); | 6846 return _parseContinueStatement(); |
| 7529 } else if (keyword == Keyword.DO) { | 6847 } else if (keyword == Keyword.DO) { |
| 7530 return _parseDoStatement(); | 6848 return _parseDoStatement(); |
| 7531 } else if (keyword == Keyword.FOR) { | 6849 } else if (keyword == Keyword.FOR) { |
| 7532 return _parseForStatement(); | 6850 return _parseForStatement(); |
| 7533 } else if (keyword == Keyword.IF) { | 6851 } else if (keyword == Keyword.IF) { |
| 7534 return _parseIfStatement(); | 6852 return _parseIfStatement(); |
| 7535 } else if (keyword == Keyword.RETHROW) { | 6853 } else if (keyword == Keyword.RETHROW) { |
| 7536 return new ExpressionStatement( | 6854 return new ExpressionStatement( |
| 7537 _parseRethrowExpression(), | 6855 _parseRethrowExpression(), _expect(TokenType.SEMICOLON)); |
| 7538 _expect(TokenType.SEMICOLON)); | |
| 7539 } else if (keyword == Keyword.RETURN) { | 6856 } else if (keyword == Keyword.RETURN) { |
| 7540 return _parseReturnStatement(); | 6857 return _parseReturnStatement(); |
| 7541 } else if (keyword == Keyword.SWITCH) { | 6858 } else if (keyword == Keyword.SWITCH) { |
| 7542 return _parseSwitchStatement(); | 6859 return _parseSwitchStatement(); |
| 7543 } else if (keyword == Keyword.THROW) { | 6860 } else if (keyword == Keyword.THROW) { |
| 7544 return new ExpressionStatement( | 6861 return new ExpressionStatement( |
| 7545 _parseThrowExpression(), | 6862 _parseThrowExpression(), _expect(TokenType.SEMICOLON)); |
| 7546 _expect(TokenType.SEMICOLON)); | |
| 7547 } else if (keyword == Keyword.TRY) { | 6863 } else if (keyword == Keyword.TRY) { |
| 7548 return _parseTryStatement(); | 6864 return _parseTryStatement(); |
| 7549 } else if (keyword == Keyword.WHILE) { | 6865 } else if (keyword == Keyword.WHILE) { |
| 7550 return _parseWhileStatement(); | 6866 return _parseWhileStatement(); |
| 7551 } else if (keyword == Keyword.VAR || keyword == Keyword.FINAL) { | 6867 } else if (keyword == Keyword.VAR || keyword == Keyword.FINAL) { |
| 7552 return _parseVariableDeclarationStatementAfterMetadata( | 6868 return _parseVariableDeclarationStatementAfterMetadata( |
| 7553 commentAndMetadata); | 6869 commentAndMetadata); |
| 7554 } else if (keyword == Keyword.VOID) { | 6870 } else if (keyword == Keyword.VOID) { |
| 7555 TypeName returnType = parseReturnType(); | 6871 TypeName returnType = parseReturnType(); |
| 7556 if (_matchesIdentifier() && | 6872 if (_matchesIdentifier() && |
| 7557 _peek().matchesAny( | 6873 _peek().matchesAny([ |
| 7558 [TokenType.OPEN_PAREN, TokenType.OPEN_CURLY_BRACKET, TokenType.F
UNCTION])) { | 6874 TokenType.OPEN_PAREN, |
| 6875 TokenType.OPEN_CURLY_BRACKET, |
| 6876 TokenType.FUNCTION |
| 6877 ])) { |
| 7559 return _parseFunctionDeclarationStatementAfterReturnType( | 6878 return _parseFunctionDeclarationStatementAfterReturnType( |
| 7560 commentAndMetadata, | 6879 commentAndMetadata, returnType); |
| 7561 returnType); | |
| 7562 } else { | 6880 } else { |
| 7563 // | 6881 // |
| 7564 // We have found an error of some kind. Try to recover. | 6882 // We have found an error of some kind. Try to recover. |
| 7565 // | 6883 // |
| 7566 if (_matchesIdentifier()) { | 6884 if (_matchesIdentifier()) { |
| 7567 if (_peek().matchesAny( | 6885 if (_peek().matchesAny( |
| 7568 [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { | 6886 [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { |
| 7569 // | 6887 // |
| 7570 // We appear to have a variable declaration with a type of "void". | 6888 // We appear to have a variable declaration with a type of "void". |
| 7571 // | 6889 // |
| 7572 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); | 6890 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); |
| 7573 return _parseVariableDeclarationStatementAfterMetadata( | 6891 return _parseVariableDeclarationStatementAfterMetadata( |
| 7574 commentAndMetadata); | 6892 commentAndMetadata); |
| 7575 } | 6893 } |
| 7576 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 6894 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 7577 // | 6895 // |
| 7578 // We appear to have found an incomplete statement at the end of a | 6896 // We appear to have found an incomplete statement at the end of a |
| 7579 // block. Parse it as a variable declaration. | 6897 // block. Parse it as a variable declaration. |
| 7580 // | 6898 // |
| 7581 return _parseVariableDeclarationStatementAfterType( | 6899 return _parseVariableDeclarationStatementAfterType( |
| 7582 commentAndMetadata, | 6900 commentAndMetadata, null, returnType); |
| 7583 null, | |
| 7584 returnType); | |
| 7585 } | 6901 } |
| 7586 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); | 6902 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); |
| 7587 // TODO(brianwilkerson) Recover from this error. | 6903 // TODO(brianwilkerson) Recover from this error. |
| 7588 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); | 6904 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); |
| 7589 } | 6905 } |
| 7590 } else if (keyword == Keyword.CONST) { | 6906 } else if (keyword == Keyword.CONST) { |
| 7591 if (_peek().matchesAny( | 6907 if (_peek().matchesAny([ |
| 7592 [ | 6908 TokenType.LT, |
| 7593 TokenType.LT, | 6909 TokenType.OPEN_CURLY_BRACKET, |
| 7594 TokenType.OPEN_CURLY_BRACKET, | 6910 TokenType.OPEN_SQUARE_BRACKET, |
| 7595 TokenType.OPEN_SQUARE_BRACKET, | 6911 TokenType.INDEX |
| 7596 TokenType.INDEX])) { | 6912 ])) { |
| 7597 return new ExpressionStatement( | 6913 return new ExpressionStatement( |
| 7598 parseExpression2(), | 6914 parseExpression2(), _expect(TokenType.SEMICOLON)); |
| 7599 _expect(TokenType.SEMICOLON)); | |
| 7600 } else if (_tokenMatches(_peek(), TokenType.IDENTIFIER)) { | 6915 } else if (_tokenMatches(_peek(), TokenType.IDENTIFIER)) { |
| 7601 Token afterType = _skipTypeName(_peek()); | 6916 Token afterType = _skipTypeName(_peek()); |
| 7602 if (afterType != null) { | 6917 if (afterType != null) { |
| 7603 if (_tokenMatches(afterType, TokenType.OPEN_PAREN) || | 6918 if (_tokenMatches(afterType, TokenType.OPEN_PAREN) || |
| 7604 (_tokenMatches(afterType, TokenType.PERIOD) && | 6919 (_tokenMatches(afterType, TokenType.PERIOD) && |
| 7605 _tokenMatches(afterType.next, TokenType.IDENTIFIER) && | 6920 _tokenMatches(afterType.next, TokenType.IDENTIFIER) && |
| 7606 _tokenMatches(afterType.next.next, TokenType.OPEN_PAREN))) { | 6921 _tokenMatches(afterType.next.next, TokenType.OPEN_PAREN))) { |
| 7607 return new ExpressionStatement( | 6922 return new ExpressionStatement( |
| 7608 parseExpression2(), | 6923 parseExpression2(), _expect(TokenType.SEMICOLON)); |
| 7609 _expect(TokenType.SEMICOLON)); | |
| 7610 } | 6924 } |
| 7611 } | 6925 } |
| 7612 } | 6926 } |
| 7613 return _parseVariableDeclarationStatementAfterMetadata( | 6927 return _parseVariableDeclarationStatementAfterMetadata( |
| 7614 commentAndMetadata); | 6928 commentAndMetadata); |
| 7615 } else if (keyword == Keyword.NEW || | 6929 } else if (keyword == Keyword.NEW || |
| 7616 keyword == Keyword.TRUE || | 6930 keyword == Keyword.TRUE || |
| 7617 keyword == Keyword.FALSE || | 6931 keyword == Keyword.FALSE || |
| 7618 keyword == Keyword.NULL || | 6932 keyword == Keyword.NULL || |
| 7619 keyword == Keyword.SUPER || | 6933 keyword == Keyword.SUPER || |
| 7620 keyword == Keyword.THIS) { | 6934 keyword == Keyword.THIS) { |
| 7621 return new ExpressionStatement( | 6935 return new ExpressionStatement( |
| 7622 parseExpression2(), | 6936 parseExpression2(), _expect(TokenType.SEMICOLON)); |
| 7623 _expect(TokenType.SEMICOLON)); | |
| 7624 } else { | 6937 } else { |
| 7625 // | 6938 // |
| 7626 // We have found an error of some kind. Try to recover. | 6939 // We have found an error of some kind. Try to recover. |
| 7627 // | 6940 // |
| 7628 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); | 6941 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); |
| 7629 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); | 6942 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); |
| 7630 } | 6943 } |
| 7631 } else if (_inGenerator && _matchesString(_YIELD)) { | 6944 } else if (_inGenerator && _matchesString(_YIELD)) { |
| 7632 return _parseYieldStatement(); | 6945 return _parseYieldStatement(); |
| 7633 } else if (_inAsync && _matchesString(_AWAIT)) { | 6946 } else if (_inAsync && _matchesString(_AWAIT)) { |
| 7634 if (_tokenMatchesKeyword(_peek(), Keyword.FOR)) { | 6947 if (_tokenMatchesKeyword(_peek(), Keyword.FOR)) { |
| 7635 return _parseForStatement(); | 6948 return _parseForStatement(); |
| 7636 } | 6949 } |
| 7637 return new ExpressionStatement( | 6950 return new ExpressionStatement( |
| 7638 parseExpression2(), | 6951 parseExpression2(), _expect(TokenType.SEMICOLON)); |
| 7639 _expect(TokenType.SEMICOLON)); | |
| 7640 } else if (_matchesString(_AWAIT) && | 6952 } else if (_matchesString(_AWAIT) && |
| 7641 _tokenMatchesKeyword(_peek(), Keyword.FOR)) { | 6953 _tokenMatchesKeyword(_peek(), Keyword.FOR)) { |
| 7642 Token awaitToken = _currentToken; | 6954 Token awaitToken = _currentToken; |
| 7643 Statement statement = _parseForStatement(); | 6955 Statement statement = _parseForStatement(); |
| 7644 if (statement is! ForStatement) { | 6956 if (statement is! ForStatement) { |
| 7645 _reportErrorForToken( | 6957 _reportErrorForToken( |
| 7646 CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT, | 6958 CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT, awaitToken); |
| 7647 awaitToken); | |
| 7648 } | 6959 } |
| 7649 return statement; | 6960 return statement; |
| 7650 } else if (_matches(TokenType.SEMICOLON)) { | 6961 } else if (_matches(TokenType.SEMICOLON)) { |
| 7651 return _parseEmptyStatement(); | 6962 return _parseEmptyStatement(); |
| 7652 } else if (_isInitializedVariableDeclaration()) { | 6963 } else if (_isInitializedVariableDeclaration()) { |
| 7653 return _parseVariableDeclarationStatementAfterMetadata( | 6964 return _parseVariableDeclarationStatementAfterMetadata( |
| 7654 commentAndMetadata); | 6965 commentAndMetadata); |
| 7655 } else if (_isFunctionDeclaration()) { | 6966 } else if (_isFunctionDeclaration()) { |
| 7656 return _parseFunctionDeclarationStatement(); | 6967 return _parseFunctionDeclarationStatement(); |
| 7657 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 6968 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 7658 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); | 6969 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); |
| 7659 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); | 6970 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); |
| 7660 } else { | 6971 } else { |
| 7661 return new ExpressionStatement( | 6972 return new ExpressionStatement( |
| 7662 parseExpression2(), | 6973 parseExpression2(), _expect(TokenType.SEMICOLON)); |
| 7663 _expect(TokenType.SEMICOLON)); | |
| 7664 } | 6974 } |
| 7665 } | 6975 } |
| 7666 | 6976 |
| 7667 /** | 6977 /** |
| 7668 * Parse an operator declaration. | 6978 * Parse an operator declaration. |
| 7669 * | 6979 * |
| 7670 * <pre> | 6980 * <pre> |
| 7671 * operatorDeclaration ::= | 6981 * operatorDeclaration ::= |
| 7672 * operatorSignature (';' | functionBody) | 6982 * operatorSignature (';' | functionBody) |
| 7673 * | 6983 * |
| 7674 * operatorSignature ::= | 6984 * operatorSignature ::= |
| 7675 * 'external'? returnType? 'operator' operator formalParameterList | 6985 * 'external'? returnType? 'operator' operator formalParameterList |
| 7676 * </pre> | 6986 * </pre> |
| 7677 * | 6987 * |
| 7678 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the | 6988 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the |
| 7679 * declaration | 6989 * declaration |
| 7680 * @param externalKeyword the 'external' token | 6990 * @param externalKeyword the 'external' token |
| 7681 * @param the return type that has already been parsed, or `null` if there was
no return | 6991 * @param the return type that has already been parsed, or `null` if there was
no return |
| 7682 * type | 6992 * type |
| 7683 * @return the operator declaration that was parsed | 6993 * @return the operator declaration that was parsed |
| 7684 */ | 6994 */ |
| 7685 MethodDeclaration _parseOperator(CommentAndMetadata commentAndMetadata, | 6995 MethodDeclaration _parseOperator(CommentAndMetadata commentAndMetadata, |
| 7686 Token externalKeyword, TypeName returnType) { | 6996 Token externalKeyword, TypeName returnType) { |
| 7687 Token operatorKeyword; | 6997 Token operatorKeyword; |
| 7688 if (_matchesKeyword(Keyword.OPERATOR)) { | 6998 if (_matchesKeyword(Keyword.OPERATOR)) { |
| 7689 operatorKeyword = getAndAdvance(); | 6999 operatorKeyword = getAndAdvance(); |
| 7690 } else { | 7000 } else { |
| 7691 _reportErrorForToken( | 7001 _reportErrorForToken( |
| 7692 ParserErrorCode.MISSING_KEYWORD_OPERATOR, | 7002 ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken); |
| 7693 _currentToken); | |
| 7694 operatorKeyword = _createSyntheticKeyword(Keyword.OPERATOR); | 7003 operatorKeyword = _createSyntheticKeyword(Keyword.OPERATOR); |
| 7695 } | 7004 } |
| 7696 if (!_currentToken.isUserDefinableOperator) { | 7005 if (!_currentToken.isUserDefinableOperator) { |
| 7697 _reportErrorForCurrentToken( | 7006 _reportErrorForCurrentToken( |
| 7698 ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, | 7007 ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]); |
| 7699 [_currentToken.lexeme]); | |
| 7700 } | 7008 } |
| 7701 SimpleIdentifier name = new SimpleIdentifier(getAndAdvance()); | 7009 SimpleIdentifier name = new SimpleIdentifier(getAndAdvance()); |
| 7702 if (_matches(TokenType.EQ)) { | 7010 if (_matches(TokenType.EQ)) { |
| 7703 Token previous = _currentToken.previous; | 7011 Token previous = _currentToken.previous; |
| 7704 if ((_tokenMatches(previous, TokenType.EQ_EQ) || | 7012 if ((_tokenMatches(previous, TokenType.EQ_EQ) || |
| 7705 _tokenMatches(previous, TokenType.BANG_EQ)) && | 7013 _tokenMatches(previous, TokenType.BANG_EQ)) && |
| 7706 _currentToken.offset == previous.offset + 2) { | 7014 _currentToken.offset == previous.offset + 2) { |
| 7707 _reportErrorForCurrentToken( | 7015 _reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR, [ |
| 7708 ParserErrorCode.INVALID_OPERATOR, | 7016 "${previous.lexeme}${_currentToken.lexeme}" |
| 7709 ["${previous.lexeme}${_currentToken.lexeme}"]); | 7017 ]); |
| 7710 _advance(); | 7018 _advance(); |
| 7711 } | 7019 } |
| 7712 } | 7020 } |
| 7713 FormalParameterList parameters = parseFormalParameterList(); | 7021 FormalParameterList parameters = parseFormalParameterList(); |
| 7714 _validateFormalParameterList(parameters); | 7022 _validateFormalParameterList(parameters); |
| 7715 FunctionBody body = | 7023 FunctionBody body = |
| 7716 _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false); | 7024 _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false); |
| 7717 if (externalKeyword != null && body is! EmptyFunctionBody) { | 7025 if (externalKeyword != null && body is! EmptyFunctionBody) { |
| 7718 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY); | 7026 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY); |
| 7719 } | 7027 } |
| 7720 return new MethodDeclaration( | 7028 return new MethodDeclaration(commentAndMetadata.comment, |
| 7721 commentAndMetadata.comment, | 7029 commentAndMetadata.metadata, externalKeyword, null, returnType, null, |
| 7722 commentAndMetadata.metadata, | 7030 operatorKeyword, name, parameters, body); |
| 7723 externalKeyword, | |
| 7724 null, | |
| 7725 returnType, | |
| 7726 null, | |
| 7727 operatorKeyword, | |
| 7728 name, | |
| 7729 parameters, | |
| 7730 body); | |
| 7731 } | 7031 } |
| 7732 | 7032 |
| 7733 /** | 7033 /** |
| 7734 * Parse a return type if one is given, otherwise return `null` without advanc
ing. | 7034 * Parse a return type if one is given, otherwise return `null` without advanc
ing. |
| 7735 * | 7035 * |
| 7736 * @return the return type that was parsed | 7036 * @return the return type that was parsed |
| 7737 */ | 7037 */ |
| 7738 TypeName _parseOptionalReturnType() { | 7038 TypeName _parseOptionalReturnType() { |
| 7739 if (_matchesKeyword(Keyword.VOID)) { | 7039 if (_matchesKeyword(Keyword.VOID)) { |
| 7740 return parseReturnType(); | 7040 return parseReturnType(); |
| 7741 } else if (_matchesIdentifier() && | 7041 } else if (_matchesIdentifier() && |
| 7742 !_matchesKeyword(Keyword.GET) && | 7042 !_matchesKeyword(Keyword.GET) && |
| 7743 !_matchesKeyword(Keyword.SET) && | 7043 !_matchesKeyword(Keyword.SET) && |
| 7744 !_matchesKeyword(Keyword.OPERATOR) && | 7044 !_matchesKeyword(Keyword.OPERATOR) && |
| 7745 (_tokenMatchesIdentifier(_peek()) || _tokenMatches(_peek(), TokenType.LT
))) { | 7045 (_tokenMatchesIdentifier(_peek()) || |
| 7046 _tokenMatches(_peek(), TokenType.LT))) { |
| 7746 return parseReturnType(); | 7047 return parseReturnType(); |
| 7747 } else if (_matchesIdentifier() && | 7048 } else if (_matchesIdentifier() && |
| 7748 _tokenMatches(_peek(), TokenType.PERIOD) && | 7049 _tokenMatches(_peek(), TokenType.PERIOD) && |
| 7749 _tokenMatchesIdentifier(_peekAt(2)) && | 7050 _tokenMatchesIdentifier(_peekAt(2)) && |
| 7750 (_tokenMatchesIdentifier(_peekAt(3)) || | 7051 (_tokenMatchesIdentifier(_peekAt(3)) || |
| 7751 _tokenMatches(_peekAt(3), TokenType.LT))) { | 7052 _tokenMatches(_peekAt(3), TokenType.LT))) { |
| 7752 return parseReturnType(); | 7053 return parseReturnType(); |
| 7753 } | 7054 } |
| 7754 return null; | 7055 return null; |
| 7755 } | 7056 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 7766 * </pre> | 7067 * </pre> |
| 7767 * | 7068 * |
| 7768 * @param commentAndMetadata the metadata to be associated with the directive | 7069 * @param commentAndMetadata the metadata to be associated with the directive |
| 7769 * @return the part or part-of directive that was parsed | 7070 * @return the part or part-of directive that was parsed |
| 7770 */ | 7071 */ |
| 7771 Directive _parsePartDirective(CommentAndMetadata commentAndMetadata) { | 7072 Directive _parsePartDirective(CommentAndMetadata commentAndMetadata) { |
| 7772 Token partKeyword = _expectKeyword(Keyword.PART); | 7073 Token partKeyword = _expectKeyword(Keyword.PART); |
| 7773 if (_matchesString(_OF)) { | 7074 if (_matchesString(_OF)) { |
| 7774 Token ofKeyword = getAndAdvance(); | 7075 Token ofKeyword = getAndAdvance(); |
| 7775 LibraryIdentifier libraryName = _parseLibraryName( | 7076 LibraryIdentifier libraryName = _parseLibraryName( |
| 7776 ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE, | 7077 ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE, ofKeyword); |
| 7777 ofKeyword); | |
| 7778 Token semicolon = _expect(TokenType.SEMICOLON); | 7078 Token semicolon = _expect(TokenType.SEMICOLON); |
| 7779 return new PartOfDirective( | 7079 return new PartOfDirective(commentAndMetadata.comment, |
| 7780 commentAndMetadata.comment, | 7080 commentAndMetadata.metadata, partKeyword, ofKeyword, libraryName, |
| 7781 commentAndMetadata.metadata, | |
| 7782 partKeyword, | |
| 7783 ofKeyword, | |
| 7784 libraryName, | |
| 7785 semicolon); | 7081 semicolon); |
| 7786 } | 7082 } |
| 7787 StringLiteral partUri = _parseUri(); | 7083 StringLiteral partUri = _parseUri(); |
| 7788 Token semicolon = _expect(TokenType.SEMICOLON); | 7084 Token semicolon = _expect(TokenType.SEMICOLON); |
| 7789 return new PartDirective( | 7085 return new PartDirective(commentAndMetadata.comment, |
| 7790 commentAndMetadata.comment, | 7086 commentAndMetadata.metadata, partKeyword, partUri, semicolon); |
| 7791 commentAndMetadata.metadata, | |
| 7792 partKeyword, | |
| 7793 partUri, | |
| 7794 semicolon); | |
| 7795 } | 7087 } |
| 7796 | 7088 |
| 7797 /** | 7089 /** |
| 7798 * Parse a postfix expression. | 7090 * Parse a postfix expression. |
| 7799 * | 7091 * |
| 7800 * <pre> | 7092 * <pre> |
| 7801 * postfixExpression ::= | 7093 * postfixExpression ::= |
| 7802 * assignableExpression postfixOperator | 7094 * assignableExpression postfixOperator |
| 7803 * | primary selector* | 7095 * | primary selector* |
| 7804 * | 7096 * |
| 7805 * selector ::= | 7097 * selector ::= |
| 7806 * assignableSelector | 7098 * assignableSelector |
| 7807 * | argumentList | 7099 * | argumentList |
| 7808 * </pre> | 7100 * </pre> |
| 7809 * | 7101 * |
| 7810 * @return the postfix expression that was parsed | 7102 * @return the postfix expression that was parsed |
| 7811 */ | 7103 */ |
| 7812 Expression _parsePostfixExpression() { | 7104 Expression _parsePostfixExpression() { |
| 7813 Expression operand = _parseAssignableExpression(true); | 7105 Expression operand = _parseAssignableExpression(true); |
| 7814 if (_matches(TokenType.OPEN_SQUARE_BRACKET) || | 7106 if (_matches(TokenType.OPEN_SQUARE_BRACKET) || |
| 7815 _matches(TokenType.PERIOD) || | 7107 _matches(TokenType.PERIOD) || |
| 7816 _matches(TokenType.OPEN_PAREN)) { | 7108 _matches(TokenType.OPEN_PAREN)) { |
| 7817 do { | 7109 do { |
| 7818 if (_matches(TokenType.OPEN_PAREN)) { | 7110 if (_matches(TokenType.OPEN_PAREN)) { |
| 7819 ArgumentList argumentList = parseArgumentList(); | 7111 ArgumentList argumentList = parseArgumentList(); |
| 7820 if (operand is PropertyAccess) { | 7112 if (operand is PropertyAccess) { |
| 7821 PropertyAccess access = operand as PropertyAccess; | 7113 PropertyAccess access = operand as PropertyAccess; |
| 7822 operand = new MethodInvocation( | 7114 operand = new MethodInvocation(access.target, access.operator, |
| 7823 access.target, | 7115 access.propertyName, argumentList); |
| 7824 access.operator, | |
| 7825 access.propertyName, | |
| 7826 argumentList); | |
| 7827 } else { | 7116 } else { |
| 7828 operand = new FunctionExpressionInvocation(operand, argumentList); | 7117 operand = new FunctionExpressionInvocation(operand, argumentList); |
| 7829 } | 7118 } |
| 7830 } else { | 7119 } else { |
| 7831 operand = _parseAssignableSelector(operand, true); | 7120 operand = _parseAssignableSelector(operand, true); |
| 7832 } | 7121 } |
| 7833 } while (_matches(TokenType.OPEN_SQUARE_BRACKET) || | 7122 } while (_matches(TokenType.OPEN_SQUARE_BRACKET) || |
| 7834 _matches(TokenType.PERIOD) || | 7123 _matches(TokenType.PERIOD) || |
| 7835 _matches(TokenType.OPEN_PAREN)); | 7124 _matches(TokenType.OPEN_PAREN)); |
| 7836 return operand; | 7125 return operand; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7868 * | listLiteral | 7157 * | listLiteral |
| 7869 * </pre> | 7158 * </pre> |
| 7870 * | 7159 * |
| 7871 * @return the primary expression that was parsed | 7160 * @return the primary expression that was parsed |
| 7872 */ | 7161 */ |
| 7873 Expression _parsePrimaryExpression() { | 7162 Expression _parsePrimaryExpression() { |
| 7874 if (_matchesKeyword(Keyword.THIS)) { | 7163 if (_matchesKeyword(Keyword.THIS)) { |
| 7875 return new ThisExpression(getAndAdvance()); | 7164 return new ThisExpression(getAndAdvance()); |
| 7876 } else if (_matchesKeyword(Keyword.SUPER)) { | 7165 } else if (_matchesKeyword(Keyword.SUPER)) { |
| 7877 return _parseAssignableSelector( | 7166 return _parseAssignableSelector( |
| 7878 new SuperExpression(getAndAdvance()), | 7167 new SuperExpression(getAndAdvance()), false); |
| 7879 false); | |
| 7880 } else if (_matchesKeyword(Keyword.NULL)) { | 7168 } else if (_matchesKeyword(Keyword.NULL)) { |
| 7881 return new NullLiteral(getAndAdvance()); | 7169 return new NullLiteral(getAndAdvance()); |
| 7882 } else if (_matchesKeyword(Keyword.FALSE)) { | 7170 } else if (_matchesKeyword(Keyword.FALSE)) { |
| 7883 return new BooleanLiteral(getAndAdvance(), false); | 7171 return new BooleanLiteral(getAndAdvance(), false); |
| 7884 } else if (_matchesKeyword(Keyword.TRUE)) { | 7172 } else if (_matchesKeyword(Keyword.TRUE)) { |
| 7885 return new BooleanLiteral(getAndAdvance(), true); | 7173 return new BooleanLiteral(getAndAdvance(), true); |
| 7886 } else if (_matches(TokenType.DOUBLE)) { | 7174 } else if (_matches(TokenType.DOUBLE)) { |
| 7887 Token token = getAndAdvance(); | 7175 Token token = getAndAdvance(); |
| 7888 double value = 0.0; | 7176 double value = 0.0; |
| 7889 try { | 7177 try { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7938 if (_isFunctionExpression(_currentToken)) { | 7226 if (_isFunctionExpression(_currentToken)) { |
| 7939 return parseFunctionExpression(); | 7227 return parseFunctionExpression(); |
| 7940 } | 7228 } |
| 7941 Token leftParenthesis = getAndAdvance(); | 7229 Token leftParenthesis = getAndAdvance(); |
| 7942 bool wasInInitializer = _inInitializer; | 7230 bool wasInInitializer = _inInitializer; |
| 7943 _inInitializer = false; | 7231 _inInitializer = false; |
| 7944 try { | 7232 try { |
| 7945 Expression expression = parseExpression2(); | 7233 Expression expression = parseExpression2(); |
| 7946 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 7234 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 7947 return new ParenthesizedExpression( | 7235 return new ParenthesizedExpression( |
| 7948 leftParenthesis, | 7236 leftParenthesis, expression, rightParenthesis); |
| 7949 expression, | |
| 7950 rightParenthesis); | |
| 7951 } finally { | 7237 } finally { |
| 7952 _inInitializer = wasInInitializer; | 7238 _inInitializer = wasInInitializer; |
| 7953 } | 7239 } |
| 7954 } else if (_matches(TokenType.LT)) { | 7240 } else if (_matches(TokenType.LT)) { |
| 7955 return _parseListOrMapLiteral(null); | 7241 return _parseListOrMapLiteral(null); |
| 7956 } else if (_matches(TokenType.QUESTION) && | 7242 } else if (_matches(TokenType.QUESTION) && |
| 7957 _tokenMatches(_peek(), TokenType.IDENTIFIER)) { | 7243 _tokenMatches(_peek(), TokenType.IDENTIFIER)) { |
| 7958 _reportErrorForCurrentToken( | 7244 _reportErrorForCurrentToken( |
| 7959 ParserErrorCode.UNEXPECTED_TOKEN, | 7245 ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]); |
| 7960 [_currentToken.lexeme]); | |
| 7961 _advance(); | 7246 _advance(); |
| 7962 return _parsePrimaryExpression(); | 7247 return _parsePrimaryExpression(); |
| 7963 } else if (_matchesKeyword(Keyword.VOID)) { | 7248 } else if (_matchesKeyword(Keyword.VOID)) { |
| 7964 // | 7249 // |
| 7965 // Recover from having a return type of "void" where a return type is not | 7250 // Recover from having a return type of "void" where a return type is not |
| 7966 // expected. | 7251 // expected. |
| 7967 // | 7252 // |
| 7968 // TODO(brianwilkerson) Improve this error message. | 7253 // TODO(brianwilkerson) Improve this error message. |
| 7969 _reportErrorForCurrentToken( | 7254 _reportErrorForCurrentToken( |
| 7970 ParserErrorCode.UNEXPECTED_TOKEN, | 7255 ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]); |
| 7971 [_currentToken.lexeme]); | |
| 7972 _advance(); | 7256 _advance(); |
| 7973 return _parsePrimaryExpression(); | 7257 return _parsePrimaryExpression(); |
| 7974 } else if (_matches(TokenType.HASH)) { | 7258 } else if (_matches(TokenType.HASH)) { |
| 7975 return _parseSymbolLiteral(); | 7259 return _parseSymbolLiteral(); |
| 7976 } else { | 7260 } else { |
| 7977 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); | 7261 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 7978 return _createSyntheticIdentifier(); | 7262 return _createSyntheticIdentifier(); |
| 7979 } | 7263 } |
| 7980 } | 7264 } |
| 7981 | 7265 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 7992 RedirectingConstructorInvocation _parseRedirectingConstructorInvocation() { | 7276 RedirectingConstructorInvocation _parseRedirectingConstructorInvocation() { |
| 7993 Token keyword = _expectKeyword(Keyword.THIS); | 7277 Token keyword = _expectKeyword(Keyword.THIS); |
| 7994 Token period = null; | 7278 Token period = null; |
| 7995 SimpleIdentifier constructorName = null; | 7279 SimpleIdentifier constructorName = null; |
| 7996 if (_matches(TokenType.PERIOD)) { | 7280 if (_matches(TokenType.PERIOD)) { |
| 7997 period = getAndAdvance(); | 7281 period = getAndAdvance(); |
| 7998 constructorName = parseSimpleIdentifier(); | 7282 constructorName = parseSimpleIdentifier(); |
| 7999 } | 7283 } |
| 8000 ArgumentList argumentList = parseArgumentList(); | 7284 ArgumentList argumentList = parseArgumentList(); |
| 8001 return new RedirectingConstructorInvocation( | 7285 return new RedirectingConstructorInvocation( |
| 8002 keyword, | 7286 keyword, period, constructorName, argumentList); |
| 8003 period, | |
| 8004 constructorName, | |
| 8005 argumentList); | |
| 8006 } | 7287 } |
| 8007 | 7288 |
| 8008 /** | 7289 /** |
| 8009 * Parse a relational expression. | 7290 * Parse a relational expression. |
| 8010 * | 7291 * |
| 8011 * <pre> | 7292 * <pre> |
| 8012 * relationalExpression ::= | 7293 * relationalExpression ::= |
| 8013 * bitwiseOrExpression ('is' '!'? type | 'as' type | relationalOperator bi
twiseOrExpression)? | 7294 * bitwiseOrExpression ('is' '!'? type | 'as' type | relationalOperator bi
twiseOrExpression)? |
| 8014 * | 'super' relationalOperator bitwiseOrExpression | 7295 * | 'super' relationalOperator bitwiseOrExpression |
| 8015 * </pre> | 7296 * </pre> |
| 8016 * | 7297 * |
| 8017 * @return the relational expression that was parsed | 7298 * @return the relational expression that was parsed |
| 8018 */ | 7299 */ |
| 8019 Expression _parseRelationalExpression() { | 7300 Expression _parseRelationalExpression() { |
| 8020 if (_matchesKeyword(Keyword.SUPER) && | 7301 if (_matchesKeyword(Keyword.SUPER) && |
| 8021 _currentToken.next.type.isRelationalOperator) { | 7302 _currentToken.next.type.isRelationalOperator) { |
| 8022 Expression expression = new SuperExpression(getAndAdvance()); | 7303 Expression expression = new SuperExpression(getAndAdvance()); |
| 8023 Token operator = getAndAdvance(); | 7304 Token operator = getAndAdvance(); |
| 8024 expression = | 7305 expression = new BinaryExpression( |
| 8025 new BinaryExpression(expression, operator, parseBitwiseOrExpression())
; | 7306 expression, operator, parseBitwiseOrExpression()); |
| 8026 return expression; | 7307 return expression; |
| 8027 } | 7308 } |
| 8028 Expression expression = parseBitwiseOrExpression(); | 7309 Expression expression = parseBitwiseOrExpression(); |
| 8029 if (_matchesKeyword(Keyword.AS)) { | 7310 if (_matchesKeyword(Keyword.AS)) { |
| 8030 Token asOperator = getAndAdvance(); | 7311 Token asOperator = getAndAdvance(); |
| 8031 expression = new AsExpression(expression, asOperator, parseTypeName()); | 7312 expression = new AsExpression(expression, asOperator, parseTypeName()); |
| 8032 } else if (_matchesKeyword(Keyword.IS)) { | 7313 } else if (_matchesKeyword(Keyword.IS)) { |
| 8033 Token isOperator = getAndAdvance(); | 7314 Token isOperator = getAndAdvance(); |
| 8034 Token notOperator = null; | 7315 Token notOperator = null; |
| 8035 if (_matches(TokenType.BANG)) { | 7316 if (_matches(TokenType.BANG)) { |
| 8036 notOperator = getAndAdvance(); | 7317 notOperator = getAndAdvance(); |
| 8037 } | 7318 } |
| 8038 expression = | 7319 expression = new IsExpression( |
| 8039 new IsExpression(expression, isOperator, notOperator, parseTypeName())
; | 7320 expression, isOperator, notOperator, parseTypeName()); |
| 8040 } else if (_currentToken.type.isRelationalOperator) { | 7321 } else if (_currentToken.type.isRelationalOperator) { |
| 8041 Token operator = getAndAdvance(); | 7322 Token operator = getAndAdvance(); |
| 8042 expression = | 7323 expression = new BinaryExpression( |
| 8043 new BinaryExpression(expression, operator, parseBitwiseOrExpression())
; | 7324 expression, operator, parseBitwiseOrExpression()); |
| 8044 } | 7325 } |
| 8045 return expression; | 7326 return expression; |
| 8046 } | 7327 } |
| 8047 | 7328 |
| 8048 /** | 7329 /** |
| 8049 * Parse a rethrow expression. | 7330 * Parse a rethrow expression. |
| 8050 * | 7331 * |
| 8051 * <pre> | 7332 * <pre> |
| 8052 * rethrowExpression ::= | 7333 * rethrowExpression ::= |
| 8053 * 'rethrow' | 7334 * 'rethrow' |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8098 * @return the setter that was parsed | 7379 * @return the setter that was parsed |
| 8099 */ | 7380 */ |
| 8100 MethodDeclaration _parseSetter(CommentAndMetadata commentAndMetadata, | 7381 MethodDeclaration _parseSetter(CommentAndMetadata commentAndMetadata, |
| 8101 Token externalKeyword, Token staticKeyword, TypeName returnType) { | 7382 Token externalKeyword, Token staticKeyword, TypeName returnType) { |
| 8102 Token propertyKeyword = _expectKeyword(Keyword.SET); | 7383 Token propertyKeyword = _expectKeyword(Keyword.SET); |
| 8103 SimpleIdentifier name = parseSimpleIdentifier(); | 7384 SimpleIdentifier name = parseSimpleIdentifier(); |
| 8104 FormalParameterList parameters = parseFormalParameterList(); | 7385 FormalParameterList parameters = parseFormalParameterList(); |
| 8105 _validateFormalParameterList(parameters); | 7386 _validateFormalParameterList(parameters); |
| 8106 FunctionBody body = _parseFunctionBody( | 7387 FunctionBody body = _parseFunctionBody( |
| 8107 externalKeyword != null || staticKeyword == null, | 7388 externalKeyword != null || staticKeyword == null, |
| 8108 ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, | 7389 ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false); |
| 8109 false); | |
| 8110 if (externalKeyword != null && body is! EmptyFunctionBody) { | 7390 if (externalKeyword != null && body is! EmptyFunctionBody) { |
| 8111 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY); | 7391 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY); |
| 8112 } | 7392 } |
| 8113 return new MethodDeclaration( | 7393 return new MethodDeclaration(commentAndMetadata.comment, |
| 8114 commentAndMetadata.comment, | 7394 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, |
| 8115 commentAndMetadata.metadata, | 7395 propertyKeyword, null, name, parameters, body); |
| 8116 externalKeyword, | |
| 8117 staticKeyword, | |
| 8118 returnType, | |
| 8119 propertyKeyword, | |
| 8120 null, | |
| 8121 name, | |
| 8122 parameters, | |
| 8123 body); | |
| 8124 } | 7396 } |
| 8125 | 7397 |
| 8126 /** | 7398 /** |
| 8127 * Parse a shift expression. | 7399 * Parse a shift expression. |
| 8128 * | 7400 * |
| 8129 * <pre> | 7401 * <pre> |
| 8130 * shiftExpression ::= | 7402 * shiftExpression ::= |
| 8131 * additiveExpression (shiftOperator additiveExpression)* | 7403 * additiveExpression (shiftOperator additiveExpression)* |
| 8132 * | 'super' (shiftOperator additiveExpression)+ | 7404 * | 'super' (shiftOperator additiveExpression)+ |
| 8133 * </pre> | 7405 * </pre> |
| 8134 * | 7406 * |
| 8135 * @return the shift expression that was parsed | 7407 * @return the shift expression that was parsed |
| 8136 */ | 7408 */ |
| 8137 Expression _parseShiftExpression() { | 7409 Expression _parseShiftExpression() { |
| 8138 Expression expression; | 7410 Expression expression; |
| 8139 if (_matchesKeyword(Keyword.SUPER) && | 7411 if (_matchesKeyword(Keyword.SUPER) && |
| 8140 _currentToken.next.type.isShiftOperator) { | 7412 _currentToken.next.type.isShiftOperator) { |
| 8141 expression = new SuperExpression(getAndAdvance()); | 7413 expression = new SuperExpression(getAndAdvance()); |
| 8142 } else { | 7414 } else { |
| 8143 expression = _parseAdditiveExpression(); | 7415 expression = _parseAdditiveExpression(); |
| 8144 } | 7416 } |
| 8145 while (_currentToken.type.isShiftOperator) { | 7417 while (_currentToken.type.isShiftOperator) { |
| 8146 Token operator = getAndAdvance(); | 7418 Token operator = getAndAdvance(); |
| 8147 expression = | 7419 expression = new BinaryExpression( |
| 8148 new BinaryExpression(expression, operator, _parseAdditiveExpression())
; | 7420 expression, operator, _parseAdditiveExpression()); |
| 8149 } | 7421 } |
| 8150 return expression; | 7422 return expression; |
| 8151 } | 7423 } |
| 8152 | 7424 |
| 8153 /** | 7425 /** |
| 8154 * Parse a list of statements within a switch statement. | 7426 * Parse a list of statements within a switch statement. |
| 8155 * | 7427 * |
| 8156 * <pre> | 7428 * <pre> |
| 8157 * statements ::= | 7429 * statements ::= |
| 8158 * statement* | 7430 * statement* |
| 8159 * </pre> | 7431 * </pre> |
| 8160 * | 7432 * |
| 8161 * @return the statements that were parsed | 7433 * @return the statements that were parsed |
| 8162 */ | 7434 */ |
| 8163 List<Statement> _parseStatementList() { | 7435 List<Statement> _parseStatementList() { |
| 8164 List<Statement> statements = new List<Statement>(); | 7436 List<Statement> statements = new List<Statement>(); |
| 8165 Token statementStart = _currentToken; | 7437 Token statementStart = _currentToken; |
| 8166 while (!_matches(TokenType.EOF) && | 7438 while (!_matches(TokenType.EOF) && |
| 8167 !_matches(TokenType.CLOSE_CURLY_BRACKET) && | 7439 !_matches(TokenType.CLOSE_CURLY_BRACKET) && |
| 8168 !_isSwitchMember()) { | 7440 !_isSwitchMember()) { |
| 8169 statements.add(parseStatement2()); | 7441 statements.add(parseStatement2()); |
| 8170 if (identical(_currentToken, statementStart)) { | 7442 if (identical(_currentToken, statementStart)) { |
| 8171 _reportErrorForToken( | 7443 _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [ |
| 8172 ParserErrorCode.UNEXPECTED_TOKEN, | 7444 _currentToken.lexeme |
| 8173 _currentToken, | 7445 ]); |
| 8174 [_currentToken.lexeme]); | |
| 8175 _advance(); | 7446 _advance(); |
| 8176 } | 7447 } |
| 8177 statementStart = _currentToken; | 7448 statementStart = _currentToken; |
| 8178 } | 7449 } |
| 8179 return statements; | 7450 return statements; |
| 8180 } | 7451 } |
| 8181 | 7452 |
| 8182 /** | 7453 /** |
| 8183 * Parse a string literal that contains interpolations. | 7454 * Parse a string literal that contains interpolations. |
| 8184 * | 7455 * |
| 8185 * @return the string literal that was parsed | 7456 * @return the string literal that was parsed |
| 8186 */ | 7457 */ |
| 8187 StringInterpolation _parseStringInterpolation(Token string) { | 7458 StringInterpolation _parseStringInterpolation(Token string) { |
| 8188 List<InterpolationElement> elements = new List<InterpolationElement>(); | 7459 List<InterpolationElement> elements = new List<InterpolationElement>(); |
| 8189 bool hasMore = | 7460 bool hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || |
| 8190 _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || | |
| 8191 _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER); | 7461 _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER); |
| 8192 elements.add( | 7462 elements.add(new InterpolationString( |
| 8193 new InterpolationString( | 7463 string, _computeStringValue(string.lexeme, true, !hasMore))); |
| 8194 string, | |
| 8195 _computeStringValue(string.lexeme, true, !hasMore))); | |
| 8196 while (hasMore) { | 7464 while (hasMore) { |
| 8197 if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION)) { | 7465 if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION)) { |
| 8198 Token openToken = getAndAdvance(); | 7466 Token openToken = getAndAdvance(); |
| 8199 bool wasInInitializer = _inInitializer; | 7467 bool wasInInitializer = _inInitializer; |
| 8200 _inInitializer = false; | 7468 _inInitializer = false; |
| 8201 try { | 7469 try { |
| 8202 Expression expression = parseExpression2(); | 7470 Expression expression = parseExpression2(); |
| 8203 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 7471 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 8204 elements.add( | 7472 elements.add( |
| 8205 new InterpolationExpression(openToken, expression, rightBracket)); | 7473 new InterpolationExpression(openToken, expression, rightBracket)); |
| 8206 } finally { | 7474 } finally { |
| 8207 _inInitializer = wasInInitializer; | 7475 _inInitializer = wasInInitializer; |
| 8208 } | 7476 } |
| 8209 } else { | 7477 } else { |
| 8210 Token openToken = getAndAdvance(); | 7478 Token openToken = getAndAdvance(); |
| 8211 Expression expression = null; | 7479 Expression expression = null; |
| 8212 if (_matchesKeyword(Keyword.THIS)) { | 7480 if (_matchesKeyword(Keyword.THIS)) { |
| 8213 expression = new ThisExpression(getAndAdvance()); | 7481 expression = new ThisExpression(getAndAdvance()); |
| 8214 } else { | 7482 } else { |
| 8215 expression = parseSimpleIdentifier(); | 7483 expression = parseSimpleIdentifier(); |
| 8216 } | 7484 } |
| 8217 elements.add(new InterpolationExpression(openToken, expression, null)); | 7485 elements.add(new InterpolationExpression(openToken, expression, null)); |
| 8218 } | 7486 } |
| 8219 if (_matches(TokenType.STRING)) { | 7487 if (_matches(TokenType.STRING)) { |
| 8220 string = getAndAdvance(); | 7488 string = getAndAdvance(); |
| 8221 hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || | 7489 hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || |
| 8222 _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER); | 7490 _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER); |
| 8223 elements.add( | 7491 elements.add(new InterpolationString( |
| 8224 new InterpolationString( | 7492 string, _computeStringValue(string.lexeme, false, !hasMore))); |
| 8225 string, | |
| 8226 _computeStringValue(string.lexeme, false, !hasMore))); | |
| 8227 } else { | 7493 } else { |
| 8228 hasMore = false; | 7494 hasMore = false; |
| 8229 } | 7495 } |
| 8230 } | 7496 } |
| 8231 return new StringInterpolation(elements); | 7497 return new StringInterpolation(elements); |
| 8232 } | 7498 } |
| 8233 | 7499 |
| 8234 /** | 7500 /** |
| 8235 * Parse a super constructor invocation. | 7501 * Parse a super constructor invocation. |
| 8236 * | 7502 * |
| 8237 * <pre> | 7503 * <pre> |
| 8238 * superConstructorInvocation ::= | 7504 * superConstructorInvocation ::= |
| 8239 * 'super' ('.' identifier)? arguments | 7505 * 'super' ('.' identifier)? arguments |
| 8240 * </pre> | 7506 * </pre> |
| 8241 * | 7507 * |
| 8242 * @return the super constructor invocation that was parsed | 7508 * @return the super constructor invocation that was parsed |
| 8243 */ | 7509 */ |
| 8244 SuperConstructorInvocation _parseSuperConstructorInvocation() { | 7510 SuperConstructorInvocation _parseSuperConstructorInvocation() { |
| 8245 Token keyword = _expectKeyword(Keyword.SUPER); | 7511 Token keyword = _expectKeyword(Keyword.SUPER); |
| 8246 Token period = null; | 7512 Token period = null; |
| 8247 SimpleIdentifier constructorName = null; | 7513 SimpleIdentifier constructorName = null; |
| 8248 if (_matches(TokenType.PERIOD)) { | 7514 if (_matches(TokenType.PERIOD)) { |
| 8249 period = getAndAdvance(); | 7515 period = getAndAdvance(); |
| 8250 constructorName = parseSimpleIdentifier(); | 7516 constructorName = parseSimpleIdentifier(); |
| 8251 } | 7517 } |
| 8252 ArgumentList argumentList = parseArgumentList(); | 7518 ArgumentList argumentList = parseArgumentList(); |
| 8253 return new SuperConstructorInvocation( | 7519 return new SuperConstructorInvocation( |
| 8254 keyword, | 7520 keyword, period, constructorName, argumentList); |
| 8255 period, | |
| 8256 constructorName, | |
| 8257 argumentList); | |
| 8258 } | 7521 } |
| 8259 | 7522 |
| 8260 /** | 7523 /** |
| 8261 * Parse a switch statement. | 7524 * Parse a switch statement. |
| 8262 * | 7525 * |
| 8263 * <pre> | 7526 * <pre> |
| 8264 * switchStatement ::= | 7527 * switchStatement ::= |
| 8265 * 'switch' '(' expression ')' '{' switchCase* defaultCase? '}' | 7528 * 'switch' '(' expression ')' '{' switchCase* defaultCase? '}' |
| 8266 * | 7529 * |
| 8267 * switchCase ::= | 7530 * switchCase ::= |
| (...skipping 13 matching lines...) Expand all Loading... |
| 8281 Token keyword = _expectKeyword(Keyword.SWITCH); | 7544 Token keyword = _expectKeyword(Keyword.SWITCH); |
| 8282 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); | 7545 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); |
| 8283 Expression expression = parseExpression2(); | 7546 Expression expression = parseExpression2(); |
| 8284 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 7547 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 8285 Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); | 7548 Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); |
| 8286 Token defaultKeyword = null; | 7549 Token defaultKeyword = null; |
| 8287 List<SwitchMember> members = new List<SwitchMember>(); | 7550 List<SwitchMember> members = new List<SwitchMember>(); |
| 8288 while (!_matches(TokenType.EOF) && | 7551 while (!_matches(TokenType.EOF) && |
| 8289 !_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 7552 !_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 8290 List<Label> labels = new List<Label>(); | 7553 List<Label> labels = new List<Label>(); |
| 8291 while (_matchesIdentifier() && | 7554 while ( |
| 8292 _tokenMatches(_peek(), TokenType.COLON)) { | 7555 _matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) { |
| 8293 SimpleIdentifier identifier = parseSimpleIdentifier(); | 7556 SimpleIdentifier identifier = parseSimpleIdentifier(); |
| 8294 String label = identifier.token.lexeme; | 7557 String label = identifier.token.lexeme; |
| 8295 if (definedLabels.contains(label)) { | 7558 if (definedLabels.contains(label)) { |
| 8296 _reportErrorForToken( | 7559 _reportErrorForToken( |
| 8297 ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, | 7560 ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, |
| 8298 identifier.token, | 7561 identifier.token, [label]); |
| 8299 [label]); | |
| 8300 } else { | 7562 } else { |
| 8301 definedLabels.add(label); | 7563 definedLabels.add(label); |
| 8302 } | 7564 } |
| 8303 Token colon = _expect(TokenType.COLON); | 7565 Token colon = _expect(TokenType.COLON); |
| 8304 labels.add(new Label(identifier, colon)); | 7566 labels.add(new Label(identifier, colon)); |
| 8305 } | 7567 } |
| 8306 if (_matchesKeyword(Keyword.CASE)) { | 7568 if (_matchesKeyword(Keyword.CASE)) { |
| 8307 Token caseKeyword = getAndAdvance(); | 7569 Token caseKeyword = getAndAdvance(); |
| 8308 Expression caseExpression = parseExpression2(); | 7570 Expression caseExpression = parseExpression2(); |
| 8309 Token colon = _expect(TokenType.COLON); | 7571 Token colon = _expect(TokenType.COLON); |
| 8310 members.add( | 7572 members.add(new SwitchCase(labels, caseKeyword, caseExpression, colon, |
| 8311 new SwitchCase( | 7573 _parseStatementList())); |
| 8312 labels, | |
| 8313 caseKeyword, | |
| 8314 caseExpression, | |
| 8315 colon, | |
| 8316 _parseStatementList())); | |
| 8317 if (defaultKeyword != null) { | 7574 if (defaultKeyword != null) { |
| 8318 _reportErrorForToken( | 7575 _reportErrorForToken( |
| 8319 ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, | 7576 ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, |
| 8320 caseKeyword); | 7577 caseKeyword); |
| 8321 } | 7578 } |
| 8322 } else if (_matchesKeyword(Keyword.DEFAULT)) { | 7579 } else if (_matchesKeyword(Keyword.DEFAULT)) { |
| 8323 if (defaultKeyword != null) { | 7580 if (defaultKeyword != null) { |
| 8324 _reportErrorForToken( | 7581 _reportErrorForToken( |
| 8325 ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, | 7582 ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, _peek()); |
| 8326 _peek()); | |
| 8327 } | 7583 } |
| 8328 defaultKeyword = getAndAdvance(); | 7584 defaultKeyword = getAndAdvance(); |
| 8329 Token colon = _expect(TokenType.COLON); | 7585 Token colon = _expect(TokenType.COLON); |
| 8330 members.add( | 7586 members.add(new SwitchDefault( |
| 8331 new SwitchDefault(labels, defaultKeyword, colon, _parseStatementLi
st())); | 7587 labels, defaultKeyword, colon, _parseStatementList())); |
| 8332 } else { | 7588 } else { |
| 8333 // We need to advance, otherwise we could end up in an infinite loop, | 7589 // We need to advance, otherwise we could end up in an infinite loop, |
| 8334 // but this could be a lot smarter about recovering from the error. | 7590 // but this could be a lot smarter about recovering from the error. |
| 8335 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT); | 7591 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT); |
| 8336 while (!_matches(TokenType.EOF) && | 7592 while (!_matches(TokenType.EOF) && |
| 8337 !_matches(TokenType.CLOSE_CURLY_BRACKET) && | 7593 !_matches(TokenType.CLOSE_CURLY_BRACKET) && |
| 8338 !_matchesKeyword(Keyword.CASE) && | 7594 !_matchesKeyword(Keyword.CASE) && |
| 8339 !_matchesKeyword(Keyword.DEFAULT)) { | 7595 !_matchesKeyword(Keyword.DEFAULT)) { |
| 8340 _advance(); | 7596 _advance(); |
| 8341 } | 7597 } |
| 8342 } | 7598 } |
| 8343 } | 7599 } |
| 8344 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 7600 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 8345 return new SwitchStatement( | 7601 return new SwitchStatement(keyword, leftParenthesis, expression, |
| 8346 keyword, | 7602 rightParenthesis, leftBracket, members, rightBracket); |
| 8347 leftParenthesis, | |
| 8348 expression, | |
| 8349 rightParenthesis, | |
| 8350 leftBracket, | |
| 8351 members, | |
| 8352 rightBracket); | |
| 8353 } finally { | 7603 } finally { |
| 8354 _inSwitch = wasInSwitch; | 7604 _inSwitch = wasInSwitch; |
| 8355 } | 7605 } |
| 8356 } | 7606 } |
| 8357 | 7607 |
| 8358 /** | 7608 /** |
| 8359 * Parse a symbol literal. | 7609 * Parse a symbol literal. |
| 8360 * | 7610 * |
| 8361 * <pre> | 7611 * <pre> |
| 8362 * symbolLiteral ::= | 7612 * symbolLiteral ::= |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8398 * throwExpression ::= | 7648 * throwExpression ::= |
| 8399 * 'throw' expression | 7649 * 'throw' expression |
| 8400 * </pre> | 7650 * </pre> |
| 8401 * | 7651 * |
| 8402 * @return the throw expression that was parsed | 7652 * @return the throw expression that was parsed |
| 8403 */ | 7653 */ |
| 8404 Expression _parseThrowExpression() { | 7654 Expression _parseThrowExpression() { |
| 8405 Token keyword = _expectKeyword(Keyword.THROW); | 7655 Token keyword = _expectKeyword(Keyword.THROW); |
| 8406 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) { | 7656 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) { |
| 8407 _reportErrorForToken( | 7657 _reportErrorForToken( |
| 8408 ParserErrorCode.MISSING_EXPRESSION_IN_THROW, | 7658 ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken); |
| 8409 _currentToken); | |
| 8410 return new ThrowExpression(keyword, _createSyntheticIdentifier()); | 7659 return new ThrowExpression(keyword, _createSyntheticIdentifier()); |
| 8411 } | 7660 } |
| 8412 Expression expression = parseExpression2(); | 7661 Expression expression = parseExpression2(); |
| 8413 return new ThrowExpression(keyword, expression); | 7662 return new ThrowExpression(keyword, expression); |
| 8414 } | 7663 } |
| 8415 | 7664 |
| 8416 /** | 7665 /** |
| 8417 * Parse a throw expression. | 7666 * Parse a throw expression. |
| 8418 * | 7667 * |
| 8419 * <pre> | 7668 * <pre> |
| 8420 * throwExpressionWithoutCascade ::= | 7669 * throwExpressionWithoutCascade ::= |
| 8421 * 'throw' expressionWithoutCascade | 7670 * 'throw' expressionWithoutCascade |
| 8422 * </pre> | 7671 * </pre> |
| 8423 * | 7672 * |
| 8424 * @return the throw expression that was parsed | 7673 * @return the throw expression that was parsed |
| 8425 */ | 7674 */ |
| 8426 Expression _parseThrowExpressionWithoutCascade() { | 7675 Expression _parseThrowExpressionWithoutCascade() { |
| 8427 Token keyword = _expectKeyword(Keyword.THROW); | 7676 Token keyword = _expectKeyword(Keyword.THROW); |
| 8428 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) { | 7677 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) { |
| 8429 _reportErrorForToken( | 7678 _reportErrorForToken( |
| 8430 ParserErrorCode.MISSING_EXPRESSION_IN_THROW, | 7679 ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken); |
| 8431 _currentToken); | |
| 8432 return new ThrowExpression(keyword, _createSyntheticIdentifier()); | 7680 return new ThrowExpression(keyword, _createSyntheticIdentifier()); |
| 8433 } | 7681 } |
| 8434 Expression expression = parseExpressionWithoutCascade(); | 7682 Expression expression = parseExpressionWithoutCascade(); |
| 8435 return new ThrowExpression(keyword, expression); | 7683 return new ThrowExpression(keyword, expression); |
| 8436 } | 7684 } |
| 8437 | 7685 |
| 8438 /** | 7686 /** |
| 8439 * Parse a try statement. | 7687 * Parse a try statement. |
| 8440 * | 7688 * |
| 8441 * <pre> | 7689 * <pre> |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8477 catchKeyword = getAndAdvance(); | 7725 catchKeyword = getAndAdvance(); |
| 8478 leftParenthesis = _expect(TokenType.OPEN_PAREN); | 7726 leftParenthesis = _expect(TokenType.OPEN_PAREN); |
| 8479 exceptionParameter = parseSimpleIdentifier(); | 7727 exceptionParameter = parseSimpleIdentifier(); |
| 8480 if (_matches(TokenType.COMMA)) { | 7728 if (_matches(TokenType.COMMA)) { |
| 8481 comma = getAndAdvance(); | 7729 comma = getAndAdvance(); |
| 8482 stackTraceParameter = parseSimpleIdentifier(); | 7730 stackTraceParameter = parseSimpleIdentifier(); |
| 8483 } | 7731 } |
| 8484 rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 7732 rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 8485 } | 7733 } |
| 8486 Block catchBody = parseBlock(); | 7734 Block catchBody = parseBlock(); |
| 8487 catchClauses.add( | 7735 catchClauses.add(new CatchClause(onKeyword, exceptionType, catchKeyword, |
| 8488 new CatchClause( | 7736 leftParenthesis, exceptionParameter, comma, stackTraceParameter, |
| 8489 onKeyword, | 7737 rightParenthesis, catchBody)); |
| 8490 exceptionType, | |
| 8491 catchKeyword, | |
| 8492 leftParenthesis, | |
| 8493 exceptionParameter, | |
| 8494 comma, | |
| 8495 stackTraceParameter, | |
| 8496 rightParenthesis, | |
| 8497 catchBody)); | |
| 8498 } | 7738 } |
| 8499 Token finallyKeyword = null; | 7739 Token finallyKeyword = null; |
| 8500 if (_matchesKeyword(Keyword.FINALLY)) { | 7740 if (_matchesKeyword(Keyword.FINALLY)) { |
| 8501 finallyKeyword = getAndAdvance(); | 7741 finallyKeyword = getAndAdvance(); |
| 8502 finallyClause = parseBlock(); | 7742 finallyClause = parseBlock(); |
| 8503 } else { | 7743 } else { |
| 8504 if (catchClauses.isEmpty) { | 7744 if (catchClauses.isEmpty) { |
| 8505 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY); | 7745 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY); |
| 8506 } | 7746 } |
| 8507 } | 7747 } |
| 8508 return new TryStatement( | 7748 return new TryStatement( |
| 8509 tryKeyword, | 7749 tryKeyword, body, catchClauses, finallyKeyword, finallyClause); |
| 8510 body, | |
| 8511 catchClauses, | |
| 8512 finallyKeyword, | |
| 8513 finallyClause); | |
| 8514 } | 7750 } |
| 8515 | 7751 |
| 8516 /** | 7752 /** |
| 8517 * Parse a type alias. | 7753 * Parse a type alias. |
| 8518 * | 7754 * |
| 8519 * <pre> | 7755 * <pre> |
| 8520 * typeAlias ::= | 7756 * typeAlias ::= |
| 8521 * 'typedef' typeAliasBody | 7757 * 'typedef' typeAliasBody |
| 8522 * | 7758 * |
| 8523 * typeAliasBody ::= | 7759 * typeAliasBody ::= |
| (...skipping 19 matching lines...) Expand all Loading... |
| 8543 TypeAlias _parseTypeAlias(CommentAndMetadata commentAndMetadata) { | 7779 TypeAlias _parseTypeAlias(CommentAndMetadata commentAndMetadata) { |
| 8544 Token keyword = _expectKeyword(Keyword.TYPEDEF); | 7780 Token keyword = _expectKeyword(Keyword.TYPEDEF); |
| 8545 if (_matchesIdentifier()) { | 7781 if (_matchesIdentifier()) { |
| 8546 Token next = _peek(); | 7782 Token next = _peek(); |
| 8547 if (_tokenMatches(next, TokenType.LT)) { | 7783 if (_tokenMatches(next, TokenType.LT)) { |
| 8548 next = _skipTypeParameterList(next); | 7784 next = _skipTypeParameterList(next); |
| 8549 if (next != null && _tokenMatches(next, TokenType.EQ)) { | 7785 if (next != null && _tokenMatches(next, TokenType.EQ)) { |
| 8550 TypeAlias typeAlias = | 7786 TypeAlias typeAlias = |
| 8551 _parseClassTypeAlias(commentAndMetadata, null, keyword); | 7787 _parseClassTypeAlias(commentAndMetadata, null, keyword); |
| 8552 _reportErrorForToken( | 7788 _reportErrorForToken( |
| 8553 ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, | 7789 ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword); |
| 8554 keyword); | |
| 8555 return typeAlias; | 7790 return typeAlias; |
| 8556 } | 7791 } |
| 8557 } else if (_tokenMatches(next, TokenType.EQ)) { | 7792 } else if (_tokenMatches(next, TokenType.EQ)) { |
| 8558 TypeAlias typeAlias = | 7793 TypeAlias typeAlias = |
| 8559 _parseClassTypeAlias(commentAndMetadata, null, keyword); | 7794 _parseClassTypeAlias(commentAndMetadata, null, keyword); |
| 8560 _reportErrorForToken( | 7795 _reportErrorForToken( |
| 8561 ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, | 7796 ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword); |
| 8562 keyword); | |
| 8563 return typeAlias; | 7797 return typeAlias; |
| 8564 } | 7798 } |
| 8565 } | 7799 } |
| 8566 return _parseFunctionTypeAlias(commentAndMetadata, keyword); | 7800 return _parseFunctionTypeAlias(commentAndMetadata, keyword); |
| 8567 } | 7801 } |
| 8568 | 7802 |
| 8569 /** | 7803 /** |
| 8570 * Parse a unary expression. | 7804 * Parse a unary expression. |
| 8571 * | 7805 * |
| 8572 * <pre> | 7806 * <pre> |
| (...skipping 16 matching lines...) Expand all Loading... |
| 8589 if (_matchesKeyword(Keyword.SUPER)) { | 7823 if (_matchesKeyword(Keyword.SUPER)) { |
| 8590 if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) || | 7824 if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) || |
| 8591 _tokenMatches(_peek(), TokenType.PERIOD)) { | 7825 _tokenMatches(_peek(), TokenType.PERIOD)) { |
| 8592 // "prefixOperator unaryExpression" | 7826 // "prefixOperator unaryExpression" |
| 8593 // --> "prefixOperator postfixExpression" | 7827 // --> "prefixOperator postfixExpression" |
| 8594 // --> "prefixOperator primary selector*" | 7828 // --> "prefixOperator primary selector*" |
| 8595 // --> "prefixOperator 'super' assignableSelector selector*" | 7829 // --> "prefixOperator 'super' assignableSelector selector*" |
| 8596 return new PrefixExpression(operator, _parseUnaryExpression()); | 7830 return new PrefixExpression(operator, _parseUnaryExpression()); |
| 8597 } | 7831 } |
| 8598 return new PrefixExpression( | 7832 return new PrefixExpression( |
| 8599 operator, | 7833 operator, new SuperExpression(getAndAdvance())); |
| 8600 new SuperExpression(getAndAdvance())); | |
| 8601 } | 7834 } |
| 8602 return new PrefixExpression(operator, _parseUnaryExpression()); | 7835 return new PrefixExpression(operator, _parseUnaryExpression()); |
| 8603 } else if (_currentToken.type.isIncrementOperator) { | 7836 } else if (_currentToken.type.isIncrementOperator) { |
| 8604 Token operator = getAndAdvance(); | 7837 Token operator = getAndAdvance(); |
| 8605 if (_matchesKeyword(Keyword.SUPER)) { | 7838 if (_matchesKeyword(Keyword.SUPER)) { |
| 8606 if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) || | 7839 if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) || |
| 8607 _tokenMatches(_peek(), TokenType.PERIOD)) { | 7840 _tokenMatches(_peek(), TokenType.PERIOD)) { |
| 8608 // --> "prefixOperator 'super' assignableSelector selector*" | 7841 // --> "prefixOperator 'super' assignableSelector selector*" |
| 8609 return new PrefixExpression(operator, _parseUnaryExpression()); | 7842 return new PrefixExpression(operator, _parseUnaryExpression()); |
| 8610 } | 7843 } |
| 8611 // | 7844 // |
| 8612 // Even though it is not valid to use an incrementing operator | 7845 // Even though it is not valid to use an incrementing operator |
| 8613 // ('++' or '--') before 'super', we can (and therefore must) interpret | 7846 // ('++' or '--') before 'super', we can (and therefore must) interpret |
| 8614 // "--super" as semantically equivalent to "-(-super)". Unfortunately, | 7847 // "--super" as semantically equivalent to "-(-super)". Unfortunately, |
| 8615 // we cannot do the same for "++super" because "+super" is also not | 7848 // we cannot do the same for "++super" because "+super" is also not |
| 8616 // valid. | 7849 // valid. |
| 8617 // | 7850 // |
| 8618 if (operator.type == TokenType.MINUS_MINUS) { | 7851 if (operator.type == TokenType.MINUS_MINUS) { |
| 8619 Token firstOperator = _createToken(operator, TokenType.MINUS); | 7852 Token firstOperator = _createToken(operator, TokenType.MINUS); |
| 8620 Token secondOperator = | 7853 Token secondOperator = |
| 8621 new Token(TokenType.MINUS, operator.offset + 1); | 7854 new Token(TokenType.MINUS, operator.offset + 1); |
| 8622 secondOperator.setNext(_currentToken); | 7855 secondOperator.setNext(_currentToken); |
| 8623 firstOperator.setNext(secondOperator); | 7856 firstOperator.setNext(secondOperator); |
| 8624 operator.previous.setNext(firstOperator); | 7857 operator.previous.setNext(firstOperator); |
| 8625 return new PrefixExpression( | 7858 return new PrefixExpression(firstOperator, new PrefixExpression( |
| 8626 firstOperator, | 7859 secondOperator, new SuperExpression(getAndAdvance()))); |
| 8627 new PrefixExpression(secondOperator, new SuperExpression(getAndAdv
ance()))); | |
| 8628 } else { | 7860 } else { |
| 8629 // Invalid operator before 'super' | 7861 // Invalid operator before 'super' |
| 8630 _reportErrorForCurrentToken( | 7862 _reportErrorForCurrentToken( |
| 8631 ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, | 7863 ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]); |
| 8632 [operator.lexeme]); | |
| 8633 return new PrefixExpression( | 7864 return new PrefixExpression( |
| 8634 operator, | 7865 operator, new SuperExpression(getAndAdvance())); |
| 8635 new SuperExpression(getAndAdvance())); | |
| 8636 } | 7866 } |
| 8637 } | 7867 } |
| 8638 return new PrefixExpression(operator, _parseAssignableExpression(false)); | 7868 return new PrefixExpression(operator, _parseAssignableExpression(false)); |
| 8639 } else if (_matches(TokenType.PLUS)) { | 7869 } else if (_matches(TokenType.PLUS)) { |
| 8640 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); | 7870 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 8641 return _createSyntheticIdentifier(); | 7871 return _createSyntheticIdentifier(); |
| 8642 } else if (_inAsync && _matchesString(_AWAIT)) { | 7872 } else if (_inAsync && _matchesString(_AWAIT)) { |
| 8643 return _parseAwaitExpression(); | 7873 return _parseAwaitExpression(); |
| 8644 } | 7874 } |
| 8645 return _parsePostfixExpression(); | 7875 return _parsePostfixExpression(); |
| 8646 } | 7876 } |
| 8647 | 7877 |
| 8648 /** | 7878 /** |
| 8649 * Parse a string literal representing a URI. | 7879 * Parse a string literal representing a URI. |
| 8650 */ | 7880 */ |
| 8651 StringLiteral _parseUri() { | 7881 StringLiteral _parseUri() { |
| 8652 bool iskeywordAfterUri(Token token) => | 7882 bool iskeywordAfterUri(Token token) => token.lexeme == Keyword.AS.syntax || |
| 8653 token.lexeme == Keyword.AS.syntax || | 7883 token.lexeme == _HIDE || |
| 8654 token.lexeme == _HIDE || | 7884 token.lexeme == _SHOW; |
| 8655 token.lexeme == _SHOW; | |
| 8656 if (!_matches(TokenType.STRING) && | 7885 if (!_matches(TokenType.STRING) && |
| 8657 !_matches(TokenType.SEMICOLON) && | 7886 !_matches(TokenType.SEMICOLON) && |
| 8658 !iskeywordAfterUri(_currentToken)) { | 7887 !iskeywordAfterUri(_currentToken)) { |
| 8659 // Attempt to recover in the case where the URI was not enclosed in | 7888 // Attempt to recover in the case where the URI was not enclosed in |
| 8660 // quotes. | 7889 // quotes. |
| 8661 Token token = _currentToken; | 7890 Token token = _currentToken; |
| 8662 while ((_tokenMatchesIdentifier(token) && !iskeywordAfterUri(token)) || | 7891 while ((_tokenMatchesIdentifier(token) && !iskeywordAfterUri(token)) || |
| 8663 _tokenMatches(token, TokenType.COLON) || | 7892 _tokenMatches(token, TokenType.COLON) || |
| 8664 _tokenMatches(token, TokenType.SLASH) || | 7893 _tokenMatches(token, TokenType.SLASH) || |
| 8665 _tokenMatches(token, TokenType.PERIOD) || | 7894 _tokenMatches(token, TokenType.PERIOD) || |
| (...skipping 15 matching lines...) Expand all Loading... |
| 8681 if (token.offset != endOffset || token.precedingComments != null) { | 7910 if (token.offset != endOffset || token.precedingComments != null) { |
| 8682 return parseStringLiteral(); | 7911 return parseStringLiteral(); |
| 8683 } | 7912 } |
| 8684 buffer.write(token.lexeme); | 7913 buffer.write(token.lexeme); |
| 8685 endOffset = token.end; | 7914 endOffset = token.end; |
| 8686 } | 7915 } |
| 8687 String value = buffer.toString(); | 7916 String value = buffer.toString(); |
| 8688 Token newToken = | 7917 Token newToken = |
| 8689 new StringToken(TokenType.STRING, "'$value'", _currentToken.offset); | 7918 new StringToken(TokenType.STRING, "'$value'", _currentToken.offset); |
| 8690 _reportErrorForToken( | 7919 _reportErrorForToken( |
| 8691 ParserErrorCode.NON_STRING_LITERAL_AS_URI, | 7920 ParserErrorCode.NON_STRING_LITERAL_AS_URI, newToken); |
| 8692 newToken); | |
| 8693 _currentToken = endToken.next; | 7921 _currentToken = endToken.next; |
| 8694 return new SimpleStringLiteral(newToken, value); | 7922 return new SimpleStringLiteral(newToken, value); |
| 8695 } | 7923 } |
| 8696 } | 7924 } |
| 8697 return parseStringLiteral(); | 7925 return parseStringLiteral(); |
| 8698 } | 7926 } |
| 8699 | 7927 |
| 8700 /** | 7928 /** |
| 8701 * Parse a variable declaration. | 7929 * Parse a variable declaration. |
| 8702 * | 7930 * |
| 8703 * <pre> | 7931 * <pre> |
| 8704 * variableDeclaration ::= | 7932 * variableDeclaration ::= |
| 8705 * identifier ('=' expression)? | 7933 * identifier ('=' expression)? |
| 8706 * </pre> | 7934 * </pre> |
| 8707 * | 7935 * |
| 8708 * @return the variable declaration that was parsed | 7936 * @return the variable declaration that was parsed |
| 8709 */ | 7937 */ |
| 8710 VariableDeclaration _parseVariableDeclaration() { | 7938 VariableDeclaration _parseVariableDeclaration() { |
| 8711 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 7939 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 8712 SimpleIdentifier name = parseSimpleIdentifier(); | 7940 SimpleIdentifier name = parseSimpleIdentifier(); |
| 8713 Token equals = null; | 7941 Token equals = null; |
| 8714 Expression initializer = null; | 7942 Expression initializer = null; |
| 8715 if (_matches(TokenType.EQ)) { | 7943 if (_matches(TokenType.EQ)) { |
| 8716 equals = getAndAdvance(); | 7944 equals = getAndAdvance(); |
| 8717 initializer = parseExpression2(); | 7945 initializer = parseExpression2(); |
| 8718 } | 7946 } |
| 8719 return new VariableDeclaration( | 7947 return new VariableDeclaration(commentAndMetadata.comment, |
| 8720 commentAndMetadata.comment, | 7948 commentAndMetadata.metadata, name, equals, initializer); |
| 8721 commentAndMetadata.metadata, | |
| 8722 name, | |
| 8723 equals, | |
| 8724 initializer); | |
| 8725 } | 7949 } |
| 8726 | 7950 |
| 8727 /** | 7951 /** |
| 8728 * Parse a variable declaration list. | 7952 * Parse a variable declaration list. |
| 8729 * | 7953 * |
| 8730 * <pre> | 7954 * <pre> |
| 8731 * variableDeclarationList ::= | 7955 * variableDeclarationList ::= |
| 8732 * finalConstVarOrType variableDeclaration (',' variableDeclaration)* | 7956 * finalConstVarOrType variableDeclaration (',' variableDeclaration)* |
| 8733 * </pre> | 7957 * </pre> |
| 8734 * | 7958 * |
| 8735 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration list | 7959 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration list |
| 8736 * @return the variable declaration list that was parsed | 7960 * @return the variable declaration list that was parsed |
| 8737 */ | 7961 */ |
| 8738 VariableDeclarationList | 7962 VariableDeclarationList _parseVariableDeclarationListAfterMetadata( |
| 8739 _parseVariableDeclarationListAfterMetadata(CommentAndMetadata commentAndMe
tadata) { | 7963 CommentAndMetadata commentAndMetadata) { |
| 8740 FinalConstVarOrType holder = _parseFinalConstVarOrType(false); | 7964 FinalConstVarOrType holder = _parseFinalConstVarOrType(false); |
| 8741 return _parseVariableDeclarationListAfterType( | 7965 return _parseVariableDeclarationListAfterType( |
| 8742 commentAndMetadata, | 7966 commentAndMetadata, holder.keyword, holder.type); |
| 8743 holder.keyword, | |
| 8744 holder.type); | |
| 8745 } | 7967 } |
| 8746 | 7968 |
| 8747 /** | 7969 /** |
| 8748 * Parse a variable declaration list. | 7970 * Parse a variable declaration list. |
| 8749 * | 7971 * |
| 8750 * <pre> | 7972 * <pre> |
| 8751 * variableDeclarationList ::= | 7973 * variableDeclarationList ::= |
| 8752 * finalConstVarOrType variableDeclaration (',' variableDeclaration)* | 7974 * finalConstVarOrType variableDeclaration (',' variableDeclaration)* |
| 8753 * </pre> | 7975 * </pre> |
| 8754 * | 7976 * |
| 8755 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration list, or | 7977 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration list, or |
| 8756 * `null` if there is no attempt at parsing the comment and metadata | 7978 * `null` if there is no attempt at parsing the comment and metadata |
| 8757 * @param keyword the token representing the 'final', 'const' or 'var' keyword
, or `null` if | 7979 * @param keyword the token representing the 'final', 'const' or 'var' keyword
, or `null` if |
| 8758 * there is no keyword | 7980 * there is no keyword |
| 8759 * @param type the type of the variables in the list | 7981 * @param type the type of the variables in the list |
| 8760 * @return the variable declaration list that was parsed | 7982 * @return the variable declaration list that was parsed |
| 8761 */ | 7983 */ |
| 8762 VariableDeclarationList | 7984 VariableDeclarationList _parseVariableDeclarationListAfterType( |
| 8763 _parseVariableDeclarationListAfterType(CommentAndMetadata commentAndMetada
ta, | 7985 CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) { |
| 8764 Token keyword, TypeName type) { | |
| 8765 if (type != null && | 7986 if (type != null && |
| 8766 keyword != null && | 7987 keyword != null && |
| 8767 _tokenMatchesKeyword(keyword, Keyword.VAR)) { | 7988 _tokenMatchesKeyword(keyword, Keyword.VAR)) { |
| 8768 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, keyword); | 7989 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, keyword); |
| 8769 } | 7990 } |
| 8770 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 7991 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 8771 variables.add(_parseVariableDeclaration()); | 7992 variables.add(_parseVariableDeclaration()); |
| 8772 while (_matches(TokenType.COMMA)) { | 7993 while (_matches(TokenType.COMMA)) { |
| 8773 _advance(); | 7994 _advance(); |
| 8774 variables.add(_parseVariableDeclaration()); | 7995 variables.add(_parseVariableDeclaration()); |
| 8775 } | 7996 } |
| 8776 return new VariableDeclarationList( | 7997 return new VariableDeclarationList( |
| 8777 commentAndMetadata != null ? commentAndMetadata.comment : null, | 7998 commentAndMetadata != null ? commentAndMetadata.comment : null, |
| 8778 commentAndMetadata != null ? commentAndMetadata.metadata : null, | 7999 commentAndMetadata != null ? commentAndMetadata.metadata : null, |
| 8779 keyword, | 8000 keyword, type, variables); |
| 8780 type, | |
| 8781 variables); | |
| 8782 } | 8001 } |
| 8783 | 8002 |
| 8784 /** | 8003 /** |
| 8785 * Parse a variable declaration statement. | 8004 * Parse a variable declaration statement. |
| 8786 * | 8005 * |
| 8787 * <pre> | 8006 * <pre> |
| 8788 * variableDeclarationStatement ::= | 8007 * variableDeclarationStatement ::= |
| 8789 * variableDeclarationList ';' | 8008 * variableDeclarationList ';' |
| 8790 * </pre> | 8009 * </pre> |
| 8791 * | 8010 * |
| 8792 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration | 8011 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration |
| 8793 * statement, or `null` if there is no attempt at parsing the comment
and metadata | 8012 * statement, or `null` if there is no attempt at parsing the comment
and metadata |
| 8794 * @return the variable declaration statement that was parsed | 8013 * @return the variable declaration statement that was parsed |
| 8795 */ | 8014 */ |
| 8796 VariableDeclarationStatement | 8015 VariableDeclarationStatement _parseVariableDeclarationStatementAfterMetadata( |
| 8797 _parseVariableDeclarationStatementAfterMetadata(CommentAndMetadata comment
AndMetadata) { | 8016 CommentAndMetadata commentAndMetadata) { |
| 8798 // Token startToken = currentToken; | 8017 // Token startToken = currentToken; |
| 8799 VariableDeclarationList variableList = | 8018 VariableDeclarationList variableList = |
| 8800 _parseVariableDeclarationListAfterMetadata(commentAndMetadata); | 8019 _parseVariableDeclarationListAfterMetadata(commentAndMetadata); |
| 8801 // if (!matches(TokenType.SEMICOLON)) { | 8020 // if (!matches(TokenType.SEMICOLON)) { |
| 8802 // if (matches(startToken, Keyword.VAR) && isTypedIdentifier(startToken
.getNext())) { | 8021 // if (matches(startToken, Keyword.VAR) && isTypedIdentifier(startToken
.getNext())) { |
| 8803 // // TODO(brianwilkerson) This appears to be of the form "var type v
ariable". We should do | 8022 // // TODO(brianwilkerson) This appears to be of the form "var type v
ariable". We should do |
| 8804 // // a better job of recovering in this case. | 8023 // // a better job of recovering in this case. |
| 8805 // } | 8024 // } |
| 8806 // } | 8025 // } |
| 8807 Token semicolon = _expect(TokenType.SEMICOLON); | 8026 Token semicolon = _expect(TokenType.SEMICOLON); |
| 8808 return new VariableDeclarationStatement(variableList, semicolon); | 8027 return new VariableDeclarationStatement(variableList, semicolon); |
| 8809 } | 8028 } |
| 8810 | 8029 |
| 8811 /** | 8030 /** |
| 8812 * Parse a variable declaration statement. | 8031 * Parse a variable declaration statement. |
| 8813 * | 8032 * |
| 8814 * <pre> | 8033 * <pre> |
| 8815 * variableDeclarationStatement ::= | 8034 * variableDeclarationStatement ::= |
| 8816 * variableDeclarationList ';' | 8035 * variableDeclarationList ';' |
| 8817 * </pre> | 8036 * </pre> |
| 8818 * | 8037 * |
| 8819 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration | 8038 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration |
| 8820 * statement, or `null` if there is no attempt at parsing the comment
and metadata | 8039 * statement, or `null` if there is no attempt at parsing the comment
and metadata |
| 8821 * @param keyword the token representing the 'final', 'const' or 'var' keyword
, or `null` if | 8040 * @param keyword the token representing the 'final', 'const' or 'var' keyword
, or `null` if |
| 8822 * there is no keyword | 8041 * there is no keyword |
| 8823 * @param type the type of the variables in the list | 8042 * @param type the type of the variables in the list |
| 8824 * @return the variable declaration statement that was parsed | 8043 * @return the variable declaration statement that was parsed |
| 8825 */ | 8044 */ |
| 8826 VariableDeclarationStatement | 8045 VariableDeclarationStatement _parseVariableDeclarationStatementAfterType( |
| 8827 _parseVariableDeclarationStatementAfterType(CommentAndMetadata commentAndM
etadata, | 8046 CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) { |
| 8828 Token keyword, TypeName type) { | |
| 8829 VariableDeclarationList variableList = | 8047 VariableDeclarationList variableList = |
| 8830 _parseVariableDeclarationListAfterType(commentAndMetadata, keyword, type
); | 8048 _parseVariableDeclarationListAfterType( |
| 8049 commentAndMetadata, keyword, type); |
| 8831 Token semicolon = _expect(TokenType.SEMICOLON); | 8050 Token semicolon = _expect(TokenType.SEMICOLON); |
| 8832 return new VariableDeclarationStatement(variableList, semicolon); | 8051 return new VariableDeclarationStatement(variableList, semicolon); |
| 8833 } | 8052 } |
| 8834 | 8053 |
| 8835 /** | 8054 /** |
| 8836 * Parse a while statement. | 8055 * Parse a while statement. |
| 8837 * | 8056 * |
| 8838 * <pre> | 8057 * <pre> |
| 8839 * whileStatement ::= | 8058 * whileStatement ::= |
| 8840 * 'while' '(' expression ')' statement | 8059 * 'while' '(' expression ')' statement |
| 8841 * </pre> | 8060 * </pre> |
| 8842 * | 8061 * |
| 8843 * @return the while statement that was parsed | 8062 * @return the while statement that was parsed |
| 8844 */ | 8063 */ |
| 8845 Statement _parseWhileStatement() { | 8064 Statement _parseWhileStatement() { |
| 8846 bool wasInLoop = _inLoop; | 8065 bool wasInLoop = _inLoop; |
| 8847 _inLoop = true; | 8066 _inLoop = true; |
| 8848 try { | 8067 try { |
| 8849 Token keyword = _expectKeyword(Keyword.WHILE); | 8068 Token keyword = _expectKeyword(Keyword.WHILE); |
| 8850 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); | 8069 Token leftParenthesis = _expect(TokenType.OPEN_PAREN); |
| 8851 Expression condition = parseExpression2(); | 8070 Expression condition = parseExpression2(); |
| 8852 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 8071 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 8853 Statement body = parseStatement2(); | 8072 Statement body = parseStatement2(); |
| 8854 return new WhileStatement( | 8073 return new WhileStatement( |
| 8855 keyword, | 8074 keyword, leftParenthesis, condition, rightParenthesis, body); |
| 8856 leftParenthesis, | |
| 8857 condition, | |
| 8858 rightParenthesis, | |
| 8859 body); | |
| 8860 } finally { | 8075 } finally { |
| 8861 _inLoop = wasInLoop; | 8076 _inLoop = wasInLoop; |
| 8862 } | 8077 } |
| 8863 } | 8078 } |
| 8864 | 8079 |
| 8865 /** | 8080 /** |
| 8866 * Parse a yield statement. | 8081 * Parse a yield statement. |
| 8867 * | 8082 * |
| 8868 * <pre> | 8083 * <pre> |
| 8869 * yieldStatement ::= | 8084 * yieldStatement ::= |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8931 | 8146 |
| 8932 /** | 8147 /** |
| 8933 * Report an error with the given error code and arguments. | 8148 * Report an error with the given error code and arguments. |
| 8934 * | 8149 * |
| 8935 * @param errorCode the error code of the error to be reported | 8150 * @param errorCode the error code of the error to be reported |
| 8936 * @param node the node specifying the location of the error | 8151 * @param node the node specifying the location of the error |
| 8937 * @param arguments the arguments to the error, used to compose the error mess
age | 8152 * @param arguments the arguments to the error, used to compose the error mess
age |
| 8938 */ | 8153 */ |
| 8939 void _reportErrorForNode(ParserErrorCode errorCode, AstNode node, | 8154 void _reportErrorForNode(ParserErrorCode errorCode, AstNode node, |
| 8940 [List<Object> arguments]) { | 8155 [List<Object> arguments]) { |
| 8941 _reportError( | 8156 _reportError(new AnalysisError.con2( |
| 8942 new AnalysisError.con2( | 8157 _source, node.offset, node.length, errorCode, arguments)); |
| 8943 _source, | |
| 8944 node.offset, | |
| 8945 node.length, | |
| 8946 errorCode, | |
| 8947 arguments)); | |
| 8948 } | 8158 } |
| 8949 | 8159 |
| 8950 /** | 8160 /** |
| 8951 * Report an error with the given error code and arguments. | 8161 * Report an error with the given error code and arguments. |
| 8952 * | 8162 * |
| 8953 * @param errorCode the error code of the error to be reported | 8163 * @param errorCode the error code of the error to be reported |
| 8954 * @param token the token specifying the location of the error | 8164 * @param token the token specifying the location of the error |
| 8955 * @param arguments the arguments to the error, used to compose the error mess
age | 8165 * @param arguments the arguments to the error, used to compose the error mess
age |
| 8956 */ | 8166 */ |
| 8957 void _reportErrorForToken(ErrorCode errorCode, Token token, | 8167 void _reportErrorForToken(ErrorCode errorCode, Token token, |
| 8958 [List<Object> arguments]) { | 8168 [List<Object> arguments]) { |
| 8959 if (token.type == TokenType.EOF) { | 8169 if (token.type == TokenType.EOF) { |
| 8960 token = token.previous; | 8170 token = token.previous; |
| 8961 } | 8171 } |
| 8962 _reportError( | 8172 _reportError(new AnalysisError.con2(_source, token.offset, |
| 8963 new AnalysisError.con2( | 8173 math.max(token.length, 1), errorCode, arguments)); |
| 8964 _source, | |
| 8965 token.offset, | |
| 8966 math.max(token.length, 1), | |
| 8967 errorCode, | |
| 8968 arguments)); | |
| 8969 } | 8174 } |
| 8970 | 8175 |
| 8971 /** | 8176 /** |
| 8972 * Skips a block with all containing blocks. | 8177 * Skips a block with all containing blocks. |
| 8973 */ | 8178 */ |
| 8974 void _skipBlock() { | 8179 void _skipBlock() { |
| 8975 Token endToken = (_currentToken as BeginToken).endToken; | 8180 Token endToken = (_currentToken as BeginToken).endToken; |
| 8976 if (endToken == null) { | 8181 if (endToken == null) { |
| 8977 endToken = _currentToken.next; | 8182 endToken = _currentToken.next; |
| 8978 while (!identical(endToken, _currentToken)) { | 8183 while (!identical(endToken, _currentToken)) { |
| 8979 _currentToken = endToken; | 8184 _currentToken = endToken; |
| 8980 endToken = _currentToken.next; | 8185 endToken = _currentToken.next; |
| 8981 } | 8186 } |
| 8982 _reportErrorForToken( | 8187 _reportErrorForToken( |
| 8983 ParserErrorCode.EXPECTED_TOKEN, | 8188 ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, ["}"]); |
| 8984 _currentToken.previous, | |
| 8985 ["}"]); | |
| 8986 } else { | 8189 } else { |
| 8987 _currentToken = endToken.next; | 8190 _currentToken = endToken.next; |
| 8988 } | 8191 } |
| 8989 } | 8192 } |
| 8990 | 8193 |
| 8991 /** | 8194 /** |
| 8992 * Parse the 'final', 'const', 'var' or type preceding a variable declaration,
starting at the | 8195 * Parse the 'final', 'const', 'var' or type preceding a variable declaration,
starting at the |
| 8993 * given token, without actually creating a type or changing the current token
. Return the token | 8196 * given token, without actually creating a type or changing the current token
. Return the token |
| 8994 * following the type that was parsed, or `null` if the given token is not the
first token | 8197 * following the type that was parsed, or `null` if the given token is not the
first token |
| 8995 * in a valid type. | 8198 * in a valid type. |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9080 return null; | 8283 return null; |
| 9081 } | 8284 } |
| 9082 Token next = startToken.next; | 8285 Token next = startToken.next; |
| 9083 if (_tokenMatches(next, TokenType.CLOSE_PAREN)) { | 8286 if (_tokenMatches(next, TokenType.CLOSE_PAREN)) { |
| 9084 return next.next; | 8287 return next.next; |
| 9085 } | 8288 } |
| 9086 // | 8289 // |
| 9087 // Look to see whether the token after the open parenthesis is something | 8290 // Look to see whether the token after the open parenthesis is something |
| 9088 // that should only occur at the beginning of a parameter list. | 8291 // that should only occur at the beginning of a parameter list. |
| 9089 // | 8292 // |
| 9090 if (next.matchesAny( | 8293 if (next.matchesAny([ |
| 9091 [TokenType.AT, TokenType.OPEN_SQUARE_BRACKET, TokenType.OPEN_CURLY_BRACK
ET]) || | 8294 TokenType.AT, |
| 8295 TokenType.OPEN_SQUARE_BRACKET, |
| 8296 TokenType.OPEN_CURLY_BRACKET |
| 8297 ]) || |
| 9092 _tokenMatchesKeyword(next, Keyword.VOID) || | 8298 _tokenMatchesKeyword(next, Keyword.VOID) || |
| 9093 (_tokenMatchesIdentifier(next) && | 8299 (_tokenMatchesIdentifier(next) && |
| 9094 (next.next.matchesAny([TokenType.COMMA, TokenType.CLOSE_PAREN])))) { | 8300 (next.next.matchesAny([TokenType.COMMA, TokenType.CLOSE_PAREN])))) { |
| 9095 return _skipPastMatchingToken(startToken); | 8301 return _skipPastMatchingToken(startToken); |
| 9096 } | 8302 } |
| 9097 // | 8303 // |
| 9098 // Look to see whether the first parameter is a function typed parameter | 8304 // Look to see whether the first parameter is a function typed parameter |
| 9099 // without a return type. | 8305 // without a return type. |
| 9100 // | 8306 // |
| 9101 if (_tokenMatchesIdentifier(next) && | 8307 if (_tokenMatchesIdentifier(next) && |
| 9102 _tokenMatches(next.next, TokenType.OPEN_PAREN)) { | 8308 _tokenMatches(next.next, TokenType.OPEN_PAREN)) { |
| 9103 Token afterParameters = _skipFormalParameterList(next.next); | 8309 Token afterParameters = _skipFormalParameterList(next.next); |
| 9104 if (afterParameters != null && | 8310 if (afterParameters != null && |
| 9105 (afterParameters.matchesAny([TokenType.COMMA, TokenType.CLOSE_PAREN]))
) { | 8311 (afterParameters |
| 8312 .matchesAny([TokenType.COMMA, TokenType.CLOSE_PAREN]))) { |
| 9106 return _skipPastMatchingToken(startToken); | 8313 return _skipPastMatchingToken(startToken); |
| 9107 } | 8314 } |
| 9108 } | 8315 } |
| 9109 // | 8316 // |
| 9110 // Look to see whether the first parameter has a type or is a function typed | 8317 // Look to see whether the first parameter has a type or is a function typed |
| 9111 // parameter with a return type. | 8318 // parameter with a return type. |
| 9112 // | 8319 // |
| 9113 Token afterType = _skipFinalConstVarOrType(next); | 8320 Token afterType = _skipFinalConstVarOrType(next); |
| 9114 if (afterType == null) { | 8321 if (afterType == null) { |
| 9115 return null; | 8322 return null; |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9452 (token as KeywordToken).keyword.isPseudoKeyword); | 8659 (token as KeywordToken).keyword.isPseudoKeyword); |
| 9453 | 8660 |
| 9454 /** | 8661 /** |
| 9455 * Return `true` if the given token matches the given keyword. | 8662 * Return `true` if the given token matches the given keyword. |
| 9456 * | 8663 * |
| 9457 * @param token the token being tested | 8664 * @param token the token being tested |
| 9458 * @param keyword the keyword that is being tested for | 8665 * @param keyword the keyword that is being tested for |
| 9459 * @return `true` if the given token matches the given keyword | 8666 * @return `true` if the given token matches the given keyword |
| 9460 */ | 8667 */ |
| 9461 bool _tokenMatchesKeyword(Token token, Keyword keyword) => | 8668 bool _tokenMatchesKeyword(Token token, Keyword keyword) => |
| 9462 token.type == TokenType.KEYWORD && (token as KeywordToken).keyword == keyw
ord; | 8669 token.type == TokenType.KEYWORD && |
| 8670 (token as KeywordToken).keyword == keyword; |
| 9463 | 8671 |
| 9464 /** | 8672 /** |
| 9465 * Return `true` if the given token matches the given identifier. | 8673 * Return `true` if the given token matches the given identifier. |
| 9466 * | 8674 * |
| 9467 * @param token the token being tested | 8675 * @param token the token being tested |
| 9468 * @param identifier the identifier that can optionally appear in the current
location | 8676 * @param identifier the identifier that can optionally appear in the current
location |
| 9469 * @return `true` if the current token matches the given identifier | 8677 * @return `true` if the current token matches the given identifier |
| 9470 */ | 8678 */ |
| 9471 bool _tokenMatchesString(Token token, String identifier) => | 8679 bool _tokenMatchesString(Token token, String identifier) => |
| 9472 token.type == TokenType.IDENTIFIER && token.lexeme == identifier; | 8680 token.type == TokenType.IDENTIFIER && token.lexeme == identifier; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9520 // Illegal escape sequence: not enough hex digits | 8728 // Illegal escape sequence: not enough hex digits |
| 9521 _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE); | 8729 _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE); |
| 9522 return length; | 8730 return length; |
| 9523 } | 8731 } |
| 9524 int firstDigit = lexeme.codeUnitAt(currentIndex + 1); | 8732 int firstDigit = lexeme.codeUnitAt(currentIndex + 1); |
| 9525 int secondDigit = lexeme.codeUnitAt(currentIndex + 2); | 8733 int secondDigit = lexeme.codeUnitAt(currentIndex + 2); |
| 9526 if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit)) { | 8734 if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit)) { |
| 9527 // Illegal escape sequence: invalid hex digit | 8735 // Illegal escape sequence: invalid hex digit |
| 9528 _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE); | 8736 _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE); |
| 9529 } else { | 8737 } else { |
| 9530 int charCode = | 8738 int charCode = (Character.digit(firstDigit, 16) << 4) + |
| 9531 (Character.digit(firstDigit, 16) << 4) + | |
| 9532 Character.digit(secondDigit, 16); | 8739 Character.digit(secondDigit, 16); |
| 9533 buffer.writeCharCode(charCode); | 8740 buffer.writeCharCode(charCode); |
| 9534 } | 8741 } |
| 9535 return currentIndex + 3; | 8742 return currentIndex + 3; |
| 9536 } else if (currentChar == 0x75) { | 8743 } else if (currentChar == 0x75) { |
| 9537 currentIndex++; | 8744 currentIndex++; |
| 9538 if (currentIndex >= length) { | 8745 if (currentIndex >= length) { |
| 9539 // Illegal escape sequence: not enough hex digits | 8746 // Illegal escape sequence: not enough hex digits |
| 9540 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); | 8747 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 9541 return length; | 8748 return length; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 9569 // Illegal escape sequence: incomplete escape | 8776 // Illegal escape sequence: incomplete escape |
| 9570 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); | 8777 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 9571 return length; | 8778 return length; |
| 9572 } | 8779 } |
| 9573 currentChar = lexeme.codeUnitAt(currentIndex); | 8780 currentChar = lexeme.codeUnitAt(currentIndex); |
| 9574 } | 8781 } |
| 9575 if (digitCount < 1 || digitCount > 6) { | 8782 if (digitCount < 1 || digitCount > 6) { |
| 9576 // Illegal escape sequence: not enough or too many hex digits | 8783 // Illegal escape sequence: not enough or too many hex digits |
| 9577 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); | 8784 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 9578 } | 8785 } |
| 9579 _appendScalarValue( | 8786 _appendScalarValue(buffer, lexeme.substring(index, currentIndex + 1), |
| 9580 buffer, | 8787 value, index, currentIndex); |
| 9581 lexeme.substring(index, currentIndex + 1), | |
| 9582 value, | |
| 9583 index, | |
| 9584 currentIndex); | |
| 9585 return currentIndex + 1; | 8788 return currentIndex + 1; |
| 9586 } else { | 8789 } else { |
| 9587 if (currentIndex + 3 >= length) { | 8790 if (currentIndex + 3 >= length) { |
| 9588 // Illegal escape sequence: not enough hex digits | 8791 // Illegal escape sequence: not enough hex digits |
| 9589 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); | 8792 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 9590 return length; | 8793 return length; |
| 9591 } | 8794 } |
| 9592 int firstDigit = currentChar; | 8795 int firstDigit = currentChar; |
| 9593 int secondDigit = lexeme.codeUnitAt(currentIndex + 1); | 8796 int secondDigit = lexeme.codeUnitAt(currentIndex + 1); |
| 9594 int thirdDigit = lexeme.codeUnitAt(currentIndex + 2); | 8797 int thirdDigit = lexeme.codeUnitAt(currentIndex + 2); |
| 9595 int fourthDigit = lexeme.codeUnitAt(currentIndex + 3); | 8798 int fourthDigit = lexeme.codeUnitAt(currentIndex + 3); |
| 9596 if (!_isHexDigit(firstDigit) || | 8799 if (!_isHexDigit(firstDigit) || |
| 9597 !_isHexDigit(secondDigit) || | 8800 !_isHexDigit(secondDigit) || |
| 9598 !_isHexDigit(thirdDigit) || | 8801 !_isHexDigit(thirdDigit) || |
| 9599 !_isHexDigit(fourthDigit)) { | 8802 !_isHexDigit(fourthDigit)) { |
| 9600 // Illegal escape sequence: invalid hex digits | 8803 // Illegal escape sequence: invalid hex digits |
| 9601 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); | 8804 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 9602 } else { | 8805 } else { |
| 9603 _appendScalarValue( | 8806 _appendScalarValue(buffer, lexeme.substring(index, currentIndex + 1), |
| 9604 buffer, | |
| 9605 lexeme.substring(index, currentIndex + 1), | |
| 9606 (((((Character.digit(firstDigit, 16) << 4) + | 8807 (((((Character.digit(firstDigit, 16) << 4) + |
| 9607 Character.digit(secondDigit, 16)) << | 8808 Character.digit(secondDigit, 16)) << |
| 9608 4) + | 8809 4) + |
| 9609 Character.digit(thirdDigit, 16)) << | 8810 Character.digit(thirdDigit, 16)) << |
| 9610 4) + | 8811 4) + |
| 9611 Character.digit(fourthDigit, 16), | 8812 Character.digit(fourthDigit, 16), index, currentIndex + 3); |
| 9612 index, | |
| 9613 currentIndex + 3); | |
| 9614 } | 8813 } |
| 9615 return currentIndex + 4; | 8814 return currentIndex + 4; |
| 9616 } | 8815 } |
| 9617 } else { | 8816 } else { |
| 9618 buffer.writeCharCode(currentChar); | 8817 buffer.writeCharCode(currentChar); |
| 9619 } | 8818 } |
| 9620 return currentIndex + 1; | 8819 return currentIndex + 1; |
| 9621 } | 8820 } |
| 9622 | 8821 |
| 9623 /** | 8822 /** |
| (...skipping 29 matching lines...) Expand all Loading... |
| 9653 * | 8852 * |
| 9654 * @param modifiers the modifiers being validated | 8853 * @param modifiers the modifiers being validated |
| 9655 */ | 8854 */ |
| 9656 Token _validateModifiersForClass(Modifiers modifiers) { | 8855 Token _validateModifiersForClass(Modifiers modifiers) { |
| 9657 _validateModifiersForTopLevelDeclaration(modifiers); | 8856 _validateModifiersForTopLevelDeclaration(modifiers); |
| 9658 if (modifiers.constKeyword != null) { | 8857 if (modifiers.constKeyword != null) { |
| 9659 _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword); | 8858 _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword); |
| 9660 } | 8859 } |
| 9661 if (modifiers.externalKeyword != null) { | 8860 if (modifiers.externalKeyword != null) { |
| 9662 _reportErrorForToken( | 8861 _reportErrorForToken( |
| 9663 ParserErrorCode.EXTERNAL_CLASS, | 8862 ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword); |
| 9664 modifiers.externalKeyword); | |
| 9665 } | 8863 } |
| 9666 if (modifiers.finalKeyword != null) { | 8864 if (modifiers.finalKeyword != null) { |
| 9667 _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword); | 8865 _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword); |
| 9668 } | 8866 } |
| 9669 if (modifiers.varKeyword != null) { | 8867 if (modifiers.varKeyword != null) { |
| 9670 _reportErrorForToken(ParserErrorCode.VAR_CLASS, modifiers.varKeyword); | 8868 _reportErrorForToken(ParserErrorCode.VAR_CLASS, modifiers.varKeyword); |
| 9671 } | 8869 } |
| 9672 return modifiers.abstractKeyword; | 8870 return modifiers.abstractKeyword; |
| 9673 } | 8871 } |
| 9674 | 8872 |
| 9675 /** | 8873 /** |
| 9676 * Validate that the given set of modifiers is appropriate for a constructor a
nd return the | 8874 * Validate that the given set of modifiers is appropriate for a constructor a
nd return the |
| 9677 * 'const' keyword if there is one. | 8875 * 'const' keyword if there is one. |
| 9678 * | 8876 * |
| 9679 * @param modifiers the modifiers being validated | 8877 * @param modifiers the modifiers being validated |
| 9680 * @return the 'const' or 'final' keyword associated with the constructor | 8878 * @return the 'const' or 'final' keyword associated with the constructor |
| 9681 */ | 8879 */ |
| 9682 Token _validateModifiersForConstructor(Modifiers modifiers) { | 8880 Token _validateModifiersForConstructor(Modifiers modifiers) { |
| 9683 if (modifiers.abstractKeyword != null) { | 8881 if (modifiers.abstractKeyword != null) { |
| 9684 _reportErrorForToken( | 8882 _reportErrorForToken( |
| 9685 ParserErrorCode.ABSTRACT_CLASS_MEMBER, | 8883 ParserErrorCode.ABSTRACT_CLASS_MEMBER, modifiers.abstractKeyword); |
| 9686 modifiers.abstractKeyword); | |
| 9687 } | 8884 } |
| 9688 if (modifiers.finalKeyword != null) { | 8885 if (modifiers.finalKeyword != null) { |
| 9689 _reportErrorForToken( | 8886 _reportErrorForToken( |
| 9690 ParserErrorCode.FINAL_CONSTRUCTOR, | 8887 ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword); |
| 9691 modifiers.finalKeyword); | |
| 9692 } | 8888 } |
| 9693 if (modifiers.staticKeyword != null) { | 8889 if (modifiers.staticKeyword != null) { |
| 9694 _reportErrorForToken( | 8890 _reportErrorForToken( |
| 9695 ParserErrorCode.STATIC_CONSTRUCTOR, | 8891 ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword); |
| 9696 modifiers.staticKeyword); | |
| 9697 } | 8892 } |
| 9698 if (modifiers.varKeyword != null) { | 8893 if (modifiers.varKeyword != null) { |
| 9699 _reportErrorForToken( | 8894 _reportErrorForToken( |
| 9700 ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, | 8895 ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword); |
| 9701 modifiers.varKeyword); | |
| 9702 } | 8896 } |
| 9703 Token externalKeyword = modifiers.externalKeyword; | 8897 Token externalKeyword = modifiers.externalKeyword; |
| 9704 Token constKeyword = modifiers.constKeyword; | 8898 Token constKeyword = modifiers.constKeyword; |
| 9705 Token factoryKeyword = modifiers.factoryKeyword; | 8899 Token factoryKeyword = modifiers.factoryKeyword; |
| 9706 if (externalKeyword != null && | 8900 if (externalKeyword != null && |
| 9707 constKeyword != null && | 8901 constKeyword != null && |
| 9708 constKeyword.offset < externalKeyword.offset) { | 8902 constKeyword.offset < externalKeyword.offset) { |
| 9709 _reportErrorForToken( | 8903 _reportErrorForToken( |
| 9710 ParserErrorCode.EXTERNAL_AFTER_CONST, | 8904 ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword); |
| 9711 externalKeyword); | |
| 9712 } | 8905 } |
| 9713 if (externalKeyword != null && | 8906 if (externalKeyword != null && |
| 9714 factoryKeyword != null && | 8907 factoryKeyword != null && |
| 9715 factoryKeyword.offset < externalKeyword.offset) { | 8908 factoryKeyword.offset < externalKeyword.offset) { |
| 9716 _reportErrorForToken( | 8909 _reportErrorForToken( |
| 9717 ParserErrorCode.EXTERNAL_AFTER_FACTORY, | 8910 ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword); |
| 9718 externalKeyword); | |
| 9719 } | 8911 } |
| 9720 return constKeyword; | 8912 return constKeyword; |
| 9721 } | 8913 } |
| 9722 | 8914 |
| 9723 /** | 8915 /** |
| 9724 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' | 8916 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' |
| 9725 * keyword if there is one. | 8917 * keyword if there is one. |
| 9726 * | 8918 * |
| 9727 * @param modifiers the modifiers being validated | 8919 * @param modifiers the modifiers being validated |
| 9728 */ | 8920 */ |
| 9729 void _validateModifiersForEnum(Modifiers modifiers) { | 8921 void _validateModifiersForEnum(Modifiers modifiers) { |
| 9730 _validateModifiersForTopLevelDeclaration(modifiers); | 8922 _validateModifiersForTopLevelDeclaration(modifiers); |
| 9731 if (modifiers.abstractKeyword != null) { | 8923 if (modifiers.abstractKeyword != null) { |
| 9732 _reportErrorForToken( | 8924 _reportErrorForToken( |
| 9733 ParserErrorCode.ABSTRACT_ENUM, | 8925 ParserErrorCode.ABSTRACT_ENUM, modifiers.abstractKeyword); |
| 9734 modifiers.abstractKeyword); | |
| 9735 } | 8926 } |
| 9736 if (modifiers.constKeyword != null) { | 8927 if (modifiers.constKeyword != null) { |
| 9737 _reportErrorForToken(ParserErrorCode.CONST_ENUM, modifiers.constKeyword); | 8928 _reportErrorForToken(ParserErrorCode.CONST_ENUM, modifiers.constKeyword); |
| 9738 } | 8929 } |
| 9739 if (modifiers.externalKeyword != null) { | 8930 if (modifiers.externalKeyword != null) { |
| 9740 _reportErrorForToken( | 8931 _reportErrorForToken( |
| 9741 ParserErrorCode.EXTERNAL_ENUM, | 8932 ParserErrorCode.EXTERNAL_ENUM, modifiers.externalKeyword); |
| 9742 modifiers.externalKeyword); | |
| 9743 } | 8933 } |
| 9744 if (modifiers.finalKeyword != null) { | 8934 if (modifiers.finalKeyword != null) { |
| 9745 _reportErrorForToken(ParserErrorCode.FINAL_ENUM, modifiers.finalKeyword); | 8935 _reportErrorForToken(ParserErrorCode.FINAL_ENUM, modifiers.finalKeyword); |
| 9746 } | 8936 } |
| 9747 if (modifiers.varKeyword != null) { | 8937 if (modifiers.varKeyword != null) { |
| 9748 _reportErrorForToken(ParserErrorCode.VAR_ENUM, modifiers.varKeyword); | 8938 _reportErrorForToken(ParserErrorCode.VAR_ENUM, modifiers.varKeyword); |
| 9749 } | 8939 } |
| 9750 } | 8940 } |
| 9751 | 8941 |
| 9752 /** | 8942 /** |
| 9753 * Validate that the given set of modifiers is appropriate for a field and ret
urn the 'final', | 8943 * Validate that the given set of modifiers is appropriate for a field and ret
urn the 'final', |
| 9754 * 'const' or 'var' keyword if there is one. | 8944 * 'const' or 'var' keyword if there is one. |
| 9755 * | 8945 * |
| 9756 * @param modifiers the modifiers being validated | 8946 * @param modifiers the modifiers being validated |
| 9757 * @return the 'final', 'const' or 'var' keyword associated with the field | 8947 * @return the 'final', 'const' or 'var' keyword associated with the field |
| 9758 */ | 8948 */ |
| 9759 Token _validateModifiersForField(Modifiers modifiers) { | 8949 Token _validateModifiersForField(Modifiers modifiers) { |
| 9760 if (modifiers.abstractKeyword != null) { | 8950 if (modifiers.abstractKeyword != null) { |
| 9761 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); | 8951 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); |
| 9762 } | 8952 } |
| 9763 if (modifiers.externalKeyword != null) { | 8953 if (modifiers.externalKeyword != null) { |
| 9764 _reportErrorForToken( | 8954 _reportErrorForToken( |
| 9765 ParserErrorCode.EXTERNAL_FIELD, | 8955 ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword); |
| 9766 modifiers.externalKeyword); | |
| 9767 } | 8956 } |
| 9768 if (modifiers.factoryKeyword != null) { | 8957 if (modifiers.factoryKeyword != null) { |
| 9769 _reportErrorForToken( | 8958 _reportErrorForToken( |
| 9770 ParserErrorCode.NON_CONSTRUCTOR_FACTORY, | 8959 ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword); |
| 9771 modifiers.factoryKeyword); | |
| 9772 } | 8960 } |
| 9773 Token staticKeyword = modifiers.staticKeyword; | 8961 Token staticKeyword = modifiers.staticKeyword; |
| 9774 Token constKeyword = modifiers.constKeyword; | 8962 Token constKeyword = modifiers.constKeyword; |
| 9775 Token finalKeyword = modifiers.finalKeyword; | 8963 Token finalKeyword = modifiers.finalKeyword; |
| 9776 Token varKeyword = modifiers.varKeyword; | 8964 Token varKeyword = modifiers.varKeyword; |
| 9777 if (constKeyword != null) { | 8965 if (constKeyword != null) { |
| 9778 if (finalKeyword != null) { | 8966 if (finalKeyword != null) { |
| 9779 _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword); | 8967 _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword); |
| 9780 } | 8968 } |
| 9781 if (varKeyword != null) { | 8969 if (varKeyword != null) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9821 * Validate that the given set of modifiers is appropriate for a getter, sette
r, or method. | 9009 * Validate that the given set of modifiers is appropriate for a getter, sette
r, or method. |
| 9822 * | 9010 * |
| 9823 * @param modifiers the modifiers being validated | 9011 * @param modifiers the modifiers being validated |
| 9824 */ | 9012 */ |
| 9825 void _validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) { | 9013 void _validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) { |
| 9826 if (modifiers.abstractKeyword != null) { | 9014 if (modifiers.abstractKeyword != null) { |
| 9827 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); | 9015 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); |
| 9828 } | 9016 } |
| 9829 if (modifiers.constKeyword != null) { | 9017 if (modifiers.constKeyword != null) { |
| 9830 _reportErrorForToken( | 9018 _reportErrorForToken( |
| 9831 ParserErrorCode.CONST_METHOD, | 9019 ParserErrorCode.CONST_METHOD, modifiers.constKeyword); |
| 9832 modifiers.constKeyword); | |
| 9833 } | 9020 } |
| 9834 if (modifiers.factoryKeyword != null) { | 9021 if (modifiers.factoryKeyword != null) { |
| 9835 _reportErrorForToken( | 9022 _reportErrorForToken( |
| 9836 ParserErrorCode.NON_CONSTRUCTOR_FACTORY, | 9023 ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword); |
| 9837 modifiers.factoryKeyword); | |
| 9838 } | 9024 } |
| 9839 if (modifiers.finalKeyword != null) { | 9025 if (modifiers.finalKeyword != null) { |
| 9840 _reportErrorForToken( | 9026 _reportErrorForToken( |
| 9841 ParserErrorCode.FINAL_METHOD, | 9027 ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword); |
| 9842 modifiers.finalKeyword); | |
| 9843 } | 9028 } |
| 9844 if (modifiers.varKeyword != null) { | 9029 if (modifiers.varKeyword != null) { |
| 9845 _reportErrorForToken( | 9030 _reportErrorForToken( |
| 9846 ParserErrorCode.VAR_RETURN_TYPE, | 9031 ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword); |
| 9847 modifiers.varKeyword); | |
| 9848 } | 9032 } |
| 9849 Token externalKeyword = modifiers.externalKeyword; | 9033 Token externalKeyword = modifiers.externalKeyword; |
| 9850 Token staticKeyword = modifiers.staticKeyword; | 9034 Token staticKeyword = modifiers.staticKeyword; |
| 9851 if (externalKeyword != null && | 9035 if (externalKeyword != null && |
| 9852 staticKeyword != null && | 9036 staticKeyword != null && |
| 9853 staticKeyword.offset < externalKeyword.offset) { | 9037 staticKeyword.offset < externalKeyword.offset) { |
| 9854 _reportErrorForToken( | 9038 _reportErrorForToken( |
| 9855 ParserErrorCode.EXTERNAL_AFTER_STATIC, | 9039 ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword); |
| 9856 externalKeyword); | |
| 9857 } | 9040 } |
| 9858 } | 9041 } |
| 9859 | 9042 |
| 9860 /** | 9043 /** |
| 9861 * Validate that the given set of modifiers is appropriate for a getter, sette
r, or method. | 9044 * Validate that the given set of modifiers is appropriate for a getter, sette
r, or method. |
| 9862 * | 9045 * |
| 9863 * @param modifiers the modifiers being validated | 9046 * @param modifiers the modifiers being validated |
| 9864 */ | 9047 */ |
| 9865 void _validateModifiersForOperator(Modifiers modifiers) { | 9048 void _validateModifiersForOperator(Modifiers modifiers) { |
| 9866 if (modifiers.abstractKeyword != null) { | 9049 if (modifiers.abstractKeyword != null) { |
| 9867 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); | 9050 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); |
| 9868 } | 9051 } |
| 9869 if (modifiers.constKeyword != null) { | 9052 if (modifiers.constKeyword != null) { |
| 9870 _reportErrorForToken( | 9053 _reportErrorForToken( |
| 9871 ParserErrorCode.CONST_METHOD, | 9054 ParserErrorCode.CONST_METHOD, modifiers.constKeyword); |
| 9872 modifiers.constKeyword); | |
| 9873 } | 9055 } |
| 9874 if (modifiers.factoryKeyword != null) { | 9056 if (modifiers.factoryKeyword != null) { |
| 9875 _reportErrorForToken( | 9057 _reportErrorForToken( |
| 9876 ParserErrorCode.NON_CONSTRUCTOR_FACTORY, | 9058 ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword); |
| 9877 modifiers.factoryKeyword); | |
| 9878 } | 9059 } |
| 9879 if (modifiers.finalKeyword != null) { | 9060 if (modifiers.finalKeyword != null) { |
| 9880 _reportErrorForToken( | 9061 _reportErrorForToken( |
| 9881 ParserErrorCode.FINAL_METHOD, | 9062 ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword); |
| 9882 modifiers.finalKeyword); | |
| 9883 } | 9063 } |
| 9884 if (modifiers.staticKeyword != null) { | 9064 if (modifiers.staticKeyword != null) { |
| 9885 _reportErrorForToken( | 9065 _reportErrorForToken( |
| 9886 ParserErrorCode.STATIC_OPERATOR, | 9066 ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword); |
| 9887 modifiers.staticKeyword); | |
| 9888 } | 9067 } |
| 9889 if (modifiers.varKeyword != null) { | 9068 if (modifiers.varKeyword != null) { |
| 9890 _reportErrorForToken( | 9069 _reportErrorForToken( |
| 9891 ParserErrorCode.VAR_RETURN_TYPE, | 9070 ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword); |
| 9892 modifiers.varKeyword); | |
| 9893 } | 9071 } |
| 9894 } | 9072 } |
| 9895 | 9073 |
| 9896 /** | 9074 /** |
| 9897 * Validate that the given set of modifiers is appropriate for a top-level dec
laration. | 9075 * Validate that the given set of modifiers is appropriate for a top-level dec
laration. |
| 9898 * | 9076 * |
| 9899 * @param modifiers the modifiers being validated | 9077 * @param modifiers the modifiers being validated |
| 9900 */ | 9078 */ |
| 9901 void _validateModifiersForTopLevelDeclaration(Modifiers modifiers) { | 9079 void _validateModifiersForTopLevelDeclaration(Modifiers modifiers) { |
| 9902 if (modifiers.factoryKeyword != null) { | 9080 if (modifiers.factoryKeyword != null) { |
| 9903 _reportErrorForToken( | 9081 _reportErrorForToken(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, |
| 9904 ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, | |
| 9905 modifiers.factoryKeyword); | 9082 modifiers.factoryKeyword); |
| 9906 } | 9083 } |
| 9907 if (modifiers.staticKeyword != null) { | 9084 if (modifiers.staticKeyword != null) { |
| 9908 _reportErrorForToken( | 9085 _reportErrorForToken(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, |
| 9909 ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, | |
| 9910 modifiers.staticKeyword); | 9086 modifiers.staticKeyword); |
| 9911 } | 9087 } |
| 9912 } | 9088 } |
| 9913 | 9089 |
| 9914 /** | 9090 /** |
| 9915 * Validate that the given set of modifiers is appropriate for a top-level fun
ction. | 9091 * Validate that the given set of modifiers is appropriate for a top-level fun
ction. |
| 9916 * | 9092 * |
| 9917 * @param modifiers the modifiers being validated | 9093 * @param modifiers the modifiers being validated |
| 9918 */ | 9094 */ |
| 9919 void _validateModifiersForTopLevelFunction(Modifiers modifiers) { | 9095 void _validateModifiersForTopLevelFunction(Modifiers modifiers) { |
| 9920 _validateModifiersForTopLevelDeclaration(modifiers); | 9096 _validateModifiersForTopLevelDeclaration(modifiers); |
| 9921 if (modifiers.abstractKeyword != null) { | 9097 if (modifiers.abstractKeyword != null) { |
| 9922 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION); | 9098 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION); |
| 9923 } | 9099 } |
| 9924 if (modifiers.constKeyword != null) { | 9100 if (modifiers.constKeyword != null) { |
| 9925 _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword); | 9101 _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword); |
| 9926 } | 9102 } |
| 9927 if (modifiers.finalKeyword != null) { | 9103 if (modifiers.finalKeyword != null) { |
| 9928 _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword); | 9104 _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword); |
| 9929 } | 9105 } |
| 9930 if (modifiers.varKeyword != null) { | 9106 if (modifiers.varKeyword != null) { |
| 9931 _reportErrorForToken( | 9107 _reportErrorForToken( |
| 9932 ParserErrorCode.VAR_RETURN_TYPE, | 9108 ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword); |
| 9933 modifiers.varKeyword); | |
| 9934 } | 9109 } |
| 9935 } | 9110 } |
| 9936 | 9111 |
| 9937 /** | 9112 /** |
| 9938 * Validate that the given set of modifiers is appropriate for a field and ret
urn the 'final', | 9113 * Validate that the given set of modifiers is appropriate for a field and ret
urn the 'final', |
| 9939 * 'const' or 'var' keyword if there is one. | 9114 * 'const' or 'var' keyword if there is one. |
| 9940 * | 9115 * |
| 9941 * @param modifiers the modifiers being validated | 9116 * @param modifiers the modifiers being validated |
| 9942 * @return the 'final', 'const' or 'var' keyword associated with the field | 9117 * @return the 'final', 'const' or 'var' keyword associated with the field |
| 9943 */ | 9118 */ |
| 9944 Token _validateModifiersForTopLevelVariable(Modifiers modifiers) { | 9119 Token _validateModifiersForTopLevelVariable(Modifiers modifiers) { |
| 9945 _validateModifiersForTopLevelDeclaration(modifiers); | 9120 _validateModifiersForTopLevelDeclaration(modifiers); |
| 9946 if (modifiers.abstractKeyword != null) { | 9121 if (modifiers.abstractKeyword != null) { |
| 9947 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE); | 9122 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE); |
| 9948 } | 9123 } |
| 9949 if (modifiers.externalKeyword != null) { | 9124 if (modifiers.externalKeyword != null) { |
| 9950 _reportErrorForToken( | 9125 _reportErrorForToken( |
| 9951 ParserErrorCode.EXTERNAL_FIELD, | 9126 ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword); |
| 9952 modifiers.externalKeyword); | |
| 9953 } | 9127 } |
| 9954 Token constKeyword = modifiers.constKeyword; | 9128 Token constKeyword = modifiers.constKeyword; |
| 9955 Token finalKeyword = modifiers.finalKeyword; | 9129 Token finalKeyword = modifiers.finalKeyword; |
| 9956 Token varKeyword = modifiers.varKeyword; | 9130 Token varKeyword = modifiers.varKeyword; |
| 9957 if (constKeyword != null) { | 9131 if (constKeyword != null) { |
| 9958 if (finalKeyword != null) { | 9132 if (finalKeyword != null) { |
| 9959 _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword); | 9133 _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword); |
| 9960 } | 9134 } |
| 9961 if (varKeyword != null) { | 9135 if (varKeyword != null) { |
| 9962 _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword); | 9136 _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword); |
| 9963 } | 9137 } |
| 9964 } else if (finalKeyword != null) { | 9138 } else if (finalKeyword != null) { |
| 9965 if (varKeyword != null) { | 9139 if (varKeyword != null) { |
| 9966 _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword); | 9140 _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword); |
| 9967 } | 9141 } |
| 9968 } | 9142 } |
| 9969 return Token.lexicallyFirst([constKeyword, finalKeyword, varKeyword]); | 9143 return Token.lexicallyFirst([constKeyword, finalKeyword, varKeyword]); |
| 9970 } | 9144 } |
| 9971 | 9145 |
| 9972 /** | 9146 /** |
| 9973 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' | 9147 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' |
| 9974 * keyword if there is one. | 9148 * keyword if there is one. |
| 9975 * | 9149 * |
| 9976 * @param modifiers the modifiers being validated | 9150 * @param modifiers the modifiers being validated |
| 9977 */ | 9151 */ |
| 9978 void _validateModifiersForTypedef(Modifiers modifiers) { | 9152 void _validateModifiersForTypedef(Modifiers modifiers) { |
| 9979 _validateModifiersForTopLevelDeclaration(modifiers); | 9153 _validateModifiersForTopLevelDeclaration(modifiers); |
| 9980 if (modifiers.abstractKeyword != null) { | 9154 if (modifiers.abstractKeyword != null) { |
| 9981 _reportErrorForToken( | 9155 _reportErrorForToken( |
| 9982 ParserErrorCode.ABSTRACT_TYPEDEF, | 9156 ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword); |
| 9983 modifiers.abstractKeyword); | |
| 9984 } | 9157 } |
| 9985 if (modifiers.constKeyword != null) { | 9158 if (modifiers.constKeyword != null) { |
| 9986 _reportErrorForToken( | 9159 _reportErrorForToken( |
| 9987 ParserErrorCode.CONST_TYPEDEF, | 9160 ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword); |
| 9988 modifiers.constKeyword); | |
| 9989 } | 9161 } |
| 9990 if (modifiers.externalKeyword != null) { | 9162 if (modifiers.externalKeyword != null) { |
| 9991 _reportErrorForToken( | 9163 _reportErrorForToken( |
| 9992 ParserErrorCode.EXTERNAL_TYPEDEF, | 9164 ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword); |
| 9993 modifiers.externalKeyword); | |
| 9994 } | 9165 } |
| 9995 if (modifiers.finalKeyword != null) { | 9166 if (modifiers.finalKeyword != null) { |
| 9996 _reportErrorForToken( | 9167 _reportErrorForToken( |
| 9997 ParserErrorCode.FINAL_TYPEDEF, | 9168 ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword); |
| 9998 modifiers.finalKeyword); | |
| 9999 } | 9169 } |
| 10000 if (modifiers.varKeyword != null) { | 9170 if (modifiers.varKeyword != null) { |
| 10001 _reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword); | 9171 _reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword); |
| 10002 } | 9172 } |
| 10003 } | 9173 } |
| 10004 } | 9174 } |
| 10005 /** | 9175 /** |
| 10006 * Instances of the class `SyntheticKeywordToken` implement a synthetic keyword
token. | 9176 * Instances of the class `SyntheticKeywordToken` implement a synthetic keyword
token. |
| 10007 */ | 9177 */ |
| 10008 class Parser_SyntheticKeywordToken extends KeywordToken { | 9178 class Parser_SyntheticKeywordToken extends KeywordToken { |
| 10009 /** | 9179 /** |
| 10010 * Initialize a newly created token to represent the given keyword. | 9180 * Initialize a newly created token to represent the given keyword. |
| 10011 * | 9181 * |
| 10012 * @param keyword the keyword being represented by this token | 9182 * @param keyword the keyword being represented by this token |
| 10013 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 9183 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
| 10014 */ | 9184 */ |
| 10015 Parser_SyntheticKeywordToken(Keyword keyword, int offset) | 9185 Parser_SyntheticKeywordToken(Keyword keyword, int offset) |
| 10016 : super(keyword, offset); | 9186 : super(keyword, offset); |
| 10017 | 9187 |
| 10018 @override | 9188 @override |
| 10019 int get length => 0; | 9189 int get length => 0; |
| 10020 | 9190 |
| 10021 @override | 9191 @override |
| 10022 Token copy() => new Parser_SyntheticKeywordToken(keyword, offset); | 9192 Token copy() => new Parser_SyntheticKeywordToken(keyword, offset); |
| 10023 } | 9193 } |
| 10024 | 9194 |
| 10025 | |
| 10026 /** | 9195 /** |
| 10027 * The enumeration `ParserErrorCode` defines the error codes used for errors | 9196 * The enumeration `ParserErrorCode` defines the error codes used for errors |
| 10028 * detected by the parser. The convention for this class is for the name of the | 9197 * detected by the parser. The convention for this class is for the name of the |
| 10029 * error code to indicate the problem that caused the error to be generated and | 9198 * error code to indicate the problem that caused the error to be generated and |
| 10030 * for the error message to explain what is wrong and, when appropriate, how the | 9199 * for the error message to explain what is wrong and, when appropriate, how the |
| 10031 * problem can be corrected. | 9200 * problem can be corrected. |
| 10032 */ | 9201 */ |
| 10033 class ParserErrorCode extends ErrorCode { | 9202 class ParserErrorCode extends ErrorCode { |
| 10034 static const ParserErrorCode ABSTRACT_CLASS_MEMBER = const ParserErrorCode( | 9203 static const ParserErrorCode ABSTRACT_CLASS_MEMBER = const ParserErrorCode( |
| 10035 'ABSTRACT_CLASS_MEMBER', | 9204 'ABSTRACT_CLASS_MEMBER', |
| 10036 "Members of classes cannot be declared to be 'abstract'"); | 9205 "Members of classes cannot be declared to be 'abstract'"); |
| 10037 | 9206 |
| 10038 static const ParserErrorCode ABSTRACT_ENUM = const ParserErrorCode( | 9207 static const ParserErrorCode ABSTRACT_ENUM = const ParserErrorCode( |
| 10039 'ABSTRACT_ENUM', | 9208 'ABSTRACT_ENUM', "Enums cannot be declared to be 'abstract'"); |
| 10040 "Enums cannot be declared to be 'abstract'"); | |
| 10041 | 9209 |
| 10042 static const ParserErrorCode ABSTRACT_STATIC_METHOD = const ParserErrorCode( | 9210 static const ParserErrorCode ABSTRACT_STATIC_METHOD = const ParserErrorCode( |
| 10043 'ABSTRACT_STATIC_METHOD', | 9211 'ABSTRACT_STATIC_METHOD', |
| 10044 "Static methods cannot be declared to be 'abstract'"); | 9212 "Static methods cannot be declared to be 'abstract'"); |
| 10045 | 9213 |
| 10046 static const ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = | 9214 static const ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = |
| 10047 const ParserErrorCode( | 9215 const ParserErrorCode('ABSTRACT_TOP_LEVEL_FUNCTION', |
| 10048 'ABSTRACT_TOP_LEVEL_FUNCTION', | |
| 10049 "Top-level functions cannot be declared to be 'abstract'"); | 9216 "Top-level functions cannot be declared to be 'abstract'"); |
| 10050 | 9217 |
| 10051 static const ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = | 9218 static const ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = |
| 10052 const ParserErrorCode( | 9219 const ParserErrorCode('ABSTRACT_TOP_LEVEL_VARIABLE', |
| 10053 'ABSTRACT_TOP_LEVEL_VARIABLE', | |
| 10054 "Top-level variables cannot be declared to be 'abstract'"); | 9220 "Top-level variables cannot be declared to be 'abstract'"); |
| 10055 | 9221 |
| 10056 static const ParserErrorCode ABSTRACT_TYPEDEF = const ParserErrorCode( | 9222 static const ParserErrorCode ABSTRACT_TYPEDEF = const ParserErrorCode( |
| 10057 'ABSTRACT_TYPEDEF', | 9223 'ABSTRACT_TYPEDEF', "Type aliases cannot be declared to be 'abstract'"); |
| 10058 "Type aliases cannot be declared to be 'abstract'"); | |
| 10059 | 9224 |
| 10060 static const ParserErrorCode ANNOTATION_ON_ENUM_CONSTANT = | 9225 static const ParserErrorCode ANNOTATION_ON_ENUM_CONSTANT = |
| 10061 const ParserErrorCode( | 9226 const ParserErrorCode('ANNOTATION_ON_ENUM_CONSTANT', |
| 10062 'ANNOTATION_ON_ENUM_CONSTANT', | |
| 10063 "Enum constants cannot have annotations"); | 9227 "Enum constants cannot have annotations"); |
| 10064 | 9228 |
| 10065 static const ParserErrorCode ASSERT_DOES_NOT_TAKE_ASSIGNMENT = | 9229 static const ParserErrorCode ASSERT_DOES_NOT_TAKE_ASSIGNMENT = |
| 10066 const ParserErrorCode( | 9230 const ParserErrorCode('ASSERT_DOES_NOT_TAKE_ASSIGNMENT', |
| 10067 'ASSERT_DOES_NOT_TAKE_ASSIGNMENT', | |
| 10068 "Assert cannot be called on an assignment"); | 9231 "Assert cannot be called on an assignment"); |
| 10069 | 9232 |
| 10070 static const ParserErrorCode ASSERT_DOES_NOT_TAKE_CASCADE = | 9233 static const ParserErrorCode ASSERT_DOES_NOT_TAKE_CASCADE = |
| 10071 const ParserErrorCode( | 9234 const ParserErrorCode( |
| 10072 'ASSERT_DOES_NOT_TAKE_CASCADE', | 9235 'ASSERT_DOES_NOT_TAKE_CASCADE', "Assert cannot be called on cascade"); |
| 10073 "Assert cannot be called on cascade"); | |
| 10074 | 9236 |
| 10075 static const ParserErrorCode ASSERT_DOES_NOT_TAKE_THROW = | 9237 static const ParserErrorCode ASSERT_DOES_NOT_TAKE_THROW = |
| 10076 const ParserErrorCode( | 9238 const ParserErrorCode( |
| 10077 'ASSERT_DOES_NOT_TAKE_THROW', | 9239 'ASSERT_DOES_NOT_TAKE_THROW', "Assert cannot be called on throws"); |
| 10078 "Assert cannot be called on throws"); | |
| 10079 | 9240 |
| 10080 static const ParserErrorCode ASSERT_DOES_NOT_TAKE_RETHROW = | 9241 static const ParserErrorCode ASSERT_DOES_NOT_TAKE_RETHROW = |
| 10081 const ParserErrorCode( | 9242 const ParserErrorCode('ASSERT_DOES_NOT_TAKE_RETHROW', |
| 10082 'ASSERT_DOES_NOT_TAKE_RETHROW', | |
| 10083 "Assert cannot be called on rethrows"); | 9243 "Assert cannot be called on rethrows"); |
| 10084 | 9244 |
| 10085 /** | 9245 /** |
| 10086 * 16.32 Identifier Reference: It is a compile-time error if any of the | 9246 * 16.32 Identifier Reference: It is a compile-time error if any of the |
| 10087 * identifiers async, await, or yield is used as an identifier in a function | 9247 * identifiers async, await, or yield is used as an identifier in a function |
| 10088 * body marked with either async, async*, or sync*. | 9248 * body marked with either async, async*, or sync*. |
| 10089 */ | 9249 */ |
| 10090 static const ParserErrorCode ASYNC_KEYWORD_USED_AS_IDENTIFIER = | 9250 static const ParserErrorCode ASYNC_KEYWORD_USED_AS_IDENTIFIER = |
| 10091 const ParserErrorCode( | 9251 const ParserErrorCode('ASYNC_KEYWORD_USED_AS_IDENTIFIER', |
| 10092 'ASYNC_KEYWORD_USED_AS_IDENTIFIER', | |
| 10093 "The keywords 'async', 'await', and 'yield' may not be used as identif
iers in an asynchronous or generator function."); | 9252 "The keywords 'async', 'await', and 'yield' may not be used as identif
iers in an asynchronous or generator function."); |
| 10094 | 9253 |
| 10095 static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = const ParserErrorCode( | 9254 static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = const ParserErrorCode( |
| 10096 'BREAK_OUTSIDE_OF_LOOP', | 9255 'BREAK_OUTSIDE_OF_LOOP', |
| 10097 "A break statement cannot be used outside of a loop or switch statement"); | 9256 "A break statement cannot be used outside of a loop or switch statement"); |
| 10098 | 9257 |
| 10099 static const ParserErrorCode CLASS_IN_CLASS = const ParserErrorCode( | 9258 static const ParserErrorCode CLASS_IN_CLASS = const ParserErrorCode( |
| 10100 'CLASS_IN_CLASS', | 9259 'CLASS_IN_CLASS', "Classes cannot be declared inside other classes"); |
| 10101 "Classes cannot be declared inside other classes"); | |
| 10102 | 9260 |
| 10103 static const ParserErrorCode COLON_IN_PLACE_OF_IN = const ParserErrorCode( | 9261 static const ParserErrorCode COLON_IN_PLACE_OF_IN = const ParserErrorCode( |
| 10104 'COLON_IN_PLACE_OF_IN', | 9262 'COLON_IN_PLACE_OF_IN', "For-in loops use 'in' rather than a colon"); |
| 10105 "For-in loops use 'in' rather than a colon"); | |
| 10106 | 9263 |
| 10107 static const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode( | 9264 static const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode( |
| 10108 'CONST_AND_FINAL', | 9265 'CONST_AND_FINAL', |
| 10109 "Members cannot be declared to be both 'const' and 'final'"); | 9266 "Members cannot be declared to be both 'const' and 'final'"); |
| 10110 | 9267 |
| 10111 static const ParserErrorCode CONST_AND_VAR = const ParserErrorCode( | 9268 static const ParserErrorCode CONST_AND_VAR = const ParserErrorCode( |
| 10112 'CONST_AND_VAR', | 9269 'CONST_AND_VAR', |
| 10113 "Members cannot be declared to be both 'const' and 'var'"); | 9270 "Members cannot be declared to be both 'const' and 'var'"); |
| 10114 | 9271 |
| 10115 static const ParserErrorCode CONST_CLASS = const ParserErrorCode( | 9272 static const ParserErrorCode CONST_CLASS = const ParserErrorCode( |
| 10116 'CONST_CLASS', | 9273 'CONST_CLASS', "Classes cannot be declared to be 'const'"); |
| 10117 "Classes cannot be declared to be 'const'"); | |
| 10118 | 9274 |
| 10119 static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = | 9275 static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = |
| 10120 const ParserErrorCode( | 9276 const ParserErrorCode('CONST_CONSTRUCTOR_WITH_BODY', |
| 10121 'CONST_CONSTRUCTOR_WITH_BODY', | |
| 10122 "'const' constructors cannot have a body"); | 9277 "'const' constructors cannot have a body"); |
| 10123 | 9278 |
| 10124 static const ParserErrorCode CONST_ENUM = | 9279 static const ParserErrorCode CONST_ENUM = const ParserErrorCode( |
| 10125 const ParserErrorCode('CONST_ENUM', "Enums cannot be declared to be 'const
'"); | 9280 'CONST_ENUM', "Enums cannot be declared to be 'const'"); |
| 10126 | 9281 |
| 10127 static const ParserErrorCode CONST_FACTORY = const ParserErrorCode( | 9282 static const ParserErrorCode CONST_FACTORY = const ParserErrorCode( |
| 10128 'CONST_FACTORY', | 9283 'CONST_FACTORY', |
| 10129 "Only redirecting factory constructors can be declared to be 'const'"); | 9284 "Only redirecting factory constructors can be declared to be 'const'"); |
| 10130 | 9285 |
| 10131 static const ParserErrorCode CONST_METHOD = const ParserErrorCode( | 9286 static const ParserErrorCode CONST_METHOD = const ParserErrorCode( |
| 10132 'CONST_METHOD', | 9287 'CONST_METHOD', |
| 10133 "Getters, setters and methods cannot be declared to be 'const'"); | 9288 "Getters, setters and methods cannot be declared to be 'const'"); |
| 10134 | 9289 |
| 10135 static const ParserErrorCode CONST_TYPEDEF = const ParserErrorCode( | 9290 static const ParserErrorCode CONST_TYPEDEF = const ParserErrorCode( |
| 10136 'CONST_TYPEDEF', | 9291 'CONST_TYPEDEF', "Type aliases cannot be declared to be 'const'"); |
| 10137 "Type aliases cannot be declared to be 'const'"); | |
| 10138 | 9292 |
| 10139 static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = | 9293 static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = |
| 10140 const ParserErrorCode( | 9294 const ParserErrorCode('CONSTRUCTOR_WITH_RETURN_TYPE', |
| 10141 'CONSTRUCTOR_WITH_RETURN_TYPE', | |
| 10142 "Constructors cannot have a return type"); | 9295 "Constructors cannot have a return type"); |
| 10143 | 9296 |
| 10144 static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = const ParserErrorCode( | 9297 static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = const ParserErrorCode( |
| 10145 'CONTINUE_OUTSIDE_OF_LOOP', | 9298 'CONTINUE_OUTSIDE_OF_LOOP', |
| 10146 "A continue statement cannot be used outside of a loop or switch statement
"); | 9299 "A continue statement cannot be used outside of a loop or switch statement
"); |
| 10147 | 9300 |
| 10148 static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = | 9301 static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = |
| 10149 const ParserErrorCode( | 9302 const ParserErrorCode('CONTINUE_WITHOUT_LABEL_IN_CASE', |
| 10150 'CONTINUE_WITHOUT_LABEL_IN_CASE', | |
| 10151 "A continue statement in a switch statement must have a label as a tar
get"); | 9303 "A continue statement in a switch statement must have a label as a tar
get"); |
| 10152 | 9304 |
| 10153 static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = | 9305 static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = |
| 10154 const ParserErrorCode( | 9306 const ParserErrorCode('DEPRECATED_CLASS_TYPE_ALIAS', |
| 10155 'DEPRECATED_CLASS_TYPE_ALIAS', | |
| 10156 "The 'typedef' mixin application was replaced with 'class'"); | 9307 "The 'typedef' mixin application was replaced with 'class'"); |
| 10157 | 9308 |
| 10158 static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = | 9309 static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = |
| 10159 const ParserErrorCode( | 9310 const ParserErrorCode('DIRECTIVE_AFTER_DECLARATION', |
| 10160 'DIRECTIVE_AFTER_DECLARATION', | |
| 10161 "Directives must appear before any declarations"); | 9311 "Directives must appear before any declarations"); |
| 10162 | 9312 |
| 10163 static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = | 9313 static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = |
| 10164 const ParserErrorCode( | 9314 const ParserErrorCode('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', |
| 10165 'DUPLICATE_LABEL_IN_SWITCH_STATEMENT', | |
| 10166 "The label {0} was already used in this switch statement"); | 9315 "The label {0} was already used in this switch statement"); |
| 10167 | 9316 |
| 10168 static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode( | 9317 static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode( |
| 10169 'DUPLICATED_MODIFIER', | 9318 'DUPLICATED_MODIFIER', "The modifier '{0}' was already specified."); |
| 10170 "The modifier '{0}' was already specified."); | |
| 10171 | 9319 |
| 10172 static const ParserErrorCode EMPTY_ENUM_BODY = const ParserErrorCode( | 9320 static const ParserErrorCode EMPTY_ENUM_BODY = const ParserErrorCode( |
| 10173 'EMPTY_ENUM_BODY', | 9321 'EMPTY_ENUM_BODY', "An enum must declare at least one constant name"); |
| 10174 "An enum must declare at least one constant name"); | |
| 10175 | 9322 |
| 10176 static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = | 9323 static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = |
| 10177 const ParserErrorCode( | 9324 const ParserErrorCode('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', |
| 10178 'EQUALITY_CANNOT_BE_EQUALITY_OPERAND', | |
| 10179 "Equality expression cannot be operand of another equality expression.
"); | 9325 "Equality expression cannot be operand of another equality expression.
"); |
| 10180 | 9326 |
| 10181 static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode( | 9327 static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode( |
| 10182 'EXPECTED_CASE_OR_DEFAULT', | 9328 'EXPECTED_CASE_OR_DEFAULT', "Expected 'case' or 'default'"); |
| 10183 "Expected 'case' or 'default'"); | |
| 10184 | 9329 |
| 10185 static const ParserErrorCode EXPECTED_CLASS_MEMBER = | 9330 static const ParserErrorCode EXPECTED_CLASS_MEMBER = |
| 10186 const ParserErrorCode('EXPECTED_CLASS_MEMBER', "Expected a class member"); | 9331 const ParserErrorCode('EXPECTED_CLASS_MEMBER', "Expected a class member"); |
| 10187 | 9332 |
| 10188 static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode( | 9333 static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode( |
| 10189 'EXPECTED_EXECUTABLE', | 9334 'EXPECTED_EXECUTABLE', |
| 10190 "Expected a method, getter, setter or operator declaration"); | 9335 "Expected a method, getter, setter or operator declaration"); |
| 10191 | 9336 |
| 10192 static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = | 9337 static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = |
| 10193 const ParserErrorCode( | 9338 const ParserErrorCode( |
| 10194 'EXPECTED_LIST_OR_MAP_LITERAL', | 9339 'EXPECTED_LIST_OR_MAP_LITERAL', "Expected a list or map literal"); |
| 10195 "Expected a list or map literal"); | |
| 10196 | 9340 |
| 10197 static const ParserErrorCode EXPECTED_STRING_LITERAL = | 9341 static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode( |
| 10198 const ParserErrorCode('EXPECTED_STRING_LITERAL', "Expected a string litera
l"); | 9342 'EXPECTED_STRING_LITERAL', "Expected a string literal"); |
| 10199 | 9343 |
| 10200 static const ParserErrorCode EXPECTED_TOKEN = | 9344 static const ParserErrorCode EXPECTED_TOKEN = |
| 10201 const ParserErrorCode('EXPECTED_TOKEN', "Expected to find '{0}'"); | 9345 const ParserErrorCode('EXPECTED_TOKEN', "Expected to find '{0}'"); |
| 10202 | 9346 |
| 10203 static const ParserErrorCode EXPECTED_TYPE_NAME = | 9347 static const ParserErrorCode EXPECTED_TYPE_NAME = |
| 10204 const ParserErrorCode('EXPECTED_TYPE_NAME', "Expected a type name"); | 9348 const ParserErrorCode('EXPECTED_TYPE_NAME', "Expected a type name"); |
| 10205 | 9349 |
| 10206 static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = | 9350 static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = |
| 10207 const ParserErrorCode( | 9351 const ParserErrorCode('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', |
| 10208 'EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', | |
| 10209 "Export directives must preceed part directives"); | 9352 "Export directives must preceed part directives"); |
| 10210 | 9353 |
| 10211 static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode( | 9354 static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode( |
| 10212 'EXTERNAL_AFTER_CONST', | 9355 'EXTERNAL_AFTER_CONST', |
| 10213 "The modifier 'external' should be before the modifier 'const'"); | 9356 "The modifier 'external' should be before the modifier 'const'"); |
| 10214 | 9357 |
| 10215 static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode( | 9358 static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode( |
| 10216 'EXTERNAL_AFTER_FACTORY', | 9359 'EXTERNAL_AFTER_FACTORY', |
| 10217 "The modifier 'external' should be before the modifier 'factory'"); | 9360 "The modifier 'external' should be before the modifier 'factory'"); |
| 10218 | 9361 |
| 10219 static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode( | 9362 static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode( |
| 10220 'EXTERNAL_AFTER_STATIC', | 9363 'EXTERNAL_AFTER_STATIC', |
| 10221 "The modifier 'external' should be before the modifier 'static'"); | 9364 "The modifier 'external' should be before the modifier 'static'"); |
| 10222 | 9365 |
| 10223 static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode( | 9366 static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode( |
| 10224 'EXTERNAL_CLASS', | 9367 'EXTERNAL_CLASS', "Classes cannot be declared to be 'external'"); |
| 10225 "Classes cannot be declared to be 'external'"); | |
| 10226 | 9368 |
| 10227 static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = | 9369 static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = |
| 10228 const ParserErrorCode( | 9370 const ParserErrorCode('EXTERNAL_CONSTRUCTOR_WITH_BODY', |
| 10229 'EXTERNAL_CONSTRUCTOR_WITH_BODY', | |
| 10230 "External constructors cannot have a body"); | 9371 "External constructors cannot have a body"); |
| 10231 | 9372 |
| 10232 static const ParserErrorCode EXTERNAL_ENUM = const ParserErrorCode( | 9373 static const ParserErrorCode EXTERNAL_ENUM = const ParserErrorCode( |
| 10233 'EXTERNAL_ENUM', | 9374 'EXTERNAL_ENUM', "Enums cannot be declared to be 'external'"); |
| 10234 "Enums cannot be declared to be 'external'"); | |
| 10235 | 9375 |
| 10236 static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode( | 9376 static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode( |
| 10237 'EXTERNAL_FIELD', | 9377 'EXTERNAL_FIELD', "Fields cannot be declared to be 'external'"); |
| 10238 "Fields cannot be declared to be 'external'"); | |
| 10239 | 9378 |
| 10240 static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = | 9379 static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = |
| 10241 const ParserErrorCode( | 9380 const ParserErrorCode( |
| 10242 'EXTERNAL_GETTER_WITH_BODY', | 9381 'EXTERNAL_GETTER_WITH_BODY', "External getters cannot have a body"); |
| 10243 "External getters cannot have a body"); | |
| 10244 | 9382 |
| 10245 static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = | 9383 static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = |
| 10246 const ParserErrorCode( | 9384 const ParserErrorCode( |
| 10247 'EXTERNAL_METHOD_WITH_BODY', | 9385 'EXTERNAL_METHOD_WITH_BODY', "External methods cannot have a body"); |
| 10248 "External methods cannot have a body"); | |
| 10249 | 9386 |
| 10250 static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = | 9387 static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = |
| 10251 const ParserErrorCode( | 9388 const ParserErrorCode('EXTERNAL_OPERATOR_WITH_BODY', |
| 10252 'EXTERNAL_OPERATOR_WITH_BODY', | |
| 10253 "External operators cannot have a body"); | 9389 "External operators cannot have a body"); |
| 10254 | 9390 |
| 10255 static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = | 9391 static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = |
| 10256 const ParserErrorCode( | 9392 const ParserErrorCode( |
| 10257 'EXTERNAL_SETTER_WITH_BODY', | 9393 'EXTERNAL_SETTER_WITH_BODY', "External setters cannot have a body"); |
| 10258 "External setters cannot have a body"); | |
| 10259 | 9394 |
| 10260 static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode( | 9395 static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode( |
| 10261 'EXTERNAL_TYPEDEF', | 9396 'EXTERNAL_TYPEDEF', "Type aliases cannot be declared to be 'external'"); |
| 10262 "Type aliases cannot be declared to be 'external'"); | |
| 10263 | 9397 |
| 10264 static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = | 9398 static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = |
| 10265 const ParserErrorCode( | 9399 const ParserErrorCode('FACTORY_TOP_LEVEL_DECLARATION', |
| 10266 'FACTORY_TOP_LEVEL_DECLARATION', | |
| 10267 "Top-level declarations cannot be declared to be 'factory'"); | 9400 "Top-level declarations cannot be declared to be 'factory'"); |
| 10268 | 9401 |
| 10269 static const ParserErrorCode FACTORY_WITH_INITIALIZERS = | 9402 static const ParserErrorCode FACTORY_WITH_INITIALIZERS = |
| 10270 const ParserErrorCode( | 9403 const ParserErrorCode('FACTORY_WITH_INITIALIZERS', |
| 10271 'FACTORY_WITH_INITIALIZERS', | |
| 10272 "A 'factory' constructor cannot have initializers", | 9404 "A 'factory' constructor cannot have initializers", |
| 10273 "Either remove the 'factory' keyword to make this a generative " | 9405 "Either remove the 'factory' keyword to make this a generative " |
| 10274 "constructor or remove the initializers."); | 9406 "constructor or remove the initializers."); |
| 10275 | 9407 |
| 10276 static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode( | 9408 static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode( |
| 10277 'FACTORY_WITHOUT_BODY', | 9409 'FACTORY_WITHOUT_BODY', |
| 10278 "A non-redirecting 'factory' constructor must have a body"); | 9410 "A non-redirecting 'factory' constructor must have a body"); |
| 10279 | 9411 |
| 10280 static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = | 9412 static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = |
| 10281 const ParserErrorCode( | 9413 const ParserErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', |
| 10282 'FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', | |
| 10283 "Field initializers can only be used in a constructor"); | 9414 "Field initializers can only be used in a constructor"); |
| 10284 | 9415 |
| 10285 static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode( | 9416 static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode( |
| 10286 'FINAL_AND_VAR', | 9417 'FINAL_AND_VAR', |
| 10287 "Members cannot be declared to be both 'final' and 'var'"); | 9418 "Members cannot be declared to be both 'final' and 'var'"); |
| 10288 | 9419 |
| 10289 static const ParserErrorCode FINAL_CLASS = const ParserErrorCode( | 9420 static const ParserErrorCode FINAL_CLASS = const ParserErrorCode( |
| 10290 'FINAL_CLASS', | 9421 'FINAL_CLASS', "Classes cannot be declared to be 'final'"); |
| 10291 "Classes cannot be declared to be 'final'"); | |
| 10292 | 9422 |
| 10293 static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode( | 9423 static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode( |
| 10294 'FINAL_CONSTRUCTOR', | 9424 'FINAL_CONSTRUCTOR', "A constructor cannot be declared to be 'final'"); |
| 10295 "A constructor cannot be declared to be 'final'"); | |
| 10296 | 9425 |
| 10297 static const ParserErrorCode FINAL_ENUM = | 9426 static const ParserErrorCode FINAL_ENUM = const ParserErrorCode( |
| 10298 const ParserErrorCode('FINAL_ENUM', "Enums cannot be declared to be 'final
'"); | 9427 'FINAL_ENUM', "Enums cannot be declared to be 'final'"); |
| 10299 | 9428 |
| 10300 static const ParserErrorCode FINAL_METHOD = const ParserErrorCode( | 9429 static const ParserErrorCode FINAL_METHOD = const ParserErrorCode( |
| 10301 'FINAL_METHOD', | 9430 'FINAL_METHOD', |
| 10302 "Getters, setters and methods cannot be declared to be 'final'"); | 9431 "Getters, setters and methods cannot be declared to be 'final'"); |
| 10303 | 9432 |
| 10304 static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode( | 9433 static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode( |
| 10305 'FINAL_TYPEDEF', | 9434 'FINAL_TYPEDEF', "Type aliases cannot be declared to be 'final'"); |
| 10306 "Type aliases cannot be declared to be 'final'"); | |
| 10307 | 9435 |
| 10308 static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = | 9436 static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorC
ode( |
| 10309 const ParserErrorCode( | 9437 'FUNCTION_TYPED_PARAMETER_VAR', |
| 10310 'FUNCTION_TYPED_PARAMETER_VAR', | 9438 "Function typed parameters cannot specify 'const', 'final' or 'var' instea
d of return type"); |
| 10311 "Function typed parameters cannot specify 'const', 'final' or 'var' in
stead of return type"); | |
| 10312 | 9439 |
| 10313 static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode( | 9440 static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode( |
| 10314 'GETTER_IN_FUNCTION', | 9441 'GETTER_IN_FUNCTION', |
| 10315 "Getters cannot be defined within methods or functions"); | 9442 "Getters cannot be defined within methods or functions"); |
| 10316 | 9443 |
| 10317 static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode( | 9444 static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode( |
| 10318 'GETTER_WITH_PARAMETERS', | 9445 'GETTER_WITH_PARAMETERS', |
| 10319 "Getter should be declared without a parameter list"); | 9446 "Getter should be declared without a parameter list"); |
| 10320 | 9447 |
| 10321 static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = | 9448 static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = |
| 10322 const ParserErrorCode( | 9449 const ParserErrorCode('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', |
| 10323 'ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', | |
| 10324 "Illegal assignment to non-assignable expression"); | 9450 "Illegal assignment to non-assignable expression"); |
| 10325 | 9451 |
| 10326 static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = | 9452 static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = |
| 10327 const ParserErrorCode( | 9453 const ParserErrorCode('IMPLEMENTS_BEFORE_EXTENDS', |
| 10328 'IMPLEMENTS_BEFORE_EXTENDS', | |
| 10329 "The extends clause must be before the implements clause"); | 9454 "The extends clause must be before the implements clause"); |
| 10330 | 9455 |
| 10331 static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode( | 9456 static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode( |
| 10332 'IMPLEMENTS_BEFORE_WITH', | 9457 'IMPLEMENTS_BEFORE_WITH', |
| 10333 "The with clause must be before the implements clause"); | 9458 "The with clause must be before the implements clause"); |
| 10334 | 9459 |
| 10335 static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = | 9460 static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = |
| 10336 const ParserErrorCode( | 9461 const ParserErrorCode('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', |
| 10337 'IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', | |
| 10338 "Import directives must preceed part directives"); | 9462 "Import directives must preceed part directives"); |
| 10339 | 9463 |
| 10340 static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = | 9464 static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = |
| 10341 const ParserErrorCode( | 9465 const ParserErrorCode('INITIALIZED_VARIABLE_IN_FOR_EACH', |
| 10342 'INITIALIZED_VARIABLE_IN_FOR_EACH', | |
| 10343 "The loop variable in a for-each loop cannot be initialized"); | 9466 "The loop variable in a for-each loop cannot be initialized"); |
| 10344 | 9467 |
| 10345 static const ParserErrorCode INVALID_AWAIT_IN_FOR = const ParserErrorCode( | 9468 static const ParserErrorCode INVALID_AWAIT_IN_FOR = const ParserErrorCode( |
| 10346 'INVALID_AWAIT_IN_FOR', | 9469 'INVALID_AWAIT_IN_FOR', |
| 10347 "The modifier 'await' is not allowed for a normal 'for' statement", | 9470 "The modifier 'await' is not allowed for a normal 'for' statement", |
| 10348 "Remove the keyword or use a for-each statement."); | 9471 "Remove the keyword or use a for-each statement."); |
| 10349 | 9472 |
| 10350 static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode( | 9473 static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode( |
| 10351 'INVALID_CODE_POINT', | 9474 'INVALID_CODE_POINT', |
| 10352 "The escape sequence '{0}' is not a valid code point"); | 9475 "The escape sequence '{0}' is not a valid code point"); |
| 10353 | 9476 |
| 10354 static const ParserErrorCode INVALID_COMMENT_REFERENCE = | 9477 static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode
( |
| 10355 const ParserErrorCode( | 9478 'INVALID_COMMENT_REFERENCE', |
| 10356 'INVALID_COMMENT_REFERENCE', | 9479 "Comment references should contain a possibly prefixed identifier and can
start with 'new', but should not contain anything else"); |
| 10357 "Comment references should contain a possibly prefixed identifier and
can start with 'new', but should not contain anything else"); | |
| 10358 | 9480 |
| 10359 static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode( | 9481 static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode( |
| 10360 'INVALID_HEX_ESCAPE', | 9482 'INVALID_HEX_ESCAPE', |
| 10361 "An escape sequence starting with '\\x' must be followed by 2 hexidecimal
digits"); | 9483 "An escape sequence starting with '\\x' must be followed by 2 hexidecimal
digits"); |
| 10362 | 9484 |
| 10363 static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode( | 9485 static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode( |
| 10364 'INVALID_OPERATOR', | 9486 'INVALID_OPERATOR', "The string '{0}' is not a valid operator"); |
| 10365 "The string '{0}' is not a valid operator"); | |
| 10366 | 9487 |
| 10367 static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = | 9488 static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = |
| 10368 const ParserErrorCode( | 9489 const ParserErrorCode('INVALID_OPERATOR_FOR_SUPER', |
| 10369 'INVALID_OPERATOR_FOR_SUPER', | |
| 10370 "The operator '{0}' cannot be used with 'super'"); | 9490 "The operator '{0}' cannot be used with 'super'"); |
| 10371 | 9491 |
| 10372 static const ParserErrorCode INVALID_STAR_AFTER_ASYNC = const ParserErrorCode( | 9492 static const ParserErrorCode INVALID_STAR_AFTER_ASYNC = const ParserErrorCode( |
| 10373 'INVALID_STAR_AFTER_ASYNC', | 9493 'INVALID_STAR_AFTER_ASYNC', |
| 10374 "The modifier 'async*' is not allowed for an expression function body", | 9494 "The modifier 'async*' is not allowed for an expression function body", |
| 10375 "Convert the body to a block."); | 9495 "Convert the body to a block."); |
| 10376 | 9496 |
| 10377 static const ParserErrorCode INVALID_SYNC = const ParserErrorCode( | 9497 static const ParserErrorCode INVALID_SYNC = const ParserErrorCode( |
| 10378 'INVALID_SYNC', | 9498 'INVALID_SYNC', |
| 10379 "The modifier 'sync' is not allowed for an exrpression function body", | 9499 "The modifier 'sync' is not allowed for an exrpression function body", |
| 10380 "Convert the body to a block."); | 9500 "Convert the body to a block."); |
| 10381 | 9501 |
| 10382 static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode( | 9502 static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode( |
| 10383 'INVALID_UNICODE_ESCAPE', | 9503 'INVALID_UNICODE_ESCAPE', |
| 10384 "An escape sequence starting with '\\u' must be followed by 4 hexidecimal
digits or from 1 to 6 digits between '{' and '}'"); | 9504 "An escape sequence starting with '\\u' must be followed by 4 hexidecimal
digits or from 1 to 6 digits between '{' and '}'"); |
| 10385 | 9505 |
| 10386 static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = | 9506 static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = |
| 10387 const ParserErrorCode( | 9507 const ParserErrorCode('LIBRARY_DIRECTIVE_NOT_FIRST', |
| 10388 'LIBRARY_DIRECTIVE_NOT_FIRST', | |
| 10389 "The library directive must appear before all other directives"); | 9508 "The library directive must appear before all other directives"); |
| 10390 | 9509 |
| 10391 static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = | 9510 static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = |
| 10392 const ParserErrorCode( | 9511 const ParserErrorCode('LOCAL_FUNCTION_DECLARATION_MODIFIER', |
| 10393 'LOCAL_FUNCTION_DECLARATION_MODIFIER', | |
| 10394 "Local function declarations cannot specify any modifier"); | 9512 "Local function declarations cannot specify any modifier"); |
| 10395 | 9513 |
| 10396 static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = | 9514 static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = |
| 10397 const ParserErrorCode( | 9515 const ParserErrorCode('MISSING_ASSIGNABLE_SELECTOR', |
| 10398 'MISSING_ASSIGNABLE_SELECTOR', | |
| 10399 "Missing selector such as \".<identifier>\" or \"[0]\""); | 9516 "Missing selector such as \".<identifier>\" or \"[0]\""); |
| 10400 | 9517 |
| 10401 static const ParserErrorCode MISSING_ASSIGNMENT_IN_INITIALIZER = | 9518 static const ParserErrorCode MISSING_ASSIGNMENT_IN_INITIALIZER = |
| 10402 const ParserErrorCode( | 9519 const ParserErrorCode('MISSING_ASSIGNMENT_IN_INITIALIZER', |
| 10403 'MISSING_ASSIGNMENT_IN_INITIALIZER', | |
| 10404 "Expected an assignment after the field name"); | 9520 "Expected an assignment after the field name"); |
| 10405 | 9521 |
| 10406 static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode( | 9522 static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode( |
| 10407 'MISSING_CATCH_OR_FINALLY', | 9523 'MISSING_CATCH_OR_FINALLY', |
| 10408 "A try statement must have either a catch or finally clause"); | 9524 "A try statement must have either a catch or finally clause"); |
| 10409 | 9525 |
| 10410 static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode( | 9526 static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode( |
| 10411 'MISSING_CLASS_BODY', | 9527 'MISSING_CLASS_BODY', |
| 10412 "A class definition must have a body, even if it is empty"); | 9528 "A class definition must have a body, even if it is empty"); |
| 10413 | 9529 |
| 10414 static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = | 9530 static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = |
| 10415 const ParserErrorCode( | 9531 const ParserErrorCode( |
| 10416 'MISSING_CLOSING_PARENTHESIS', | 9532 'MISSING_CLOSING_PARENTHESIS', "The closing parenthesis is missing"); |
| 10417 "The closing parenthesis is missing"); | |
| 10418 | 9533 |
| 10419 static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = | 9534 static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = |
| 10420 const ParserErrorCode( | 9535 const ParserErrorCode('MISSING_CONST_FINAL_VAR_OR_TYPE', |
| 10421 'MISSING_CONST_FINAL_VAR_OR_TYPE', | |
| 10422 "Variables must be declared using the keywords 'const', 'final', 'var'
or a type name"); | 9536 "Variables must be declared using the keywords 'const', 'final', 'var'
or a type name"); |
| 10423 | 9537 |
| 10424 static const ParserErrorCode MISSING_ENUM_BODY = const ParserErrorCode( | 9538 static const ParserErrorCode MISSING_ENUM_BODY = const ParserErrorCode( |
| 10425 'MISSING_ENUM_BODY', | 9539 'MISSING_ENUM_BODY', |
| 10426 "An enum definition must have a body with at least one constant name"); | 9540 "An enum definition must have a body with at least one constant name"); |
| 10427 | 9541 |
| 10428 static const ParserErrorCode MISSING_EXPRESSION_IN_INITIALIZER = | 9542 static const ParserErrorCode MISSING_EXPRESSION_IN_INITIALIZER = |
| 10429 const ParserErrorCode( | 9543 const ParserErrorCode('MISSING_EXPRESSION_IN_INITIALIZER', |
| 10430 'MISSING_EXPRESSION_IN_INITIALIZER', | |
| 10431 "Expected an expression after the assignment operator"); | 9544 "Expected an expression after the assignment operator"); |
| 10432 | 9545 |
| 10433 static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = | 9546 static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = |
| 10434 const ParserErrorCode( | 9547 const ParserErrorCode('MISSING_EXPRESSION_IN_THROW', |
| 10435 'MISSING_EXPRESSION_IN_THROW', | |
| 10436 "Throw expressions must compute the object to be thrown"); | 9548 "Throw expressions must compute the object to be thrown"); |
| 10437 | 9549 |
| 10438 static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode( | 9550 static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode( |
| 10439 'MISSING_FUNCTION_BODY', | 9551 'MISSING_FUNCTION_BODY', "A function body must be provided"); |
| 10440 "A function body must be provided"); | |
| 10441 | 9552 |
| 10442 static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = | 9553 static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = |
| 10443 const ParserErrorCode( | 9554 const ParserErrorCode('MISSING_FUNCTION_PARAMETERS', |
| 10444 'MISSING_FUNCTION_PARAMETERS', | |
| 10445 "Functions must have an explicit list of parameters"); | 9555 "Functions must have an explicit list of parameters"); |
| 10446 | 9556 |
| 10447 static const ParserErrorCode MISSING_METHOD_PARAMETERS = | 9557 static const ParserErrorCode MISSING_METHOD_PARAMETERS = |
| 10448 const ParserErrorCode( | 9558 const ParserErrorCode('MISSING_METHOD_PARAMETERS', |
| 10449 'MISSING_METHOD_PARAMETERS', | |
| 10450 "Methods must have an explicit list of parameters"); | 9559 "Methods must have an explicit list of parameters"); |
| 10451 | 9560 |
| 10452 static const ParserErrorCode MISSING_GET = const ParserErrorCode( | 9561 static const ParserErrorCode MISSING_GET = const ParserErrorCode( |
| 10453 'MISSING_GET', | 9562 'MISSING_GET', |
| 10454 "Getters must have the keyword 'get' before the getter name"); | 9563 "Getters must have the keyword 'get' before the getter name"); |
| 10455 | 9564 |
| 10456 static const ParserErrorCode MISSING_IDENTIFIER = | 9565 static const ParserErrorCode MISSING_IDENTIFIER = |
| 10457 const ParserErrorCode('MISSING_IDENTIFIER', "Expected an identifier"); | 9566 const ParserErrorCode('MISSING_IDENTIFIER', "Expected an identifier"); |
| 10458 | 9567 |
| 10459 static const ParserErrorCode MISSING_INITIALIZER = | 9568 static const ParserErrorCode MISSING_INITIALIZER = |
| 10460 const ParserErrorCode('MISSING_INITIALIZER', "Expected an initializer"); | 9569 const ParserErrorCode('MISSING_INITIALIZER', "Expected an initializer"); |
| 10461 | 9570 |
| 10462 static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode( | 9571 static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode( |
| 10463 'MISSING_KEYWORD_OPERATOR', | 9572 'MISSING_KEYWORD_OPERATOR', |
| 10464 "Operator declarations must be preceeded by the keyword 'operator'"); | 9573 "Operator declarations must be preceeded by the keyword 'operator'"); |
| 10465 | 9574 |
| 10466 static const ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = | 9575 static const ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = |
| 10467 const ParserErrorCode( | 9576 const ParserErrorCode('MISSING_NAME_IN_LIBRARY_DIRECTIVE', |
| 10468 'MISSING_NAME_IN_LIBRARY_DIRECTIVE', | |
| 10469 "Library directives must include a library name"); | 9577 "Library directives must include a library name"); |
| 10470 | 9578 |
| 10471 static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = | 9579 static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = |
| 10472 const ParserErrorCode( | 9580 const ParserErrorCode('MISSING_NAME_IN_PART_OF_DIRECTIVE', |
| 10473 'MISSING_NAME_IN_PART_OF_DIRECTIVE', | |
| 10474 "Library directives must include a library name"); | 9581 "Library directives must include a library name"); |
| 10475 | 9582 |
| 10476 static const ParserErrorCode MISSING_PREFIX_IN_DEFERRED_IMPORT = | 9583 static const ParserErrorCode MISSING_PREFIX_IN_DEFERRED_IMPORT = |
| 10477 const ParserErrorCode( | 9584 const ParserErrorCode('MISSING_PREFIX_IN_DEFERRED_IMPORT', |
| 10478 'MISSING_PREFIX_IN_DEFERRED_IMPORT', | |
| 10479 "Deferred imports must have a prefix"); | 9585 "Deferred imports must have a prefix"); |
| 10480 | 9586 |
| 10481 static const ParserErrorCode MISSING_STAR_AFTER_SYNC = const ParserErrorCode( | 9587 static const ParserErrorCode MISSING_STAR_AFTER_SYNC = const ParserErrorCode( |
| 10482 'MISSING_STAR_AFTER_SYNC', | 9588 'MISSING_STAR_AFTER_SYNC', |
| 10483 "The modifier 'sync' must be followed by a star ('*')", | 9589 "The modifier 'sync' must be followed by a star ('*')", |
| 10484 "Remove the modifier or add a star."); | 9590 "Remove the modifier or add a star."); |
| 10485 | 9591 |
| 10486 static const ParserErrorCode MISSING_STATEMENT = | 9592 static const ParserErrorCode MISSING_STATEMENT = |
| 10487 const ParserErrorCode('MISSING_STATEMENT', "Expected a statement"); | 9593 const ParserErrorCode('MISSING_STATEMENT', "Expected a statement"); |
| 10488 | 9594 |
| 10489 static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = | 9595 static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = |
| 10490 const ParserErrorCode( | 9596 const ParserErrorCode('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', |
| 10491 'MISSING_TERMINATOR_FOR_PARAMETER_GROUP', | |
| 10492 "There is no '{0}' to close the parameter group"); | 9597 "There is no '{0}' to close the parameter group"); |
| 10493 | 9598 |
| 10494 static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS = | 9599 static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS = |
| 10495 const ParserErrorCode( | 9600 const ParserErrorCode('MISSING_TYPEDEF_PARAMETERS', |
| 10496 'MISSING_TYPEDEF_PARAMETERS', | |
| 10497 "Type aliases for functions must have an explicit list of parameters")
; | 9601 "Type aliases for functions must have an explicit list of parameters")
; |
| 10498 | 9602 |
| 10499 static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = | 9603 static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = const ParserErrorC
ode( |
| 10500 const ParserErrorCode( | 9604 'MISSING_VARIABLE_IN_FOR_EACH', |
| 10501 'MISSING_VARIABLE_IN_FOR_EACH', | 9605 "A loop variable must be declared in a for-each loop before the 'in', but
none were found"); |
| 10502 "A loop variable must be declared in a for-each loop before the 'in',
but none were found"); | |
| 10503 | 9606 |
| 10504 static const ParserErrorCode MIXED_PARAMETER_GROUPS = const ParserErrorCode( | 9607 static const ParserErrorCode MIXED_PARAMETER_GROUPS = const ParserErrorCode( |
| 10505 'MIXED_PARAMETER_GROUPS', | 9608 'MIXED_PARAMETER_GROUPS', |
| 10506 "Cannot have both positional and named parameters in a single parameter li
st"); | 9609 "Cannot have both positional and named parameters in a single parameter li
st"); |
| 10507 | 9610 |
| 10508 static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode( | 9611 static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode( |
| 10509 'MULTIPLE_EXTENDS_CLAUSES', | 9612 'MULTIPLE_EXTENDS_CLAUSES', |
| 10510 "Each class definition can have at most one extends clause"); | 9613 "Each class definition can have at most one extends clause"); |
| 10511 | 9614 |
| 10512 static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = | 9615 static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = |
| 10513 const ParserErrorCode( | 9616 const ParserErrorCode('MULTIPLE_IMPLEMENTS_CLAUSES', |
| 10514 'MULTIPLE_IMPLEMENTS_CLAUSES', | |
| 10515 "Each class definition can have at most one implements clause"); | 9617 "Each class definition can have at most one implements clause"); |
| 10516 | 9618 |
| 10517 static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = | 9619 static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = |
| 10518 const ParserErrorCode( | 9620 const ParserErrorCode('MULTIPLE_LIBRARY_DIRECTIVES', |
| 10519 'MULTIPLE_LIBRARY_DIRECTIVES', | |
| 10520 "Only one library directive may be declared in a file"); | 9621 "Only one library directive may be declared in a file"); |
| 10521 | 9622 |
| 10522 static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = | 9623 static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = |
| 10523 const ParserErrorCode( | 9624 const ParserErrorCode('MULTIPLE_NAMED_PARAMETER_GROUPS', |
| 10524 'MULTIPLE_NAMED_PARAMETER_GROUPS', | |
| 10525 "Cannot have multiple groups of named parameters in a single parameter
list"); | 9625 "Cannot have multiple groups of named parameters in a single parameter
list"); |
| 10526 | 9626 |
| 10527 static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = | 9627 static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = |
| 10528 const ParserErrorCode( | 9628 const ParserErrorCode('MULTIPLE_PART_OF_DIRECTIVES', |
| 10529 'MULTIPLE_PART_OF_DIRECTIVES', | |
| 10530 "Only one part-of directive may be declared in a file"); | 9629 "Only one part-of directive may be declared in a file"); |
| 10531 | 9630 |
| 10532 static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = | 9631 static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = |
| 10533 const ParserErrorCode( | 9632 const ParserErrorCode('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', |
| 10534 'MULTIPLE_POSITIONAL_PARAMETER_GROUPS', | |
| 10535 "Cannot have multiple groups of positional parameters in a single para
meter list"); | 9633 "Cannot have multiple groups of positional parameters in a single para
meter list"); |
| 10536 | 9634 |
| 10537 static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = | 9635 static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = |
| 10538 const ParserErrorCode( | 9636 const ParserErrorCode('MULTIPLE_VARIABLES_IN_FOR_EACH', |
| 10539 'MULTIPLE_VARIABLES_IN_FOR_EACH', | |
| 10540 "A single loop variable must be declared in a for-each loop before the
'in', but {0} were found"); | 9637 "A single loop variable must be declared in a for-each loop before the
'in', but {0} were found"); |
| 10541 | 9638 |
| 10542 static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode( | 9639 static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode( |
| 10543 'MULTIPLE_WITH_CLAUSES', | 9640 'MULTIPLE_WITH_CLAUSES', |
| 10544 "Each class definition can have at most one with clause"); | 9641 "Each class definition can have at most one with clause"); |
| 10545 | 9642 |
| 10546 static const ParserErrorCode NAMED_FUNCTION_EXPRESSION = | 9643 static const ParserErrorCode NAMED_FUNCTION_EXPRESSION = |
| 10547 const ParserErrorCode( | 9644 const ParserErrorCode( |
| 10548 'NAMED_FUNCTION_EXPRESSION', | 9645 'NAMED_FUNCTION_EXPRESSION', "Function expressions cannot be named"); |
| 10549 "Function expressions cannot be named"); | |
| 10550 | 9646 |
| 10551 static const ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = | 9647 static const ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = |
| 10552 const ParserErrorCode( | 9648 const ParserErrorCode('NAMED_PARAMETER_OUTSIDE_GROUP', |
| 10553 'NAMED_PARAMETER_OUTSIDE_GROUP', | |
| 10554 "Named parameters must be enclosed in curly braces ('{' and '}')"); | 9649 "Named parameters must be enclosed in curly braces ('{' and '}')"); |
| 10555 | 9650 |
| 10556 static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = | 9651 static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = |
| 10557 const ParserErrorCode( | 9652 const ParserErrorCode('NATIVE_CLAUSE_IN_NON_SDK_CODE', |
| 10558 'NATIVE_CLAUSE_IN_NON_SDK_CODE', | |
| 10559 "Native clause can only be used in the SDK and code that is loaded thr
ough native extensions"); | 9653 "Native clause can only be used in the SDK and code that is loaded thr
ough native extensions"); |
| 10560 | 9654 |
| 10561 static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = | 9655 static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = |
| 10562 const ParserErrorCode( | 9656 const ParserErrorCode('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', |
| 10563 'NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', | |
| 10564 "Native functions can only be declared in the SDK and code that is loa
ded through native extensions"); | 9657 "Native functions can only be declared in the SDK and code that is loa
ded through native extensions"); |
| 10565 | 9658 |
| 10566 static const ParserErrorCode NON_CONSTRUCTOR_FACTORY = const ParserErrorCode( | 9659 static const ParserErrorCode NON_CONSTRUCTOR_FACTORY = const ParserErrorCode( |
| 10567 'NON_CONSTRUCTOR_FACTORY', | 9660 'NON_CONSTRUCTOR_FACTORY', |
| 10568 "Only constructors can be declared to be a 'factory'"); | 9661 "Only constructors can be declared to be a 'factory'"); |
| 10569 | 9662 |
| 10570 static const ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = | 9663 static const ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = |
| 10571 const ParserErrorCode( | 9664 const ParserErrorCode('NON_IDENTIFIER_LIBRARY_NAME', |
| 10572 'NON_IDENTIFIER_LIBRARY_NAME', | |
| 10573 "The name of a library must be an identifier"); | 9665 "The name of a library must be an identifier"); |
| 10574 | 9666 |
| 10575 static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = | 9667 static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = |
| 10576 const ParserErrorCode( | 9668 const ParserErrorCode('NON_PART_OF_DIRECTIVE_IN_PART', |
| 10577 'NON_PART_OF_DIRECTIVE_IN_PART', | |
| 10578 "The part-of directive must be the only directive in a part"); | 9669 "The part-of directive must be the only directive in a part"); |
| 10579 | 9670 |
| 10580 static const ParserErrorCode NON_STRING_LITERAL_AS_URI = | 9671 static const ParserErrorCode NON_STRING_LITERAL_AS_URI = |
| 10581 const ParserErrorCode( | 9672 const ParserErrorCode('NON_STRING_LITERAL_AS_URI', |
| 10582 'NON_STRING_LITERAL_AS_URI', | |
| 10583 "The URI must be a string literal", | 9673 "The URI must be a string literal", |
| 10584 "Enclose the URI in either single or double quotes."); | 9674 "Enclose the URI in either single or double quotes."); |
| 10585 | 9675 |
| 10586 static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = | 9676 static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = |
| 10587 const ParserErrorCode( | 9677 const ParserErrorCode('NON_USER_DEFINABLE_OPERATOR', |
| 10588 'NON_USER_DEFINABLE_OPERATOR', | |
| 10589 "The operator '{0}' is not user definable"); | 9678 "The operator '{0}' is not user definable"); |
| 10590 | 9679 |
| 10591 static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = | 9680 static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = |
| 10592 const ParserErrorCode( | 9681 const ParserErrorCode('NORMAL_BEFORE_OPTIONAL_PARAMETERS', |
| 10593 'NORMAL_BEFORE_OPTIONAL_PARAMETERS', | |
| 10594 "Normal parameters must occur before optional parameters"); | 9682 "Normal parameters must occur before optional parameters"); |
| 10595 | 9683 |
| 10596 static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = | 9684 static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = |
| 10597 const ParserErrorCode( | 9685 const ParserErrorCode('POSITIONAL_AFTER_NAMED_ARGUMENT', |
| 10598 'POSITIONAL_AFTER_NAMED_ARGUMENT', | |
| 10599 "Positional arguments must occur before named arguments"); | 9686 "Positional arguments must occur before named arguments"); |
| 10600 | 9687 |
| 10601 static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = | 9688 static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = |
| 10602 const ParserErrorCode( | 9689 const ParserErrorCode('POSITIONAL_PARAMETER_OUTSIDE_GROUP', |
| 10603 'POSITIONAL_PARAMETER_OUTSIDE_GROUP', | |
| 10604 "Positional parameters must be enclosed in square brackets ('[' and ']
')"); | 9690 "Positional parameters must be enclosed in square brackets ('[' and ']
')"); |
| 10605 | 9691 |
| 10606 static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = | 9692 static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = |
| 10607 const ParserErrorCode( | 9693 const ParserErrorCode('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', |
| 10608 'REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', | |
| 10609 "Only factory constructor can specify '=' redirection."); | 9694 "Only factory constructor can specify '=' redirection."); |
| 10610 | 9695 |
| 10611 static const ParserErrorCode SETTER_IN_FUNCTION = const ParserErrorCode( | 9696 static const ParserErrorCode SETTER_IN_FUNCTION = const ParserErrorCode( |
| 10612 'SETTER_IN_FUNCTION', | 9697 'SETTER_IN_FUNCTION', |
| 10613 "Setters cannot be defined within methods or functions"); | 9698 "Setters cannot be defined within methods or functions"); |
| 10614 | 9699 |
| 10615 static const ParserErrorCode STATIC_AFTER_CONST = const ParserErrorCode( | 9700 static const ParserErrorCode STATIC_AFTER_CONST = const ParserErrorCode( |
| 10616 'STATIC_AFTER_CONST', | 9701 'STATIC_AFTER_CONST', |
| 10617 "The modifier 'static' should be before the modifier 'const'"); | 9702 "The modifier 'static' should be before the modifier 'const'"); |
| 10618 | 9703 |
| 10619 static const ParserErrorCode STATIC_AFTER_FINAL = const ParserErrorCode( | 9704 static const ParserErrorCode STATIC_AFTER_FINAL = const ParserErrorCode( |
| 10620 'STATIC_AFTER_FINAL', | 9705 'STATIC_AFTER_FINAL', |
| 10621 "The modifier 'static' should be before the modifier 'final'"); | 9706 "The modifier 'static' should be before the modifier 'final'"); |
| 10622 | 9707 |
| 10623 static const ParserErrorCode STATIC_AFTER_VAR = const ParserErrorCode( | 9708 static const ParserErrorCode STATIC_AFTER_VAR = const ParserErrorCode( |
| 10624 'STATIC_AFTER_VAR', | 9709 'STATIC_AFTER_VAR', |
| 10625 "The modifier 'static' should be before the modifier 'var'"); | 9710 "The modifier 'static' should be before the modifier 'var'"); |
| 10626 | 9711 |
| 10627 static const ParserErrorCode STATIC_CONSTRUCTOR = | 9712 static const ParserErrorCode STATIC_CONSTRUCTOR = const ParserErrorCode( |
| 10628 const ParserErrorCode('STATIC_CONSTRUCTOR', "Constructors cannot be static
"); | 9713 'STATIC_CONSTRUCTOR', "Constructors cannot be static"); |
| 10629 | 9714 |
| 10630 static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY = | 9715 static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY = |
| 10631 const ParserErrorCode( | 9716 const ParserErrorCode( |
| 10632 'STATIC_GETTER_WITHOUT_BODY', | 9717 'STATIC_GETTER_WITHOUT_BODY', "A 'static' getter must have a body"); |
| 10633 "A 'static' getter must have a body"); | |
| 10634 | 9718 |
| 10635 static const ParserErrorCode STATIC_OPERATOR = | 9719 static const ParserErrorCode STATIC_OPERATOR = |
| 10636 const ParserErrorCode('STATIC_OPERATOR', "Operators cannot be static"); | 9720 const ParserErrorCode('STATIC_OPERATOR', "Operators cannot be static"); |
| 10637 | 9721 |
| 10638 static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY = | 9722 static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY = |
| 10639 const ParserErrorCode( | 9723 const ParserErrorCode( |
| 10640 'STATIC_SETTER_WITHOUT_BODY', | 9724 'STATIC_SETTER_WITHOUT_BODY', "A 'static' setter must have a body"); |
| 10641 "A 'static' setter must have a body"); | |
| 10642 | 9725 |
| 10643 static const ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = | 9726 static const ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = |
| 10644 const ParserErrorCode( | 9727 const ParserErrorCode('STATIC_TOP_LEVEL_DECLARATION', |
| 10645 'STATIC_TOP_LEVEL_DECLARATION', | |
| 10646 "Top-level declarations cannot be declared to be 'static'"); | 9728 "Top-level declarations cannot be declared to be 'static'"); |
| 10647 | 9729 |
| 10648 static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = | 9730 static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = |
| 10649 const ParserErrorCode( | 9731 const ParserErrorCode('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', |
| 10650 'SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', | |
| 10651 "The 'default' case should be the last case in a switch statement"); | 9732 "The 'default' case should be the last case in a switch statement"); |
| 10652 | 9733 |
| 10653 static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = | 9734 static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = |
| 10654 const ParserErrorCode( | 9735 const ParserErrorCode('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', |
| 10655 'SWITCH_HAS_MULTIPLE_DEFAULT_CASES', | |
| 10656 "The 'default' case can only be declared once"); | 9736 "The 'default' case can only be declared once"); |
| 10657 | 9737 |
| 10658 static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode( | 9738 static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode( |
| 10659 'TOP_LEVEL_OPERATOR', | 9739 'TOP_LEVEL_OPERATOR', "Operators must be declared within a class"); |
| 10660 "Operators must be declared within a class"); | |
| 10661 | 9740 |
| 10662 static const ParserErrorCode TYPEDEF_IN_CLASS = const ParserErrorCode( | 9741 static const ParserErrorCode TYPEDEF_IN_CLASS = const ParserErrorCode( |
| 10663 'TYPEDEF_IN_CLASS', | 9742 'TYPEDEF_IN_CLASS', |
| 10664 "Function type aliases cannot be declared inside classes"); | 9743 "Function type aliases cannot be declared inside classes"); |
| 10665 | 9744 |
| 10666 static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = | 9745 static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = |
| 10667 const ParserErrorCode( | 9746 const ParserErrorCode('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', |
| 10668 'UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', | |
| 10669 "There is no '{0}' to open a parameter group"); | 9747 "There is no '{0}' to open a parameter group"); |
| 10670 | 9748 |
| 10671 static const ParserErrorCode UNEXPECTED_TOKEN = | 9749 static const ParserErrorCode UNEXPECTED_TOKEN = |
| 10672 const ParserErrorCode('UNEXPECTED_TOKEN', "Unexpected token '{0}'"); | 9750 const ParserErrorCode('UNEXPECTED_TOKEN', "Unexpected token '{0}'"); |
| 10673 | 9751 |
| 10674 static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode( | 9752 static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode( |
| 10675 'WITH_BEFORE_EXTENDS', | 9753 'WITH_BEFORE_EXTENDS', |
| 10676 "The extends clause must be before the with clause"); | 9754 "The extends clause must be before the with clause"); |
| 10677 | 9755 |
| 10678 static const ParserErrorCode WITH_WITHOUT_EXTENDS = const ParserErrorCode( | 9756 static const ParserErrorCode WITH_WITHOUT_EXTENDS = const ParserErrorCode( |
| 10679 'WITH_WITHOUT_EXTENDS', | 9757 'WITH_WITHOUT_EXTENDS', |
| 10680 "The with clause cannot be used without an extends clause"); | 9758 "The with clause cannot be used without an extends clause"); |
| 10681 | 9759 |
| 10682 static const ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = | 9760 static const ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = |
| 10683 const ParserErrorCode( | 9761 const ParserErrorCode('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', |
| 10684 'WRONG_SEPARATOR_FOR_NAMED_PARAMETER', | |
| 10685 "The default value of a named parameter should be preceeded by ':'"); | 9762 "The default value of a named parameter should be preceeded by ':'"); |
| 10686 | 9763 |
| 10687 static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = | 9764 static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = |
| 10688 const ParserErrorCode( | 9765 const ParserErrorCode('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', |
| 10689 'WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', | |
| 10690 "The default value of a positional parameter should be preceeded by '=
'"); | 9766 "The default value of a positional parameter should be preceeded by '=
'"); |
| 10691 | 9767 |
| 10692 static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = | 9768 static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = |
| 10693 const ParserErrorCode( | 9769 const ParserErrorCode('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', |
| 10694 'WRONG_TERMINATOR_FOR_PARAMETER_GROUP', | |
| 10695 "Expected '{0}' to close parameter group"); | 9770 "Expected '{0}' to close parameter group"); |
| 10696 | 9771 |
| 10697 static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode( | 9772 static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode( |
| 10698 'VAR_AND_TYPE', | 9773 'VAR_AND_TYPE', |
| 10699 "Variables cannot be declared using both 'var' and a type name; remove the
'var'"); | 9774 "Variables cannot be declared using both 'var' and a type name; remove the
'var'"); |
| 10700 | 9775 |
| 10701 static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode( | 9776 static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode( |
| 10702 'VAR_AS_TYPE_NAME', | 9777 'VAR_AS_TYPE_NAME', "The keyword 'var' cannot be used as a type name"); |
| 10703 "The keyword 'var' cannot be used as a type name"); | |
| 10704 | 9778 |
| 10705 static const ParserErrorCode VAR_CLASS = | 9779 static const ParserErrorCode VAR_CLASS = const ParserErrorCode( |
| 10706 const ParserErrorCode('VAR_CLASS', "Classes cannot be declared to be 'var'
"); | 9780 'VAR_CLASS', "Classes cannot be declared to be 'var'"); |
| 10707 | 9781 |
| 10708 static const ParserErrorCode VAR_ENUM = | 9782 static const ParserErrorCode VAR_ENUM = |
| 10709 const ParserErrorCode('VAR_ENUM', "Enums cannot be declared to be 'var'"); | 9783 const ParserErrorCode('VAR_ENUM', "Enums cannot be declared to be 'var'"); |
| 10710 | 9784 |
| 10711 static const ParserErrorCode VAR_RETURN_TYPE = | 9785 static const ParserErrorCode VAR_RETURN_TYPE = const ParserErrorCode( |
| 10712 const ParserErrorCode('VAR_RETURN_TYPE', "The return type cannot be 'var'"
); | 9786 'VAR_RETURN_TYPE', "The return type cannot be 'var'"); |
| 10713 | 9787 |
| 10714 static const ParserErrorCode VAR_TYPEDEF = const ParserErrorCode( | 9788 static const ParserErrorCode VAR_TYPEDEF = const ParserErrorCode( |
| 10715 'VAR_TYPEDEF', | 9789 'VAR_TYPEDEF', "Type aliases cannot be declared to be 'var'"); |
| 10716 "Type aliases cannot be declared to be 'var'"); | |
| 10717 | 9790 |
| 10718 static const ParserErrorCode VOID_PARAMETER = const ParserErrorCode( | 9791 static const ParserErrorCode VOID_PARAMETER = const ParserErrorCode( |
| 10719 'VOID_PARAMETER', | 9792 'VOID_PARAMETER', "Parameters cannot have a type of 'void'"); |
| 10720 "Parameters cannot have a type of 'void'"); | |
| 10721 | 9793 |
| 10722 static const ParserErrorCode VOID_VARIABLE = const ParserErrorCode( | 9794 static const ParserErrorCode VOID_VARIABLE = const ParserErrorCode( |
| 10723 'VOID_VARIABLE', | 9795 'VOID_VARIABLE', "Variables cannot have a type of 'void'"); |
| 10724 "Variables cannot have a type of 'void'"); | |
| 10725 | 9796 |
| 10726 /** | 9797 /** |
| 10727 * Initialize a newly created error code to have the given [name]. The message | 9798 * Initialize a newly created error code to have the given [name]. The message |
| 10728 * associated with the error will be created from the given [message] | 9799 * associated with the error will be created from the given [message] |
| 10729 * template. The correction associated with the error will be created from the | 9800 * template. The correction associated with the error will be created from the |
| 10730 * given [correction] template. | 9801 * given [correction] template. |
| 10731 */ | 9802 */ |
| 10732 const ParserErrorCode(String name, String message, [String correction]) | 9803 const ParserErrorCode(String name, String message, [String correction]) |
| 10733 : super(name, message, correction); | 9804 : super(name, message, correction); |
| 10734 | 9805 |
| 10735 @override | 9806 @override |
| 10736 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; | 9807 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; |
| 10737 | 9808 |
| 10738 @override | 9809 @override |
| 10739 ErrorType get type => ErrorType.SYNTACTIC_ERROR; | 9810 ErrorType get type => ErrorType.SYNTACTIC_ERROR; |
| 10740 } | 9811 } |
| 10741 | 9812 |
| 10742 | |
| 10743 /** | 9813 /** |
| 10744 * Instances of the class `ResolutionCopier` copies resolution information from
one AST | 9814 * Instances of the class `ResolutionCopier` copies resolution information from
one AST |
| 10745 * structure to another as long as the structures of the corresponding children
of a pair of nodes | 9815 * structure to another as long as the structures of the corresponding children
of a pair of nodes |
| 10746 * are the same. | 9816 * are the same. |
| 10747 */ | 9817 */ |
| 10748 class ResolutionCopier implements AstVisitor<bool> { | 9818 class ResolutionCopier implements AstVisitor<bool> { |
| 10749 /** | 9819 /** |
| 10750 * The AST node with which the node being visited is to be compared. This is o
nly valid at the | 9820 * The AST node with which the node being visited is to be compared. This is o
nly valid at the |
| 10751 * beginning of each visit method (until [isEqualNodes] is invoked). | 9821 * beginning of each visit method (until [isEqualNodes] is invoked). |
| 10752 */ | 9822 */ |
| 10753 AstNode _toNode; | 9823 AstNode _toNode; |
| 10754 | 9824 |
| 10755 @override | 9825 @override |
| 10756 bool visitAdjacentStrings(AdjacentStrings node) { | 9826 bool visitAdjacentStrings(AdjacentStrings node) { |
| 10757 AdjacentStrings toNode = this._toNode as AdjacentStrings; | 9827 AdjacentStrings toNode = this._toNode as AdjacentStrings; |
| 10758 return _isEqualNodeLists(node.strings, toNode.strings); | 9828 return _isEqualNodeLists(node.strings, toNode.strings); |
| 10759 } | 9829 } |
| 10760 | 9830 |
| 10761 @override | 9831 @override |
| 10762 bool visitAnnotation(Annotation node) { | 9832 bool visitAnnotation(Annotation node) { |
| 10763 Annotation toNode = this._toNode as Annotation; | 9833 Annotation toNode = this._toNode as Annotation; |
| 10764 if (_and( | 9834 if (_and(_isEqualTokens(node.atSign, toNode.atSign), |
| 10765 _isEqualTokens(node.atSign, toNode.atSign), | |
| 10766 _isEqualNodes(node.name, toNode.name), | 9835 _isEqualNodes(node.name, toNode.name), |
| 10767 _isEqualTokens(node.period, toNode.period), | 9836 _isEqualTokens(node.period, toNode.period), |
| 10768 _isEqualNodes(node.constructorName, toNode.constructorName), | 9837 _isEqualNodes(node.constructorName, toNode.constructorName), |
| 10769 _isEqualNodes(node.arguments, toNode.arguments))) { | 9838 _isEqualNodes(node.arguments, toNode.arguments))) { |
| 10770 toNode.element = node.element; | 9839 toNode.element = node.element; |
| 10771 return true; | 9840 return true; |
| 10772 } | 9841 } |
| 10773 return false; | 9842 return false; |
| 10774 } | 9843 } |
| 10775 | 9844 |
| 10776 @override | 9845 @override |
| 10777 bool visitArgumentList(ArgumentList node) { | 9846 bool visitArgumentList(ArgumentList node) { |
| 10778 ArgumentList toNode = this._toNode as ArgumentList; | 9847 ArgumentList toNode = this._toNode as ArgumentList; |
| 10779 return _and( | 9848 return _and(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 10780 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | |
| 10781 _isEqualNodeLists(node.arguments, toNode.arguments), | 9849 _isEqualNodeLists(node.arguments, toNode.arguments), |
| 10782 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)); | 9850 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)); |
| 10783 } | 9851 } |
| 10784 | 9852 |
| 10785 @override | 9853 @override |
| 10786 bool visitAsExpression(AsExpression node) { | 9854 bool visitAsExpression(AsExpression node) { |
| 10787 AsExpression toNode = this._toNode as AsExpression; | 9855 AsExpression toNode = this._toNode as AsExpression; |
| 10788 if (_and( | 9856 if (_and(_isEqualNodes(node.expression, toNode.expression), |
| 10789 _isEqualNodes(node.expression, toNode.expression), | |
| 10790 _isEqualTokens(node.asOperator, toNode.asOperator), | 9857 _isEqualTokens(node.asOperator, toNode.asOperator), |
| 10791 _isEqualNodes(node.type, toNode.type))) { | 9858 _isEqualNodes(node.type, toNode.type))) { |
| 10792 toNode.propagatedType = node.propagatedType; | 9859 toNode.propagatedType = node.propagatedType; |
| 10793 toNode.staticType = node.staticType; | 9860 toNode.staticType = node.staticType; |
| 10794 return true; | 9861 return true; |
| 10795 } | 9862 } |
| 10796 return false; | 9863 return false; |
| 10797 } | 9864 } |
| 10798 | 9865 |
| 10799 @override | 9866 @override |
| 10800 bool visitAssertStatement(AssertStatement node) { | 9867 bool visitAssertStatement(AssertStatement node) { |
| 10801 AssertStatement toNode = this._toNode as AssertStatement; | 9868 AssertStatement toNode = this._toNode as AssertStatement; |
| 10802 return _and( | 9869 return _and(_isEqualTokens(node.assertKeyword, toNode.assertKeyword), |
| 10803 _isEqualTokens(node.assertKeyword, toNode.assertKeyword), | |
| 10804 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | 9870 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 10805 _isEqualNodes(node.condition, toNode.condition), | 9871 _isEqualNodes(node.condition, toNode.condition), |
| 10806 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), | 9872 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), |
| 10807 _isEqualTokens(node.semicolon, toNode.semicolon)); | 9873 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 10808 } | 9874 } |
| 10809 | 9875 |
| 10810 @override | 9876 @override |
| 10811 bool visitAssignmentExpression(AssignmentExpression node) { | 9877 bool visitAssignmentExpression(AssignmentExpression node) { |
| 10812 AssignmentExpression toNode = this._toNode as AssignmentExpression; | 9878 AssignmentExpression toNode = this._toNode as AssignmentExpression; |
| 10813 if (_and( | 9879 if (_and(_isEqualNodes(node.leftHandSide, toNode.leftHandSide), |
| 10814 _isEqualNodes(node.leftHandSide, toNode.leftHandSide), | |
| 10815 _isEqualTokens(node.operator, toNode.operator), | 9880 _isEqualTokens(node.operator, toNode.operator), |
| 10816 _isEqualNodes(node.rightHandSide, toNode.rightHandSide))) { | 9881 _isEqualNodes(node.rightHandSide, toNode.rightHandSide))) { |
| 10817 toNode.propagatedElement = node.propagatedElement; | 9882 toNode.propagatedElement = node.propagatedElement; |
| 10818 toNode.propagatedType = node.propagatedType; | 9883 toNode.propagatedType = node.propagatedType; |
| 10819 toNode.staticElement = node.staticElement; | 9884 toNode.staticElement = node.staticElement; |
| 10820 toNode.staticType = node.staticType; | 9885 toNode.staticType = node.staticType; |
| 10821 return true; | 9886 return true; |
| 10822 } | 9887 } |
| 10823 return false; | 9888 return false; |
| 10824 } | 9889 } |
| 10825 | 9890 |
| 10826 @override | 9891 @override |
| 10827 bool visitAwaitExpression(AwaitExpression node) { | 9892 bool visitAwaitExpression(AwaitExpression node) { |
| 10828 AwaitExpression toNode = this._toNode as AwaitExpression; | 9893 AwaitExpression toNode = this._toNode as AwaitExpression; |
| 10829 return _and( | 9894 return _and(_isEqualTokens(node.awaitKeyword, toNode.awaitKeyword), |
| 10830 _isEqualTokens(node.awaitKeyword, toNode.awaitKeyword), | |
| 10831 _isEqualNodes(node.expression, toNode.expression)); | 9895 _isEqualNodes(node.expression, toNode.expression)); |
| 10832 } | 9896 } |
| 10833 | 9897 |
| 10834 @override | 9898 @override |
| 10835 bool visitBinaryExpression(BinaryExpression node) { | 9899 bool visitBinaryExpression(BinaryExpression node) { |
| 10836 BinaryExpression toNode = this._toNode as BinaryExpression; | 9900 BinaryExpression toNode = this._toNode as BinaryExpression; |
| 10837 if (_and( | 9901 if (_and(_isEqualNodes(node.leftOperand, toNode.leftOperand), |
| 10838 _isEqualNodes(node.leftOperand, toNode.leftOperand), | |
| 10839 _isEqualTokens(node.operator, toNode.operator), | 9902 _isEqualTokens(node.operator, toNode.operator), |
| 10840 _isEqualNodes(node.rightOperand, toNode.rightOperand))) { | 9903 _isEqualNodes(node.rightOperand, toNode.rightOperand))) { |
| 10841 toNode.propagatedElement = node.propagatedElement; | 9904 toNode.propagatedElement = node.propagatedElement; |
| 10842 toNode.propagatedType = node.propagatedType; | 9905 toNode.propagatedType = node.propagatedType; |
| 10843 toNode.staticElement = node.staticElement; | 9906 toNode.staticElement = node.staticElement; |
| 10844 toNode.staticType = node.staticType; | 9907 toNode.staticType = node.staticType; |
| 10845 return true; | 9908 return true; |
| 10846 } | 9909 } |
| 10847 return false; | 9910 return false; |
| 10848 } | 9911 } |
| 10849 | 9912 |
| 10850 @override | 9913 @override |
| 10851 bool visitBlock(Block node) { | 9914 bool visitBlock(Block node) { |
| 10852 Block toNode = this._toNode as Block; | 9915 Block toNode = this._toNode as Block; |
| 10853 return _and( | 9916 return _and(_isEqualTokens(node.leftBracket, toNode.leftBracket), |
| 10854 _isEqualTokens(node.leftBracket, toNode.leftBracket), | |
| 10855 _isEqualNodeLists(node.statements, toNode.statements), | 9917 _isEqualNodeLists(node.statements, toNode.statements), |
| 10856 _isEqualTokens(node.rightBracket, toNode.rightBracket)); | 9918 _isEqualTokens(node.rightBracket, toNode.rightBracket)); |
| 10857 } | 9919 } |
| 10858 | 9920 |
| 10859 @override | 9921 @override |
| 10860 bool visitBlockFunctionBody(BlockFunctionBody node) { | 9922 bool visitBlockFunctionBody(BlockFunctionBody node) { |
| 10861 BlockFunctionBody toNode = this._toNode as BlockFunctionBody; | 9923 BlockFunctionBody toNode = this._toNode as BlockFunctionBody; |
| 10862 return _isEqualNodes(node.block, toNode.block); | 9924 return _isEqualNodes(node.block, toNode.block); |
| 10863 } | 9925 } |
| 10864 | 9926 |
| 10865 @override | 9927 @override |
| 10866 bool visitBooleanLiteral(BooleanLiteral node) { | 9928 bool visitBooleanLiteral(BooleanLiteral node) { |
| 10867 BooleanLiteral toNode = this._toNode as BooleanLiteral; | 9929 BooleanLiteral toNode = this._toNode as BooleanLiteral; |
| 10868 if (_and( | 9930 if (_and(_isEqualTokens(node.literal, toNode.literal), |
| 10869 _isEqualTokens(node.literal, toNode.literal), | |
| 10870 node.value == toNode.value)) { | 9931 node.value == toNode.value)) { |
| 10871 toNode.propagatedType = node.propagatedType; | 9932 toNode.propagatedType = node.propagatedType; |
| 10872 toNode.staticType = node.staticType; | 9933 toNode.staticType = node.staticType; |
| 10873 return true; | 9934 return true; |
| 10874 } | 9935 } |
| 10875 return false; | 9936 return false; |
| 10876 } | 9937 } |
| 10877 | 9938 |
| 10878 @override | 9939 @override |
| 10879 bool visitBreakStatement(BreakStatement node) { | 9940 bool visitBreakStatement(BreakStatement node) { |
| 10880 BreakStatement toNode = this._toNode as BreakStatement; | 9941 BreakStatement toNode = this._toNode as BreakStatement; |
| 10881 if (_and( | 9942 if (_and(_isEqualTokens(node.breakKeyword, toNode.breakKeyword), |
| 10882 _isEqualTokens(node.breakKeyword, toNode.breakKeyword), | |
| 10883 _isEqualNodes(node.label, toNode.label), | 9943 _isEqualNodes(node.label, toNode.label), |
| 10884 _isEqualTokens(node.semicolon, toNode.semicolon))) { | 9944 _isEqualTokens(node.semicolon, toNode.semicolon))) { |
| 10885 // TODO(paulberry): map node.target to toNode.target. | 9945 // TODO(paulberry): map node.target to toNode.target. |
| 10886 return true; | 9946 return true; |
| 10887 } | 9947 } |
| 10888 return false; | 9948 return false; |
| 10889 } | 9949 } |
| 10890 | 9950 |
| 10891 @override | 9951 @override |
| 10892 bool visitCascadeExpression(CascadeExpression node) { | 9952 bool visitCascadeExpression(CascadeExpression node) { |
| 10893 CascadeExpression toNode = this._toNode as CascadeExpression; | 9953 CascadeExpression toNode = this._toNode as CascadeExpression; |
| 10894 if (_and( | 9954 if (_and(_isEqualNodes(node.target, toNode.target), |
| 10895 _isEqualNodes(node.target, toNode.target), | |
| 10896 _isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) { | 9955 _isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) { |
| 10897 toNode.propagatedType = node.propagatedType; | 9956 toNode.propagatedType = node.propagatedType; |
| 10898 toNode.staticType = node.staticType; | 9957 toNode.staticType = node.staticType; |
| 10899 return true; | 9958 return true; |
| 10900 } | 9959 } |
| 10901 return false; | 9960 return false; |
| 10902 } | 9961 } |
| 10903 | 9962 |
| 10904 @override | 9963 @override |
| 10905 bool visitCatchClause(CatchClause node) { | 9964 bool visitCatchClause(CatchClause node) { |
| 10906 CatchClause toNode = this._toNode as CatchClause; | 9965 CatchClause toNode = this._toNode as CatchClause; |
| 10907 return _and( | 9966 return _and(_isEqualTokens(node.onKeyword, toNode.onKeyword), |
| 10908 _isEqualTokens(node.onKeyword, toNode.onKeyword), | |
| 10909 _isEqualNodes(node.exceptionType, toNode.exceptionType), | 9967 _isEqualNodes(node.exceptionType, toNode.exceptionType), |
| 10910 _isEqualTokens(node.catchKeyword, toNode.catchKeyword), | 9968 _isEqualTokens(node.catchKeyword, toNode.catchKeyword), |
| 10911 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | 9969 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 10912 _isEqualNodes(node.exceptionParameter, toNode.exceptionParameter), | 9970 _isEqualNodes(node.exceptionParameter, toNode.exceptionParameter), |
| 10913 _isEqualTokens(node.comma, toNode.comma), | 9971 _isEqualTokens(node.comma, toNode.comma), |
| 10914 _isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter), | 9972 _isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter), |
| 10915 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), | 9973 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), |
| 10916 _isEqualNodes(node.body, toNode.body)); | 9974 _isEqualNodes(node.body, toNode.body)); |
| 10917 } | 9975 } |
| 10918 | 9976 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10953 | 10011 |
| 10954 @override | 10012 @override |
| 10955 bool visitComment(Comment node) { | 10013 bool visitComment(Comment node) { |
| 10956 Comment toNode = this._toNode as Comment; | 10014 Comment toNode = this._toNode as Comment; |
| 10957 return _isEqualNodeLists(node.references, toNode.references); | 10015 return _isEqualNodeLists(node.references, toNode.references); |
| 10958 } | 10016 } |
| 10959 | 10017 |
| 10960 @override | 10018 @override |
| 10961 bool visitCommentReference(CommentReference node) { | 10019 bool visitCommentReference(CommentReference node) { |
| 10962 CommentReference toNode = this._toNode as CommentReference; | 10020 CommentReference toNode = this._toNode as CommentReference; |
| 10963 return _and( | 10021 return _and(_isEqualTokens(node.newKeyword, toNode.newKeyword), |
| 10964 _isEqualTokens(node.newKeyword, toNode.newKeyword), | |
| 10965 _isEqualNodes(node.identifier, toNode.identifier)); | 10022 _isEqualNodes(node.identifier, toNode.identifier)); |
| 10966 } | 10023 } |
| 10967 | 10024 |
| 10968 @override | 10025 @override |
| 10969 bool visitCompilationUnit(CompilationUnit node) { | 10026 bool visitCompilationUnit(CompilationUnit node) { |
| 10970 CompilationUnit toNode = this._toNode as CompilationUnit; | 10027 CompilationUnit toNode = this._toNode as CompilationUnit; |
| 10971 if (_and( | 10028 if (_and(_isEqualTokens(node.beginToken, toNode.beginToken), |
| 10972 _isEqualTokens(node.beginToken, toNode.beginToken), | |
| 10973 _isEqualNodes(node.scriptTag, toNode.scriptTag), | 10029 _isEqualNodes(node.scriptTag, toNode.scriptTag), |
| 10974 _isEqualNodeLists(node.directives, toNode.directives), | 10030 _isEqualNodeLists(node.directives, toNode.directives), |
| 10975 _isEqualNodeLists(node.declarations, toNode.declarations), | 10031 _isEqualNodeLists(node.declarations, toNode.declarations), |
| 10976 _isEqualTokens(node.endToken, toNode.endToken))) { | 10032 _isEqualTokens(node.endToken, toNode.endToken))) { |
| 10977 toNode.element = node.element; | 10033 toNode.element = node.element; |
| 10978 return true; | 10034 return true; |
| 10979 } | 10035 } |
| 10980 return false; | 10036 return false; |
| 10981 } | 10037 } |
| 10982 | 10038 |
| 10983 @override | 10039 @override |
| 10984 bool visitConditionalExpression(ConditionalExpression node) { | 10040 bool visitConditionalExpression(ConditionalExpression node) { |
| 10985 ConditionalExpression toNode = this._toNode as ConditionalExpression; | 10041 ConditionalExpression toNode = this._toNode as ConditionalExpression; |
| 10986 if (_and( | 10042 if (_and(_isEqualNodes(node.condition, toNode.condition), |
| 10987 _isEqualNodes(node.condition, toNode.condition), | |
| 10988 _isEqualTokens(node.question, toNode.question), | 10043 _isEqualTokens(node.question, toNode.question), |
| 10989 _isEqualNodes(node.thenExpression, toNode.thenExpression), | 10044 _isEqualNodes(node.thenExpression, toNode.thenExpression), |
| 10990 _isEqualTokens(node.colon, toNode.colon), | 10045 _isEqualTokens(node.colon, toNode.colon), |
| 10991 _isEqualNodes(node.elseExpression, toNode.elseExpression))) { | 10046 _isEqualNodes(node.elseExpression, toNode.elseExpression))) { |
| 10992 toNode.propagatedType = node.propagatedType; | 10047 toNode.propagatedType = node.propagatedType; |
| 10993 toNode.staticType = node.staticType; | 10048 toNode.staticType = node.staticType; |
| 10994 return true; | 10049 return true; |
| 10995 } | 10050 } |
| 10996 return false; | 10051 return false; |
| 10997 } | 10052 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 11016 toNode.element = node.element; | 10071 toNode.element = node.element; |
| 11017 return true; | 10072 return true; |
| 11018 } | 10073 } |
| 11019 return false; | 10074 return false; |
| 11020 } | 10075 } |
| 11021 | 10076 |
| 11022 @override | 10077 @override |
| 11023 bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) { | 10078 bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) { |
| 11024 ConstructorFieldInitializer toNode = | 10079 ConstructorFieldInitializer toNode = |
| 11025 this._toNode as ConstructorFieldInitializer; | 10080 this._toNode as ConstructorFieldInitializer; |
| 11026 return _and( | 10081 return _and(_isEqualTokens(node.thisKeyword, toNode.thisKeyword), |
| 11027 _isEqualTokens(node.thisKeyword, toNode.thisKeyword), | |
| 11028 _isEqualTokens(node.period, toNode.period), | 10082 _isEqualTokens(node.period, toNode.period), |
| 11029 _isEqualNodes(node.fieldName, toNode.fieldName), | 10083 _isEqualNodes(node.fieldName, toNode.fieldName), |
| 11030 _isEqualTokens(node.equals, toNode.equals), | 10084 _isEqualTokens(node.equals, toNode.equals), |
| 11031 _isEqualNodes(node.expression, toNode.expression)); | 10085 _isEqualNodes(node.expression, toNode.expression)); |
| 11032 } | 10086 } |
| 11033 | 10087 |
| 11034 @override | 10088 @override |
| 11035 bool visitConstructorName(ConstructorName node) { | 10089 bool visitConstructorName(ConstructorName node) { |
| 11036 ConstructorName toNode = this._toNode as ConstructorName; | 10090 ConstructorName toNode = this._toNode as ConstructorName; |
| 11037 if (_and( | 10091 if (_and(_isEqualNodes(node.type, toNode.type), |
| 11038 _isEqualNodes(node.type, toNode.type), | |
| 11039 _isEqualTokens(node.period, toNode.period), | 10092 _isEqualTokens(node.period, toNode.period), |
| 11040 _isEqualNodes(node.name, toNode.name))) { | 10093 _isEqualNodes(node.name, toNode.name))) { |
| 11041 toNode.staticElement = node.staticElement; | 10094 toNode.staticElement = node.staticElement; |
| 11042 return true; | 10095 return true; |
| 11043 } | 10096 } |
| 11044 return false; | 10097 return false; |
| 11045 } | 10098 } |
| 11046 | 10099 |
| 11047 @override | 10100 @override |
| 11048 bool visitContinueStatement(ContinueStatement node) { | 10101 bool visitContinueStatement(ContinueStatement node) { |
| 11049 ContinueStatement toNode = this._toNode as ContinueStatement; | 10102 ContinueStatement toNode = this._toNode as ContinueStatement; |
| 11050 if (_and( | 10103 if (_and(_isEqualTokens(node.continueKeyword, toNode.continueKeyword), |
| 11051 _isEqualTokens(node.continueKeyword, toNode.continueKeyword), | |
| 11052 _isEqualNodes(node.label, toNode.label), | 10104 _isEqualNodes(node.label, toNode.label), |
| 11053 _isEqualTokens(node.semicolon, toNode.semicolon))) { | 10105 _isEqualTokens(node.semicolon, toNode.semicolon))) { |
| 11054 // TODO(paulberry): map node.target to toNode.target. | 10106 // TODO(paulberry): map node.target to toNode.target. |
| 11055 return true; | 10107 return true; |
| 11056 } | 10108 } |
| 11057 return false; | 10109 return false; |
| 11058 } | 10110 } |
| 11059 | 10111 |
| 11060 @override | 10112 @override |
| 11061 bool visitDeclaredIdentifier(DeclaredIdentifier node) { | 10113 bool visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 11062 DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier; | 10114 DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier; |
| 11063 return _and( | 10115 return _and( |
| 11064 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10116 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11065 _isEqualNodeLists(node.metadata, toNode.metadata), | 10117 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11066 _isEqualTokens(node.keyword, toNode.keyword), | 10118 _isEqualTokens(node.keyword, toNode.keyword), |
| 11067 _isEqualNodes(node.type, toNode.type), | 10119 _isEqualNodes(node.type, toNode.type), |
| 11068 _isEqualNodes(node.identifier, toNode.identifier)); | 10120 _isEqualNodes(node.identifier, toNode.identifier)); |
| 11069 } | 10121 } |
| 11070 | 10122 |
| 11071 @override | 10123 @override |
| 11072 bool visitDefaultFormalParameter(DefaultFormalParameter node) { | 10124 bool visitDefaultFormalParameter(DefaultFormalParameter node) { |
| 11073 DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter; | 10125 DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter; |
| 11074 return _and( | 10126 return _and(_isEqualNodes(node.parameter, toNode.parameter), |
| 11075 _isEqualNodes(node.parameter, toNode.parameter), | |
| 11076 node.kind == toNode.kind, | 10127 node.kind == toNode.kind, |
| 11077 _isEqualTokens(node.separator, toNode.separator), | 10128 _isEqualTokens(node.separator, toNode.separator), |
| 11078 _isEqualNodes(node.defaultValue, toNode.defaultValue)); | 10129 _isEqualNodes(node.defaultValue, toNode.defaultValue)); |
| 11079 } | 10130 } |
| 11080 | 10131 |
| 11081 @override | 10132 @override |
| 11082 bool visitDoStatement(DoStatement node) { | 10133 bool visitDoStatement(DoStatement node) { |
| 11083 DoStatement toNode = this._toNode as DoStatement; | 10134 DoStatement toNode = this._toNode as DoStatement; |
| 11084 return _and( | 10135 return _and(_isEqualTokens(node.doKeyword, toNode.doKeyword), |
| 11085 _isEqualTokens(node.doKeyword, toNode.doKeyword), | |
| 11086 _isEqualNodes(node.body, toNode.body), | 10136 _isEqualNodes(node.body, toNode.body), |
| 11087 _isEqualTokens(node.whileKeyword, toNode.whileKeyword), | 10137 _isEqualTokens(node.whileKeyword, toNode.whileKeyword), |
| 11088 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | 10138 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 11089 _isEqualNodes(node.condition, toNode.condition), | 10139 _isEqualNodes(node.condition, toNode.condition), |
| 11090 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), | 10140 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), |
| 11091 _isEqualTokens(node.semicolon, toNode.semicolon)); | 10141 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 11092 } | 10142 } |
| 11093 | 10143 |
| 11094 @override | 10144 @override |
| 11095 bool visitDoubleLiteral(DoubleLiteral node) { | 10145 bool visitDoubleLiteral(DoubleLiteral node) { |
| 11096 DoubleLiteral toNode = this._toNode as DoubleLiteral; | 10146 DoubleLiteral toNode = this._toNode as DoubleLiteral; |
| 11097 if (_and( | 10147 if (_and(_isEqualTokens(node.literal, toNode.literal), |
| 11098 _isEqualTokens(node.literal, toNode.literal), | |
| 11099 node.value == toNode.value)) { | 10148 node.value == toNode.value)) { |
| 11100 toNode.propagatedType = node.propagatedType; | 10149 toNode.propagatedType = node.propagatedType; |
| 11101 toNode.staticType = node.staticType; | 10150 toNode.staticType = node.staticType; |
| 11102 return true; | 10151 return true; |
| 11103 } | 10152 } |
| 11104 return false; | 10153 return false; |
| 11105 } | 10154 } |
| 11106 | 10155 |
| 11107 @override | 10156 @override |
| 11108 bool visitEmptyFunctionBody(EmptyFunctionBody node) { | 10157 bool visitEmptyFunctionBody(EmptyFunctionBody node) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11159 ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody; | 10208 ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody; |
| 11160 return _and( | 10209 return _and( |
| 11161 _isEqualTokens(node.functionDefinition, toNode.functionDefinition), | 10210 _isEqualTokens(node.functionDefinition, toNode.functionDefinition), |
| 11162 _isEqualNodes(node.expression, toNode.expression), | 10211 _isEqualNodes(node.expression, toNode.expression), |
| 11163 _isEqualTokens(node.semicolon, toNode.semicolon)); | 10212 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 11164 } | 10213 } |
| 11165 | 10214 |
| 11166 @override | 10215 @override |
| 11167 bool visitExpressionStatement(ExpressionStatement node) { | 10216 bool visitExpressionStatement(ExpressionStatement node) { |
| 11168 ExpressionStatement toNode = this._toNode as ExpressionStatement; | 10217 ExpressionStatement toNode = this._toNode as ExpressionStatement; |
| 11169 return _and( | 10218 return _and(_isEqualNodes(node.expression, toNode.expression), |
| 11170 _isEqualNodes(node.expression, toNode.expression), | |
| 11171 _isEqualTokens(node.semicolon, toNode.semicolon)); | 10219 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 11172 } | 10220 } |
| 11173 | 10221 |
| 11174 @override | 10222 @override |
| 11175 bool visitExtendsClause(ExtendsClause node) { | 10223 bool visitExtendsClause(ExtendsClause node) { |
| 11176 ExtendsClause toNode = this._toNode as ExtendsClause; | 10224 ExtendsClause toNode = this._toNode as ExtendsClause; |
| 11177 return _and( | 10225 return _and(_isEqualTokens(node.extendsKeyword, toNode.extendsKeyword), |
| 11178 _isEqualTokens(node.extendsKeyword, toNode.extendsKeyword), | |
| 11179 _isEqualNodes(node.superclass, toNode.superclass)); | 10226 _isEqualNodes(node.superclass, toNode.superclass)); |
| 11180 } | 10227 } |
| 11181 | 10228 |
| 11182 @override | 10229 @override |
| 11183 bool visitFieldDeclaration(FieldDeclaration node) { | 10230 bool visitFieldDeclaration(FieldDeclaration node) { |
| 11184 FieldDeclaration toNode = this._toNode as FieldDeclaration; | 10231 FieldDeclaration toNode = this._toNode as FieldDeclaration; |
| 11185 return _and( | 10232 return _and( |
| 11186 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10233 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11187 _isEqualNodeLists(node.metadata, toNode.metadata), | 10234 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11188 _isEqualTokens(node.staticKeyword, toNode.staticKeyword), | 10235 _isEqualTokens(node.staticKeyword, toNode.staticKeyword), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 11199 _isEqualTokens(node.keyword, toNode.keyword), | 10246 _isEqualTokens(node.keyword, toNode.keyword), |
| 11200 _isEqualNodes(node.type, toNode.type), | 10247 _isEqualNodes(node.type, toNode.type), |
| 11201 _isEqualTokens(node.thisKeyword, toNode.thisKeyword), | 10248 _isEqualTokens(node.thisKeyword, toNode.thisKeyword), |
| 11202 _isEqualTokens(node.period, toNode.period), | 10249 _isEqualTokens(node.period, toNode.period), |
| 11203 _isEqualNodes(node.identifier, toNode.identifier)); | 10250 _isEqualNodes(node.identifier, toNode.identifier)); |
| 11204 } | 10251 } |
| 11205 | 10252 |
| 11206 @override | 10253 @override |
| 11207 bool visitForEachStatement(ForEachStatement node) { | 10254 bool visitForEachStatement(ForEachStatement node) { |
| 11208 ForEachStatement toNode = this._toNode as ForEachStatement; | 10255 ForEachStatement toNode = this._toNode as ForEachStatement; |
| 11209 return _and( | 10256 return _and(_isEqualTokens(node.forKeyword, toNode.forKeyword), |
| 11210 _isEqualTokens(node.forKeyword, toNode.forKeyword), | |
| 11211 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | 10257 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 11212 _isEqualNodes(node.loopVariable, toNode.loopVariable), | 10258 _isEqualNodes(node.loopVariable, toNode.loopVariable), |
| 11213 _isEqualTokens(node.inKeyword, toNode.inKeyword), | 10259 _isEqualTokens(node.inKeyword, toNode.inKeyword), |
| 11214 _isEqualNodes(node.iterable, toNode.iterable), | 10260 _isEqualNodes(node.iterable, toNode.iterable), |
| 11215 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), | 10261 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), |
| 11216 _isEqualNodes(node.body, toNode.body)); | 10262 _isEqualNodes(node.body, toNode.body)); |
| 11217 } | 10263 } |
| 11218 | 10264 |
| 11219 @override | 10265 @override |
| 11220 bool visitFormalParameterList(FormalParameterList node) { | 10266 bool visitFormalParameterList(FormalParameterList node) { |
| 11221 FormalParameterList toNode = this._toNode as FormalParameterList; | 10267 FormalParameterList toNode = this._toNode as FormalParameterList; |
| 11222 return _and( | 10268 return _and(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 11223 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | |
| 11224 _isEqualNodeLists(node.parameters, toNode.parameters), | 10269 _isEqualNodeLists(node.parameters, toNode.parameters), |
| 11225 _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter), | 10270 _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter), |
| 11226 _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter), | 10271 _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter), |
| 11227 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)); | 10272 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)); |
| 11228 } | 10273 } |
| 11229 | 10274 |
| 11230 @override | 10275 @override |
| 11231 bool visitForStatement(ForStatement node) { | 10276 bool visitForStatement(ForStatement node) { |
| 11232 ForStatement toNode = this._toNode as ForStatement; | 10277 ForStatement toNode = this._toNode as ForStatement; |
| 11233 return _and( | 10278 return _and(_isEqualTokens(node.forKeyword, toNode.forKeyword), |
| 11234 _isEqualTokens(node.forKeyword, toNode.forKeyword), | |
| 11235 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | 10279 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 11236 _isEqualNodes(node.variables, toNode.variables), | 10280 _isEqualNodes(node.variables, toNode.variables), |
| 11237 _isEqualNodes(node.initialization, toNode.initialization), | 10281 _isEqualNodes(node.initialization, toNode.initialization), |
| 11238 _isEqualTokens(node.leftSeparator, toNode.leftSeparator), | 10282 _isEqualTokens(node.leftSeparator, toNode.leftSeparator), |
| 11239 _isEqualNodes(node.condition, toNode.condition), | 10283 _isEqualNodes(node.condition, toNode.condition), |
| 11240 _isEqualTokens(node.rightSeparator, toNode.rightSeparator), | 10284 _isEqualTokens(node.rightSeparator, toNode.rightSeparator), |
| 11241 _isEqualNodeLists(node.updaters, toNode.updaters), | 10285 _isEqualNodeLists(node.updaters, toNode.updaters), |
| 11242 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), | 10286 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), |
| 11243 _isEqualNodes(node.body, toNode.body)); | 10287 _isEqualNodes(node.body, toNode.body)); |
| 11244 } | 10288 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 11259 @override | 10303 @override |
| 11260 bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) { | 10304 bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) { |
| 11261 FunctionDeclarationStatement toNode = | 10305 FunctionDeclarationStatement toNode = |
| 11262 this._toNode as FunctionDeclarationStatement; | 10306 this._toNode as FunctionDeclarationStatement; |
| 11263 return _isEqualNodes(node.functionDeclaration, toNode.functionDeclaration); | 10307 return _isEqualNodes(node.functionDeclaration, toNode.functionDeclaration); |
| 11264 } | 10308 } |
| 11265 | 10309 |
| 11266 @override | 10310 @override |
| 11267 bool visitFunctionExpression(FunctionExpression node) { | 10311 bool visitFunctionExpression(FunctionExpression node) { |
| 11268 FunctionExpression toNode = this._toNode as FunctionExpression; | 10312 FunctionExpression toNode = this._toNode as FunctionExpression; |
| 11269 if (_and( | 10313 if (_and(_isEqualNodes(node.parameters, toNode.parameters), |
| 11270 _isEqualNodes(node.parameters, toNode.parameters), | |
| 11271 _isEqualNodes(node.body, toNode.body))) { | 10314 _isEqualNodes(node.body, toNode.body))) { |
| 11272 toNode.element = node.element; | 10315 toNode.element = node.element; |
| 11273 toNode.propagatedType = node.propagatedType; | 10316 toNode.propagatedType = node.propagatedType; |
| 11274 toNode.staticType = node.staticType; | 10317 toNode.staticType = node.staticType; |
| 11275 return true; | 10318 return true; |
| 11276 } | 10319 } |
| 11277 return false; | 10320 return false; |
| 11278 } | 10321 } |
| 11279 | 10322 |
| 11280 @override | 10323 @override |
| 11281 bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { | 10324 bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { |
| 11282 FunctionExpressionInvocation toNode = | 10325 FunctionExpressionInvocation toNode = |
| 11283 this._toNode as FunctionExpressionInvocation; | 10326 this._toNode as FunctionExpressionInvocation; |
| 11284 if (_and( | 10327 if (_and(_isEqualNodes(node.function, toNode.function), |
| 11285 _isEqualNodes(node.function, toNode.function), | |
| 11286 _isEqualNodes(node.argumentList, toNode.argumentList))) { | 10328 _isEqualNodes(node.argumentList, toNode.argumentList))) { |
| 11287 toNode.propagatedElement = node.propagatedElement; | 10329 toNode.propagatedElement = node.propagatedElement; |
| 11288 toNode.propagatedType = node.propagatedType; | 10330 toNode.propagatedType = node.propagatedType; |
| 11289 toNode.staticElement = node.staticElement; | 10331 toNode.staticElement = node.staticElement; |
| 11290 toNode.staticType = node.staticType; | 10332 toNode.staticType = node.staticType; |
| 11291 return true; | 10333 return true; |
| 11292 } | 10334 } |
| 11293 return false; | 10335 return false; |
| 11294 } | 10336 } |
| 11295 | 10337 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 11315 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10357 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11316 _isEqualNodeLists(node.metadata, toNode.metadata), | 10358 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11317 _isEqualNodes(node.returnType, toNode.returnType), | 10359 _isEqualNodes(node.returnType, toNode.returnType), |
| 11318 _isEqualNodes(node.identifier, toNode.identifier), | 10360 _isEqualNodes(node.identifier, toNode.identifier), |
| 11319 _isEqualNodes(node.parameters, toNode.parameters)); | 10361 _isEqualNodes(node.parameters, toNode.parameters)); |
| 11320 } | 10362 } |
| 11321 | 10363 |
| 11322 @override | 10364 @override |
| 11323 bool visitHideCombinator(HideCombinator node) { | 10365 bool visitHideCombinator(HideCombinator node) { |
| 11324 HideCombinator toNode = this._toNode as HideCombinator; | 10366 HideCombinator toNode = this._toNode as HideCombinator; |
| 11325 return _and( | 10367 return _and(_isEqualTokens(node.keyword, toNode.keyword), |
| 11326 _isEqualTokens(node.keyword, toNode.keyword), | |
| 11327 _isEqualNodeLists(node.hiddenNames, toNode.hiddenNames)); | 10368 _isEqualNodeLists(node.hiddenNames, toNode.hiddenNames)); |
| 11328 } | 10369 } |
| 11329 | 10370 |
| 11330 @override | 10371 @override |
| 11331 bool visitIfStatement(IfStatement node) { | 10372 bool visitIfStatement(IfStatement node) { |
| 11332 IfStatement toNode = this._toNode as IfStatement; | 10373 IfStatement toNode = this._toNode as IfStatement; |
| 11333 return _and( | 10374 return _and(_isEqualTokens(node.ifKeyword, toNode.ifKeyword), |
| 11334 _isEqualTokens(node.ifKeyword, toNode.ifKeyword), | |
| 11335 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | 10375 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 11336 _isEqualNodes(node.condition, toNode.condition), | 10376 _isEqualNodes(node.condition, toNode.condition), |
| 11337 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), | 10377 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), |
| 11338 _isEqualNodes(node.thenStatement, toNode.thenStatement), | 10378 _isEqualNodes(node.thenStatement, toNode.thenStatement), |
| 11339 _isEqualTokens(node.elseKeyword, toNode.elseKeyword), | 10379 _isEqualTokens(node.elseKeyword, toNode.elseKeyword), |
| 11340 _isEqualNodes(node.elseStatement, toNode.elseStatement)); | 10380 _isEqualNodes(node.elseStatement, toNode.elseStatement)); |
| 11341 } | 10381 } |
| 11342 | 10382 |
| 11343 @override | 10383 @override |
| 11344 bool visitImplementsClause(ImplementsClause node) { | 10384 bool visitImplementsClause(ImplementsClause node) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 11362 _isEqualTokens(node.semicolon, toNode.semicolon))) { | 10402 _isEqualTokens(node.semicolon, toNode.semicolon))) { |
| 11363 toNode.element = node.element; | 10403 toNode.element = node.element; |
| 11364 return true; | 10404 return true; |
| 11365 } | 10405 } |
| 11366 return false; | 10406 return false; |
| 11367 } | 10407 } |
| 11368 | 10408 |
| 11369 @override | 10409 @override |
| 11370 bool visitIndexExpression(IndexExpression node) { | 10410 bool visitIndexExpression(IndexExpression node) { |
| 11371 IndexExpression toNode = this._toNode as IndexExpression; | 10411 IndexExpression toNode = this._toNode as IndexExpression; |
| 11372 if (_and( | 10412 if (_and(_isEqualNodes(node.target, toNode.target), |
| 11373 _isEqualNodes(node.target, toNode.target), | |
| 11374 _isEqualTokens(node.leftBracket, toNode.leftBracket), | 10413 _isEqualTokens(node.leftBracket, toNode.leftBracket), |
| 11375 _isEqualNodes(node.index, toNode.index), | 10414 _isEqualNodes(node.index, toNode.index), |
| 11376 _isEqualTokens(node.rightBracket, toNode.rightBracket))) { | 10415 _isEqualTokens(node.rightBracket, toNode.rightBracket))) { |
| 11377 toNode.auxiliaryElements = node.auxiliaryElements; | 10416 toNode.auxiliaryElements = node.auxiliaryElements; |
| 11378 toNode.propagatedElement = node.propagatedElement; | 10417 toNode.propagatedElement = node.propagatedElement; |
| 11379 toNode.propagatedType = node.propagatedType; | 10418 toNode.propagatedType = node.propagatedType; |
| 11380 toNode.staticElement = node.staticElement; | 10419 toNode.staticElement = node.staticElement; |
| 11381 toNode.staticType = node.staticType; | 10420 toNode.staticType = node.staticType; |
| 11382 return true; | 10421 return true; |
| 11383 } | 10422 } |
| 11384 return false; | 10423 return false; |
| 11385 } | 10424 } |
| 11386 | 10425 |
| 11387 @override | 10426 @override |
| 11388 bool visitInstanceCreationExpression(InstanceCreationExpression node) { | 10427 bool visitInstanceCreationExpression(InstanceCreationExpression node) { |
| 11389 InstanceCreationExpression toNode = | 10428 InstanceCreationExpression toNode = |
| 11390 this._toNode as InstanceCreationExpression; | 10429 this._toNode as InstanceCreationExpression; |
| 11391 if (_and( | 10430 if (_and(_isEqualTokens(node.keyword, toNode.keyword), |
| 11392 _isEqualTokens(node.keyword, toNode.keyword), | |
| 11393 _isEqualNodes(node.constructorName, toNode.constructorName), | 10431 _isEqualNodes(node.constructorName, toNode.constructorName), |
| 11394 _isEqualNodes(node.argumentList, toNode.argumentList))) { | 10432 _isEqualNodes(node.argumentList, toNode.argumentList))) { |
| 11395 toNode.propagatedType = node.propagatedType; | 10433 toNode.propagatedType = node.propagatedType; |
| 11396 toNode.staticElement = node.staticElement; | 10434 toNode.staticElement = node.staticElement; |
| 11397 toNode.staticType = node.staticType; | 10435 toNode.staticType = node.staticType; |
| 11398 return true; | 10436 return true; |
| 11399 } | 10437 } |
| 11400 return false; | 10438 return false; |
| 11401 } | 10439 } |
| 11402 | 10440 |
| 11403 @override | 10441 @override |
| 11404 bool visitIntegerLiteral(IntegerLiteral node) { | 10442 bool visitIntegerLiteral(IntegerLiteral node) { |
| 11405 IntegerLiteral toNode = this._toNode as IntegerLiteral; | 10443 IntegerLiteral toNode = this._toNode as IntegerLiteral; |
| 11406 if (_and( | 10444 if (_and(_isEqualTokens(node.literal, toNode.literal), |
| 11407 _isEqualTokens(node.literal, toNode.literal), | |
| 11408 node.value == toNode.value)) { | 10445 node.value == toNode.value)) { |
| 11409 toNode.propagatedType = node.propagatedType; | 10446 toNode.propagatedType = node.propagatedType; |
| 11410 toNode.staticType = node.staticType; | 10447 toNode.staticType = node.staticType; |
| 11411 return true; | 10448 return true; |
| 11412 } | 10449 } |
| 11413 return false; | 10450 return false; |
| 11414 } | 10451 } |
| 11415 | 10452 |
| 11416 @override | 10453 @override |
| 11417 bool visitInterpolationExpression(InterpolationExpression node) { | 10454 bool visitInterpolationExpression(InterpolationExpression node) { |
| 11418 InterpolationExpression toNode = this._toNode as InterpolationExpression; | 10455 InterpolationExpression toNode = this._toNode as InterpolationExpression; |
| 11419 return _and( | 10456 return _and(_isEqualTokens(node.leftBracket, toNode.leftBracket), |
| 11420 _isEqualTokens(node.leftBracket, toNode.leftBracket), | |
| 11421 _isEqualNodes(node.expression, toNode.expression), | 10457 _isEqualNodes(node.expression, toNode.expression), |
| 11422 _isEqualTokens(node.rightBracket, toNode.rightBracket)); | 10458 _isEqualTokens(node.rightBracket, toNode.rightBracket)); |
| 11423 } | 10459 } |
| 11424 | 10460 |
| 11425 @override | 10461 @override |
| 11426 bool visitInterpolationString(InterpolationString node) { | 10462 bool visitInterpolationString(InterpolationString node) { |
| 11427 InterpolationString toNode = this._toNode as InterpolationString; | 10463 InterpolationString toNode = this._toNode as InterpolationString; |
| 11428 return _and( | 10464 return _and(_isEqualTokens(node.contents, toNode.contents), |
| 11429 _isEqualTokens(node.contents, toNode.contents), | |
| 11430 node.value == toNode.value); | 10465 node.value == toNode.value); |
| 11431 } | 10466 } |
| 11432 | 10467 |
| 11433 @override | 10468 @override |
| 11434 bool visitIsExpression(IsExpression node) { | 10469 bool visitIsExpression(IsExpression node) { |
| 11435 IsExpression toNode = this._toNode as IsExpression; | 10470 IsExpression toNode = this._toNode as IsExpression; |
| 11436 if (_and( | 10471 if (_and(_isEqualNodes(node.expression, toNode.expression), |
| 11437 _isEqualNodes(node.expression, toNode.expression), | |
| 11438 _isEqualTokens(node.isOperator, toNode.isOperator), | 10472 _isEqualTokens(node.isOperator, toNode.isOperator), |
| 11439 _isEqualTokens(node.notOperator, toNode.notOperator), | 10473 _isEqualTokens(node.notOperator, toNode.notOperator), |
| 11440 _isEqualNodes(node.type, toNode.type))) { | 10474 _isEqualNodes(node.type, toNode.type))) { |
| 11441 toNode.propagatedType = node.propagatedType; | 10475 toNode.propagatedType = node.propagatedType; |
| 11442 toNode.staticType = node.staticType; | 10476 toNode.staticType = node.staticType; |
| 11443 return true; | 10477 return true; |
| 11444 } | 10478 } |
| 11445 return false; | 10479 return false; |
| 11446 } | 10480 } |
| 11447 | 10481 |
| 11448 @override | 10482 @override |
| 11449 bool visitLabel(Label node) { | 10483 bool visitLabel(Label node) { |
| 11450 Label toNode = this._toNode as Label; | 10484 Label toNode = this._toNode as Label; |
| 11451 return _and( | 10485 return _and(_isEqualNodes(node.label, toNode.label), |
| 11452 _isEqualNodes(node.label, toNode.label), | |
| 11453 _isEqualTokens(node.colon, toNode.colon)); | 10486 _isEqualTokens(node.colon, toNode.colon)); |
| 11454 } | 10487 } |
| 11455 | 10488 |
| 11456 @override | 10489 @override |
| 11457 bool visitLabeledStatement(LabeledStatement node) { | 10490 bool visitLabeledStatement(LabeledStatement node) { |
| 11458 LabeledStatement toNode = this._toNode as LabeledStatement; | 10491 LabeledStatement toNode = this._toNode as LabeledStatement; |
| 11459 return _and( | 10492 return _and(_isEqualNodeLists(node.labels, toNode.labels), |
| 11460 _isEqualNodeLists(node.labels, toNode.labels), | |
| 11461 _isEqualNodes(node.statement, toNode.statement)); | 10493 _isEqualNodes(node.statement, toNode.statement)); |
| 11462 } | 10494 } |
| 11463 | 10495 |
| 11464 @override | 10496 @override |
| 11465 bool visitLibraryDirective(LibraryDirective node) { | 10497 bool visitLibraryDirective(LibraryDirective node) { |
| 11466 LibraryDirective toNode = this._toNode as LibraryDirective; | 10498 LibraryDirective toNode = this._toNode as LibraryDirective; |
| 11467 return _and( | 10499 return _and( |
| 11468 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10500 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11469 _isEqualNodeLists(node.metadata, toNode.metadata), | 10501 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11470 _isEqualTokens(node.libraryKeyword, toNode.libraryKeyword), | 10502 _isEqualTokens(node.libraryKeyword, toNode.libraryKeyword), |
| 11471 _isEqualNodes(node.name, toNode.name), | 10503 _isEqualNodes(node.name, toNode.name), |
| 11472 _isEqualTokens(node.semicolon, toNode.semicolon)); | 10504 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 11473 } | 10505 } |
| 11474 | 10506 |
| 11475 @override | 10507 @override |
| 11476 bool visitLibraryIdentifier(LibraryIdentifier node) { | 10508 bool visitLibraryIdentifier(LibraryIdentifier node) { |
| 11477 LibraryIdentifier toNode = this._toNode as LibraryIdentifier; | 10509 LibraryIdentifier toNode = this._toNode as LibraryIdentifier; |
| 11478 if (_isEqualNodeLists(node.components, toNode.components)) { | 10510 if (_isEqualNodeLists(node.components, toNode.components)) { |
| 11479 toNode.propagatedType = node.propagatedType; | 10511 toNode.propagatedType = node.propagatedType; |
| 11480 toNode.staticType = node.staticType; | 10512 toNode.staticType = node.staticType; |
| 11481 return true; | 10513 return true; |
| 11482 } | 10514 } |
| 11483 return false; | 10515 return false; |
| 11484 } | 10516 } |
| 11485 | 10517 |
| 11486 @override | 10518 @override |
| 11487 bool visitListLiteral(ListLiteral node) { | 10519 bool visitListLiteral(ListLiteral node) { |
| 11488 ListLiteral toNode = this._toNode as ListLiteral; | 10520 ListLiteral toNode = this._toNode as ListLiteral; |
| 11489 if (_and( | 10521 if (_and(_isEqualTokens(node.constKeyword, toNode.constKeyword), |
| 11490 _isEqualTokens(node.constKeyword, toNode.constKeyword), | |
| 11491 _isEqualNodes(node.typeArguments, toNode.typeArguments), | 10522 _isEqualNodes(node.typeArguments, toNode.typeArguments), |
| 11492 _isEqualTokens(node.leftBracket, toNode.leftBracket), | 10523 _isEqualTokens(node.leftBracket, toNode.leftBracket), |
| 11493 _isEqualNodeLists(node.elements, toNode.elements), | 10524 _isEqualNodeLists(node.elements, toNode.elements), |
| 11494 _isEqualTokens(node.rightBracket, toNode.rightBracket))) { | 10525 _isEqualTokens(node.rightBracket, toNode.rightBracket))) { |
| 11495 toNode.propagatedType = node.propagatedType; | 10526 toNode.propagatedType = node.propagatedType; |
| 11496 toNode.staticType = node.staticType; | 10527 toNode.staticType = node.staticType; |
| 11497 return true; | 10528 return true; |
| 11498 } | 10529 } |
| 11499 return false; | 10530 return false; |
| 11500 } | 10531 } |
| 11501 | 10532 |
| 11502 @override | 10533 @override |
| 11503 bool visitMapLiteral(MapLiteral node) { | 10534 bool visitMapLiteral(MapLiteral node) { |
| 11504 MapLiteral toNode = this._toNode as MapLiteral; | 10535 MapLiteral toNode = this._toNode as MapLiteral; |
| 11505 if (_and( | 10536 if (_and(_isEqualTokens(node.constKeyword, toNode.constKeyword), |
| 11506 _isEqualTokens(node.constKeyword, toNode.constKeyword), | |
| 11507 _isEqualNodes(node.typeArguments, toNode.typeArguments), | 10537 _isEqualNodes(node.typeArguments, toNode.typeArguments), |
| 11508 _isEqualTokens(node.leftBracket, toNode.leftBracket), | 10538 _isEqualTokens(node.leftBracket, toNode.leftBracket), |
| 11509 _isEqualNodeLists(node.entries, toNode.entries), | 10539 _isEqualNodeLists(node.entries, toNode.entries), |
| 11510 _isEqualTokens(node.rightBracket, toNode.rightBracket))) { | 10540 _isEqualTokens(node.rightBracket, toNode.rightBracket))) { |
| 11511 toNode.propagatedType = node.propagatedType; | 10541 toNode.propagatedType = node.propagatedType; |
| 11512 toNode.staticType = node.staticType; | 10542 toNode.staticType = node.staticType; |
| 11513 return true; | 10543 return true; |
| 11514 } | 10544 } |
| 11515 return false; | 10545 return false; |
| 11516 } | 10546 } |
| 11517 | 10547 |
| 11518 @override | 10548 @override |
| 11519 bool visitMapLiteralEntry(MapLiteralEntry node) { | 10549 bool visitMapLiteralEntry(MapLiteralEntry node) { |
| 11520 MapLiteralEntry toNode = this._toNode as MapLiteralEntry; | 10550 MapLiteralEntry toNode = this._toNode as MapLiteralEntry; |
| 11521 return _and( | 10551 return _and(_isEqualNodes(node.key, toNode.key), |
| 11522 _isEqualNodes(node.key, toNode.key), | |
| 11523 _isEqualTokens(node.separator, toNode.separator), | 10552 _isEqualTokens(node.separator, toNode.separator), |
| 11524 _isEqualNodes(node.value, toNode.value)); | 10553 _isEqualNodes(node.value, toNode.value)); |
| 11525 } | 10554 } |
| 11526 | 10555 |
| 11527 @override | 10556 @override |
| 11528 bool visitMethodDeclaration(MethodDeclaration node) { | 10557 bool visitMethodDeclaration(MethodDeclaration node) { |
| 11529 MethodDeclaration toNode = this._toNode as MethodDeclaration; | 10558 MethodDeclaration toNode = this._toNode as MethodDeclaration; |
| 11530 return _and( | 10559 return _and( |
| 11531 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10560 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11532 _isEqualNodeLists(node.metadata, toNode.metadata), | 10561 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11533 _isEqualTokens(node.externalKeyword, toNode.externalKeyword), | 10562 _isEqualTokens(node.externalKeyword, toNode.externalKeyword), |
| 11534 _isEqualTokens(node.modifierKeyword, toNode.modifierKeyword), | 10563 _isEqualTokens(node.modifierKeyword, toNode.modifierKeyword), |
| 11535 _isEqualNodes(node.returnType, toNode.returnType), | 10564 _isEqualNodes(node.returnType, toNode.returnType), |
| 11536 _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword), | 10565 _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword), |
| 11537 _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword), | 10566 _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword), |
| 11538 _isEqualNodes(node.name, toNode.name), | 10567 _isEqualNodes(node.name, toNode.name), |
| 11539 _isEqualNodes(node.parameters, toNode.parameters), | 10568 _isEqualNodes(node.parameters, toNode.parameters), |
| 11540 _isEqualNodes(node.body, toNode.body)); | 10569 _isEqualNodes(node.body, toNode.body)); |
| 11541 } | 10570 } |
| 11542 | 10571 |
| 11543 @override | 10572 @override |
| 11544 bool visitMethodInvocation(MethodInvocation node) { | 10573 bool visitMethodInvocation(MethodInvocation node) { |
| 11545 MethodInvocation toNode = this._toNode as MethodInvocation; | 10574 MethodInvocation toNode = this._toNode as MethodInvocation; |
| 11546 if (_and( | 10575 if (_and(_isEqualNodes(node.target, toNode.target), |
| 11547 _isEqualNodes(node.target, toNode.target), | |
| 11548 _isEqualTokens(node.period, toNode.period), | 10576 _isEqualTokens(node.period, toNode.period), |
| 11549 _isEqualNodes(node.methodName, toNode.methodName), | 10577 _isEqualNodes(node.methodName, toNode.methodName), |
| 11550 _isEqualNodes(node.argumentList, toNode.argumentList))) { | 10578 _isEqualNodes(node.argumentList, toNode.argumentList))) { |
| 11551 toNode.propagatedType = node.propagatedType; | 10579 toNode.propagatedType = node.propagatedType; |
| 11552 toNode.staticType = node.staticType; | 10580 toNode.staticType = node.staticType; |
| 11553 return true; | 10581 return true; |
| 11554 } | 10582 } |
| 11555 return false; | 10583 return false; |
| 11556 } | 10584 } |
| 11557 | 10585 |
| 11558 @override | 10586 @override |
| 11559 bool visitNamedExpression(NamedExpression node) { | 10587 bool visitNamedExpression(NamedExpression node) { |
| 11560 NamedExpression toNode = this._toNode as NamedExpression; | 10588 NamedExpression toNode = this._toNode as NamedExpression; |
| 11561 if (_and( | 10589 if (_and(_isEqualNodes(node.name, toNode.name), |
| 11562 _isEqualNodes(node.name, toNode.name), | |
| 11563 _isEqualNodes(node.expression, toNode.expression))) { | 10590 _isEqualNodes(node.expression, toNode.expression))) { |
| 11564 toNode.propagatedType = node.propagatedType; | 10591 toNode.propagatedType = node.propagatedType; |
| 11565 toNode.staticType = node.staticType; | 10592 toNode.staticType = node.staticType; |
| 11566 return true; | 10593 return true; |
| 11567 } | 10594 } |
| 11568 return false; | 10595 return false; |
| 11569 } | 10596 } |
| 11570 | 10597 |
| 11571 @override | 10598 @override |
| 11572 bool visitNativeClause(NativeClause node) { | 10599 bool visitNativeClause(NativeClause node) { |
| 11573 NativeClause toNode = this._toNode as NativeClause; | 10600 NativeClause toNode = this._toNode as NativeClause; |
| 11574 return _and( | 10601 return _and(_isEqualTokens(node.nativeKeyword, toNode.nativeKeyword), |
| 11575 _isEqualTokens(node.nativeKeyword, toNode.nativeKeyword), | |
| 11576 _isEqualNodes(node.name, toNode.name)); | 10602 _isEqualNodes(node.name, toNode.name)); |
| 11577 } | 10603 } |
| 11578 | 10604 |
| 11579 @override | 10605 @override |
| 11580 bool visitNativeFunctionBody(NativeFunctionBody node) { | 10606 bool visitNativeFunctionBody(NativeFunctionBody node) { |
| 11581 NativeFunctionBody toNode = this._toNode as NativeFunctionBody; | 10607 NativeFunctionBody toNode = this._toNode as NativeFunctionBody; |
| 11582 return _and( | 10608 return _and(_isEqualTokens(node.nativeKeyword, toNode.nativeKeyword), |
| 11583 _isEqualTokens(node.nativeKeyword, toNode.nativeKeyword), | |
| 11584 _isEqualNodes(node.stringLiteral, toNode.stringLiteral), | 10609 _isEqualNodes(node.stringLiteral, toNode.stringLiteral), |
| 11585 _isEqualTokens(node.semicolon, toNode.semicolon)); | 10610 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 11586 } | 10611 } |
| 11587 | 10612 |
| 11588 @override | 10613 @override |
| 11589 bool visitNullLiteral(NullLiteral node) { | 10614 bool visitNullLiteral(NullLiteral node) { |
| 11590 NullLiteral toNode = this._toNode as NullLiteral; | 10615 NullLiteral toNode = this._toNode as NullLiteral; |
| 11591 if (_isEqualTokens(node.literal, toNode.literal)) { | 10616 if (_isEqualTokens(node.literal, toNode.literal)) { |
| 11592 toNode.propagatedType = node.propagatedType; | 10617 toNode.propagatedType = node.propagatedType; |
| 11593 toNode.staticType = node.staticType; | 10618 toNode.staticType = node.staticType; |
| 11594 return true; | 10619 return true; |
| 11595 } | 10620 } |
| 11596 return false; | 10621 return false; |
| 11597 } | 10622 } |
| 11598 | 10623 |
| 11599 @override | 10624 @override |
| 11600 bool visitParenthesizedExpression(ParenthesizedExpression node) { | 10625 bool visitParenthesizedExpression(ParenthesizedExpression node) { |
| 11601 ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression; | 10626 ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression; |
| 11602 if (_and( | 10627 if (_and(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 11603 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | |
| 11604 _isEqualNodes(node.expression, toNode.expression), | 10628 _isEqualNodes(node.expression, toNode.expression), |
| 11605 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) { | 10629 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) { |
| 11606 toNode.propagatedType = node.propagatedType; | 10630 toNode.propagatedType = node.propagatedType; |
| 11607 toNode.staticType = node.staticType; | 10631 toNode.staticType = node.staticType; |
| 11608 return true; | 10632 return true; |
| 11609 } | 10633 } |
| 11610 return false; | 10634 return false; |
| 11611 } | 10635 } |
| 11612 | 10636 |
| 11613 @override | 10637 @override |
| (...skipping 23 matching lines...) Expand all Loading... |
| 11637 _isEqualTokens(node.semicolon, toNode.semicolon))) { | 10661 _isEqualTokens(node.semicolon, toNode.semicolon))) { |
| 11638 toNode.element = node.element; | 10662 toNode.element = node.element; |
| 11639 return true; | 10663 return true; |
| 11640 } | 10664 } |
| 11641 return false; | 10665 return false; |
| 11642 } | 10666 } |
| 11643 | 10667 |
| 11644 @override | 10668 @override |
| 11645 bool visitPostfixExpression(PostfixExpression node) { | 10669 bool visitPostfixExpression(PostfixExpression node) { |
| 11646 PostfixExpression toNode = this._toNode as PostfixExpression; | 10670 PostfixExpression toNode = this._toNode as PostfixExpression; |
| 11647 if (_and( | 10671 if (_and(_isEqualNodes(node.operand, toNode.operand), |
| 11648 _isEqualNodes(node.operand, toNode.operand), | |
| 11649 _isEqualTokens(node.operator, toNode.operator))) { | 10672 _isEqualTokens(node.operator, toNode.operator))) { |
| 11650 toNode.propagatedElement = node.propagatedElement; | 10673 toNode.propagatedElement = node.propagatedElement; |
| 11651 toNode.propagatedType = node.propagatedType; | 10674 toNode.propagatedType = node.propagatedType; |
| 11652 toNode.staticElement = node.staticElement; | 10675 toNode.staticElement = node.staticElement; |
| 11653 toNode.staticType = node.staticType; | 10676 toNode.staticType = node.staticType; |
| 11654 return true; | 10677 return true; |
| 11655 } | 10678 } |
| 11656 return false; | 10679 return false; |
| 11657 } | 10680 } |
| 11658 | 10681 |
| 11659 @override | 10682 @override |
| 11660 bool visitPrefixedIdentifier(PrefixedIdentifier node) { | 10683 bool visitPrefixedIdentifier(PrefixedIdentifier node) { |
| 11661 PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier; | 10684 PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier; |
| 11662 if (_and( | 10685 if (_and(_isEqualNodes(node.prefix, toNode.prefix), |
| 11663 _isEqualNodes(node.prefix, toNode.prefix), | |
| 11664 _isEqualTokens(node.period, toNode.period), | 10686 _isEqualTokens(node.period, toNode.period), |
| 11665 _isEqualNodes(node.identifier, toNode.identifier))) { | 10687 _isEqualNodes(node.identifier, toNode.identifier))) { |
| 11666 toNode.propagatedType = node.propagatedType; | 10688 toNode.propagatedType = node.propagatedType; |
| 11667 toNode.staticType = node.staticType; | 10689 toNode.staticType = node.staticType; |
| 11668 return true; | 10690 return true; |
| 11669 } | 10691 } |
| 11670 return false; | 10692 return false; |
| 11671 } | 10693 } |
| 11672 | 10694 |
| 11673 @override | 10695 @override |
| 11674 bool visitPrefixExpression(PrefixExpression node) { | 10696 bool visitPrefixExpression(PrefixExpression node) { |
| 11675 PrefixExpression toNode = this._toNode as PrefixExpression; | 10697 PrefixExpression toNode = this._toNode as PrefixExpression; |
| 11676 if (_and( | 10698 if (_and(_isEqualTokens(node.operator, toNode.operator), |
| 11677 _isEqualTokens(node.operator, toNode.operator), | |
| 11678 _isEqualNodes(node.operand, toNode.operand))) { | 10699 _isEqualNodes(node.operand, toNode.operand))) { |
| 11679 toNode.propagatedElement = node.propagatedElement; | 10700 toNode.propagatedElement = node.propagatedElement; |
| 11680 toNode.propagatedType = node.propagatedType; | 10701 toNode.propagatedType = node.propagatedType; |
| 11681 toNode.staticElement = node.staticElement; | 10702 toNode.staticElement = node.staticElement; |
| 11682 toNode.staticType = node.staticType; | 10703 toNode.staticType = node.staticType; |
| 11683 return true; | 10704 return true; |
| 11684 } | 10705 } |
| 11685 return false; | 10706 return false; |
| 11686 } | 10707 } |
| 11687 | 10708 |
| 11688 @override | 10709 @override |
| 11689 bool visitPropertyAccess(PropertyAccess node) { | 10710 bool visitPropertyAccess(PropertyAccess node) { |
| 11690 PropertyAccess toNode = this._toNode as PropertyAccess; | 10711 PropertyAccess toNode = this._toNode as PropertyAccess; |
| 11691 if (_and( | 10712 if (_and(_isEqualNodes(node.target, toNode.target), |
| 11692 _isEqualNodes(node.target, toNode.target), | |
| 11693 _isEqualTokens(node.operator, toNode.operator), | 10713 _isEqualTokens(node.operator, toNode.operator), |
| 11694 _isEqualNodes(node.propertyName, toNode.propertyName))) { | 10714 _isEqualNodes(node.propertyName, toNode.propertyName))) { |
| 11695 toNode.propagatedType = node.propagatedType; | 10715 toNode.propagatedType = node.propagatedType; |
| 11696 toNode.staticType = node.staticType; | 10716 toNode.staticType = node.staticType; |
| 11697 return true; | 10717 return true; |
| 11698 } | 10718 } |
| 11699 return false; | 10719 return false; |
| 11700 } | 10720 } |
| 11701 | 10721 |
| 11702 @override | 10722 @override |
| 11703 bool | 10723 bool visitRedirectingConstructorInvocation( |
| 11704 visitRedirectingConstructorInvocation(RedirectingConstructorInvocation nod
e) { | 10724 RedirectingConstructorInvocation node) { |
| 11705 RedirectingConstructorInvocation toNode = | 10725 RedirectingConstructorInvocation toNode = |
| 11706 this._toNode as RedirectingConstructorInvocation; | 10726 this._toNode as RedirectingConstructorInvocation; |
| 11707 if (_and( | 10727 if (_and(_isEqualTokens(node.thisKeyword, toNode.thisKeyword), |
| 11708 _isEqualTokens(node.thisKeyword, toNode.thisKeyword), | |
| 11709 _isEqualTokens(node.period, toNode.period), | 10728 _isEqualTokens(node.period, toNode.period), |
| 11710 _isEqualNodes(node.constructorName, toNode.constructorName), | 10729 _isEqualNodes(node.constructorName, toNode.constructorName), |
| 11711 _isEqualNodes(node.argumentList, toNode.argumentList))) { | 10730 _isEqualNodes(node.argumentList, toNode.argumentList))) { |
| 11712 toNode.staticElement = node.staticElement; | 10731 toNode.staticElement = node.staticElement; |
| 11713 return true; | 10732 return true; |
| 11714 } | 10733 } |
| 11715 return false; | 10734 return false; |
| 11716 } | 10735 } |
| 11717 | 10736 |
| 11718 @override | 10737 @override |
| 11719 bool visitRethrowExpression(RethrowExpression node) { | 10738 bool visitRethrowExpression(RethrowExpression node) { |
| 11720 RethrowExpression toNode = this._toNode as RethrowExpression; | 10739 RethrowExpression toNode = this._toNode as RethrowExpression; |
| 11721 if (_isEqualTokens(node.rethrowKeyword, toNode.rethrowKeyword)) { | 10740 if (_isEqualTokens(node.rethrowKeyword, toNode.rethrowKeyword)) { |
| 11722 toNode.propagatedType = node.propagatedType; | 10741 toNode.propagatedType = node.propagatedType; |
| 11723 toNode.staticType = node.staticType; | 10742 toNode.staticType = node.staticType; |
| 11724 return true; | 10743 return true; |
| 11725 } | 10744 } |
| 11726 return false; | 10745 return false; |
| 11727 } | 10746 } |
| 11728 | 10747 |
| 11729 @override | 10748 @override |
| 11730 bool visitReturnStatement(ReturnStatement node) { | 10749 bool visitReturnStatement(ReturnStatement node) { |
| 11731 ReturnStatement toNode = this._toNode as ReturnStatement; | 10750 ReturnStatement toNode = this._toNode as ReturnStatement; |
| 11732 return _and( | 10751 return _and(_isEqualTokens(node.returnKeyword, toNode.returnKeyword), |
| 11733 _isEqualTokens(node.returnKeyword, toNode.returnKeyword), | |
| 11734 _isEqualNodes(node.expression, toNode.expression), | 10752 _isEqualNodes(node.expression, toNode.expression), |
| 11735 _isEqualTokens(node.semicolon, toNode.semicolon)); | 10753 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 11736 } | 10754 } |
| 11737 | 10755 |
| 11738 @override | 10756 @override |
| 11739 bool visitScriptTag(ScriptTag node) { | 10757 bool visitScriptTag(ScriptTag node) { |
| 11740 ScriptTag toNode = this._toNode as ScriptTag; | 10758 ScriptTag toNode = this._toNode as ScriptTag; |
| 11741 return _isEqualTokens(node.scriptTag, toNode.scriptTag); | 10759 return _isEqualTokens(node.scriptTag, toNode.scriptTag); |
| 11742 } | 10760 } |
| 11743 | 10761 |
| 11744 @override | 10762 @override |
| 11745 bool visitShowCombinator(ShowCombinator node) { | 10763 bool visitShowCombinator(ShowCombinator node) { |
| 11746 ShowCombinator toNode = this._toNode as ShowCombinator; | 10764 ShowCombinator toNode = this._toNode as ShowCombinator; |
| 11747 return _and( | 10765 return _and(_isEqualTokens(node.keyword, toNode.keyword), |
| 11748 _isEqualTokens(node.keyword, toNode.keyword), | |
| 11749 _isEqualNodeLists(node.shownNames, toNode.shownNames)); | 10766 _isEqualNodeLists(node.shownNames, toNode.shownNames)); |
| 11750 } | 10767 } |
| 11751 | 10768 |
| 11752 @override | 10769 @override |
| 11753 bool visitSimpleFormalParameter(SimpleFormalParameter node) { | 10770 bool visitSimpleFormalParameter(SimpleFormalParameter node) { |
| 11754 SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter; | 10771 SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter; |
| 11755 return _and( | 10772 return _and( |
| 11756 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10773 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11757 _isEqualNodeLists(node.metadata, toNode.metadata), | 10774 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11758 _isEqualTokens(node.keyword, toNode.keyword), | 10775 _isEqualTokens(node.keyword, toNode.keyword), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 11770 toNode.propagatedType = node.propagatedType; | 10787 toNode.propagatedType = node.propagatedType; |
| 11771 toNode.auxiliaryElements = node.auxiliaryElements; | 10788 toNode.auxiliaryElements = node.auxiliaryElements; |
| 11772 return true; | 10789 return true; |
| 11773 } | 10790 } |
| 11774 return false; | 10791 return false; |
| 11775 } | 10792 } |
| 11776 | 10793 |
| 11777 @override | 10794 @override |
| 11778 bool visitSimpleStringLiteral(SimpleStringLiteral node) { | 10795 bool visitSimpleStringLiteral(SimpleStringLiteral node) { |
| 11779 SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral; | 10796 SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral; |
| 11780 if (_and( | 10797 if (_and(_isEqualTokens(node.literal, toNode.literal), |
| 11781 _isEqualTokens(node.literal, toNode.literal), | |
| 11782 node.value == toNode.value)) { | 10798 node.value == toNode.value)) { |
| 11783 toNode.propagatedType = node.propagatedType; | 10799 toNode.propagatedType = node.propagatedType; |
| 11784 toNode.staticType = node.staticType; | 10800 toNode.staticType = node.staticType; |
| 11785 return true; | 10801 return true; |
| 11786 } | 10802 } |
| 11787 return false; | 10803 return false; |
| 11788 } | 10804 } |
| 11789 | 10805 |
| 11790 @override | 10806 @override |
| 11791 bool visitStringInterpolation(StringInterpolation node) { | 10807 bool visitStringInterpolation(StringInterpolation node) { |
| 11792 StringInterpolation toNode = this._toNode as StringInterpolation; | 10808 StringInterpolation toNode = this._toNode as StringInterpolation; |
| 11793 if (_isEqualNodeLists(node.elements, toNode.elements)) { | 10809 if (_isEqualNodeLists(node.elements, toNode.elements)) { |
| 11794 toNode.propagatedType = node.propagatedType; | 10810 toNode.propagatedType = node.propagatedType; |
| 11795 toNode.staticType = node.staticType; | 10811 toNode.staticType = node.staticType; |
| 11796 return true; | 10812 return true; |
| 11797 } | 10813 } |
| 11798 return false; | 10814 return false; |
| 11799 } | 10815 } |
| 11800 | 10816 |
| 11801 @override | 10817 @override |
| 11802 bool visitSuperConstructorInvocation(SuperConstructorInvocation node) { | 10818 bool visitSuperConstructorInvocation(SuperConstructorInvocation node) { |
| 11803 SuperConstructorInvocation toNode = | 10819 SuperConstructorInvocation toNode = |
| 11804 this._toNode as SuperConstructorInvocation; | 10820 this._toNode as SuperConstructorInvocation; |
| 11805 if (_and( | 10821 if (_and(_isEqualTokens(node.superKeyword, toNode.superKeyword), |
| 11806 _isEqualTokens(node.superKeyword, toNode.superKeyword), | |
| 11807 _isEqualTokens(node.period, toNode.period), | 10822 _isEqualTokens(node.period, toNode.period), |
| 11808 _isEqualNodes(node.constructorName, toNode.constructorName), | 10823 _isEqualNodes(node.constructorName, toNode.constructorName), |
| 11809 _isEqualNodes(node.argumentList, toNode.argumentList))) { | 10824 _isEqualNodes(node.argumentList, toNode.argumentList))) { |
| 11810 toNode.staticElement = node.staticElement; | 10825 toNode.staticElement = node.staticElement; |
| 11811 return true; | 10826 return true; |
| 11812 } | 10827 } |
| 11813 return false; | 10828 return false; |
| 11814 } | 10829 } |
| 11815 | 10830 |
| 11816 @override | 10831 @override |
| 11817 bool visitSuperExpression(SuperExpression node) { | 10832 bool visitSuperExpression(SuperExpression node) { |
| 11818 SuperExpression toNode = this._toNode as SuperExpression; | 10833 SuperExpression toNode = this._toNode as SuperExpression; |
| 11819 if (_isEqualTokens(node.superKeyword, toNode.superKeyword)) { | 10834 if (_isEqualTokens(node.superKeyword, toNode.superKeyword)) { |
| 11820 toNode.propagatedType = node.propagatedType; | 10835 toNode.propagatedType = node.propagatedType; |
| 11821 toNode.staticType = node.staticType; | 10836 toNode.staticType = node.staticType; |
| 11822 return true; | 10837 return true; |
| 11823 } | 10838 } |
| 11824 return false; | 10839 return false; |
| 11825 } | 10840 } |
| 11826 | 10841 |
| 11827 @override | 10842 @override |
| 11828 bool visitSwitchCase(SwitchCase node) { | 10843 bool visitSwitchCase(SwitchCase node) { |
| 11829 SwitchCase toNode = this._toNode as SwitchCase; | 10844 SwitchCase toNode = this._toNode as SwitchCase; |
| 11830 return _and( | 10845 return _and(_isEqualNodeLists(node.labels, toNode.labels), |
| 11831 _isEqualNodeLists(node.labels, toNode.labels), | |
| 11832 _isEqualTokens(node.keyword, toNode.keyword), | 10846 _isEqualTokens(node.keyword, toNode.keyword), |
| 11833 _isEqualNodes(node.expression, toNode.expression), | 10847 _isEqualNodes(node.expression, toNode.expression), |
| 11834 _isEqualTokens(node.colon, toNode.colon), | 10848 _isEqualTokens(node.colon, toNode.colon), |
| 11835 _isEqualNodeLists(node.statements, toNode.statements)); | 10849 _isEqualNodeLists(node.statements, toNode.statements)); |
| 11836 } | 10850 } |
| 11837 | 10851 |
| 11838 @override | 10852 @override |
| 11839 bool visitSwitchDefault(SwitchDefault node) { | 10853 bool visitSwitchDefault(SwitchDefault node) { |
| 11840 SwitchDefault toNode = this._toNode as SwitchDefault; | 10854 SwitchDefault toNode = this._toNode as SwitchDefault; |
| 11841 return _and( | 10855 return _and(_isEqualNodeLists(node.labels, toNode.labels), |
| 11842 _isEqualNodeLists(node.labels, toNode.labels), | |
| 11843 _isEqualTokens(node.keyword, toNode.keyword), | 10856 _isEqualTokens(node.keyword, toNode.keyword), |
| 11844 _isEqualTokens(node.colon, toNode.colon), | 10857 _isEqualTokens(node.colon, toNode.colon), |
| 11845 _isEqualNodeLists(node.statements, toNode.statements)); | 10858 _isEqualNodeLists(node.statements, toNode.statements)); |
| 11846 } | 10859 } |
| 11847 | 10860 |
| 11848 @override | 10861 @override |
| 11849 bool visitSwitchStatement(SwitchStatement node) { | 10862 bool visitSwitchStatement(SwitchStatement node) { |
| 11850 SwitchStatement toNode = this._toNode as SwitchStatement; | 10863 SwitchStatement toNode = this._toNode as SwitchStatement; |
| 11851 return _and( | 10864 return _and(_isEqualTokens(node.switchKeyword, toNode.switchKeyword), |
| 11852 _isEqualTokens(node.switchKeyword, toNode.switchKeyword), | |
| 11853 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | 10865 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 11854 _isEqualNodes(node.expression, toNode.expression), | 10866 _isEqualNodes(node.expression, toNode.expression), |
| 11855 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), | 10867 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), |
| 11856 _isEqualTokens(node.leftBracket, toNode.leftBracket), | 10868 _isEqualTokens(node.leftBracket, toNode.leftBracket), |
| 11857 _isEqualNodeLists(node.members, toNode.members), | 10869 _isEqualNodeLists(node.members, toNode.members), |
| 11858 _isEqualTokens(node.rightBracket, toNode.rightBracket)); | 10870 _isEqualTokens(node.rightBracket, toNode.rightBracket)); |
| 11859 } | 10871 } |
| 11860 | 10872 |
| 11861 @override | 10873 @override |
| 11862 bool visitSymbolLiteral(SymbolLiteral node) { | 10874 bool visitSymbolLiteral(SymbolLiteral node) { |
| 11863 SymbolLiteral toNode = this._toNode as SymbolLiteral; | 10875 SymbolLiteral toNode = this._toNode as SymbolLiteral; |
| 11864 if (_and( | 10876 if (_and(_isEqualTokens(node.poundSign, toNode.poundSign), |
| 11865 _isEqualTokens(node.poundSign, toNode.poundSign), | |
| 11866 _isEqualTokenLists(node.components, toNode.components))) { | 10877 _isEqualTokenLists(node.components, toNode.components))) { |
| 11867 toNode.propagatedType = node.propagatedType; | 10878 toNode.propagatedType = node.propagatedType; |
| 11868 toNode.staticType = node.staticType; | 10879 toNode.staticType = node.staticType; |
| 11869 return true; | 10880 return true; |
| 11870 } | 10881 } |
| 11871 return false; | 10882 return false; |
| 11872 } | 10883 } |
| 11873 | 10884 |
| 11874 @override | 10885 @override |
| 11875 bool visitThisExpression(ThisExpression node) { | 10886 bool visitThisExpression(ThisExpression node) { |
| 11876 ThisExpression toNode = this._toNode as ThisExpression; | 10887 ThisExpression toNode = this._toNode as ThisExpression; |
| 11877 if (_isEqualTokens(node.thisKeyword, toNode.thisKeyword)) { | 10888 if (_isEqualTokens(node.thisKeyword, toNode.thisKeyword)) { |
| 11878 toNode.propagatedType = node.propagatedType; | 10889 toNode.propagatedType = node.propagatedType; |
| 11879 toNode.staticType = node.staticType; | 10890 toNode.staticType = node.staticType; |
| 11880 return true; | 10891 return true; |
| 11881 } | 10892 } |
| 11882 return false; | 10893 return false; |
| 11883 } | 10894 } |
| 11884 | 10895 |
| 11885 @override | 10896 @override |
| 11886 bool visitThrowExpression(ThrowExpression node) { | 10897 bool visitThrowExpression(ThrowExpression node) { |
| 11887 ThrowExpression toNode = this._toNode as ThrowExpression; | 10898 ThrowExpression toNode = this._toNode as ThrowExpression; |
| 11888 if (_and( | 10899 if (_and(_isEqualTokens(node.throwKeyword, toNode.throwKeyword), |
| 11889 _isEqualTokens(node.throwKeyword, toNode.throwKeyword), | |
| 11890 _isEqualNodes(node.expression, toNode.expression))) { | 10900 _isEqualNodes(node.expression, toNode.expression))) { |
| 11891 toNode.propagatedType = node.propagatedType; | 10901 toNode.propagatedType = node.propagatedType; |
| 11892 toNode.staticType = node.staticType; | 10902 toNode.staticType = node.staticType; |
| 11893 return true; | 10903 return true; |
| 11894 } | 10904 } |
| 11895 return false; | 10905 return false; |
| 11896 } | 10906 } |
| 11897 | 10907 |
| 11898 @override | 10908 @override |
| 11899 bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { | 10909 bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { |
| 11900 TopLevelVariableDeclaration toNode = | 10910 TopLevelVariableDeclaration toNode = |
| 11901 this._toNode as TopLevelVariableDeclaration; | 10911 this._toNode as TopLevelVariableDeclaration; |
| 11902 return _and( | 10912 return _and( |
| 11903 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10913 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11904 _isEqualNodeLists(node.metadata, toNode.metadata), | 10914 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11905 _isEqualNodes(node.variables, toNode.variables), | 10915 _isEqualNodes(node.variables, toNode.variables), |
| 11906 _isEqualTokens(node.semicolon, toNode.semicolon)); | 10916 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 11907 } | 10917 } |
| 11908 | 10918 |
| 11909 @override | 10919 @override |
| 11910 bool visitTryStatement(TryStatement node) { | 10920 bool visitTryStatement(TryStatement node) { |
| 11911 TryStatement toNode = this._toNode as TryStatement; | 10921 TryStatement toNode = this._toNode as TryStatement; |
| 11912 return _and( | 10922 return _and(_isEqualTokens(node.tryKeyword, toNode.tryKeyword), |
| 11913 _isEqualTokens(node.tryKeyword, toNode.tryKeyword), | |
| 11914 _isEqualNodes(node.body, toNode.body), | 10923 _isEqualNodes(node.body, toNode.body), |
| 11915 _isEqualNodeLists(node.catchClauses, toNode.catchClauses), | 10924 _isEqualNodeLists(node.catchClauses, toNode.catchClauses), |
| 11916 _isEqualTokens(node.finallyKeyword, toNode.finallyKeyword), | 10925 _isEqualTokens(node.finallyKeyword, toNode.finallyKeyword), |
| 11917 _isEqualNodes(node.finallyBlock, toNode.finallyBlock)); | 10926 _isEqualNodes(node.finallyBlock, toNode.finallyBlock)); |
| 11918 } | 10927 } |
| 11919 | 10928 |
| 11920 @override | 10929 @override |
| 11921 bool visitTypeArgumentList(TypeArgumentList node) { | 10930 bool visitTypeArgumentList(TypeArgumentList node) { |
| 11922 TypeArgumentList toNode = this._toNode as TypeArgumentList; | 10931 TypeArgumentList toNode = this._toNode as TypeArgumentList; |
| 11923 return _and( | 10932 return _and(_isEqualTokens(node.leftBracket, toNode.leftBracket), |
| 11924 _isEqualTokens(node.leftBracket, toNode.leftBracket), | |
| 11925 _isEqualNodeLists(node.arguments, toNode.arguments), | 10933 _isEqualNodeLists(node.arguments, toNode.arguments), |
| 11926 _isEqualTokens(node.rightBracket, toNode.rightBracket)); | 10934 _isEqualTokens(node.rightBracket, toNode.rightBracket)); |
| 11927 } | 10935 } |
| 11928 | 10936 |
| 11929 @override | 10937 @override |
| 11930 bool visitTypeName(TypeName node) { | 10938 bool visitTypeName(TypeName node) { |
| 11931 TypeName toNode = this._toNode as TypeName; | 10939 TypeName toNode = this._toNode as TypeName; |
| 11932 if (_and( | 10940 if (_and(_isEqualNodes(node.name, toNode.name), |
| 11933 _isEqualNodes(node.name, toNode.name), | |
| 11934 _isEqualNodes(node.typeArguments, toNode.typeArguments))) { | 10941 _isEqualNodes(node.typeArguments, toNode.typeArguments))) { |
| 11935 toNode.type = node.type; | 10942 toNode.type = node.type; |
| 11936 return true; | 10943 return true; |
| 11937 } | 10944 } |
| 11938 return false; | 10945 return false; |
| 11939 } | 10946 } |
| 11940 | 10947 |
| 11941 @override | 10948 @override |
| 11942 bool visitTypeParameter(TypeParameter node) { | 10949 bool visitTypeParameter(TypeParameter node) { |
| 11943 TypeParameter toNode = this._toNode as TypeParameter; | 10950 TypeParameter toNode = this._toNode as TypeParameter; |
| 11944 return _and( | 10951 return _and( |
| 11945 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10952 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11946 _isEqualNodeLists(node.metadata, toNode.metadata), | 10953 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11947 _isEqualNodes(node.name, toNode.name), | 10954 _isEqualNodes(node.name, toNode.name), |
| 11948 _isEqualTokens(node.extendsKeyword, toNode.extendsKeyword), | 10955 _isEqualTokens(node.extendsKeyword, toNode.extendsKeyword), |
| 11949 _isEqualNodes(node.bound, toNode.bound)); | 10956 _isEqualNodes(node.bound, toNode.bound)); |
| 11950 } | 10957 } |
| 11951 | 10958 |
| 11952 @override | 10959 @override |
| 11953 bool visitTypeParameterList(TypeParameterList node) { | 10960 bool visitTypeParameterList(TypeParameterList node) { |
| 11954 TypeParameterList toNode = this._toNode as TypeParameterList; | 10961 TypeParameterList toNode = this._toNode as TypeParameterList; |
| 11955 return _and( | 10962 return _and(_isEqualTokens(node.leftBracket, toNode.leftBracket), |
| 11956 _isEqualTokens(node.leftBracket, toNode.leftBracket), | |
| 11957 _isEqualNodeLists(node.typeParameters, toNode.typeParameters), | 10963 _isEqualNodeLists(node.typeParameters, toNode.typeParameters), |
| 11958 _isEqualTokens(node.rightBracket, toNode.rightBracket)); | 10964 _isEqualTokens(node.rightBracket, toNode.rightBracket)); |
| 11959 } | 10965 } |
| 11960 | 10966 |
| 11961 @override | 10967 @override |
| 11962 bool visitVariableDeclaration(VariableDeclaration node) { | 10968 bool visitVariableDeclaration(VariableDeclaration node) { |
| 11963 VariableDeclaration toNode = this._toNode as VariableDeclaration; | 10969 VariableDeclaration toNode = this._toNode as VariableDeclaration; |
| 11964 return _and( | 10970 return _and( |
| 11965 _isEqualNodes(node.documentationComment, toNode.documentationComment), | 10971 _isEqualNodes(node.documentationComment, toNode.documentationComment), |
| 11966 _isEqualNodeLists(node.metadata, toNode.metadata), | 10972 _isEqualNodeLists(node.metadata, toNode.metadata), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 11977 _isEqualNodeLists(node.metadata, toNode.metadata), | 10983 _isEqualNodeLists(node.metadata, toNode.metadata), |
| 11978 _isEqualTokens(node.keyword, toNode.keyword), | 10984 _isEqualTokens(node.keyword, toNode.keyword), |
| 11979 _isEqualNodes(node.type, toNode.type), | 10985 _isEqualNodes(node.type, toNode.type), |
| 11980 _isEqualNodeLists(node.variables, toNode.variables)); | 10986 _isEqualNodeLists(node.variables, toNode.variables)); |
| 11981 } | 10987 } |
| 11982 | 10988 |
| 11983 @override | 10989 @override |
| 11984 bool visitVariableDeclarationStatement(VariableDeclarationStatement node) { | 10990 bool visitVariableDeclarationStatement(VariableDeclarationStatement node) { |
| 11985 VariableDeclarationStatement toNode = | 10991 VariableDeclarationStatement toNode = |
| 11986 this._toNode as VariableDeclarationStatement; | 10992 this._toNode as VariableDeclarationStatement; |
| 11987 return _and( | 10993 return _and(_isEqualNodes(node.variables, toNode.variables), |
| 11988 _isEqualNodes(node.variables, toNode.variables), | |
| 11989 _isEqualTokens(node.semicolon, toNode.semicolon)); | 10994 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 11990 } | 10995 } |
| 11991 | 10996 |
| 11992 @override | 10997 @override |
| 11993 bool visitWhileStatement(WhileStatement node) { | 10998 bool visitWhileStatement(WhileStatement node) { |
| 11994 WhileStatement toNode = this._toNode as WhileStatement; | 10999 WhileStatement toNode = this._toNode as WhileStatement; |
| 11995 return _and( | 11000 return _and(_isEqualTokens(node.whileKeyword, toNode.whileKeyword), |
| 11996 _isEqualTokens(node.whileKeyword, toNode.whileKeyword), | |
| 11997 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), | 11001 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), |
| 11998 _isEqualNodes(node.condition, toNode.condition), | 11002 _isEqualNodes(node.condition, toNode.condition), |
| 11999 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), | 11003 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis), |
| 12000 _isEqualNodes(node.body, toNode.body)); | 11004 _isEqualNodes(node.body, toNode.body)); |
| 12001 } | 11005 } |
| 12002 | 11006 |
| 12003 @override | 11007 @override |
| 12004 bool visitWithClause(WithClause node) { | 11008 bool visitWithClause(WithClause node) { |
| 12005 WithClause toNode = this._toNode as WithClause; | 11009 WithClause toNode = this._toNode as WithClause; |
| 12006 return _and( | 11010 return _and(_isEqualTokens(node.withKeyword, toNode.withKeyword), |
| 12007 _isEqualTokens(node.withKeyword, toNode.withKeyword), | |
| 12008 _isEqualNodeLists(node.mixinTypes, toNode.mixinTypes)); | 11011 _isEqualNodeLists(node.mixinTypes, toNode.mixinTypes)); |
| 12009 } | 11012 } |
| 12010 | 11013 |
| 12011 @override | 11014 @override |
| 12012 bool visitYieldStatement(YieldStatement node) { | 11015 bool visitYieldStatement(YieldStatement node) { |
| 12013 YieldStatement toNode = this._toNode as YieldStatement; | 11016 YieldStatement toNode = this._toNode as YieldStatement; |
| 12014 return _and( | 11017 return _and(_isEqualTokens(node.yieldKeyword, toNode.yieldKeyword), |
| 12015 _isEqualTokens(node.yieldKeyword, toNode.yieldKeyword), | |
| 12016 _isEqualNodes(node.expression, toNode.expression), | 11018 _isEqualNodes(node.expression, toNode.expression), |
| 12017 _isEqualTokens(node.semicolon, toNode.semicolon)); | 11019 _isEqualTokens(node.semicolon, toNode.semicolon)); |
| 12018 } | 11020 } |
| 12019 | 11021 |
| 12020 /** | 11022 /** |
| 12021 * Return `true` if all of the parameters are `true`. | 11023 * Return `true` if all of the parameters are `true`. |
| 12022 */ | 11024 */ |
| 12023 bool _and(bool b1, bool b2, [bool b3 = true, bool b4 = true, bool b5 = true, | 11025 bool _and(bool b1, bool b2, [bool b3 = true, bool b4 = true, bool b5 = true, |
| 12024 bool b6 = true, bool b7 = true, bool b8 = true, bool b9 = true, bool b10 =
true, | 11026 bool b6 = true, bool b7 = true, bool b8 = true, bool b9 = true, |
| 12025 bool b11 = true, bool b12 = true, bool b13 = true]) { | 11027 bool b10 = true, bool b11 = true, bool b12 = true, bool b13 = true]) { |
| 12026 return b1 && | 11028 return b1 && |
| 12027 b2 && | 11029 b2 && |
| 12028 b3 && | 11030 b3 && |
| 12029 b4 && | 11031 b4 && |
| 12030 b5 && | 11032 b5 && |
| 12031 b6 && | 11033 b6 && |
| 12032 b7 && | 11034 b7 && |
| 12033 b8 && | 11035 b8 && |
| 12034 b9 && | 11036 b9 && |
| 12035 b10 && | 11037 b10 && |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12145 * Copy resolution data from one node to another. | 11147 * Copy resolution data from one node to another. |
| 12146 * | 11148 * |
| 12147 * @param fromNode the node from which resolution information will be copied | 11149 * @param fromNode the node from which resolution information will be copied |
| 12148 * @param toNode the node to which resolution information will be copied | 11150 * @param toNode the node to which resolution information will be copied |
| 12149 */ | 11151 */ |
| 12150 static void copyResolutionData(AstNode fromNode, AstNode toNode) { | 11152 static void copyResolutionData(AstNode fromNode, AstNode toNode) { |
| 12151 ResolutionCopier copier = new ResolutionCopier(); | 11153 ResolutionCopier copier = new ResolutionCopier(); |
| 12152 copier._isEqualNodes(fromNode, toNode); | 11154 copier._isEqualNodes(fromNode, toNode); |
| 12153 } | 11155 } |
| 12154 } | 11156 } |
| OLD | NEW |