Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart

Issue 2725983002: Add a data structure to keep track of modifiers in AstBuilder. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 library fasta.analyzer.ast_builder; 5 library fasta.analyzer.ast_builder;
6 6
7 import 'package:analyzer/analyzer.dart'; 7 import 'package:analyzer/analyzer.dart';
8 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory; 8 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory;
9 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard; 9 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard;
10 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token; 10 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token;
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 } 372 }
373 push(variable); 373 push(variable);
374 scope[variable.name.name] = variable.name.staticElement = 374 scope[variable.name.name] = variable.name.staticElement =
375 new AnalyzerLocalVariableElemment(variable); 375 new AnalyzerLocalVariableElemment(variable);
376 } 376 }
377 377
378 void endVariablesDeclaration(int count, Token endToken) { 378 void endVariablesDeclaration(int count, Token endToken) {
379 debugEvent("VariablesDeclaration"); 379 debugEvent("VariablesDeclaration");
380 List<VariableDeclaration> variables = popList(count); 380 List<VariableDeclaration> variables = popList(count);
381 TypeName type = pop(); 381 TypeName type = pop();
382 pop(); // Modifiers. 382 pop(); // TODO(paulberry): Modifiers.
383 push(ast.variableDeclarationStatement( 383 push(ast.variableDeclarationStatement(
384 ast.variableDeclarationList(null, null, null, type, variables), 384 ast.variableDeclarationList(null, null, null, type, variables),
385 toAnalyzerToken(endToken))); 385 toAnalyzerToken(endToken)));
386 } 386 }
387 387
388 void handleAssignmentExpression(Token token) { 388 void handleAssignmentExpression(Token token) {
389 debugEvent("AssignmentExpression"); 389 debugEvent("AssignmentExpression");
390 Expression rhs = pop(); 390 Expression rhs = pop();
391 Expression lhs = pop(); 391 Expression lhs = pop();
392 push(ast.assignmentExpression(lhs, toAnalyzerToken(token), rhs)); 392 push(ast.assignmentExpression(lhs, toAnalyzerToken(token), rhs));
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 AstNode nameOrFunctionTypedParameter = pop(); 563 AstNode nameOrFunctionTypedParameter = pop();
564 564
565 FormalParameter node; 565 FormalParameter node;
566 SimpleIdentifier name; 566 SimpleIdentifier name;
567 if (nameOrFunctionTypedParameter is FormalParameter) { 567 if (nameOrFunctionTypedParameter is FormalParameter) {
568 node = nameOrFunctionTypedParameter; 568 node = nameOrFunctionTypedParameter;
569 name = nameOrFunctionTypedParameter.identifier; 569 name = nameOrFunctionTypedParameter.identifier;
570 } else { 570 } else {
571 name = nameOrFunctionTypedParameter; 571 name = nameOrFunctionTypedParameter;
572 TypeName type = pop(); 572 TypeName type = pop();
573 Token keyword = _popOptionalSingleModifier(); 573 _Modifiers modifiers = pop();
574 Token keyword = modifiers?.finalConstOrVarKeyword;
574 pop(); // TODO(paulberry): Metadata. 575 pop(); // TODO(paulberry): Metadata.
575 if (thisKeyword == null) { 576 if (thisKeyword == null) {
576 node = ast.simpleFormalParameter2( 577 node = ast.simpleFormalParameter2(
577 covariantKeyword: toAnalyzerToken(covariantKeyword), 578 covariantKeyword: toAnalyzerToken(covariantKeyword),
578 keyword: toAnalyzerToken(keyword), 579 keyword: toAnalyzerToken(keyword),
579 type: type, 580 type: type,
580 identifier: name); 581 identifier: name);
581 } else { 582 } else {
582 // TODO(scheglov): Ideally the period token should be passed in. 583 // TODO(scheglov): Ideally the period token should be passed in.
583 Token period = identical('.', thisKeyword.next?.stringValue) 584 Token period = identical('.', thisKeyword.next?.stringValue)
(...skipping 22 matching lines...) Expand all
606 void endFunctionTypedFormalParameter( 607 void endFunctionTypedFormalParameter(
607 Token covariantKeyword, Token thisKeyword, FormalParameterType kind) { 608 Token covariantKeyword, Token thisKeyword, FormalParameterType kind) {
608 debugEvent("FunctionTypedFormalParameter"); 609 debugEvent("FunctionTypedFormalParameter");
609 610
610 FormalParameterList formalParameters = pop(); 611 FormalParameterList formalParameters = pop();
611 TypeParameterList typeParameters = pop(); 612 TypeParameterList typeParameters = pop();
612 SimpleIdentifier name = pop(); 613 SimpleIdentifier name = pop();
613 TypeName returnType = pop(); 614 TypeName returnType = pop();
614 615
615 { 616 {
616 List<Token> modifiers = pop(); 617 _Modifiers modifiers = pop();
617 if (modifiers.isNotEmpty) { 618 if (modifiers != null) {
618 // TODO(scheglov): Report error. 619 // TODO(scheglov): Report error.
619 internalError('Unexpected modifier. Report an error.'); 620 internalError('Unexpected modifier. Report an error.');
620 } 621 }
621 } 622 }
622 623
623 pop(); // TODO(paulberry): Metadata. 624 pop(); // TODO(paulberry): Metadata.
624 625
625 FormalParameter node; 626 FormalParameter node;
626 if (thisKeyword == null) { 627 if (thisKeyword == null) {
627 node = ast.functionTypedFormalParameter2( 628 node = ast.functionTypedFormalParameter2(
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 push(ast.postfixExpression(pop(), toAnalyzerToken(token))); 757 push(ast.postfixExpression(pop(), toAnalyzerToken(token)));
757 } 758 }
758 759
759 void handleModifier(Token token) { 760 void handleModifier(Token token) {
760 debugEvent("Modifier"); 761 debugEvent("Modifier");
761 push(token); 762 push(token);
762 } 763 }
763 764
764 void handleModifiers(int count) { 765 void handleModifiers(int count) {
765 debugEvent("Modifiers"); 766 debugEvent("Modifiers");
766 push(popList(count) ?? const <Token>[]); 767 if (count == 0) {
768 push(NullValue.Modifiers);
769 } else {
770 push(new _Modifiers(popList(count)));
771 }
767 } 772 }
768 773
769 FunctionBody _endFunctionBody() { 774 FunctionBody _endFunctionBody() {
770 AstNode body = pop(); 775 AstNode body = pop();
771 // TODO(paulberry): asyncMarker should have a type that allows constructing 776 // TODO(paulberry): asyncMarker should have a type that allows constructing
772 // the necessary analyzer AST data structures. 777 // the necessary analyzer AST data structures.
773 AsyncMarker asyncMarker = pop(); 778 AsyncMarker asyncMarker = pop();
774 assert(asyncMarker == AsyncMarker.Sync); 779 assert(asyncMarker == AsyncMarker.Sync);
775 analyzer.Token asyncKeyword = null; 780 analyzer.Token asyncKeyword = null;
776 analyzer.Token star = null; 781 analyzer.Token star = null;
(...skipping 12 matching lines...) Expand all
789 void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) { 794 void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
790 // TODO(paulberry): set up scopes properly to resolve parameters and type 795 // TODO(paulberry): set up scopes properly to resolve parameters and type
791 // variables. 796 // variables.
792 debugEvent("TopLevelMethod"); 797 debugEvent("TopLevelMethod");
793 FunctionBody body = _endFunctionBody(); 798 FunctionBody body = _endFunctionBody();
794 FormalParameterList parameters = pop(); 799 FormalParameterList parameters = pop();
795 TypeParameterList typeParameters = pop(); 800 TypeParameterList typeParameters = pop();
796 SimpleIdentifier name = pop(); 801 SimpleIdentifier name = pop();
797 analyzer.Token propertyKeyword = toAnalyzerToken(getOrSet); 802 analyzer.Token propertyKeyword = toAnalyzerToken(getOrSet);
798 TypeAnnotation returnType = pop(); 803 TypeAnnotation returnType = pop();
799 Token externalKeyword = _popOptionalSingleModifier(); 804 _Modifiers modifiers = pop();
805 Token externalKeyword = modifiers?.externalKeyword;
800 List<Annotation> metadata = pop(); 806 List<Annotation> metadata = pop();
801 // TODO(paulberry): capture doc comments. See dartbug.com/28851. 807 // TODO(paulberry): capture doc comments. See dartbug.com/28851.
802 Comment comment = null; 808 Comment comment = null;
803 push(ast.functionDeclaration( 809 push(ast.functionDeclaration(
804 comment, 810 comment,
805 metadata, 811 metadata,
806 toAnalyzerToken(externalKeyword), 812 toAnalyzerToken(externalKeyword),
807 returnType, 813 returnType,
808 propertyKeyword, 814 propertyKeyword,
809 name, 815 name,
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 toAnalyzerToken(extendsKeyword), supertype.supertype); 982 toAnalyzerToken(extendsKeyword), supertype.supertype);
977 withClause = ast.withClause( 983 withClause = ast.withClause(
978 toAnalyzerToken(supertype.withKeyword), supertype.mixinTypes); 984 toAnalyzerToken(supertype.withKeyword), supertype.mixinTypes);
979 } else { 985 } else {
980 internalError('Unexpected kind of supertype ${supertype.runtimeType}'); 986 internalError('Unexpected kind of supertype ${supertype.runtimeType}');
981 } 987 }
982 TypeParameterList typeParameters = pop(); 988 TypeParameterList typeParameters = pop();
983 SimpleIdentifier name = pop(); 989 SimpleIdentifier name = pop();
984 assert(className == name.name); 990 assert(className == name.name);
985 className = null; 991 className = null;
986 Token abstractKeyword = _popOptionalSingleModifier(); 992 _Modifiers modifiers = pop();
993 Token abstractKeyword = modifiers?.abstractKeyword;
987 List<Annotation> metadata = pop(); 994 List<Annotation> metadata = pop();
988 // TODO(paulberry): capture doc comments. See dartbug.com/28851. 995 // TODO(paulberry): capture doc comments. See dartbug.com/28851.
989 Comment comment = null; 996 Comment comment = null;
990 push(ast.classDeclaration( 997 push(ast.classDeclaration(
991 comment, 998 comment,
992 metadata, 999 metadata,
993 toAnalyzerToken(abstractKeyword), 1000 toAnalyzerToken(abstractKeyword),
994 toAnalyzerToken(classKeyword), 1001 toAnalyzerToken(classKeyword),
995 name, 1002 name,
996 typeParameters, 1003 typeParameters,
(...skipping 27 matching lines...) Expand all
1024 ast.implementsClause(toAnalyzerToken(implementsKeyword), interfaces); 1031 ast.implementsClause(toAnalyzerToken(implementsKeyword), interfaces);
1025 } 1032 }
1026 _MixinApplication mixinApplication = pop(); 1033 _MixinApplication mixinApplication = pop();
1027 var superclass = mixinApplication.supertype; 1034 var superclass = mixinApplication.supertype;
1028 var withClause = ast.withClause( 1035 var withClause = ast.withClause(
1029 toAnalyzerToken(mixinApplication.withKeyword), 1036 toAnalyzerToken(mixinApplication.withKeyword),
1030 mixinApplication.mixinTypes); 1037 mixinApplication.mixinTypes);
1031 analyzer.Token equals = toAnalyzerToken(equalsToken); 1038 analyzer.Token equals = toAnalyzerToken(equalsToken);
1032 TypeParameterList typeParameters = pop(); 1039 TypeParameterList typeParameters = pop();
1033 SimpleIdentifier name = pop(); 1040 SimpleIdentifier name = pop();
1034 Token abstractKeyword = _popOptionalSingleModifier(); 1041 _Modifiers modifiers = pop();
1042 Token abstractKeyword = modifiers?.abstractKeyword;
1035 List<Annotation> metadata = pop(); 1043 List<Annotation> metadata = pop();
1036 // TODO(paulberry): capture doc comments. See dartbug.com/28851. 1044 // TODO(paulberry): capture doc comments. See dartbug.com/28851.
1037 Comment comment = null; 1045 Comment comment = null;
1038 push(ast.classTypeAlias( 1046 push(ast.classTypeAlias(
1039 comment, 1047 comment,
1040 metadata, 1048 metadata,
1041 toAnalyzerToken(classKeyword), 1049 toAnalyzerToken(classKeyword),
1042 name, 1050 name,
1043 typeParameters, 1051 typeParameters,
1044 equals, 1052 equals,
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 Expression initializer = pop(); 1138 Expression initializer = pop();
1131 SimpleIdentifier name = pop(); 1139 SimpleIdentifier name = pop();
1132 push(ast.variableDeclaration( 1140 push(ast.variableDeclaration(
1133 name, toAnalyzerToken(assignment), initializer)); 1141 name, toAnalyzerToken(assignment), initializer));
1134 } 1142 }
1135 1143
1136 void endTopLevelFields(int count, Token beginToken, Token endToken) { 1144 void endTopLevelFields(int count, Token beginToken, Token endToken) {
1137 debugEvent("TopLevelFields"); 1145 debugEvent("TopLevelFields");
1138 List<VariableDeclaration> variables = popList(count); 1146 List<VariableDeclaration> variables = popList(count);
1139 TypeAnnotation type = pop(); 1147 TypeAnnotation type = pop();
1140 Token keyword = _popOptionalSingleModifier(); 1148 _Modifiers modifiers = pop();
1149 Token keyword = modifiers?.finalConstOrVarKeyword;
1141 var variableList = ast.variableDeclarationList( 1150 var variableList = ast.variableDeclarationList(
1142 null, null, toAnalyzerToken(keyword), type, variables); 1151 null, null, toAnalyzerToken(keyword), type, variables);
1143 List<Annotation> metadata = pop(); 1152 List<Annotation> metadata = pop();
1144 // TODO(paulberry): capture doc comments. See dartbug.com/28851. 1153 // TODO(paulberry): capture doc comments. See dartbug.com/28851.
1145 Comment comment = null; 1154 Comment comment = null;
1146 push(ast.topLevelVariableDeclaration( 1155 push(ast.topLevelVariableDeclaration(
1147 comment, metadata, variableList, toAnalyzerToken(endToken))); 1156 comment, metadata, variableList, toAnalyzerToken(endToken)));
1148 } 1157 }
1149 1158
1150 @override 1159 @override
(...skipping 24 matching lines...) Expand all
1175 void endMethod(Token getOrSet, Token beginToken, Token endToken) { 1184 void endMethod(Token getOrSet, Token beginToken, Token endToken) {
1176 debugEvent("Method"); 1185 debugEvent("Method");
1177 FunctionBody body = _endFunctionBody(); 1186 FunctionBody body = _endFunctionBody();
1178 ConstructorName redirectedConstructor = null; // TODO(paulberry) 1187 ConstructorName redirectedConstructor = null; // TODO(paulberry)
1179 List<ConstructorInitializer> initializers = null; // TODO(paulberry) 1188 List<ConstructorInitializer> initializers = null; // TODO(paulberry)
1180 Token separator = null; // TODO(paulberry) 1189 Token separator = null; // TODO(paulberry)
1181 FormalParameterList parameters = pop(); 1190 FormalParameterList parameters = pop();
1182 TypeParameterList typeParameters = pop(); // TODO(paulberry) 1191 TypeParameterList typeParameters = pop(); // TODO(paulberry)
1183 var name = pop(); 1192 var name = pop();
1184 TypeAnnotation returnType = pop(); // TODO(paulberry) 1193 TypeAnnotation returnType = pop(); // TODO(paulberry)
1185 Token modifierKeyword = null; // TODO(paulberry) 1194 _Modifiers modifiers = pop();
1186 Token externalKeyword = null;
1187 Token constKeyword = null;
1188 Token factoryKeyword = null;
1189 List<Token> modifiers = pop();
1190 for (Token modifier in modifiers) {
1191 String value = modifier.stringValue;
1192 if (identical('external', value)) {
1193 // TODO(scheglov): Check the order and uniqueness.
1194 externalKeyword = modifier;
1195 } else if (identical('const', value)) {
1196 // TODO(scheglov): Check the order and uniqueness.
1197 constKeyword = modifier;
1198 } else if (identical('factory', value)) {
1199 // TODO(scheglov): Check the order and uniqueness.
1200 factoryKeyword = modifier;
1201 } else {
1202 // TODO(scheglov): Report error.
1203 internalError("Invalid modifier ($value). Report an error.");
1204 }
1205 }
1206
1207 List<Annotation> metadata = pop(); 1195 List<Annotation> metadata = pop();
1208 // TODO(paulberry): capture doc comments. See dartbug.com/28851. 1196 // TODO(paulberry): capture doc comments. See dartbug.com/28851.
1209 Comment comment = null; 1197 Comment comment = null;
1210 Token period; 1198 Token period;
1211 void unnamedConstructor( 1199 void unnamedConstructor(
1212 SimpleIdentifier returnType, SimpleIdentifier name) { 1200 SimpleIdentifier returnType, SimpleIdentifier name) {
1213 push(ast.constructorDeclaration( 1201 push(ast.constructorDeclaration(
1214 comment, 1202 comment,
1215 metadata, 1203 metadata,
1216 toAnalyzerToken(externalKeyword), 1204 toAnalyzerToken(modifiers?.externalKeyword),
1217 toAnalyzerToken(constKeyword), 1205 toAnalyzerToken(modifiers?.finalConstOrVarKeyword),
1218 toAnalyzerToken(factoryKeyword), 1206 null, // TODO(paulberry): factoryKeyword
1219 returnType, 1207 returnType,
1220 toAnalyzerToken(period), 1208 toAnalyzerToken(period),
1221 name, 1209 name,
1222 parameters, 1210 parameters,
1223 toAnalyzerToken(separator), 1211 toAnalyzerToken(separator),
1224 initializers, 1212 initializers,
1225 redirectedConstructor, 1213 redirectedConstructor,
1226 body)); 1214 body));
1227 } 1215 }
1228 1216
1229 void method(Token operatorKeyword, SimpleIdentifier name) { 1217 void method(Token operatorKeyword, SimpleIdentifier name) {
1230 push(ast.methodDeclaration( 1218 push(ast.methodDeclaration(
1231 comment, 1219 comment,
1232 metadata, 1220 metadata,
1233 toAnalyzerToken(externalKeyword), 1221 toAnalyzerToken(modifiers?.externalKeyword),
1234 toAnalyzerToken(modifierKeyword), 1222 toAnalyzerToken(
1223 modifiers?.abstractKeyword ?? modifiers?.staticKeyword),
1235 returnType, 1224 returnType,
1236 toAnalyzerToken(getOrSet), 1225 toAnalyzerToken(getOrSet),
1237 toAnalyzerToken(operatorKeyword), 1226 toAnalyzerToken(operatorKeyword),
1238 name, 1227 name,
1239 typeParameters, 1228 typeParameters,
1240 parameters, 1229 parameters,
1241 body)); 1230 body));
1242 } 1231 }
1243 1232
1244 if (name is SimpleIdentifier) { 1233 if (name is SimpleIdentifier) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 push(ast.typeArgumentList( 1333 push(ast.typeArgumentList(
1345 toAnalyzerToken(beginToken), arguments, toAnalyzerToken(endToken))); 1334 toAnalyzerToken(beginToken), arguments, toAnalyzerToken(endToken)));
1346 } 1335 }
1347 1336
1348 @override 1337 @override
1349 void endFields( 1338 void endFields(
1350 int count, Token covariantKeyword, Token beginToken, Token endToken) { 1339 int count, Token covariantKeyword, Token beginToken, Token endToken) {
1351 debugEvent("Fields"); 1340 debugEvent("Fields");
1352 List<VariableDeclaration> variables = popList(count); 1341 List<VariableDeclaration> variables = popList(count);
1353 TypeAnnotation type = pop(); 1342 TypeAnnotation type = pop();
1354 List<Token> modifiers = pop(); 1343 _Modifiers modifiers = pop();
1355 Token staticKeyword; 1344 var variableList = ast.variableDeclarationList(null, null,
1356 Token keyword; 1345 toAnalyzerToken(modifiers?.finalConstOrVarKeyword), type, variables);
1357 for (Token modifier in modifiers) {
1358 String value = modifier.stringValue;
1359 if (identical('static', value)) {
1360 // TODO(paulberry): Check the order and uniqueness.
1361 staticKeyword = modifier;
1362 } else if (identical('var', value)) {
1363 // TODO(paulberry): Check the order and uniqueness.
1364 keyword = modifier;
1365 } else {
1366 // TODO(paulberry): Report error.
1367 internalError("Invalid modifier ($value). Report an error.");
1368 }
1369 }
1370 var variableList = ast.variableDeclarationList(
1371 null, null, toAnalyzerToken(keyword), type, variables);
1372 List<Annotation> metadata = pop(); 1346 List<Annotation> metadata = pop();
1373 // TODO(paulberry): capture doc comments. See dartbug.com/28851. 1347 // TODO(paulberry): capture doc comments. See dartbug.com/28851.
1374 Comment comment = null; 1348 Comment comment = null;
1375 push(ast.fieldDeclaration2( 1349 push(ast.fieldDeclaration2(
1376 comment: comment, 1350 comment: comment,
1377 metadata: metadata, 1351 metadata: metadata,
1378 covariantKeyword: toAnalyzerToken(covariantKeyword), 1352 covariantKeyword: toAnalyzerToken(covariantKeyword),
1379 staticKeyword: toAnalyzerToken(staticKeyword), 1353 staticKeyword: toAnalyzerToken(modifiers?.staticKeyword),
1380 fieldList: variableList, 1354 fieldList: variableList,
1381 semicolon: toAnalyzerToken(endToken))); 1355 semicolon: toAnalyzerToken(endToken)));
1382 } 1356 }
1383 1357
1384 @override 1358 @override
1385 void handleOperatorName(Token operatorKeyword, Token token) { 1359 void handleOperatorName(Token operatorKeyword, Token token) {
1386 debugEvent("OperatorName"); 1360 debugEvent("OperatorName");
1387 push(new _OperatorName(operatorKeyword, 1361 push(new _OperatorName(operatorKeyword,
1388 ast.simpleIdentifier(toAnalyzerToken(token), isDeclaration: true))); 1362 ast.simpleIdentifier(toAnalyzerToken(token), isDeclaration: true)));
1389 } 1363 }
1390 1364
1391 /**
1392 * Pop the modifiers list, if the list is empty return `null`, if the list
1393 * has one item return it; otherwise return `null`.
1394 */
1395 Token _popOptionalSingleModifier() {
1396 List<Token> modifiers = pop();
1397 if (modifiers.length == 0) {
1398 return null;
1399 } else if (modifiers.length == 1) {
1400 // TODO(scheglov): Verify that the modifier is valid.
1401 return modifiers[0];
1402 } else {
1403 // TODO(scheglov): Report error.
1404 internalError("Invalid modifier. Report an error.");
1405 return null;
1406 }
1407 }
1408
1409 ParameterKind _toAnalyzerParameterKind(FormalParameterType type) { 1365 ParameterKind _toAnalyzerParameterKind(FormalParameterType type) {
1410 if (type == FormalParameterType.POSITIONAL) { 1366 if (type == FormalParameterType.POSITIONAL) {
1411 return ParameterKind.POSITIONAL; 1367 return ParameterKind.POSITIONAL;
1412 } else if (type == FormalParameterType.NAMED) { 1368 } else if (type == FormalParameterType.NAMED) {
1413 return ParameterKind.NAMED; 1369 return ParameterKind.NAMED;
1414 } else { 1370 } else {
1415 return ParameterKind.REQUIRED; 1371 return ParameterKind.REQUIRED;
1416 } 1372 }
1417 } 1373 }
1418 } 1374 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 } 1424 }
1469 1425
1470 /// Data structure placed on the stack to represent the keyword "operator" 1426 /// Data structure placed on the stack to represent the keyword "operator"
1471 /// followed by a token. 1427 /// followed by a token.
1472 class _OperatorName { 1428 class _OperatorName {
1473 final Token operatorKeyword; 1429 final Token operatorKeyword;
1474 final SimpleIdentifier name; 1430 final SimpleIdentifier name;
1475 1431
1476 _OperatorName(this.operatorKeyword, this.name); 1432 _OperatorName(this.operatorKeyword, this.name);
1477 } 1433 }
1434
1435 /// Data structure placed on the stack to represent a non-empty sequence
1436 /// of modifiers.
1437 class _Modifiers {
1438 Token abstractKeyword;
1439 Token externalKeyword;
1440 Token finalConstOrVarKeyword;
1441 Token staticKeyword;
1442
1443 _Modifiers(List<Token> modifierTokens) {
1444 // No need to check the order and uniqueness of the modifiers, or that
1445 // disallowed modifiers are not used; the parser should do that.
1446 // TODO(paulberry,ahe): implement the necessary logic in the parser.
1447 for (var token in modifierTokens) {
1448 var s = token.value;
1449 if (identical('abstract', s)) {
1450 abstractKeyword = token;
1451 } else if (identical('const', s)) {
1452 finalConstOrVarKeyword = token;
1453 } else if (identical('external', s)) {
1454 externalKeyword = token;
1455 } else if (identical('final', s)) {
1456 finalConstOrVarKeyword = token;
1457 } else if (identical('static', s)) {
1458 staticKeyword = token;
1459 } else if (identical('var', s)) {
1460 finalConstOrVarKeyword = token;
1461 } else {
1462 internalError('Unhandled modifier: $s');
1463 }
1464 }
1465 }
1466 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698