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

Side by Side Diff: pkg/analyzer_experimental/lib/src/generated/resolver.dart

Issue 17932005: New analyzer_experimental snapshot. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Disable resolver tests Created 7 years, 5 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 | Annotate | Revision Log
OLDNEW
1 // This code was auto-generated, is not intended to be edited, and is subject to 1 // This code was auto-generated, is not intended to be edited, and is subject to
2 // significant change. Please see the README file for more information. 2 // significant change. Please see the README file for more information.
3 library engine.resolver; 3 library engine.resolver;
4 import 'dart:collection'; 4 import 'dart:collection';
5 import 'java_core.dart'; 5 import 'java_core.dart';
6 import 'java_engine.dart'; 6 import 'java_engine.dart';
7 import 'instrumentation.dart'; 7 import 'instrumentation.dart';
8 import 'source.dart'; 8 import 'source.dart';
9 import 'error.dart'; 9 import 'error.dart';
10 import 'scanner.dart' as sc; 10 import 'scanner.dart' as sc;
11 import 'utilities_dart.dart'; 11 import 'utilities_dart.dart';
12 import 'ast.dart'; 12 import 'ast.dart';
13 import 'parser.dart' show Parser, ParserErrorCode; 13 import 'parser.dart' show Parser, ParserErrorCode;
14 import 'sdk.dart' show DartSdk, SdkLibrary; 14 import 'sdk.dart' show DartSdk, SdkLibrary;
15 import 'element.dart'; 15 import 'element.dart';
16 import 'html.dart' as ht; 16 import 'html.dart' as ht;
17 import 'engine.dart'; 17 import 'engine.dart';
18 import 'constant.dart'; 18 import 'constant.dart';
19 /** 19 /**
20 * Instances of the class `CompilationUnitBuilder` build an element model for a single 20 * Instances of the class `CompilationUnitBuilder` build an element model for a single
21 * compilation unit. 21 * compilation unit.
22 *
22 * @coverage dart.engine.resolver 23 * @coverage dart.engine.resolver
23 */ 24 */
24 class CompilationUnitBuilder { 25 class CompilationUnitBuilder {
25 26
26 /** 27 /**
27 * Build the compilation unit element for the given source. 28 * Build the compilation unit element for the given source.
29 *
28 * @param source the source describing the compilation unit 30 * @param source the source describing the compilation unit
29 * @param unit the AST structure representing the compilation unit 31 * @param unit the AST structure representing the compilation unit
30 * @return the compilation unit element that was built 32 * @return the compilation unit element that was built
31 * @throws AnalysisException if the analysis could not be performed 33 * @throws AnalysisException if the analysis could not be performed
32 */ 34 */
33 CompilationUnitElementImpl buildCompilationUnit(Source source2, CompilationUni t unit) { 35 CompilationUnitElementImpl buildCompilationUnit(Source source2, CompilationUni t unit) {
34 if (unit == null) { 36 if (unit == null) {
35 return null; 37 return null;
36 } 38 }
37 ElementHolder holder = new ElementHolder(); 39 ElementHolder holder = new ElementHolder();
38 ElementBuilder builder = new ElementBuilder(holder); 40 ElementBuilder builder = new ElementBuilder(holder);
39 unit.accept(builder); 41 unit.accept(builder);
40 CompilationUnitElementImpl element = new CompilationUnitElementImpl(source2. shortName); 42 CompilationUnitElementImpl element = new CompilationUnitElementImpl(source2. shortName);
41 element.accessors = holder.accessors; 43 element.accessors = holder.accessors;
42 element.functions = holder.functions; 44 element.functions = holder.functions;
43 element.source = source2; 45 element.source = source2;
44 element.typeAliases = holder.typeAliases; 46 element.typeAliases = holder.typeAliases;
45 element.types = holder.types; 47 element.types = holder.types;
46 element.topLevelVariables = holder.topLevelVariables; 48 element.topLevelVariables = holder.topLevelVariables;
47 unit.element = element; 49 unit.element = element;
48 return element; 50 return element;
49 } 51 }
50 } 52 }
51 /** 53 /**
52 * Instances of the class `ElementBuilder` traverse an AST structure and build t he element 54 * Instances of the class `ElementBuilder` traverse an AST structure and build t he element
53 * model representing the AST structure. 55 * model representing the AST structure.
56 *
54 * @coverage dart.engine.resolver 57 * @coverage dart.engine.resolver
55 */ 58 */
56 class ElementBuilder extends RecursiveASTVisitor<Object> { 59 class ElementBuilder extends RecursiveASTVisitor<Object> {
57 60
58 /** 61 /**
59 * The element holder associated with the element that is currently being buil t. 62 * The element holder associated with the element that is currently being buil t.
60 */ 63 */
61 ElementHolder _currentHolder; 64 ElementHolder _currentHolder;
62 65
63 /** 66 /**
(...skipping 13 matching lines...) Expand all
77 80
78 /** 81 /**
79 * A collection holding the function types defined in a class that need to hav e their type 82 * A collection holding the function types defined in a class that need to hav e their type
80 * arguments set to the types of the type parameters for the class, or `null` if we are not 83 * arguments set to the types of the type parameters for the class, or `null` if we are not
81 * currently processing nodes within a class. 84 * currently processing nodes within a class.
82 */ 85 */
83 List<FunctionTypeImpl> _functionTypesToFix = null; 86 List<FunctionTypeImpl> _functionTypesToFix = null;
84 87
85 /** 88 /**
86 * Initialize a newly created element builder to build the elements for a comp ilation unit. 89 * Initialize a newly created element builder to build the elements for a comp ilation unit.
90 *
87 * @param initialHolder the element holder associated with the compilation uni t being built 91 * @param initialHolder the element holder associated with the compilation uni t being built
88 */ 92 */
89 ElementBuilder(ElementHolder initialHolder) { 93 ElementBuilder(ElementHolder initialHolder) {
90 _currentHolder = initialHolder; 94 _currentHolder = initialHolder;
91 } 95 }
92 Object visitBlock(Block node) { 96 Object visitBlock(Block node) {
93 bool wasInField = _inFieldContext; 97 bool wasInField = _inFieldContext;
94 _inFieldContext = false; 98 _inFieldContext = false;
95 try { 99 try {
96 node.visitChildren(this); 100 node.visitChildren(this);
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 setter.static = variable.isStatic; 603 setter.static = variable.isStatic;
600 _currentHolder.addAccessor(setter); 604 _currentHolder.addAccessor(setter);
601 variable.setter = setter; 605 variable.setter = setter;
602 } 606 }
603 } 607 }
604 return null; 608 return null;
605 } 609 }
606 610
607 /** 611 /**
608 * Creates the [ConstructorElement]s array with the single default constructor element. 612 * Creates the [ConstructorElement]s array with the single default constructor element.
613 *
609 * @param interfaceType the interface type for which to create a default const ructor 614 * @param interfaceType the interface type for which to create a default const ructor
610 * @return the [ConstructorElement]s array with the single default constructor element 615 * @return the [ConstructorElement]s array with the single default constructor element
611 */ 616 */
612 List<ConstructorElement> createDefaultConstructors(InterfaceTypeImpl interface Type) { 617 List<ConstructorElement> createDefaultConstructors(InterfaceTypeImpl interface Type) {
613 ConstructorElementImpl constructor = new ConstructorElementImpl(null); 618 ConstructorElementImpl constructor = new ConstructorElementImpl(null);
614 constructor.synthetic = true; 619 constructor.synthetic = true;
615 constructor.returnType = interfaceType; 620 constructor.returnType = interfaceType;
616 FunctionTypeImpl type = new FunctionTypeImpl.con1(constructor); 621 FunctionTypeImpl type = new FunctionTypeImpl.con1(constructor);
617 _functionTypesToFix.add(type); 622 _functionTypesToFix.add(type);
618 constructor.type = type; 623 constructor.type = type;
619 return <ConstructorElement> [constructor]; 624 return <ConstructorElement> [constructor];
620 } 625 }
621 626
622 /** 627 /**
623 * Create the types associated with the given type variables, setting the type of each type 628 * Create the types associated with the given type variables, setting the type of each type
624 * variable, and return an array of types corresponding to the given variables . 629 * variable, and return an array of types corresponding to the given variables .
630 *
625 * @param typeVariables the type variables for which types are to be created 631 * @param typeVariables the type variables for which types are to be created
626 * @return 632 * @return
627 */ 633 */
628 List<Type2> createTypeVariableTypes(List<TypeVariableElement> typeVariables) { 634 List<Type2> createTypeVariableTypes(List<TypeVariableElement> typeVariables) {
629 int typeVariableCount = typeVariables.length; 635 int typeVariableCount = typeVariables.length;
630 List<Type2> typeArguments = new List<Type2>(typeVariableCount); 636 List<Type2> typeArguments = new List<Type2>(typeVariableCount);
631 for (int i = 0; i < typeVariableCount; i++) { 637 for (int i = 0; i < typeVariableCount; i++) {
632 TypeVariableElementImpl typeVariable = typeVariables[i] as TypeVariableEle mentImpl; 638 TypeVariableElementImpl typeVariable = typeVariables[i] as TypeVariableEle mentImpl;
633 TypeVariableTypeImpl typeArgument = new TypeVariableTypeImpl(typeVariable) ; 639 TypeVariableTypeImpl typeArgument = new TypeVariableTypeImpl(typeVariable) ;
634 typeVariable.type = typeArgument; 640 typeVariable.type = typeArgument;
635 typeArguments[i] = typeArgument; 641 typeArguments[i] = typeArgument;
636 } 642 }
637 return typeArguments; 643 return typeArguments;
638 } 644 }
639 645
640 /** 646 /**
641 * Return the body of the function that contains the given parameter, or `null ` if no 647 * Return the body of the function that contains the given parameter, or `null ` if no
642 * function body could be found. 648 * function body could be found.
649 *
643 * @param node the parameter contained in the function whose body is to be ret urned 650 * @param node the parameter contained in the function whose body is to be ret urned
644 * @return the body of the function that contains the given parameter 651 * @return the body of the function that contains the given parameter
645 */ 652 */
646 FunctionBody getFunctionBody(FormalParameter node) { 653 FunctionBody getFunctionBody(FormalParameter node) {
647 ASTNode parent = node.parent; 654 ASTNode parent = node.parent;
648 while (parent != null) { 655 while (parent != null) {
649 if (parent is FunctionExpression) { 656 if (parent is FunctionExpression) {
650 return ((parent as FunctionExpression)).body; 657 return ((parent as FunctionExpression)).body;
651 } else if (parent is MethodDeclaration) { 658 } else if (parent is MethodDeclaration) {
652 return ((parent as MethodDeclaration)).body; 659 return ((parent as MethodDeclaration)).body;
653 } 660 }
654 parent = parent.parent; 661 parent = parent.parent;
655 } 662 }
656 return null; 663 return null;
657 } 664 }
658 665
659 /** 666 /**
660 * Return `true` if the given token is a token for the given keyword. 667 * Return `true` if the given token is a token for the given keyword.
668 *
661 * @param token the token being tested 669 * @param token the token being tested
662 * @param keyword the keyword being tested for 670 * @param keyword the keyword being tested for
663 * @return `true` if the given token is a token for the given keyword 671 * @return `true` if the given token is a token for the given keyword
664 */ 672 */
665 bool matches(sc.Token token, sc.Keyword keyword2) => token != null && identica l(token.type, sc.TokenType.KEYWORD) && identical(((token as sc.KeywordToken)).ke yword, keyword2); 673 bool matches(sc.Token token, sc.Keyword keyword2) => token != null && identica l(token.type, sc.TokenType.KEYWORD) && identical(((token as sc.KeywordToken)).ke yword, keyword2);
666 674
667 /** 675 /**
668 * Make the given holder be the current holder while visiting the given node. 676 * Make the given holder be the current holder while visiting the given node.
677 *
669 * @param holder the holder that will gather elements that are built while vis iting the children 678 * @param holder the holder that will gather elements that are built while vis iting the children
670 * @param node the node to be visited 679 * @param node the node to be visited
671 */ 680 */
672 void visit(ElementHolder holder, ASTNode node) { 681 void visit(ElementHolder holder, ASTNode node) {
673 if (node != null) { 682 if (node != null) {
674 ElementHolder previousHolder = _currentHolder; 683 ElementHolder previousHolder = _currentHolder;
675 _currentHolder = holder; 684 _currentHolder = holder;
676 try { 685 try {
677 node.accept(this); 686 node.accept(this);
678 } finally { 687 } finally {
679 _currentHolder = previousHolder; 688 _currentHolder = previousHolder;
680 } 689 }
681 } 690 }
682 } 691 }
683 692
684 /** 693 /**
685 * Make the given holder be the current holder while visiting the children of the given node. 694 * Make the given holder be the current holder while visiting the children of the given node.
695 *
686 * @param holder the holder that will gather elements that are built while vis iting the children 696 * @param holder the holder that will gather elements that are built while vis iting the children
687 * @param node the node whose children are to be visited 697 * @param node the node whose children are to be visited
688 */ 698 */
689 void visitChildren(ElementHolder holder, ASTNode node) { 699 void visitChildren(ElementHolder holder, ASTNode node) {
690 if (node != null) { 700 if (node != null) {
691 ElementHolder previousHolder = _currentHolder; 701 ElementHolder previousHolder = _currentHolder;
692 _currentHolder = holder; 702 _currentHolder = holder;
693 try { 703 try {
694 node.visitChildren(this); 704 node.visitChildren(this);
695 } finally { 705 } finally {
696 _currentHolder = previousHolder; 706 _currentHolder = previousHolder;
697 } 707 }
698 } 708 }
699 } 709 }
700 } 710 }
701 /** 711 /**
702 * Instances of the class `ElementHolder` hold on to elements created while trav ersing an AST 712 * Instances of the class `ElementHolder` hold on to elements created while trav ersing an AST
703 * structure so that they can be accessed when creating their enclosing element. 713 * structure so that they can be accessed when creating their enclosing element.
714 *
704 * @coverage dart.engine.resolver 715 * @coverage dart.engine.resolver
705 */ 716 */
706 class ElementHolder { 717 class ElementHolder {
707 List<PropertyAccessorElement> _accessors; 718 List<PropertyAccessorElement> _accessors;
708 List<ConstructorElement> _constructors; 719 List<ConstructorElement> _constructors;
709 List<FieldElement> _fields; 720 List<FieldElement> _fields;
710 List<FunctionElement> _functions; 721 List<FunctionElement> _functions;
711 List<LabelElement> _labels; 722 List<LabelElement> _labels;
712 List<VariableElement> _localVariables; 723 List<VariableElement> _localVariables;
713 List<MethodElement> _methods; 724 List<MethodElement> _methods;
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 * The analysis context in which the element model will be built. 1008 * The analysis context in which the element model will be built.
998 */ 1009 */
999 InternalAnalysisContext _context; 1010 InternalAnalysisContext _context;
1000 1011
1001 /** 1012 /**
1002 * The error listener to which errors will be reported. 1013 * The error listener to which errors will be reported.
1003 */ 1014 */
1004 RecordingErrorListener _errorListener; 1015 RecordingErrorListener _errorListener;
1005 1016
1006 /** 1017 /**
1007 * The line information associated with the source for which an element is bei ng built, or`null` if we are not building an element. 1018 * The line information associated with the source for which an element is bei ng built, or
1019 * `null` if we are not building an element.
1008 */ 1020 */
1009 LineInfo _lineInfo; 1021 LineInfo _lineInfo;
1010 1022
1011 /** 1023 /**
1012 * The HTML element being built. 1024 * The HTML element being built.
1013 */ 1025 */
1014 HtmlElementImpl _htmlElement; 1026 HtmlElementImpl _htmlElement;
1015 1027
1016 /** 1028 /**
1017 * The elements in the path from the HTML unit to the current tag node. 1029 * The elements in the path from the HTML unit to the current tag node.
1018 */ 1030 */
1019 List<ht.XmlTagNode> _parentNodes; 1031 List<ht.XmlTagNode> _parentNodes;
1020 1032
1021 /** 1033 /**
1022 * The script elements being built. 1034 * The script elements being built.
1023 */ 1035 */
1024 List<HtmlScriptElement> _scripts; 1036 List<HtmlScriptElement> _scripts;
1025 1037
1026 /** 1038 /**
1027 * A set of the libraries that were resolved while resolving the HTML unit. 1039 * A set of the libraries that were resolved while resolving the HTML unit.
1028 */ 1040 */
1029 Set<Library> _resolvedLibraries = new Set<Library>(); 1041 Set<Library> _resolvedLibraries = new Set<Library>();
1030 1042
1031 /** 1043 /**
1032 * Initialize a newly created HTML unit builder. 1044 * Initialize a newly created HTML unit builder.
1045 *
1033 * @param context the analysis context in which the element model will be buil t 1046 * @param context the analysis context in which the element model will be buil t
1034 */ 1047 */
1035 HtmlUnitBuilder(InternalAnalysisContext context) { 1048 HtmlUnitBuilder(InternalAnalysisContext context) {
1036 this._context = context; 1049 this._context = context;
1037 this._errorListener = new RecordingErrorListener(); 1050 this._errorListener = new RecordingErrorListener();
1038 } 1051 }
1039 1052
1040 /** 1053 /**
1041 * Build the HTML element for the given source. 1054 * Build the HTML element for the given source.
1055 *
1042 * @param source the source describing the compilation unit 1056 * @param source the source describing the compilation unit
1043 * @return the HTML element that was built 1057 * @return the HTML element that was built
1044 * @throws AnalysisException if the analysis could not be performed 1058 * @throws AnalysisException if the analysis could not be performed
1045 */ 1059 */
1046 HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, _ context.parseHtmlUnit(source)); 1060 HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, _ context.parseHtmlUnit(source));
1047 1061
1048 /** 1062 /**
1049 * Build the HTML element for the given source. 1063 * Build the HTML element for the given source.
1064 *
1050 * @param source the source describing the compilation unit 1065 * @param source the source describing the compilation unit
1051 * @param unit the AST structure representing the HTML 1066 * @param unit the AST structure representing the HTML
1052 * @throws AnalysisException if the analysis could not be performed 1067 * @throws AnalysisException if the analysis could not be performed
1053 */ 1068 */
1054 HtmlElementImpl buildHtmlElement2(Source source2, ht.HtmlUnit unit) { 1069 HtmlElementImpl buildHtmlElement2(Source source2, ht.HtmlUnit unit) {
1055 _lineInfo = _context.computeLineInfo(source2); 1070 _lineInfo = _context.computeLineInfo(source2);
1056 HtmlElementImpl result = new HtmlElementImpl(_context, source2.shortName); 1071 HtmlElementImpl result = new HtmlElementImpl(_context, source2.shortName);
1057 result.source = source2; 1072 result.source = source2;
1058 _htmlElement = result; 1073 _htmlElement = result;
1059 unit.accept(this); 1074 unit.accept(this);
1060 _htmlElement = null; 1075 _htmlElement = null;
1061 unit.element = result; 1076 unit.element = result;
1062 return result; 1077 return result;
1063 } 1078 }
1064 1079
1065 /** 1080 /**
1066 * Return the listener to which analysis errors will be reported. 1081 * Return the listener to which analysis errors will be reported.
1082 *
1067 * @return the listener to which analysis errors will be reported 1083 * @return the listener to which analysis errors will be reported
1068 */ 1084 */
1069 RecordingErrorListener get errorListener => _errorListener; 1085 RecordingErrorListener get errorListener => _errorListener;
1070 1086
1071 /** 1087 /**
1072 * Return an array containing information about all of the libraries that were resolved. 1088 * Return an array containing information about all of the libraries that were resolved.
1089 *
1073 * @return an array containing the libraries that were resolved 1090 * @return an array containing the libraries that were resolved
1074 */ 1091 */
1075 Set<Library> get resolvedLibraries => _resolvedLibraries; 1092 Set<Library> get resolvedLibraries => _resolvedLibraries;
1076 Object visitHtmlUnit(ht.HtmlUnit node) { 1093 Object visitHtmlUnit(ht.HtmlUnit node) {
1077 _parentNodes = new List<ht.XmlTagNode>(); 1094 _parentNodes = new List<ht.XmlTagNode>();
1078 _scripts = new List<HtmlScriptElement>(); 1095 _scripts = new List<HtmlScriptElement>();
1079 try { 1096 try {
1080 node.visitChildren(this); 1097 node.visitChildren(this);
1081 _htmlElement.scripts = new List.from(_scripts); 1098 _htmlElement.scripts = new List.from(_scripts);
1082 } finally { 1099 } finally {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1157 node.visitChildren(this); 1174 node.visitChildren(this);
1158 } 1175 }
1159 } finally { 1176 } finally {
1160 _parentNodes.remove(node); 1177 _parentNodes.remove(node);
1161 } 1178 }
1162 return null; 1179 return null;
1163 } 1180 }
1164 1181
1165 /** 1182 /**
1166 * Return the first source attribute for the given tag node, or `null` if it d oes not exist. 1183 * Return the first source attribute for the given tag node, or `null` if it d oes not exist.
1184 *
1167 * @param node the node containing attributes 1185 * @param node the node containing attributes
1168 * @return the source attribute contained in the given tag 1186 * @return the source attribute contained in the given tag
1169 */ 1187 */
1170 ht.XmlAttributeNode getScriptSourcePath(ht.XmlTagNode node) { 1188 ht.XmlAttributeNode getScriptSourcePath(ht.XmlTagNode node) {
1171 for (ht.XmlAttributeNode attribute in node.attributes) { 1189 for (ht.XmlAttributeNode attribute in node.attributes) {
1172 if (attribute.name.lexeme == _SRC) { 1190 if (attribute.name.lexeme == _SRC) {
1173 return attribute; 1191 return attribute;
1174 } 1192 }
1175 } 1193 }
1176 return null; 1194 return null;
1177 } 1195 }
1178 1196
1179 /** 1197 /**
1180 * Determine if the specified node is a Dart script. 1198 * Determine if the specified node is a Dart script.
1199 *
1181 * @param node the node to be tested (not `null`) 1200 * @param node the node to be tested (not `null`)
1182 * @return `true` if the node is a Dart script 1201 * @return `true` if the node is a Dart script
1183 */ 1202 */
1184 bool isScriptNode(ht.XmlTagNode node) { 1203 bool isScriptNode(ht.XmlTagNode node) {
1185 if (node.tagNodes.length != 0 || node.tag.lexeme != _SCRIPT) { 1204 if (node.tagNodes.length != 0 || node.tag.lexeme != _SCRIPT) {
1186 return false; 1205 return false;
1187 } 1206 }
1188 for (ht.XmlAttributeNode attribute in node.attributes) { 1207 for (ht.XmlAttributeNode attribute in node.attributes) {
1189 if (attribute.name.lexeme == _TYPE) { 1208 if (attribute.name.lexeme == _TYPE) {
1190 ht.Token valueToken = attribute.value; 1209 ht.Token valueToken = attribute.value;
1191 if (valueToken != null) { 1210 if (valueToken != null) {
1192 String value = valueToken.lexeme; 1211 String value = valueToken.lexeme;
1193 if (value == _APPLICATION_DART_IN_DOUBLE_QUOTES || value == _APPLICATI ON_DART_IN_SINGLE_QUOTES) { 1212 if (value == _APPLICATION_DART_IN_DOUBLE_QUOTES || value == _APPLICATI ON_DART_IN_SINGLE_QUOTES) {
1194 return true; 1213 return true;
1195 } 1214 }
1196 } 1215 }
1197 } 1216 }
1198 } 1217 }
1199 return false; 1218 return false;
1200 } 1219 }
1201 1220
1202 /** 1221 /**
1203 * Report an error with the given error code at the given location. Use the gi ven arguments to 1222 * Report an error with the given error code at the given location. Use the gi ven arguments to
1204 * compose the error message. 1223 * compose the error message.
1224 *
1205 * @param errorCode the error code of the error to be reported 1225 * @param errorCode the error code of the error to be reported
1206 * @param offset the offset of the first character to be highlighted 1226 * @param offset the offset of the first character to be highlighted
1207 * @param length the number of characters to be highlighted 1227 * @param length the number of characters to be highlighted
1208 * @param arguments the arguments used to compose the error message 1228 * @param arguments the arguments used to compose the error message
1209 */ 1229 */
1210 void reportError(ErrorCode errorCode, int offset, int length, List<Object> arg uments) { 1230 void reportError(ErrorCode errorCode, int offset, int length, List<Object> arg uments) {
1211 _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, l ength, errorCode, arguments)); 1231 _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, l ength, errorCode, arguments));
1212 } 1232 }
1213 } 1233 }
1214 /** 1234 /**
(...skipping 27 matching lines...) Expand all
1242 1262
1243 /** 1263 /**
1244 * The parameter containing the AST nodes being visited, or `null` if we are n ot in the 1264 * The parameter containing the AST nodes being visited, or `null` if we are n ot in the
1245 * scope of a parameter. 1265 * scope of a parameter.
1246 */ 1266 */
1247 ParameterElement _enclosingParameter; 1267 ParameterElement _enclosingParameter;
1248 1268
1249 /** 1269 /**
1250 * Resolve the declarations within the given compilation unit to the elements rooted at the given 1270 * Resolve the declarations within the given compilation unit to the elements rooted at the given
1251 * element. 1271 * element.
1272 *
1252 * @param unit the compilation unit to be resolved 1273 * @param unit the compilation unit to be resolved
1253 * @param element the root of the element model used to resolve the AST nodes 1274 * @param element the root of the element model used to resolve the AST nodes
1254 */ 1275 */
1255 void resolve(CompilationUnit unit, CompilationUnitElement element2) { 1276 void resolve(CompilationUnit unit, CompilationUnitElement element2) {
1256 _enclosingUnit = element2; 1277 _enclosingUnit = element2;
1257 unit.element = element2; 1278 unit.element = element2;
1258 unit.accept(this); 1279 unit.accept(this);
1259 } 1280 }
1260 Object visitCatchClause(CatchClause node) { 1281 Object visitCatchClause(CatchClause node) {
1261 SimpleIdentifier exceptionParameter = node.exceptionParameter; 1282 SimpleIdentifier exceptionParameter = node.exceptionParameter;
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 return super.visitVariableDeclaration(node); 1583 return super.visitVariableDeclaration(node);
1563 } finally { 1584 } finally {
1564 _enclosingExecutable = outerExecutable; 1585 _enclosingExecutable = outerExecutable;
1565 } 1586 }
1566 } 1587 }
1567 return super.visitVariableDeclaration(node); 1588 return super.visitVariableDeclaration(node);
1568 } 1589 }
1569 1590
1570 /** 1591 /**
1571 * Append the value of the given string literal to the given string builder. 1592 * Append the value of the given string literal to the given string builder.
1593 *
1572 * @param builder the builder to which the string's value is to be appended 1594 * @param builder the builder to which the string's value is to be appended
1573 * @param literal the string literal whose value is to be appended to the buil der 1595 * @param literal the string literal whose value is to be appended to the buil der
1574 * @throws IllegalArgumentException if the string is not a constant string wit hout any string 1596 * @throws IllegalArgumentException if the string is not a constant string wit hout any string
1575 * interpolation 1597 * interpolation
1576 */ 1598 */
1577 void appendStringValue(JavaStringBuilder builder, StringLiteral literal) { 1599 void appendStringValue(JavaStringBuilder builder, StringLiteral literal) {
1578 if (literal is SimpleStringLiteral) { 1600 if (literal is SimpleStringLiteral) {
1579 builder.append(((literal as SimpleStringLiteral)).value); 1601 builder.append(((literal as SimpleStringLiteral)).value);
1580 } else if (literal is AdjacentStrings) { 1602 } else if (literal is AdjacentStrings) {
1581 for (StringLiteral stringLiteral in ((literal as AdjacentStrings)).strings ) { 1603 for (StringLiteral stringLiteral in ((literal as AdjacentStrings)).strings ) {
1582 appendStringValue(builder, stringLiteral); 1604 appendStringValue(builder, stringLiteral);
1583 } 1605 }
1584 } else { 1606 } else {
1585 throw new IllegalArgumentException(); 1607 throw new IllegalArgumentException();
1586 } 1608 }
1587 } 1609 }
1588 1610
1589 /** 1611 /**
1590 * Return the element for the part with the given source, or `null` if there i s no element 1612 * Return the element for the part with the given source, or `null` if there i s no element
1591 * for the given source. 1613 * for the given source.
1614 *
1592 * @param parts the elements for the parts 1615 * @param parts the elements for the parts
1593 * @param partSource the source for the part whose element is to be returned 1616 * @param partSource the source for the part whose element is to be returned
1594 * @return the element for the part with the given source 1617 * @return the element for the part with the given source
1595 */ 1618 */
1596 CompilationUnitElement find(List<CompilationUnitElement> parts, Source partSou rce) { 1619 CompilationUnitElement find(List<CompilationUnitElement> parts, Source partSou rce) {
1597 for (CompilationUnitElement part in parts) { 1620 for (CompilationUnitElement part in parts) {
1598 if (part.source == partSource) { 1621 if (part.source == partSource) {
1599 return part; 1622 return part;
1600 } 1623 }
1601 } 1624 }
1602 return null; 1625 return null;
1603 } 1626 }
1604 1627
1605 /** 1628 /**
1606 * Return the element in the given array of elements that was created for the declaration at the 1629 * Return the element in the given array of elements that was created for the declaration at the
1607 * given offset. This method should only be used when there is no name 1630 * given offset. This method should only be used when there is no name
1631 *
1608 * @param elements the elements of the appropriate kind that exist in the curr ent context 1632 * @param elements the elements of the appropriate kind that exist in the curr ent context
1609 * @param offset the offset of the name of the element to be returned 1633 * @param offset the offset of the name of the element to be returned
1610 * @return the element at the given offset 1634 * @return the element at the given offset
1611 */ 1635 */
1612 Element find2(List<Element> elements, int offset) => find4(elements, "", offse t); 1636 Element find2(List<Element> elements, int offset) => find4(elements, "", offse t);
1613 1637
1614 /** 1638 /**
1615 * Return the element in the given array of elements that was created for the declaration with the 1639 * Return the element in the given array of elements that was created for the declaration with the
1616 * given name. 1640 * given name.
1641 *
1617 * @param elements the elements of the appropriate kind that exist in the curr ent context 1642 * @param elements the elements of the appropriate kind that exist in the curr ent context
1618 * @param identifier the name node in the declaration of the element to be ret urned 1643 * @param identifier the name node in the declaration of the element to be ret urned
1619 * @return the element created for the declaration with the given name 1644 * @return the element created for the declaration with the given name
1620 */ 1645 */
1621 Element find3(List<Element> elements, SimpleIdentifier identifier) { 1646 Element find3(List<Element> elements, SimpleIdentifier identifier) {
1622 Element element = find4(elements, identifier.name, identifier.offset); 1647 Element element = find4(elements, identifier.name, identifier.offset);
1623 identifier.element = element; 1648 identifier.element = element;
1624 return element; 1649 return element;
1625 } 1650 }
1626 1651
1627 /** 1652 /**
1628 * Return the element in the given array of elements that was created for the declaration with the 1653 * Return the element in the given array of elements that was created for the declaration with the
1629 * given name at the given offset. 1654 * given name at the given offset.
1655 *
1630 * @param elements the elements of the appropriate kind that exist in the curr ent context 1656 * @param elements the elements of the appropriate kind that exist in the curr ent context
1631 * @param name the name of the element to be returned 1657 * @param name the name of the element to be returned
1632 * @param offset the offset of the name of the element to be returned 1658 * @param offset the offset of the name of the element to be returned
1633 * @return the element with the given name and offset 1659 * @return the element with the given name and offset
1634 */ 1660 */
1635 Element find4(List<Element> elements, String name, int offset) { 1661 Element find4(List<Element> elements, String name, int offset) {
1636 for (Element element in elements) { 1662 for (Element element in elements) {
1637 if (element.displayName == name && element.nameOffset == offset) { 1663 if (element.displayName == name && element.nameOffset == offset) {
1638 return element; 1664 return element;
1639 } 1665 }
1640 } 1666 }
1641 return null; 1667 return null;
1642 } 1668 }
1643 1669
1644 /** 1670 /**
1645 * Return the export element from the given array whose library has the given source, or`null` if there is no such export. 1671 * Return the export element from the given array whose library has the given source, or
1672 * `null` if there is no such export.
1673 *
1646 * @param exports the export elements being searched 1674 * @param exports the export elements being searched
1647 * @param source the source of the library associated with the export element to being searched 1675 * @param source the source of the library associated with the export element to being searched
1648 * for 1676 * for
1649 * @return the export element whose library has the given source 1677 * @return the export element whose library has the given source
1650 */ 1678 */
1651 ExportElement find5(List<ExportElement> exports, Source source2) { 1679 ExportElement find5(List<ExportElement> exports, Source source2) {
1652 for (ExportElement export in exports) { 1680 for (ExportElement export in exports) {
1653 if (export.exportedLibrary.source == source2) { 1681 if (export.exportedLibrary.source == source2) {
1654 return export; 1682 return export;
1655 } 1683 }
1656 } 1684 }
1657 return null; 1685 return null;
1658 } 1686 }
1659 1687
1660 /** 1688 /**
1661 * Return the import element from the given array whose library has the given source and that has 1689 * Return the import element from the given array whose library has the given source and that has
1662 * the given prefix, or `null` if there is no such import. 1690 * the given prefix, or `null` if there is no such import.
1691 *
1663 * @param imports the import elements being searched 1692 * @param imports the import elements being searched
1664 * @param source the source of the library associated with the import element to being searched 1693 * @param source the source of the library associated with the import element to being searched
1665 * for 1694 * for
1666 * @param prefix the prefix with which the library was imported 1695 * @param prefix the prefix with which the library was imported
1667 * @return the import element whose library has the given source and prefix 1696 * @return the import element whose library has the given source and prefix
1668 */ 1697 */
1669 ImportElement find6(List<ImportElement> imports, Source source2, SimpleIdentif ier prefix2) { 1698 ImportElement find6(List<ImportElement> imports, Source source2, SimpleIdentif ier prefix2) {
1670 for (ImportElement element in imports) { 1699 for (ImportElement element in imports) {
1671 if (element.importedLibrary.source == source2) { 1700 if (element.importedLibrary.source == source2) {
1672 PrefixElement prefixElement = element.prefix; 1701 PrefixElement prefixElement = element.prefix;
1673 if (prefix2 == null) { 1702 if (prefix2 == null) {
1674 if (prefixElement == null) { 1703 if (prefixElement == null) {
1675 return element; 1704 return element;
1676 } 1705 }
1677 } else { 1706 } else {
1678 if (prefixElement != null && prefix2.name == prefixElement.displayName ) { 1707 if (prefixElement != null && prefix2.name == prefixElement.displayName ) {
1679 return element; 1708 return element;
1680 } 1709 }
1681 } 1710 }
1682 } 1711 }
1683 } 1712 }
1684 return null; 1713 return null;
1685 } 1714 }
1686 1715
1687 /** 1716 /**
1688 * Return the value of the given string literal, or `null` if the string is no t a constant 1717 * Return the value of the given string literal, or `null` if the string is no t a constant
1689 * string without any string interpolation. 1718 * string without any string interpolation.
1719 *
1690 * @param literal the string literal whose value is to be returned 1720 * @param literal the string literal whose value is to be returned
1691 * @return the value of the given string literal 1721 * @return the value of the given string literal
1692 */ 1722 */
1693 String getStringValue(StringLiteral literal) { 1723 String getStringValue(StringLiteral literal) {
1694 if (literal is StringInterpolation) { 1724 if (literal is StringInterpolation) {
1695 return null; 1725 return null;
1696 } 1726 }
1697 JavaStringBuilder builder = new JavaStringBuilder(); 1727 JavaStringBuilder builder = new JavaStringBuilder();
1698 try { 1728 try {
1699 appendStringValue(builder, literal); 1729 appendStringValue(builder, literal);
1700 } on IllegalArgumentException catch (exception) { 1730 } on IllegalArgumentException catch (exception) {
1701 return null; 1731 return null;
1702 } 1732 }
1703 return builder.toString().trim(); 1733 return builder.toString().trim();
1704 } 1734 }
1705 } 1735 }
1706 /** 1736 /**
1707 * Instances of the class `ElementResolver` are used by instances of [ResolverVi sitor]to resolve references within the AST structure to the elements being refer enced. The requirements 1737 * Instances of the class `ElementResolver` are used by instances of [ResolverVi sitor]
1738 * to resolve references within the AST structure to the elements being referenc ed. The requirements
1708 * for the element resolver are: 1739 * for the element resolver are:
1709 * <ol> 1740 * <ol>
1710 * * Every [SimpleIdentifier] should be resolved to the element to which it refe rs. 1741 * * Every [SimpleIdentifier] should be resolved to the element to which it refe rs.
1711 * Specifically: 1742 * Specifically:
1712 * 1743 *
1713 * * An identifier within the declaration of that name should resolve to the ele ment being 1744 * * An identifier within the declaration of that name should resolve to the ele ment being
1714 * declared. 1745 * declared.
1715 * * An identifier denoting a prefix should resolve to the element representing the import that 1746 * * An identifier denoting a prefix should resolve to the element representing the import that
1716 * defines the prefix (an [ImportElement]). 1747 * defines the prefix (an [ImportElement]).
1717 * * An identifier denoting a variable should resolve to the element representin g the variable (a[VariableElement]). 1748 * * An identifier denoting a variable should resolve to the element representin g the variable (a
1749 * [VariableElement]).
1718 * * An identifier denoting a parameter should resolve to the element representi ng the parameter 1750 * * An identifier denoting a parameter should resolve to the element representi ng the parameter
1719 * (a [ParameterElement]). 1751 * (a [ParameterElement]).
1720 * * An identifier denoting a field should resolve to the element representing t he getter or 1752 * * An identifier denoting a field should resolve to the element representing t he getter or
1721 * setter being invoked (a [PropertyAccessorElement]). 1753 * setter being invoked (a [PropertyAccessorElement]).
1722 * * An identifier denoting the name of a method or function being invoked shoul d resolve to the 1754 * * An identifier denoting the name of a method or function being invoked shoul d resolve to the
1723 * element representing the method or function (a [ExecutableElement]). 1755 * element representing the method or function (a [ExecutableElement]).
1724 * * An identifier denoting a label should resolve to the element representing t he label (a[LabelElement]). 1756 * * An identifier denoting a label should resolve to the element representing t he label (a
1757 * [LabelElement]).
1725 * 1758 *
1726 * The identifiers within directives are exceptions to this rule and are covered below. 1759 * The identifiers within directives are exceptions to this rule and are covered below.
1727 * * Every node containing a token representing an operator that can be overridd en ([BinaryExpression], [PrefixExpression], [PostfixExpression]) should resolve to 1760 * * Every node containing a token representing an operator that can be overridd en (
1761 * [BinaryExpression], [PrefixExpression], [PostfixExpression]) should resolve t o
1728 * the element representing the method invoked by that operator (a [MethodElemen t]). 1762 * the element representing the method invoked by that operator (a [MethodElemen t]).
1729 * * Every [FunctionExpressionInvocation] should resolve to the element represen ting the 1763 * * Every [FunctionExpressionInvocation] should resolve to the element represen ting the
1730 * function being invoked (a [FunctionElement]). This will be the same element a s that to 1764 * function being invoked (a [FunctionElement]). This will be the same element a s that to
1731 * which the name is resolved if the function has a name, but is provided for th ose cases where an 1765 * which the name is resolved if the function has a name, but is provided for th ose cases where an
1732 * unnamed function is being invoked. 1766 * unnamed function is being invoked.
1733 * * Every [LibraryDirective] and [PartOfDirective] should resolve to the elemen t 1767 * * Every [LibraryDirective] and [PartOfDirective] should resolve to the elemen t
1734 * representing the library being specified by the directive (a [LibraryElement] ) unless, in 1768 * representing the library being specified by the directive (a [LibraryElement] ) unless, in
1735 * the case of a part-of directive, the specified library does not exist. 1769 * the case of a part-of directive, the specified library does not exist.
1736 * * Every [ImportDirective] and [ExportDirective] should resolve to the element 1770 * * Every [ImportDirective] and [ExportDirective] should resolve to the element
1737 * representing the library being specified by the directive unless the specifie d library does not 1771 * representing the library being specified by the directive unless the specifie d library does not
1738 * exist (an [ImportElement] or [ExportElement]). 1772 * exist (an [ImportElement] or [ExportElement]).
1739 * * The identifier representing the prefix in an [ImportDirective] should resol ve to the 1773 * * The identifier representing the prefix in an [ImportDirective] should resol ve to the
1740 * element representing the prefix (a [PrefixElement]). 1774 * element representing the prefix (a [PrefixElement]).
1741 * * The identifiers in the hide and show combinators in [ImportDirective]s and[ ExportDirective]s should resolve to the elements that are being hidden or shown, 1775 * * The identifiers in the hide and show combinators in [ImportDirective]s and
1776 * [ExportDirective]s should resolve to the elements that are being hidden or sh own,
1742 * respectively, unless those names are not defined in the specified library (or the specified 1777 * respectively, unless those names are not defined in the specified library (or the specified
1743 * library does not exist). 1778 * library does not exist).
1744 * * Every [PartDirective] should resolve to the element representing the compil ation unit 1779 * * Every [PartDirective] should resolve to the element representing the compil ation unit
1745 * being specified by the string unless the specified compilation unit does not exist (a[CompilationUnitElement]). 1780 * being specified by the string unless the specified compilation unit does not exist (a
1781 * [CompilationUnitElement]).
1746 * </ol> 1782 * </ol>
1747 * Note that AST nodes that would represent elements that are not defined are no t resolved to 1783 * Note that AST nodes that would represent elements that are not defined are no t resolved to
1748 * anything. This includes such things as references to undeclared variables (wh ich is an error) and 1784 * anything. This includes such things as references to undeclared variables (wh ich is an error) and
1749 * names in hide and show combinators that are not defined in the imported libra ry (which is not an 1785 * names in hide and show combinators that are not defined in the imported libra ry (which is not an
1750 * error). 1786 * error).
1787 *
1751 * @coverage dart.engine.resolver 1788 * @coverage dart.engine.resolver
1752 */ 1789 */
1753 class ElementResolver extends SimpleASTVisitor<Object> { 1790 class ElementResolver extends SimpleASTVisitor<Object> {
1754 1791
1755 /** 1792 /**
1756 * @return `true` if the given identifier is the return type of a constructor declaration. 1793 * @return `true` if the given identifier is the return type of a constructor declaration.
1757 */ 1794 */
1758 static bool isConstructorReturnType(SimpleIdentifier node) { 1795 static bool isConstructorReturnType(SimpleIdentifier node) {
1759 ASTNode parent = node.parent; 1796 ASTNode parent = node.parent;
1760 if (parent is ConstructorDeclaration) { 1797 if (parent is ConstructorDeclaration) {
1761 ConstructorDeclaration constructor = parent as ConstructorDeclaration; 1798 ConstructorDeclaration constructor = parent as ConstructorDeclaration;
1762 return identical(constructor.returnType, node); 1799 return identical(constructor.returnType, node);
1763 } 1800 }
1764 return false; 1801 return false;
1765 } 1802 }
1766 1803
1767 /** 1804 /**
1768 * @return `true` if the given identifier is the return type of a factory cons tructor 1805 * @return `true` if the given identifier is the return type of a factory cons tructor
1769 * declaration. 1806 * declaration.
1770 */ 1807 */
1771 static bool isFactoryConstructorReturnType(SimpleIdentifier node) { 1808 static bool isFactoryConstructorReturnType(SimpleIdentifier node) {
1772 ASTNode parent = node.parent; 1809 ASTNode parent = node.parent;
1773 if (parent is ConstructorDeclaration) { 1810 if (parent is ConstructorDeclaration) {
1774 ConstructorDeclaration constructor = parent as ConstructorDeclaration; 1811 ConstructorDeclaration constructor = parent as ConstructorDeclaration;
1775 return identical(constructor.returnType, node) && constructor.factoryKeywo rd != null; 1812 return identical(constructor.returnType, node) && constructor.factoryKeywo rd != null;
1776 } 1813 }
1777 return false; 1814 return false;
1778 } 1815 }
1779 1816
1780 /** 1817 /**
1781 * Checks if the given 'super' expression is used in the valid context. 1818 * Checks if the given 'super' expression is used in the valid context.
1819 *
1782 * @param node the 'super' expression to analyze 1820 * @param node the 'super' expression to analyze
1783 * @return `true` if the given 'super' expression is in the valid context 1821 * @return `true` if the given 'super' expression is in the valid context
1784 */ 1822 */
1785 static bool isSuperInValidContext(SuperExpression node) { 1823 static bool isSuperInValidContext(SuperExpression node) {
1786 for (ASTNode n = node; n != null; n = n.parent) { 1824 for (ASTNode n = node; n != null; n = n.parent) {
1787 if (n is CompilationUnit) { 1825 if (n is CompilationUnit) {
1788 return false; 1826 return false;
1789 } 1827 }
1790 if (n is ConstructorDeclaration) { 1828 if (n is ConstructorDeclaration) {
1791 ConstructorDeclaration constructor = n as ConstructorDeclaration; 1829 ConstructorDeclaration constructor = n as ConstructorDeclaration;
(...skipping 28 matching lines...) Expand all
1820 static String CALL_METHOD_NAME = "call"; 1858 static String CALL_METHOD_NAME = "call";
1821 1859
1822 /** 1860 /**
1823 * The name of the method that will be invoked if an attempt is made to invoke an undefined method 1861 * The name of the method that will be invoked if an attempt is made to invoke an undefined method
1824 * on an object. 1862 * on an object.
1825 */ 1863 */
1826 static String _NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod"; 1864 static String _NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
1827 1865
1828 /** 1866 /**
1829 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 1867 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
1868 *
1830 * @param resolver the resolver driving this participant 1869 * @param resolver the resolver driving this participant
1831 */ 1870 */
1832 ElementResolver(ResolverVisitor resolver) { 1871 ElementResolver(ResolverVisitor resolver) {
1833 this._resolver = resolver; 1872 this._resolver = resolver;
1834 _strictMode = resolver.definingLibrary.context.analysisOptions.strictMode; 1873 _strictMode = resolver.definingLibrary.context.analysisOptions.strictMode;
1835 } 1874 }
1836 Object visitAssignmentExpression(AssignmentExpression node) { 1875 Object visitAssignmentExpression(AssignmentExpression node) {
1837 sc.Token operator = node.operator; 1876 sc.Token operator = node.operator;
1838 sc.TokenType operatorType = operator.type; 1877 sc.TokenType operatorType = operator.type;
1839 if (operatorType != sc.TokenType.EQ) { 1878 if (operatorType != sc.TokenType.EQ) {
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
2183 if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) { 2222 if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
2184 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, me thodName, [methodName.name]); 2223 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, me thodName, [methodName.name]);
2185 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) { 2224 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
2186 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName , [methodName.name]); 2225 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName , [methodName.name]);
2187 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) { 2226 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
2188 String targetTypeName; 2227 String targetTypeName;
2189 if (target == null) { 2228 if (target == null) {
2190 ClassElement enclosingClass = _resolver.enclosingClass; 2229 ClassElement enclosingClass = _resolver.enclosingClass;
2191 targetTypeName = enclosingClass.displayName; 2230 targetTypeName = enclosingClass.displayName;
2192 } else { 2231 } else {
2193 Type2 targetType = getPropagatedType(target); 2232 Type2 targetType = getStaticType(target);
2194 if (targetType == null) { 2233 if (targetType != null && targetType.isDartCoreFunction && methodName.na me == CALL_METHOD_NAME) {
2195 targetType = getStaticType(target); 2234 return null;
2196 } 2235 }
2197 targetTypeName = targetType == null ? null : targetType.displayName; 2236 targetTypeName = targetType == null ? null : targetType.displayName;
2198 } 2237 }
2199 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_METHOD, methodName, [methodName.name, targetTypeName]); 2238 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_METHOD, methodName, [methodName.name, targetTypeName]);
2200 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD )) { 2239 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD )) {
2201 Type2 targetType = getPropagatedType(target); 2240 Type2 targetType = getPropagatedType(target);
2202 if (targetType == null) { 2241 if (targetType == null) {
2203 targetType = getStaticType(target); 2242 targetType = getStaticType(target);
2204 } 2243 }
2205 String targetTypeName = targetType == null ? null : targetType.name; 2244 String targetTypeName = targetType == null ? null : targetType.name;
(...skipping 23 matching lines...) Expand all
2229 } 2268 }
2230 return null; 2269 return null;
2231 } 2270 }
2232 Object visitPrefixedIdentifier(PrefixedIdentifier node) { 2271 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
2233 SimpleIdentifier prefix = node.prefix; 2272 SimpleIdentifier prefix = node.prefix;
2234 SimpleIdentifier identifier = node.identifier; 2273 SimpleIdentifier identifier = node.identifier;
2235 Element prefixElement = prefix.element; 2274 Element prefixElement = prefix.element;
2236 if (prefixElement is PrefixElement) { 2275 if (prefixElement is PrefixElement) {
2237 Element element = _resolver.nameScope.lookup(node, _resolver.definingLibra ry); 2276 Element element = _resolver.nameScope.lookup(node, _resolver.definingLibra ry);
2238 if (element == null) { 2277 if (element == null) {
2278 _resolver.reportError(StaticWarningCode.UNDEFINED_GETTER, identifier, [i dentifier.name, prefixElement.name]);
2239 return null; 2279 return null;
2240 } 2280 }
2241 if (element is PropertyAccessorElement && identifier.inSetterContext()) { 2281 if (element is PropertyAccessorElement && identifier.inSetterContext()) {
2242 PropertyInducingElement variable = ((element as PropertyAccessorElement) ).variable; 2282 PropertyInducingElement variable = ((element as PropertyAccessorElement) ).variable;
2243 if (variable != null) { 2283 if (variable != null) {
2244 PropertyAccessorElement setter = variable.setter; 2284 PropertyAccessorElement setter = variable.setter;
2245 if (setter != null) { 2285 if (setter != null) {
2246 element = setter; 2286 element = setter;
2247 } 2287 }
2248 } 2288 }
2249 } 2289 }
2250 recordResolution(identifier, element); 2290 recordResolution(identifier, element);
2251 return null; 2291 return null;
2252 } 2292 }
2293 if (node.parent is Annotation && prefixElement is ClassElement) {
2294 Annotation annotation = node.parent as Annotation;
2295 ConstructorElement constructor;
2296 {
2297 InterfaceType interfaceType = prefix.staticType as InterfaceType;
2298 LibraryElement definingLibrary = _resolver.definingLibrary;
2299 constructor = interfaceType.lookUpConstructor(identifier.name, definingL ibrary);
2300 }
2301 recordResolution(identifier, constructor);
2302 annotation.element = constructor;
2303 resolveAnnotationConstructorInvocationArguments(annotation, constructor);
2304 return null;
2305 }
2253 resolvePropertyAccess(prefix, identifier); 2306 resolvePropertyAccess(prefix, identifier);
2254 return null; 2307 return null;
2255 } 2308 }
2256 Object visitPrefixExpression(PrefixExpression node) { 2309 Object visitPrefixExpression(PrefixExpression node) {
2257 sc.Token operator = node.operator; 2310 sc.Token operator = node.operator;
2258 sc.TokenType operatorType = operator.type; 2311 sc.TokenType operatorType = operator.type;
2259 if (operatorType.isUserDefinableOperator || identical(operatorType, sc.Token Type.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) { 2312 if (operatorType.isUserDefinableOperator || identical(operatorType, sc.Token Type.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) {
2260 Expression operand = node.operand; 2313 Expression operand = node.operand;
2261 String methodName = getPrefixOperator(node); 2314 String methodName = getPrefixOperator(node);
2262 Type2 staticType = getStaticType(operand); 2315 Type2 staticType = getStaticType(operand);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingCl ass) { 2368 if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingCl ass) {
2316 _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLAS S, node, []); 2369 _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLAS S, node, []);
2317 } else if (element == null) { 2370 } else if (element == null) {
2318 if (isConstructorReturnType(node)) { 2371 if (isConstructorReturnType(node)) {
2319 _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, nod e, []); 2372 _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, nod e, []);
2320 } else if (!classDeclaresNoSuchMethod(_resolver.enclosingClass)) { 2373 } else if (!classDeclaresNoSuchMethod(_resolver.enclosingClass)) {
2321 _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [nod e.name]); 2374 _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [nod e.name]);
2322 } 2375 }
2323 } 2376 }
2324 recordResolution(node, element); 2377 recordResolution(node, element);
2378 if (node.parent is Annotation && element is ClassElement) {
2379 Annotation annotation = node.parent as Annotation;
2380 ConstructorElement constructor;
2381 {
2382 InterfaceType interfaceType = new InterfaceTypeImpl.con1((element as Cla ssElement));
2383 LibraryElement definingLibrary = _resolver.definingLibrary;
2384 constructor = interfaceType.lookUpConstructor(null, definingLibrary);
2385 }
2386 annotation.element = constructor;
2387 resolveAnnotationConstructorInvocationArguments(annotation, constructor);
2388 return null;
2389 }
2325 return null; 2390 return null;
2326 } 2391 }
2327 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { 2392 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
2328 ClassElement enclosingClass = _resolver.enclosingClass; 2393 ClassElement enclosingClass = _resolver.enclosingClass;
2329 if (enclosingClass == null) { 2394 if (enclosingClass == null) {
2330 return null; 2395 return null;
2331 } 2396 }
2332 ClassElement superclass = getSuperclass(enclosingClass); 2397 ClassElement superclass = getSuperclass(enclosingClass);
2333 if (superclass == null) { 2398 if (superclass == null) {
2334 return null; 2399 return null;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2382 return null; 2447 return null;
2383 } 2448 }
2384 Object visitVariableDeclaration(VariableDeclaration node) { 2449 Object visitVariableDeclaration(VariableDeclaration node) {
2385 setMetadata(node.element, node); 2450 setMetadata(node.element, node);
2386 return null; 2451 return null;
2387 } 2452 }
2388 2453
2389 /** 2454 /**
2390 * Generate annotation elements for each of the annotations in the given node list and add them to 2455 * Generate annotation elements for each of the annotations in the given node list and add them to
2391 * the given list of elements. 2456 * the given list of elements.
2457 *
2392 * @param annotationList the list of elements to which new elements are to be added 2458 * @param annotationList the list of elements to which new elements are to be added
2393 * @param annotations the AST nodes used to generate new elements 2459 * @param annotations the AST nodes used to generate new elements
2394 */ 2460 */
2395 void addAnnotations(List<ElementAnnotationImpl> annotationList, NodeList<Annot ation> annotations) { 2461 void addAnnotations(List<ElementAnnotationImpl> annotationList, NodeList<Annot ation> annotations) {
2396 for (Annotation annotationNode in annotations) { 2462 for (Annotation annotationNode in annotations) {
2397 Element resolvedElement = annotationNode.element; 2463 Element resolvedElement = annotationNode.element;
2398 if (resolvedElement != null) { 2464 if (resolvedElement != null) {
2399 annotationList.add(new ElementAnnotationImpl(resolvedElement)); 2465 annotationList.add(new ElementAnnotationImpl(resolvedElement));
2400 } 2466 }
2401 } 2467 }
2402 } 2468 }
2403 2469
2404 /** 2470 /**
2405 * Given that we have found code to invoke the given element, return the error code that should be 2471 * Given that we have found code to invoke the given element, return the error code that should be
2406 * reported, or `null` if no error should be reported. 2472 * reported, or `null` if no error should be reported.
2473 *
2407 * @param target the target of the invocation, or `null` if there was no targe t 2474 * @param target the target of the invocation, or `null` if there was no targe t
2408 * @param element the element to be invoked 2475 * @param element the element to be invoked
2409 * @return the error code that should be reported 2476 * @return the error code that should be reported
2410 */ 2477 */
2411 ErrorCode checkForInvocationError(Expression target, Element element2) { 2478 ErrorCode checkForInvocationError(Expression target, Element element2) {
2412 if (element2 is PropertyAccessorElement) { 2479 if (element2 is PropertyAccessorElement) {
2413 FunctionType getterType = ((element2 as PropertyAccessorElement)).type; 2480 FunctionType getterType = ((element2 as PropertyAccessorElement)).type;
2414 if (getterType != null) { 2481 if (getterType != null) {
2415 Type2 returnType = getterType.returnType; 2482 Type2 returnType = getterType.returnType;
2416 if (!isExecutableType(returnType)) { 2483 if (!isExecutableType(returnType)) {
2417 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; 2484 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
2418 } 2485 }
2419 } 2486 }
2420 } else if (element2 is ExecutableElement) { 2487 } else if (element2 is ExecutableElement) {
2421 return null; 2488 return null;
2422 } else if (element2 == null && target is SuperExpression) { 2489 } else if (element2 == null && target is SuperExpression) {
2423 return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD; 2490 return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
2424 } else { 2491 } else {
2425 if (element2 is PropertyInducingElement) { 2492 if (element2 is PropertyInducingElement) {
2426 PropertyAccessorElement getter = ((element2 as PropertyInducingElement)) .getter; 2493 PropertyAccessorElement getter = ((element2 as PropertyInducingElement)) .getter;
2427 FunctionType getterType = getter.type; 2494 FunctionType getterType = getter.type;
2428 if (getterType != null) { 2495 if (getterType != null) {
2429 Type2 returnType = getterType.returnType; 2496 Type2 returnType = getterType.returnType;
2430 if (!isExecutableType(returnType)) { 2497 if (!isExecutableType(returnType)) {
2431 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; 2498 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
2432 } 2499 }
2433 } 2500 }
2434 } else if (element2 is VariableElement) { 2501 } else if (element2 is VariableElement) {
2435 Type2 variableType = _resolver.overrideManager.getType(element2); 2502 Type2 variableType = ((element2 as VariableElement)).type;
2436 if (variableType == null) {
2437 variableType = ((element2 as VariableElement)).type;
2438 }
2439 if (!isExecutableType(variableType)) { 2503 if (!isExecutableType(variableType)) {
2440 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; 2504 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
2441 } 2505 }
2442 } else { 2506 } else {
2443 if (target == null) { 2507 if (target == null) {
2444 ClassElement enclosingClass = _resolver.enclosingClass; 2508 ClassElement enclosingClass = _resolver.enclosingClass;
2445 if (enclosingClass == null) { 2509 if (enclosingClass == null) {
2446 return StaticTypeWarningCode.UNDEFINED_FUNCTION; 2510 return StaticTypeWarningCode.UNDEFINED_FUNCTION;
2447 } else if (element2 == null) { 2511 } else if (element2 == null) {
2448 if (!classDeclaresNoSuchMethod(enclosingClass)) { 2512 if (!classDeclaresNoSuchMethod(enclosingClass)) {
(...skipping 11 matching lines...) Expand all
2460 } 2524 }
2461 } 2525 }
2462 } 2526 }
2463 } 2527 }
2464 return null; 2528 return null;
2465 } 2529 }
2466 2530
2467 /** 2531 /**
2468 * Return `true` if the given class declares a method named "noSuchMethod" and is not the 2532 * Return `true` if the given class declares a method named "noSuchMethod" and is not the
2469 * class 'Object'. 2533 * class 'Object'.
2534 *
2470 * @param element the class being tested 2535 * @param element the class being tested
2471 * @return `true` if the given class declares a method named "noSuchMethod" 2536 * @return `true` if the given class declares a method named "noSuchMethod"
2472 */ 2537 */
2473 bool classDeclaresNoSuchMethod(ClassElement classElement) { 2538 bool classDeclaresNoSuchMethod(ClassElement classElement) {
2474 if (classElement == null) { 2539 if (classElement == null) {
2475 return false; 2540 return false;
2476 } 2541 }
2477 MethodElement methodElement = classElement.lookUpMethod(_NO_SUCH_METHOD_METH OD_NAME, _resolver.definingLibrary); 2542 MethodElement methodElement = classElement.lookUpMethod(_NO_SUCH_METHOD_METH OD_NAME, _resolver.definingLibrary);
2478 return methodElement != null && methodElement.enclosingElement.supertype != null; 2543 return methodElement != null && methodElement.enclosingElement.supertype != null;
2479 } 2544 }
2480 2545
2481 /** 2546 /**
2482 * Return `true` if the given element represents a class that declares a metho d named 2547 * Return `true` if the given element represents a class that declares a metho d named
2483 * "noSuchMethod" and is not the class 'Object'. 2548 * "noSuchMethod" and is not the class 'Object'.
2549 *
2484 * @param element the element being tested 2550 * @param element the element being tested
2485 * @return `true` if the given element represents a class that declares a meth od named 2551 * @return `true` if the given element represents a class that declares a meth od named
2486 * "noSuchMethod" 2552 * "noSuchMethod"
2487 */ 2553 */
2488 bool classDeclaresNoSuchMethod2(Element element) { 2554 bool classDeclaresNoSuchMethod2(Element element) {
2489 if (element is ClassElement) { 2555 if (element is ClassElement) {
2490 return classDeclaresNoSuchMethod((element as ClassElement)); 2556 return classDeclaresNoSuchMethod((element as ClassElement));
2491 } 2557 }
2492 return false; 2558 return false;
2493 } 2559 }
2494 2560
2495 /** 2561 /**
2496 * Given a list of arguments and the element that will be invoked using those argument, compute 2562 * Given a list of arguments and the element that will be invoked using those argument, compute
2497 * the list of parameters that correspond to the list of arguments. Return the parameters that 2563 * the list of parameters that correspond to the list of arguments. Return the parameters that
2498 * correspond to the arguments, or `null` if no correspondence could be comput ed. 2564 * correspond to the arguments, or `null` if no correspondence could be comput ed.
2565 *
2499 * @param argumentList the list of arguments being passed to the element 2566 * @param argumentList the list of arguments being passed to the element
2500 * @param executableElement the element that will be invoked with the argument s 2567 * @param executableElement the element that will be invoked with the argument s
2501 * @return the parameters that correspond to the arguments 2568 * @return the parameters that correspond to the arguments
2502 */ 2569 */
2503 List<ParameterElement> computePropagatedParameters(ArgumentList argumentList, Element element2) { 2570 List<ParameterElement> computePropagatedParameters(ArgumentList argumentList, Element element2) {
2504 if (element2 is PropertyAccessorElement) { 2571 if (element2 is PropertyAccessorElement) {
2505 FunctionType getterType = ((element2 as PropertyAccessorElement)).type; 2572 FunctionType getterType = ((element2 as PropertyAccessorElement)).type;
2506 if (getterType != null) { 2573 if (getterType != null) {
2507 Type2 getterReturnType = getterType.returnType; 2574 Type2 getterReturnType = getterType.returnType;
2508 if (getterReturnType is InterfaceType) { 2575 if (getterReturnType is InterfaceType) {
(...skipping 24 matching lines...) Expand all
2533 return resolveArgumentsToParameters2(false, argumentList, parameters); 2600 return resolveArgumentsToParameters2(false, argumentList, parameters);
2534 } 2601 }
2535 } 2602 }
2536 } 2603 }
2537 return null; 2604 return null;
2538 } 2605 }
2539 2606
2540 /** 2607 /**
2541 * If the given element is a setter, return the getter associated with it. Oth erwise, return the 2608 * If the given element is a setter, return the getter associated with it. Oth erwise, return the
2542 * element unchanged. 2609 * element unchanged.
2610 *
2543 * @param element the element to be normalized 2611 * @param element the element to be normalized
2544 * @return a non-setter element derived from the given element 2612 * @return a non-setter element derived from the given element
2545 */ 2613 */
2546 Element convertSetterToGetter(Element element) { 2614 Element convertSetterToGetter(Element element) {
2547 if (element is PropertyAccessorElement) { 2615 if (element is PropertyAccessorElement) {
2548 return ((element as PropertyAccessorElement)).variable.getter; 2616 return ((element as PropertyAccessorElement)).variable.getter;
2549 } 2617 }
2550 return element; 2618 return element;
2551 } 2619 }
2552 2620
2553 /** 2621 /**
2554 * Look for any declarations of the given identifier that are imported using a prefix. Return the 2622 * Look for any declarations of the given identifier that are imported using a prefix. Return the
2555 * element that was found, or `null` if the name is not imported using a prefi x. 2623 * element that was found, or `null` if the name is not imported using a prefi x.
2624 *
2556 * @param identifier the identifier that might have been imported using a pref ix 2625 * @param identifier the identifier that might have been imported using a pref ix
2557 * @return the element that was found 2626 * @return the element that was found
2558 */ 2627 */
2559 Element findImportWithoutPrefix(SimpleIdentifier identifier) { 2628 Element findImportWithoutPrefix(SimpleIdentifier identifier) {
2560 Element element = null; 2629 Element element = null;
2561 Scope nameScope = _resolver.nameScope; 2630 Scope nameScope = _resolver.nameScope;
2562 LibraryElement definingLibrary = _resolver.definingLibrary; 2631 LibraryElement definingLibrary = _resolver.definingLibrary;
2563 for (ImportElement importElement in definingLibrary.imports) { 2632 for (ImportElement importElement in definingLibrary.imports) {
2564 PrefixElement prefixElement = importElement.prefix; 2633 PrefixElement prefixElement = importElement.prefix;
2565 if (prefixElement != null) { 2634 if (prefixElement != null) {
2566 Identifier prefixedIdentifier = new ElementResolver_SyntheticIdentifier( "${prefixElement.name}.${identifier.name}"); 2635 Identifier prefixedIdentifier = new ElementResolver_SyntheticIdentifier( "${prefixElement.name}.${identifier.name}");
2567 Element importedElement = nameScope.lookup(prefixedIdentifier, definingL ibrary); 2636 Element importedElement = nameScope.lookup(prefixedIdentifier, definingL ibrary);
2568 if (importedElement != null) { 2637 if (importedElement != null) {
2569 if (element == null) { 2638 if (element == null) {
2570 element = importedElement; 2639 element = importedElement;
2571 } else { 2640 } else {
2572 element = new MultiplyDefinedElementImpl(definingLibrary.context, el ement, importedElement); 2641 element = new MultiplyDefinedElementImpl(definingLibrary.context, el ement, importedElement);
2573 } 2642 }
2574 } 2643 }
2575 } 2644 }
2576 } 2645 }
2577 return element; 2646 return element;
2578 } 2647 }
2579 2648
2580 /** 2649 /**
2581 * Return the name of the method invoked by the given postfix expression. 2650 * Return the name of the method invoked by the given postfix expression.
2651 *
2582 * @param node the postfix expression being invoked 2652 * @param node the postfix expression being invoked
2583 * @return the name of the method invoked by the expression 2653 * @return the name of the method invoked by the expression
2584 */ 2654 */
2585 String getPostfixOperator(PostfixExpression node) => (identical(node.operator. type, sc.TokenType.PLUS_PLUS)) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.l exeme; 2655 String getPostfixOperator(PostfixExpression node) => (identical(node.operator. type, sc.TokenType.PLUS_PLUS)) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.l exeme;
2586 2656
2587 /** 2657 /**
2588 * Return the name of the method invoked by the given postfix expression. 2658 * Return the name of the method invoked by the given postfix expression.
2659 *
2589 * @param node the postfix expression being invoked 2660 * @param node the postfix expression being invoked
2590 * @return the name of the method invoked by the expression 2661 * @return the name of the method invoked by the expression
2591 */ 2662 */
2592 String getPrefixOperator(PrefixExpression node) { 2663 String getPrefixOperator(PrefixExpression node) {
2593 sc.Token operator = node.operator; 2664 sc.Token operator = node.operator;
2594 sc.TokenType operatorType = operator.type; 2665 sc.TokenType operatorType = operator.type;
2595 if (identical(operatorType, sc.TokenType.PLUS_PLUS)) { 2666 if (identical(operatorType, sc.TokenType.PLUS_PLUS)) {
2596 return sc.TokenType.PLUS.lexeme; 2667 return sc.TokenType.PLUS.lexeme;
2597 } else if (identical(operatorType, sc.TokenType.MINUS_MINUS)) { 2668 } else if (identical(operatorType, sc.TokenType.MINUS_MINUS)) {
2598 return sc.TokenType.MINUS.lexeme; 2669 return sc.TokenType.MINUS.lexeme;
2599 } else if (identical(operatorType, sc.TokenType.MINUS)) { 2670 } else if (identical(operatorType, sc.TokenType.MINUS)) {
2600 return "unary-"; 2671 return "unary-";
2601 } else { 2672 } else {
2602 return operator.lexeme; 2673 return operator.lexeme;
2603 } 2674 }
2604 } 2675 }
2605 2676
2606 /** 2677 /**
2607 * Return the propagated type of the given expression that is to be used for t ype analysis. 2678 * Return the propagated type of the given expression that is to be used for t ype analysis.
2679 *
2608 * @param expression the expression whose type is to be returned 2680 * @param expression the expression whose type is to be returned
2609 * @return the type of the given expression 2681 * @return the type of the given expression
2610 */ 2682 */
2611 Type2 getPropagatedType(Expression expression) { 2683 Type2 getPropagatedType(Expression expression) {
2612 Type2 propagatedType = resolveTypeVariable(expression.propagatedType); 2684 Type2 propagatedType = resolveTypeVariable(expression.propagatedType);
2613 if (propagatedType is FunctionType) { 2685 if (propagatedType is FunctionType) {
2614 propagatedType = _resolver.typeProvider.functionType; 2686 propagatedType = _resolver.typeProvider.functionType;
2615 } 2687 }
2616 return propagatedType; 2688 return propagatedType;
2617 } 2689 }
2618 2690
2619 /** 2691 /**
2620 * Return the static type of the given expression that is to be used for type analysis. 2692 * Return the static type of the given expression that is to be used for type analysis.
2693 *
2621 * @param expression the expression whose type is to be returned 2694 * @param expression the expression whose type is to be returned
2622 * @return the type of the given expression 2695 * @return the type of the given expression
2623 */ 2696 */
2624 Type2 getStaticType(Expression expression) { 2697 Type2 getStaticType(Expression expression) {
2625 if (expression is NullLiteral) { 2698 if (expression is NullLiteral) {
2626 return _resolver.typeProvider.objectType; 2699 return _resolver.typeProvider.objectType;
2627 } 2700 }
2628 Type2 staticType = resolveTypeVariable(expression.staticType); 2701 Type2 staticType = resolveTypeVariable(expression.staticType);
2629 if (staticType is FunctionType) { 2702 if (staticType is FunctionType) {
2630 staticType = _resolver.typeProvider.functionType; 2703 staticType = _resolver.typeProvider.functionType;
2631 } 2704 }
2632 return staticType; 2705 return staticType;
2633 } 2706 }
2634 2707
2635 /** 2708 /**
2636 * Return the element representing the superclass of the given class. 2709 * Return the element representing the superclass of the given class.
2710 *
2637 * @param targetClass the class whose superclass is to be returned 2711 * @param targetClass the class whose superclass is to be returned
2638 * @return the element representing the superclass of the given class 2712 * @return the element representing the superclass of the given class
2639 */ 2713 */
2640 ClassElement getSuperclass(ClassElement targetClass) { 2714 ClassElement getSuperclass(ClassElement targetClass) {
2641 InterfaceType superType = targetClass.supertype; 2715 InterfaceType superType = targetClass.supertype;
2642 if (superType == null) { 2716 if (superType == null) {
2643 return null; 2717 return null;
2644 } 2718 }
2645 return superType.element; 2719 return superType.element;
2646 } 2720 }
2647 2721
2648 /** 2722 /**
2649 * Return `true` if the given type represents an object that could be invoked using the call 2723 * Return `true` if the given type represents an object that could be invoked using the call
2650 * operator '()'. 2724 * operator '()'.
2725 *
2651 * @param type the type being tested 2726 * @param type the type being tested
2652 * @return `true` if the given type represents an object that could be invoked 2727 * @return `true` if the given type represents an object that could be invoked
2653 */ 2728 */
2654 bool isExecutableType(Type2 type) { 2729 bool isExecutableType(Type2 type) {
2655 if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction) { 2730 if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction || t ype.isObject) {
2656 return true; 2731 return true;
2657 } else if (type is InterfaceType) { 2732 } else if (type is InterfaceType) {
2658 ClassElement classElement = ((type as InterfaceType)).element; 2733 ClassElement classElement = ((type as InterfaceType)).element;
2659 MethodElement methodElement = classElement.lookUpMethod(CALL_METHOD_NAME, _resolver.definingLibrary); 2734 MethodElement methodElement = classElement.lookUpMethod(CALL_METHOD_NAME, _resolver.definingLibrary);
2660 return methodElement != null; 2735 return methodElement != null;
2661 } 2736 }
2662 return false; 2737 return false;
2663 } 2738 }
2664 2739
2665 /** 2740 /**
2666 * Return `true` if the given element is a static element. 2741 * Return `true` if the given element is a static element.
2742 *
2667 * @param element the element being tested 2743 * @param element the element being tested
2668 * @return `true` if the given element is a static element 2744 * @return `true` if the given element is a static element
2669 */ 2745 */
2670 bool isStatic(Element element) { 2746 bool isStatic(Element element) {
2671 if (element is ExecutableElement) { 2747 if (element is ExecutableElement) {
2672 return ((element as ExecutableElement)).isStatic; 2748 return ((element as ExecutableElement)).isStatic;
2673 } else if (element is PropertyInducingElement) { 2749 } else if (element is PropertyInducingElement) {
2674 return ((element as PropertyInducingElement)).isStatic; 2750 return ((element as PropertyInducingElement)).isStatic;
2675 } 2751 }
2676 return false; 2752 return false;
2677 } 2753 }
2678 2754
2679 /** 2755 /**
2680 * Looks up the method element with the given name for index expression, repor ts[StaticWarningCode#UNDEFINED_OPERATOR] if not found. 2756 * Looks up the method element with the given name for index expression, repor ts
2757 * [StaticWarningCode#UNDEFINED_OPERATOR] if not found.
2758 *
2681 * @param node the index expression to resolve 2759 * @param node the index expression to resolve
2682 * @param target the target of the expression 2760 * @param target the target of the expression
2683 * @param methodName the name of the operator associated with the context of u sing of the given 2761 * @param methodName the name of the operator associated with the context of u sing of the given
2684 * index expression 2762 * index expression
2685 * @return `true` if and only if an error code is generated on the passed node 2763 * @return `true` if and only if an error code is generated on the passed node
2686 */ 2764 */
2687 bool lookUpCheckIndexOperator(IndexExpression node, Expression target, String methodName, Type2 staticType, Type2 propagatedType) { 2765 bool lookUpCheckIndexOperator(IndexExpression node, Expression target, String methodName, Type2 staticType, Type2 propagatedType) {
2688 MethodElement staticMethod = lookUpMethod(target, staticType, methodName); 2766 MethodElement staticMethod = lookUpMethod(target, staticType, methodName);
2689 MethodElement propagatedMethod = lookUpMethod(target, propagatedType, method Name); 2767 MethodElement propagatedMethod = lookUpMethod(target, propagatedType, method Name);
2690 node.staticElement = staticMethod; 2768 node.staticElement = staticMethod;
2691 node.element = select2(staticMethod, propagatedMethod); 2769 node.element = select2(staticMethod, propagatedMethod);
2692 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || p ropagatedType == null || shouldReportMissingMember(propagatedType, propagatedMet hod))) { 2770 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || p ropagatedType == null || shouldReportMissingMember(propagatedType, propagatedMet hod))) {
2693 sc.Token leftBracket = node.leftBracket; 2771 sc.Token leftBracket = node.leftBracket;
2694 sc.Token rightBracket = node.rightBracket; 2772 sc.Token rightBracket = node.rightBracket;
2695 if (leftBracket == null || rightBracket == null) { 2773 if (leftBracket == null || rightBracket == null) {
2696 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_OPERATOR, node, [m ethodName, staticType.displayName]); 2774 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_OPERATOR, node, [m ethodName, staticType.displayName]);
2697 return true; 2775 return true;
2698 } else { 2776 } else {
2699 int offset = leftBracket.offset; 2777 int offset = leftBracket.offset;
2700 int length = rightBracket.offset - offset + 1; 2778 int length = rightBracket.offset - offset + 1;
2701 _resolver.reportError5(StaticTypeWarningCode.UNDEFINED_OPERATOR, offset, length, [methodName, staticType.displayName]); 2779 _resolver.reportError5(StaticTypeWarningCode.UNDEFINED_OPERATOR, offset, length, [methodName, staticType.displayName]);
2702 return true; 2780 return true;
2703 } 2781 }
2704 } 2782 }
2705 return false; 2783 return false;
2706 } 2784 }
2707 2785
2708 /** 2786 /**
2709 * Look up the getter with the given name in the given type. Return the elemen t representing the 2787 * Look up the getter with the given name in the given type. Return the elemen t representing the
2710 * getter that was found, or `null` if there is no getter with the given name. 2788 * getter that was found, or `null` if there is no getter with the given name.
2789 *
2711 * @param target the target of the invocation, or `null` if there is no target 2790 * @param target the target of the invocation, or `null` if there is no target
2712 * @param type the type in which the getter is defined 2791 * @param type the type in which the getter is defined
2713 * @param getterName the name of the getter being looked up 2792 * @param getterName the name of the getter being looked up
2714 * @return the element representing the getter that was found 2793 * @return the element representing the getter that was found
2715 */ 2794 */
2716 PropertyAccessorElement lookUpGetter(Expression target, Type2 type, String get terName) { 2795 PropertyAccessorElement lookUpGetter(Expression target, Type2 type, String get terName) {
2717 type = resolveTypeVariable(type); 2796 type = resolveTypeVariable(type);
2718 if (type is InterfaceType) { 2797 if (type is InterfaceType) {
2719 InterfaceType interfaceType = type as InterfaceType; 2798 InterfaceType interfaceType = type as InterfaceType;
2720 PropertyAccessorElement accessor; 2799 PropertyAccessorElement accessor;
2721 if (target is SuperExpression) { 2800 if (target is SuperExpression) {
2722 accessor = interfaceType.lookUpGetterInSuperclass(getterName, _resolver. definingLibrary); 2801 accessor = interfaceType.lookUpGetterInSuperclass(getterName, _resolver. definingLibrary);
2723 } else { 2802 } else {
2724 accessor = interfaceType.lookUpGetter(getterName, _resolver.definingLibr ary); 2803 accessor = interfaceType.lookUpGetter(getterName, _resolver.definingLibr ary);
2725 } 2804 }
2726 if (accessor != null) { 2805 if (accessor != null) {
2727 return accessor; 2806 return accessor;
2728 } 2807 }
2729 return lookUpGetterInInterfaces(interfaceType, false, getterName, new Set< ClassElement>()); 2808 return lookUpGetterInInterfaces(interfaceType, false, getterName, new Set< ClassElement>());
2730 } 2809 }
2731 return null; 2810 return null;
2732 } 2811 }
2733 2812
2734 /** 2813 /**
2735 * Look up the getter with the given name in the interfaces implemented by the given type, either 2814 * Look up the getter with the given name in the interfaces implemented by the given type, either
2736 * directly or indirectly. Return the element representing the getter that was found, or`null` if there is no getter with the given name. 2815 * directly or indirectly. Return the element representing the getter that was found, or
2816 * `null` if there is no getter with the given name.
2817 *
2737 * @param targetType the type in which the getter might be defined 2818 * @param targetType the type in which the getter might be defined
2738 * @param includeTargetType `true` if the search should include the target typ e 2819 * @param includeTargetType `true` if the search should include the target typ e
2739 * @param getterName the name of the getter being looked up 2820 * @param getterName the name of the getter being looked up
2740 * @param visitedInterfaces a set containing all of the interfaces that have b een examined, used 2821 * @param visitedInterfaces a set containing all of the interfaces that have b een examined, used
2741 * to prevent infinite recursion and to optimize the search 2822 * to prevent infinite recursion and to optimize the search
2742 * @return the element representing the getter that was found 2823 * @return the element representing the getter that was found
2743 */ 2824 */
2744 PropertyAccessorElement lookUpGetterInInterfaces(InterfaceType targetType, boo l includeTargetType, String getterName, Set<ClassElement> visitedInterfaces) { 2825 PropertyAccessorElement lookUpGetterInInterfaces(InterfaceType targetType, boo l includeTargetType, String getterName, Set<ClassElement> visitedInterfaces) {
2745 ClassElement targetClass = targetType.element; 2826 ClassElement targetClass = targetType.element;
2746 if (visitedInterfaces.contains(targetClass)) { 2827 if (visitedInterfaces.contains(targetClass)) {
2747 return null; 2828 return null;
2748 } 2829 }
2749 javaSetAdd(visitedInterfaces, targetClass); 2830 javaSetAdd(visitedInterfaces, targetClass);
2750 if (includeTargetType) { 2831 if (includeTargetType) {
2751 PropertyAccessorElement getter = targetType.getGetter(getterName); 2832 PropertyAccessorElement getter = targetType.getGetter(getterName);
(...skipping 17 matching lines...) Expand all
2769 if (superclass == null) { 2850 if (superclass == null) {
2770 return null; 2851 return null;
2771 } 2852 }
2772 return lookUpGetterInInterfaces(superclass, true, getterName, visitedInterfa ces); 2853 return lookUpGetterInInterfaces(superclass, true, getterName, visitedInterfa ces);
2773 } 2854 }
2774 2855
2775 /** 2856 /**
2776 * Look up the method or getter with the given name in the given type. Return the element 2857 * Look up the method or getter with the given name in the given type. Return the element
2777 * representing the method or getter that was found, or `null` if there is no method or 2858 * representing the method or getter that was found, or `null` if there is no method or
2778 * getter with the given name. 2859 * getter with the given name.
2860 *
2779 * @param type the type in which the method or getter is defined 2861 * @param type the type in which the method or getter is defined
2780 * @param memberName the name of the method or getter being looked up 2862 * @param memberName the name of the method or getter being looked up
2781 * @return the element representing the method or getter that was found 2863 * @return the element representing the method or getter that was found
2782 */ 2864 */
2783 ExecutableElement lookupGetterOrMethod(Type2 type, String memberName) { 2865 ExecutableElement lookupGetterOrMethod(Type2 type, String memberName) {
2784 type = resolveTypeVariable(type); 2866 type = resolveTypeVariable(type);
2785 if (type is InterfaceType) { 2867 if (type is InterfaceType) {
2786 InterfaceType interfaceType = type as InterfaceType; 2868 InterfaceType interfaceType = type as InterfaceType;
2787 ExecutableElement member = interfaceType.lookUpMethod(memberName, _resolve r.definingLibrary); 2869 ExecutableElement member = interfaceType.lookUpMethod(memberName, _resolve r.definingLibrary);
2788 if (member != null) { 2870 if (member != null) {
2789 return member; 2871 return member;
2790 } 2872 }
2791 member = interfaceType.lookUpGetter(memberName, _resolver.definingLibrary) ; 2873 member = interfaceType.lookUpGetter(memberName, _resolver.definingLibrary) ;
2792 if (member != null) { 2874 if (member != null) {
2793 return member; 2875 return member;
2794 } 2876 }
2795 return lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new Set<ClassElement>()); 2877 return lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new Set<ClassElement>());
2796 } 2878 }
2797 return null; 2879 return null;
2798 } 2880 }
2799 2881
2800 /** 2882 /**
2801 * Look up the method or getter with the given name in the interfaces implemen ted by the given 2883 * Look up the method or getter with the given name in the interfaces implemen ted by the given
2802 * type, either directly or indirectly. Return the element representing the me thod or getter that 2884 * type, either directly or indirectly. Return the element representing the me thod or getter that
2803 * was found, or `null` if there is no method or getter with the given name. 2885 * was found, or `null` if there is no method or getter with the given name.
2886 *
2804 * @param targetType the type in which the method or getter might be defined 2887 * @param targetType the type in which the method or getter might be defined
2805 * @param includeTargetType `true` if the search should include the target typ e 2888 * @param includeTargetType `true` if the search should include the target typ e
2806 * @param memberName the name of the method or getter being looked up 2889 * @param memberName the name of the method or getter being looked up
2807 * @param visitedInterfaces a set containing all of the interfaces that have b een examined, used 2890 * @param visitedInterfaces a set containing all of the interfaces that have b een examined, used
2808 * to prevent infinite recursion and to optimize the search 2891 * to prevent infinite recursion and to optimize the search
2809 * @return the element representing the method or getter that was found 2892 * @return the element representing the method or getter that was found
2810 */ 2893 */
2811 ExecutableElement lookUpGetterOrMethodInInterfaces(InterfaceType targetType, b ool includeTargetType, String memberName, Set<ClassElement> visitedInterfaces) { 2894 ExecutableElement lookUpGetterOrMethodInInterfaces(InterfaceType targetType, b ool includeTargetType, String memberName, Set<ClassElement> visitedInterfaces) {
2812 ClassElement targetClass = targetType.element; 2895 ClassElement targetClass = targetType.element;
2813 if (visitedInterfaces.contains(targetClass)) { 2896 if (visitedInterfaces.contains(targetClass)) {
2814 return null; 2897 return null;
2815 } 2898 }
2816 javaSetAdd(visitedInterfaces, targetClass); 2899 javaSetAdd(visitedInterfaces, targetClass);
2817 if (includeTargetType) { 2900 if (includeTargetType) {
2818 ExecutableElement member = targetType.getMethod(memberName); 2901 ExecutableElement member = targetType.getMethod(memberName);
(...skipping 19 matching lines...) Expand all
2838 } 2921 }
2839 InterfaceType superclass = targetType.superclass; 2922 InterfaceType superclass = targetType.superclass;
2840 if (superclass == null) { 2923 if (superclass == null) {
2841 return null; 2924 return null;
2842 } 2925 }
2843 return lookUpGetterOrMethodInInterfaces(superclass, true, memberName, visite dInterfaces); 2926 return lookUpGetterOrMethodInInterfaces(superclass, true, memberName, visite dInterfaces);
2844 } 2927 }
2845 2928
2846 /** 2929 /**
2847 * Find the element corresponding to the given label node in the current label scope. 2930 * Find the element corresponding to the given label node in the current label scope.
2931 *
2848 * @param parentNode the node containing the given label 2932 * @param parentNode the node containing the given label
2849 * @param labelNode the node representing the label being looked up 2933 * @param labelNode the node representing the label being looked up
2850 * @return the element corresponding to the given label node in the current sc ope 2934 * @return the element corresponding to the given label node in the current sc ope
2851 */ 2935 */
2852 LabelElementImpl lookupLabel(ASTNode parentNode, SimpleIdentifier labelNode) { 2936 LabelElementImpl lookupLabel(ASTNode parentNode, SimpleIdentifier labelNode) {
2853 LabelScope labelScope = _resolver.labelScope; 2937 LabelScope labelScope = _resolver.labelScope;
2854 LabelElementImpl labelElement = null; 2938 LabelElementImpl labelElement = null;
2855 if (labelNode == null) { 2939 if (labelNode == null) {
2856 if (labelScope == null) { 2940 if (labelScope == null) {
2857 } else { 2941 } else {
(...skipping 20 matching lines...) Expand all
2878 _resolver.reportError(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNo de, [labelNode.name]); 2962 _resolver.reportError(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNo de, [labelNode.name]);
2879 labelElement = null; 2963 labelElement = null;
2880 } 2964 }
2881 } 2965 }
2882 return labelElement; 2966 return labelElement;
2883 } 2967 }
2884 2968
2885 /** 2969 /**
2886 * Look up the method with the given name in the given type. Return the elemen t representing the 2970 * Look up the method with the given name in the given type. Return the elemen t representing the
2887 * method that was found, or `null` if there is no method with the given name. 2971 * method that was found, or `null` if there is no method with the given name.
2972 *
2888 * @param target the target of the invocation, or `null` if there is no target 2973 * @param target the target of the invocation, or `null` if there is no target
2889 * @param type the type in which the method is defined 2974 * @param type the type in which the method is defined
2890 * @param methodName the name of the method being looked up 2975 * @param methodName the name of the method being looked up
2891 * @return the element representing the method that was found 2976 * @return the element representing the method that was found
2892 */ 2977 */
2893 MethodElement lookUpMethod(Expression target, Type2 type, String methodName) { 2978 MethodElement lookUpMethod(Expression target, Type2 type, String methodName) {
2894 type = resolveTypeVariable(type); 2979 type = resolveTypeVariable(type);
2895 if (type is InterfaceType) { 2980 if (type is InterfaceType) {
2896 InterfaceType interfaceType = type as InterfaceType; 2981 InterfaceType interfaceType = type as InterfaceType;
2897 MethodElement method; 2982 MethodElement method;
2898 if (target is SuperExpression) { 2983 if (target is SuperExpression) {
2899 method = interfaceType.lookUpMethodInSuperclass(methodName, _resolver.de finingLibrary); 2984 method = interfaceType.lookUpMethodInSuperclass(methodName, _resolver.de finingLibrary);
2900 } else { 2985 } else {
2901 method = interfaceType.lookUpMethod(methodName, _resolver.definingLibrar y); 2986 method = interfaceType.lookUpMethod(methodName, _resolver.definingLibrar y);
2902 } 2987 }
2903 if (method != null) { 2988 if (method != null) {
2904 return method; 2989 return method;
2905 } 2990 }
2906 return lookUpMethodInInterfaces(interfaceType, false, methodName, new Set< ClassElement>()); 2991 return lookUpMethodInInterfaces(interfaceType, false, methodName, new Set< ClassElement>());
2907 } 2992 }
2908 return null; 2993 return null;
2909 } 2994 }
2910 2995
2911 /** 2996 /**
2912 * Look up the method with the given name in the interfaces implemented by the given type, either 2997 * Look up the method with the given name in the interfaces implemented by the given type, either
2913 * directly or indirectly. Return the element representing the method that was found, or`null` if there is no method with the given name. 2998 * directly or indirectly. Return the element representing the method that was found, or
2999 * `null` if there is no method with the given name.
3000 *
2914 * @param targetType the type in which the member might be defined 3001 * @param targetType the type in which the member might be defined
2915 * @param includeTargetType `true` if the search should include the target typ e 3002 * @param includeTargetType `true` if the search should include the target typ e
2916 * @param methodName the name of the method being looked up 3003 * @param methodName the name of the method being looked up
2917 * @param visitedInterfaces a set containing all of the interfaces that have b een examined, used 3004 * @param visitedInterfaces a set containing all of the interfaces that have b een examined, used
2918 * to prevent infinite recursion and to optimize the search 3005 * to prevent infinite recursion and to optimize the search
2919 * @return the element representing the method that was found 3006 * @return the element representing the method that was found
2920 */ 3007 */
2921 MethodElement lookUpMethodInInterfaces(InterfaceType targetType, bool includeT argetType, String methodName, Set<ClassElement> visitedInterfaces) { 3008 MethodElement lookUpMethodInInterfaces(InterfaceType targetType, bool includeT argetType, String methodName, Set<ClassElement> visitedInterfaces) {
2922 ClassElement targetClass = targetType.element; 3009 ClassElement targetClass = targetType.element;
2923 if (visitedInterfaces.contains(targetClass)) { 3010 if (visitedInterfaces.contains(targetClass)) {
2924 return null; 3011 return null;
2925 } 3012 }
2926 javaSetAdd(visitedInterfaces, targetClass); 3013 javaSetAdd(visitedInterfaces, targetClass);
2927 if (includeTargetType) { 3014 if (includeTargetType) {
2928 MethodElement method = targetType.getMethod(methodName); 3015 MethodElement method = targetType.getMethod(methodName);
(...skipping 16 matching lines...) Expand all
2945 InterfaceType superclass = targetType.superclass; 3032 InterfaceType superclass = targetType.superclass;
2946 if (superclass == null) { 3033 if (superclass == null) {
2947 return null; 3034 return null;
2948 } 3035 }
2949 return lookUpMethodInInterfaces(superclass, true, methodName, visitedInterfa ces); 3036 return lookUpMethodInInterfaces(superclass, true, methodName, visitedInterfa ces);
2950 } 3037 }
2951 3038
2952 /** 3039 /**
2953 * Look up the setter with the given name in the given type. Return the elemen t representing the 3040 * Look up the setter with the given name in the given type. Return the elemen t representing the
2954 * setter that was found, or `null` if there is no setter with the given name. 3041 * setter that was found, or `null` if there is no setter with the given name.
3042 *
2955 * @param target the target of the invocation, or `null` if there is no target 3043 * @param target the target of the invocation, or `null` if there is no target
2956 * @param type the type in which the setter is defined 3044 * @param type the type in which the setter is defined
2957 * @param setterName the name of the setter being looked up 3045 * @param setterName the name of the setter being looked up
2958 * @return the element representing the setter that was found 3046 * @return the element representing the setter that was found
2959 */ 3047 */
2960 PropertyAccessorElement lookUpSetter(Expression target, Type2 type, String set terName) { 3048 PropertyAccessorElement lookUpSetter(Expression target, Type2 type, String set terName) {
2961 type = resolveTypeVariable(type); 3049 type = resolveTypeVariable(type);
2962 if (type is InterfaceType) { 3050 if (type is InterfaceType) {
2963 InterfaceType interfaceType = type as InterfaceType; 3051 InterfaceType interfaceType = type as InterfaceType;
2964 PropertyAccessorElement accessor; 3052 PropertyAccessorElement accessor;
2965 if (target is SuperExpression) { 3053 if (target is SuperExpression) {
2966 accessor = interfaceType.lookUpSetterInSuperclass(setterName, _resolver. definingLibrary); 3054 accessor = interfaceType.lookUpSetterInSuperclass(setterName, _resolver. definingLibrary);
2967 } else { 3055 } else {
2968 accessor = interfaceType.lookUpSetter(setterName, _resolver.definingLibr ary); 3056 accessor = interfaceType.lookUpSetter(setterName, _resolver.definingLibr ary);
2969 } 3057 }
2970 if (accessor != null) { 3058 if (accessor != null) {
2971 return accessor; 3059 return accessor;
2972 } 3060 }
2973 return lookUpSetterInInterfaces(interfaceType, false, setterName, new Set< ClassElement>()); 3061 return lookUpSetterInInterfaces(interfaceType, false, setterName, new Set< ClassElement>());
2974 } 3062 }
2975 return null; 3063 return null;
2976 } 3064 }
2977 3065
2978 /** 3066 /**
2979 * Look up the setter with the given name in the interfaces implemented by the given type, either 3067 * Look up the setter with the given name in the interfaces implemented by the given type, either
2980 * directly or indirectly. Return the element representing the setter that was found, or`null` if there is no setter with the given name. 3068 * directly or indirectly. Return the element representing the setter that was found, or
3069 * `null` if there is no setter with the given name.
3070 *
2981 * @param targetType the type in which the setter might be defined 3071 * @param targetType the type in which the setter might be defined
2982 * @param includeTargetType `true` if the search should include the target typ e 3072 * @param includeTargetType `true` if the search should include the target typ e
2983 * @param setterName the name of the setter being looked up 3073 * @param setterName the name of the setter being looked up
2984 * @param visitedInterfaces a set containing all of the interfaces that have b een examined, used 3074 * @param visitedInterfaces a set containing all of the interfaces that have b een examined, used
2985 * to prevent infinite recursion and to optimize the search 3075 * to prevent infinite recursion and to optimize the search
2986 * @return the element representing the setter that was found 3076 * @return the element representing the setter that was found
2987 */ 3077 */
2988 PropertyAccessorElement lookUpSetterInInterfaces(InterfaceType targetType, boo l includeTargetType, String setterName, Set<ClassElement> visitedInterfaces) { 3078 PropertyAccessorElement lookUpSetterInInterfaces(InterfaceType targetType, boo l includeTargetType, String setterName, Set<ClassElement> visitedInterfaces) {
2989 ClassElement targetClass = targetType.element; 3079 ClassElement targetClass = targetType.element;
2990 if (visitedInterfaces.contains(targetClass)) { 3080 if (visitedInterfaces.contains(targetClass)) {
2991 return null; 3081 return null;
2992 } 3082 }
2993 javaSetAdd(visitedInterfaces, targetClass); 3083 javaSetAdd(visitedInterfaces, targetClass);
2994 if (includeTargetType) { 3084 if (includeTargetType) {
2995 PropertyAccessorElement setter = targetType.getSetter(setterName); 3085 PropertyAccessorElement setter = targetType.getSetter(setterName);
(...skipping 15 matching lines...) Expand all
3011 } 3101 }
3012 InterfaceType superclass = targetType.superclass; 3102 InterfaceType superclass = targetType.superclass;
3013 if (superclass == null) { 3103 if (superclass == null) {
3014 return null; 3104 return null;
3015 } 3105 }
3016 return lookUpSetterInInterfaces(superclass, true, setterName, visitedInterfa ces); 3106 return lookUpSetterInInterfaces(superclass, true, setterName, visitedInterfa ces);
3017 } 3107 }
3018 3108
3019 /** 3109 /**
3020 * Return the binary operator that is invoked by the given compound assignment operator. 3110 * Return the binary operator that is invoked by the given compound assignment operator.
3111 *
3021 * @param operator the assignment operator being mapped 3112 * @param operator the assignment operator being mapped
3022 * @return the binary operator that invoked by the given assignment operator 3113 * @return the binary operator that invoked by the given assignment operator
3023 */ 3114 */
3024 sc.TokenType operatorFromCompoundAssignment(sc.TokenType operator) { 3115 sc.TokenType operatorFromCompoundAssignment(sc.TokenType operator) {
3025 while (true) { 3116 while (true) {
3026 if (operator == sc.TokenType.AMPERSAND_EQ) { 3117 if (operator == sc.TokenType.AMPERSAND_EQ) {
3027 return sc.TokenType.AMPERSAND; 3118 return sc.TokenType.AMPERSAND;
3028 } else if (operator == sc.TokenType.BAR_EQ) { 3119 } else if (operator == sc.TokenType.BAR_EQ) {
3029 return sc.TokenType.BAR; 3120 return sc.TokenType.BAR;
3030 } else if (operator == sc.TokenType.CARET_EQ) { 3121 } else if (operator == sc.TokenType.CARET_EQ) {
(...skipping 16 matching lines...) Expand all
3047 return sc.TokenType.TILDE_SLASH; 3138 return sc.TokenType.TILDE_SLASH;
3048 } 3139 }
3049 break; 3140 break;
3050 } 3141 }
3051 AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to it's corresponding operator"); 3142 AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to it's corresponding operator");
3052 return operator; 3143 return operator;
3053 } 3144 }
3054 3145
3055 /** 3146 /**
3056 * Record the fact that the given AST node was resolved to the given element. 3147 * Record the fact that the given AST node was resolved to the given element.
3148 *
3057 * @param node the AST node that was resolved 3149 * @param node the AST node that was resolved
3058 * @param element the element to which the AST node was resolved 3150 * @param element the element to which the AST node was resolved
3059 */ 3151 */
3060 void recordResolution(SimpleIdentifier node, Element element2) { 3152 void recordResolution(SimpleIdentifier node, Element element2) {
3061 node.staticElement = element2; 3153 node.staticElement = element2;
3062 node.element = element2; 3154 node.element = element2;
3063 } 3155 }
3064 3156
3065 /** 3157 /**
3066 * Record the fact that the given AST node was resolved to the given elements. 3158 * Record the fact that the given AST node was resolved to the given elements.
3159 *
3067 * @param node the AST node that was resolved 3160 * @param node the AST node that was resolved
3068 * @param staticElement the element to which the AST node was resolved using s tatic type 3161 * @param staticElement the element to which the AST node was resolved using s tatic type
3069 * information 3162 * information
3070 * @param propagatedElement the element to which the AST node was resolved usi ng propagated type 3163 * @param propagatedElement the element to which the AST node was resolved usi ng propagated type
3071 * information 3164 * information
3072 * @return the element that was associated with the node 3165 * @return the element that was associated with the node
3073 */ 3166 */
3074 void recordResolution2(SimpleIdentifier node, Element staticElement2, Element propagatedElement) { 3167 void recordResolution2(SimpleIdentifier node, Element staticElement2, Element propagatedElement) {
3075 node.staticElement = staticElement2; 3168 node.staticElement = staticElement2;
3076 node.element = propagatedElement == null ? staticElement2 : propagatedElemen t; 3169 node.element = propagatedElement == null ? staticElement2 : propagatedElemen t;
3077 } 3170 }
3171 void resolveAnnotationConstructorInvocationArguments(Annotation annotation, Co nstructorElement constructor) {
3172 ArgumentList argumentList = annotation.arguments;
3173 if (argumentList == null) {
3174 } else {
3175 List<ParameterElement> parameters = resolveArgumentsToParameters(true, arg umentList, constructor);
3176 if (parameters != null) {
3177 argumentList.correspondingStaticParameters = parameters;
3178 }
3179 }
3180 }
3078 3181
3079 /** 3182 /**
3080 * Given a list of arguments and the element that will be invoked using those argument, compute 3183 * Given a list of arguments and the element that will be invoked using those argument, compute
3081 * the list of parameters that correspond to the list of arguments. Return the parameters that 3184 * the list of parameters that correspond to the list of arguments. Return the parameters that
3082 * correspond to the arguments, or `null` if no correspondence could be comput ed. 3185 * correspond to the arguments, or `null` if no correspondence could be comput ed.
3083 * @param reportError if `true` then compile-time error should be reported; if `false`then compile-time warning 3186 *
3187 * @param reportError if `true` then compile-time error should be reported; if `false`
3188 * then compile-time warning
3084 * @param argumentList the list of arguments being passed to the element 3189 * @param argumentList the list of arguments being passed to the element
3085 * @param executableElement the element that will be invoked with the argument s 3190 * @param executableElement the element that will be invoked with the argument s
3086 * @return the parameters that correspond to the arguments 3191 * @return the parameters that correspond to the arguments
3087 */ 3192 */
3088 List<ParameterElement> resolveArgumentsToParameters(bool reportError, Argument List argumentList, ExecutableElement executableElement) { 3193 List<ParameterElement> resolveArgumentsToParameters(bool reportError, Argument List argumentList, ExecutableElement executableElement) {
3089 if (executableElement == null) { 3194 if (executableElement == null) {
3090 return null; 3195 return null;
3091 } 3196 }
3092 List<ParameterElement> parameters = executableElement.parameters; 3197 List<ParameterElement> parameters = executableElement.parameters;
3093 return resolveArgumentsToParameters2(reportError, argumentList, parameters); 3198 return resolveArgumentsToParameters2(reportError, argumentList, parameters);
3094 } 3199 }
3095 3200
3096 /** 3201 /**
3097 * Given a list of arguments and the parameters related to the element that wi ll be invoked using 3202 * Given a list of arguments and the parameters related to the element that wi ll be invoked using
3098 * those argument, compute the list of parameters that correspond to the list of arguments. Return 3203 * those argument, compute the list of parameters that correspond to the list of arguments. Return
3099 * the parameters that correspond to the arguments. 3204 * the parameters that correspond to the arguments.
3100 * @param reportError if `true` then compile-time error should be reported; if `false`then compile-time warning 3205 *
3206 * @param reportError if `true` then compile-time error should be reported; if `false`
3207 * then compile-time warning
3101 * @param argumentList the list of arguments being passed to the element 3208 * @param argumentList the list of arguments being passed to the element
3102 * @param parameters the of the function that will be invoked with the argumen ts 3209 * @param parameters the of the function that will be invoked with the argumen ts
3103 * @return the parameters that correspond to the arguments 3210 * @return the parameters that correspond to the arguments
3104 */ 3211 */
3105 List<ParameterElement> resolveArgumentsToParameters2(bool reportError2, Argume ntList argumentList, List<ParameterElement> parameters) { 3212 List<ParameterElement> resolveArgumentsToParameters2(bool reportError2, Argume ntList argumentList, List<ParameterElement> parameters) {
3106 List<ParameterElement> requiredParameters = new List<ParameterElement>(); 3213 List<ParameterElement> requiredParameters = new List<ParameterElement>();
3107 List<ParameterElement> positionalParameters = new List<ParameterElement>(); 3214 List<ParameterElement> positionalParameters = new List<ParameterElement>();
3108 Map<String, ParameterElement> namedParameters = new Map<String, ParameterEle ment>(); 3215 Map<String, ParameterElement> namedParameters = new Map<String, ParameterEle ment>();
3109 for (ParameterElement parameter in parameters) { 3216 for (ParameterElement parameter in parameters) {
3110 ParameterKind kind = parameter.parameterKind; 3217 ParameterKind kind = parameter.parameterKind;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3153 _resolver.reportError(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]); 3260 _resolver.reportError(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
3154 } else if (positionalArgumentCount > unnamedParameterCount) { 3261 } else if (positionalArgumentCount > unnamedParameterCount) {
3155 ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.EXTRA_POSITIONAL _ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS; 3262 ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.EXTRA_POSITIONAL _ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS;
3156 _resolver.reportError(errorCode, argumentList, [unnamedParameterCount, pos itionalArgumentCount]); 3263 _resolver.reportError(errorCode, argumentList, [unnamedParameterCount, pos itionalArgumentCount]);
3157 } 3264 }
3158 return resolvedParameters; 3265 return resolvedParameters;
3159 } 3266 }
3160 3267
3161 /** 3268 /**
3162 * Resolve the names in the given combinators in the scope of the given librar y. 3269 * Resolve the names in the given combinators in the scope of the given librar y.
3270 *
3163 * @param library the library that defines the names 3271 * @param library the library that defines the names
3164 * @param combinators the combinators containing the names to be resolved 3272 * @param combinators the combinators containing the names to be resolved
3165 */ 3273 */
3166 void resolveCombinators(LibraryElement library, NodeList<Combinator> combinato rs) { 3274 void resolveCombinators(LibraryElement library, NodeList<Combinator> combinato rs) {
3167 if (library == null) { 3275 if (library == null) {
3168 return; 3276 return;
3169 } 3277 }
3170 Namespace namespace = new NamespaceBuilder().createExportNamespace2(library) ; 3278 Namespace namespace = new NamespaceBuilder().createExportNamespace2(library) ;
3171 for (Combinator combinator in combinators) { 3279 for (Combinator combinator in combinators) {
3172 NodeList<SimpleIdentifier> names; 3280 NodeList<SimpleIdentifier> names;
3173 if (combinator is HideCombinator) { 3281 if (combinator is HideCombinator) {
3174 names = ((combinator as HideCombinator)).hiddenNames; 3282 names = ((combinator as HideCombinator)).hiddenNames;
3175 } else { 3283 } else {
3176 names = ((combinator as ShowCombinator)).shownNames; 3284 names = ((combinator as ShowCombinator)).shownNames;
3177 } 3285 }
3178 for (SimpleIdentifier name in names) { 3286 for (SimpleIdentifier name in names) {
3179 Element element = namespace.get(name.name); 3287 Element element = namespace.get(name.name);
3180 if (element != null) { 3288 if (element != null) {
3181 name.element = element; 3289 name.element = element;
3182 } 3290 }
3183 } 3291 }
3184 } 3292 }
3185 } 3293 }
3186 3294
3187 /** 3295 /**
3188 * Given an invocation of the form 'e.m(a1, ..., an)', resolve 'e.m' to the el ement being invoked. 3296 * Given an invocation of the form 'e.m(a1, ..., an)', resolve 'e.m' to the el ement being invoked.
3189 * If the returned element is a method, then the method will be invoked. If th e returned element 3297 * If the returned element is a method, then the method will be invoked. If th e returned element
3190 * is a getter, the getter will be invoked without arguments and the result of that invocation 3298 * is a getter, the getter will be invoked without arguments and the result of that invocation
3191 * will then be invoked with the arguments. 3299 * will then be invoked with the arguments.
3300 *
3192 * @param target the target of the invocation ('e') 3301 * @param target the target of the invocation ('e')
3193 * @param targetType the type of the target 3302 * @param targetType the type of the target
3194 * @param methodName the name of the method being invoked ('m') 3303 * @param methodName the name of the method being invoked ('m')
3195 * @return the element being invoked 3304 * @return the element being invoked
3196 */ 3305 */
3197 Element resolveInvokedElement(Expression target, Type2 targetType, SimpleIdent ifier methodName) { 3306 Element resolveInvokedElement(Expression target, Type2 targetType, SimpleIdent ifier methodName) {
3198 if (targetType is InterfaceType) { 3307 if (targetType is InterfaceType) {
3199 InterfaceType classType = targetType as InterfaceType; 3308 InterfaceType classType = targetType as InterfaceType;
3200 Element element = lookUpMethod(target, classType, methodName.name); 3309 Element element = lookUpMethod(target, classType, methodName.name);
3201 if (element == null) { 3310 if (element == null) {
3202 element = classType.getGetter(methodName.name); 3311 element = lookUpGetter(target, classType, methodName.name);
3203 } 3312 }
3204 return element; 3313 return element;
3205 } else if (target is SimpleIdentifier) { 3314 } else if (target is SimpleIdentifier) {
3206 Element targetElement = ((target as SimpleIdentifier)).element; 3315 Element targetElement = ((target as SimpleIdentifier)).element;
3207 if (targetElement is PrefixElement) { 3316 if (targetElement is PrefixElement) {
3208 String name = "${((target as SimpleIdentifier)).name}.${methodName}"; 3317 String name = "${((target as SimpleIdentifier)).name}.${methodName}";
3209 Identifier functionName = new ElementResolver_SyntheticIdentifier(name); 3318 Identifier functionName = new ElementResolver_SyntheticIdentifier(name);
3210 Element element = _resolver.nameScope.lookup(functionName, _resolver.def iningLibrary); 3319 Element element = _resolver.nameScope.lookup(functionName, _resolver.def iningLibrary);
3211 if (element != null) { 3320 if (element != null) {
3212 return element; 3321 return element;
3213 } 3322 }
3214 } 3323 }
3215 } 3324 }
3216 return null; 3325 return null;
3217 } 3326 }
3218 3327
3219 /** 3328 /**
3220 * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the elemen t being invoked. If 3329 * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the elemen t being invoked. If
3221 * the returned element is a method, then the method will be invoked. If the r eturned element is a 3330 * the returned element is a method, then the method will be invoked. If the r eturned element is a
3222 * getter, the getter will be invoked without arguments and the result of that invocation will 3331 * getter, the getter will be invoked without arguments and the result of that invocation will
3223 * then be invoked with the arguments. 3332 * then be invoked with the arguments.
3333 *
3224 * @param methodName the name of the method being invoked ('m') 3334 * @param methodName the name of the method being invoked ('m')
3225 * @return the element being invoked 3335 * @return the element being invoked
3226 */ 3336 */
3227 Element resolveInvokedElement2(SimpleIdentifier methodName) { 3337 Element resolveInvokedElement2(SimpleIdentifier methodName) {
3228 Element element = _resolver.nameScope.lookup(methodName, _resolver.definingL ibrary); 3338 Element element = _resolver.nameScope.lookup(methodName, _resolver.definingL ibrary);
3229 if (element == null) { 3339 if (element == null) {
3230 ClassElement enclosingClass = _resolver.enclosingClass; 3340 ClassElement enclosingClass = _resolver.enclosingClass;
3231 if (enclosingClass != null) { 3341 if (enclosingClass != null) {
3232 InterfaceType enclosingType = enclosingClass.type; 3342 InterfaceType enclosingType = enclosingClass.type;
3233 element = lookUpMethod(null, enclosingType, methodName.name); 3343 element = lookUpMethod(null, enclosingType, methodName.name);
3234 if (element == null) { 3344 if (element == null) {
3235 element = lookUpGetter(null, enclosingType, methodName.name); 3345 element = lookUpGetter(null, enclosingType, methodName.name);
3236 } 3346 }
3237 } 3347 }
3238 } 3348 }
3239 return element; 3349 return element;
3240 } 3350 }
3241 3351
3242 /** 3352 /**
3243 * Given that we are accessing a property of the given type with the given nam e, return the 3353 * Given that we are accessing a property of the given type with the given nam e, return the
3244 * element that represents the property. 3354 * element that represents the property.
3355 *
3245 * @param target the target of the invocation ('e') 3356 * @param target the target of the invocation ('e')
3246 * @param targetType the type in which the search for the property should begi n 3357 * @param targetType the type in which the search for the property should begi n
3247 * @param propertyName the name of the property being accessed 3358 * @param propertyName the name of the property being accessed
3248 * @return the element that represents the property 3359 * @return the element that represents the property
3249 */ 3360 */
3250 ExecutableElement resolveProperty(Expression target, Type2 targetType, SimpleI dentifier propertyName) { 3361 ExecutableElement resolveProperty(Expression target, Type2 targetType, SimpleI dentifier propertyName) {
3251 ExecutableElement memberElement = null; 3362 ExecutableElement memberElement = null;
3252 if (propertyName.inSetterContext()) { 3363 if (propertyName.inSetterContext()) {
3253 memberElement = lookUpSetter(target, targetType, propertyName.name); 3364 memberElement = lookUpSetter(target, targetType, propertyName.name);
3254 } 3365 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3289 _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, property Name, [propertyName.name]); 3400 _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, property Name, [propertyName.name]);
3290 } 3401 }
3291 } 3402 }
3292 } 3403 }
3293 } 3404 }
3294 3405
3295 /** 3406 /**
3296 * Resolve the given simple identifier if possible. Return the element to whic h it could be 3407 * Resolve the given simple identifier if possible. Return the element to whic h it could be
3297 * resolved, or `null` if it could not be resolved. This does not record the r esults of the 3408 * resolved, or `null` if it could not be resolved. This does not record the r esults of the
3298 * resolution. 3409 * resolution.
3410 *
3299 * @param node the identifier to be resolved 3411 * @param node the identifier to be resolved
3300 * @return the element to which the identifier could be resolved 3412 * @return the element to which the identifier could be resolved
3301 */ 3413 */
3302 Element resolveSimpleIdentifier(SimpleIdentifier node) { 3414 Element resolveSimpleIdentifier(SimpleIdentifier node) {
3303 Element element = _resolver.nameScope.lookup(node, _resolver.definingLibrary ); 3415 Element element = _resolver.nameScope.lookup(node, _resolver.definingLibrary );
3304 if (element is PropertyAccessorElement && node.inSetterContext()) { 3416 if (element is PropertyAccessorElement && node.inSetterContext()) {
3305 PropertyInducingElement variable = ((element as PropertyAccessorElement)). variable; 3417 PropertyInducingElement variable = ((element as PropertyAccessorElement)). variable;
3306 if (variable != null) { 3418 if (variable != null) {
3307 PropertyAccessorElement setter = variable.setter; 3419 PropertyAccessorElement setter = variable.setter;
3308 if (setter == null) { 3420 if (setter == null) {
(...skipping 21 matching lines...) Expand all
3330 if (element == null) { 3442 if (element == null) {
3331 element = lookUpMethod(null, enclosingType, node.name); 3443 element = lookUpMethod(null, enclosingType, node.name);
3332 } 3444 }
3333 } 3445 }
3334 return element; 3446 return element;
3335 } 3447 }
3336 3448
3337 /** 3449 /**
3338 * If the given type is a type variable, resolve it to the type that should be used when looking 3450 * If the given type is a type variable, resolve it to the type that should be used when looking
3339 * up members. Otherwise, return the original type. 3451 * up members. Otherwise, return the original type.
3452 *
3340 * @param type the type that is to be resolved if it is a type variable 3453 * @param type the type that is to be resolved if it is a type variable
3341 * @return the type that should be used in place of the argument if it is a ty pe variable, or the 3454 * @return the type that should be used in place of the argument if it is a ty pe variable, or the
3342 * original argument if it isn't a type variable 3455 * original argument if it isn't a type variable
3343 */ 3456 */
3344 Type2 resolveTypeVariable(Type2 type) { 3457 Type2 resolveTypeVariable(Type2 type) {
3345 if (type is TypeVariableType) { 3458 if (type is TypeVariableType) {
3346 Type2 bound = ((type as TypeVariableType)).element.bound; 3459 Type2 bound = ((type as TypeVariableType)).element.bound;
3347 if (bound == null) { 3460 if (bound == null) {
3348 return _resolver.typeProvider.objectType; 3461 return _resolver.typeProvider.objectType;
3349 } 3462 }
3350 return bound; 3463 return bound;
3351 } 3464 }
3352 return type; 3465 return type;
3353 } 3466 }
3354 3467
3355 /** 3468 /**
3356 * Return the propagated element if it is not `null`, or the static element if it is. 3469 * Return the propagated element if it is not `null`, or the static element if it is.
3470 *
3357 * @param staticElement the element computed using static type information 3471 * @param staticElement the element computed using static type information
3358 * @param propagatedElement the element computed using propagated type informa tion 3472 * @param propagatedElement the element computed using propagated type informa tion
3359 * @return the more specific of the two elements 3473 * @return the more specific of the two elements
3360 */ 3474 */
3361 ExecutableElement select(ExecutableElement staticElement, ExecutableElement pr opagatedElement) => propagatedElement != null ? propagatedElement : staticElemen t; 3475 ExecutableElement select(ExecutableElement staticElement, ExecutableElement pr opagatedElement) => propagatedElement != null ? propagatedElement : staticElemen t;
3362 3476
3363 /** 3477 /**
3364 * Return the propagated method if it is not `null`, or the static method if i t is. 3478 * Return the propagated method if it is not `null`, or the static method if i t is.
3479 *
3365 * @param staticMethod the method computed using static type information 3480 * @param staticMethod the method computed using static type information
3366 * @param propagatedMethod the method computed using propagated type informati on 3481 * @param propagatedMethod the method computed using propagated type informati on
3367 * @return the more specific of the two methods 3482 * @return the more specific of the two methods
3368 */ 3483 */
3369 MethodElement select2(MethodElement staticMethod, MethodElement propagatedMeth od) => propagatedMethod != null ? propagatedMethod : staticMethod; 3484 MethodElement select2(MethodElement staticMethod, MethodElement propagatedMeth od) => propagatedMethod != null ? propagatedMethod : staticMethod;
3370 3485
3371 /** 3486 /**
3372 * Given a node that can have annotations associated with it and the element t o which that node 3487 * Given a node that can have annotations associated with it and the element t o which that node
3373 * has been resolved, create the annotations in the element model representing the annotations on 3488 * has been resolved, create the annotations in the element model representing the annotations on
3374 * the node. 3489 * the node.
3490 *
3375 * @param element the element to which the node has been resolved 3491 * @param element the element to which the node has been resolved
3376 * @param node the node that can have annotations associated with it 3492 * @param node the node that can have annotations associated with it
3377 */ 3493 */
3378 void setMetadata(Element element, AnnotatedNode node) { 3494 void setMetadata(Element element, AnnotatedNode node) {
3379 if (element is! ElementImpl) { 3495 if (element is! ElementImpl) {
3380 return; 3496 return;
3381 } 3497 }
3382 List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl> (); 3498 List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl> ();
3383 addAnnotations(annotationList, node.metadata); 3499 addAnnotations(annotationList, node.metadata);
3384 if (node is VariableDeclaration && node.parent is VariableDeclarationList) { 3500 if (node is VariableDeclaration && node.parent is VariableDeclarationList) {
3385 VariableDeclarationList list = node.parent as VariableDeclarationList; 3501 VariableDeclarationList list = node.parent as VariableDeclarationList;
3386 addAnnotations(annotationList, list.metadata); 3502 addAnnotations(annotationList, list.metadata);
3387 if (list.parent is FieldDeclaration) { 3503 if (list.parent is FieldDeclaration) {
3388 FieldDeclaration fieldDeclaration = list.parent as FieldDeclaration; 3504 FieldDeclaration fieldDeclaration = list.parent as FieldDeclaration;
3389 addAnnotations(annotationList, fieldDeclaration.metadata); 3505 addAnnotations(annotationList, fieldDeclaration.metadata);
3390 } else if (list.parent is TopLevelVariableDeclaration) { 3506 } else if (list.parent is TopLevelVariableDeclaration) {
3391 TopLevelVariableDeclaration variableDeclaration = list.parent as TopLeve lVariableDeclaration; 3507 TopLevelVariableDeclaration variableDeclaration = list.parent as TopLeve lVariableDeclaration;
3392 addAnnotations(annotationList, variableDeclaration.metadata); 3508 addAnnotations(annotationList, variableDeclaration.metadata);
3393 } 3509 }
3394 } 3510 }
3395 if (!annotationList.isEmpty) { 3511 if (!annotationList.isEmpty) {
3396 ((element as ElementImpl)).metadata = new List.from(annotationList); 3512 ((element as ElementImpl)).metadata = new List.from(annotationList);
3397 } 3513 }
3398 } 3514 }
3399 3515
3400 /** 3516 /**
3401 * Return `true` if we should report an error as a result of looking up a memb er in the 3517 * Return `true` if we should report an error as a result of looking up a memb er in the
3402 * given type and not finding any member. 3518 * given type and not finding any member.
3519 *
3403 * @param type the type in which we attempted to perform the look-up 3520 * @param type the type in which we attempted to perform the look-up
3404 * @param member the result of the look-up 3521 * @param member the result of the look-up
3405 * @return `true` if we should report an error 3522 * @return `true` if we should report an error
3406 */ 3523 */
3407 bool shouldReportMissingMember(Type2 type, ExecutableElement member) { 3524 bool shouldReportMissingMember(Type2 type, ExecutableElement member) {
3408 if (member != null || type == null || type.isDynamic) { 3525 if (member != null || type == null || type.isDynamic) {
3409 return false; 3526 return false;
3410 } 3527 }
3411 if (type is InterfaceType) { 3528 if (type is InterfaceType) {
3412 return !classDeclaresNoSuchMethod(((type as InterfaceType)).element); 3529 return !classDeclaresNoSuchMethod(((type as InterfaceType)).element);
3413 } 3530 }
3414 return true; 3531 return true;
3415 } 3532 }
3416 } 3533 }
3417 /** 3534 /**
3418 * Instances of the class `SyntheticIdentifier` implement an identifier that can be used to 3535 * Instances of the class `SyntheticIdentifier` implement an identifier that can be used to
3419 * look up names in the lexical scope when there is no identifier in the AST str ucture. There is 3536 * look up names in the lexical scope when there is no identifier in the AST str ucture. There is
3420 * no identifier in the AST when the parser could not distinguish between a meth od invocation and 3537 * no identifier in the AST when the parser could not distinguish between a meth od invocation and
3421 * an invocation of a top-level function imported with a prefix. 3538 * an invocation of a top-level function imported with a prefix.
3422 */ 3539 */
3423 class ElementResolver_SyntheticIdentifier extends Identifier { 3540 class ElementResolver_SyntheticIdentifier extends Identifier {
3424 3541
3425 /** 3542 /**
3426 * The name of the synthetic identifier. 3543 * The name of the synthetic identifier.
3427 */ 3544 */
3428 String _name; 3545 String _name;
3429 3546
3430 /** 3547 /**
3431 * Initialize a newly created synthetic identifier to have the given name. 3548 * Initialize a newly created synthetic identifier to have the given name.
3549 *
3432 * @param name the name of the synthetic identifier 3550 * @param name the name of the synthetic identifier
3433 */ 3551 */
3434 ElementResolver_SyntheticIdentifier(String name) { 3552 ElementResolver_SyntheticIdentifier(String name) {
3435 this._name = name; 3553 this._name = name;
3436 } 3554 }
3437 accept(ASTVisitor visitor) => null; 3555 accept(ASTVisitor visitor) => null;
3438 sc.Token get beginToken => null; 3556 sc.Token get beginToken => null;
3439 Element get element => null; 3557 Element get element => null;
3440 sc.Token get endToken => null; 3558 sc.Token get endToken => null;
3441 String get name => _name; 3559 String get name => _name;
3442 Element get staticElement => null; 3560 Element get staticElement => null;
3443 void visitChildren(ASTVisitor<Object> visitor) { 3561 void visitChildren(ASTVisitor<Object> visitor) {
3444 } 3562 }
3445 } 3563 }
3446 /** 3564 /**
3447 * Instances of the class `InheritanceManager` manage the knowledge of where cla ss members 3565 * Instances of the class `InheritanceManager` manage the knowledge of where cla ss members
3448 * (methods, getters & setters) are inherited from. 3566 * (methods, getters & setters) are inherited from.
3567 *
3449 * @coverage dart.engine.resolver 3568 * @coverage dart.engine.resolver
3450 */ 3569 */
3451 class InheritanceManager { 3570 class InheritanceManager {
3452 3571
3453 /** 3572 /**
3454 * The [LibraryElement] that is managed by this manager. 3573 * The [LibraryElement] that is managed by this manager.
3455 */ 3574 */
3456 LibraryElement _library; 3575 LibraryElement _library;
3457 3576
3458 /** 3577 /**
3459 * This is a mapping between each [ClassElement] and a map between the [String ] member 3578 * This is a mapping between each [ClassElement] and a map between the [String ] member
3460 * names and the associated [ExecutableElement] in the mixin and superclass ch ain. 3579 * names and the associated [ExecutableElement] in the mixin and superclass ch ain.
3461 */ 3580 */
3462 Map<ClassElement, Map<String, ExecutableElement>> _classLookup; 3581 Map<ClassElement, Map<String, ExecutableElement>> _classLookup;
3463 3582
3464 /** 3583 /**
3465 * This is a mapping between each [ClassElement] and a map between the [String ] member 3584 * This is a mapping between each [ClassElement] and a map between the [String ] member
3466 * names and the associated [ExecutableElement] in the interface set. 3585 * names and the associated [ExecutableElement] in the interface set.
3467 */ 3586 */
3468 Map<ClassElement, Map<String, ExecutableElement>> _interfaceLookup; 3587 Map<ClassElement, Map<String, ExecutableElement>> _interfaceLookup;
3469 3588
3470 /** 3589 /**
3471 * A map between each visited [ClassElement] and the set of [AnalysisError]s f ound on 3590 * A map between each visited [ClassElement] and the set of [AnalysisError]s f ound on
3472 * the class element. 3591 * the class element.
3473 */ 3592 */
3474 Map<ClassElement, Set<AnalysisError>> _errorsInClassElement = new Map<ClassEle ment, Set<AnalysisError>>(); 3593 Map<ClassElement, Set<AnalysisError>> _errorsInClassElement = new Map<ClassEle ment, Set<AnalysisError>>();
3475 3594
3476 /** 3595 /**
3477 * Initialize a newly created inheritance manager. 3596 * Initialize a newly created inheritance manager.
3597 *
3478 * @param library the library element context that the inheritance mappings ar e being generated 3598 * @param library the library element context that the inheritance mappings ar e being generated
3479 */ 3599 */
3480 InheritanceManager(LibraryElement library) { 3600 InheritanceManager(LibraryElement library) {
3481 this._library = library; 3601 this._library = library;
3482 _classLookup = new Map<ClassElement, Map<String, ExecutableElement>>(); 3602 _classLookup = new Map<ClassElement, Map<String, ExecutableElement>>();
3483 _interfaceLookup = new Map<ClassElement, Map<String, ExecutableElement>>(); 3603 _interfaceLookup = new Map<ClassElement, Map<String, ExecutableElement>>();
3484 } 3604 }
3485 3605
3486 /** 3606 /**
3487 * Return the set of [AnalysisError]s found on the passed [ClassElement], or`n ull` if there are none. 3607 * Return the set of [AnalysisError]s found on the passed [ClassElement], or
3608 * `null` if there are none.
3609 *
3488 * @param classElt the class element to query 3610 * @param classElt the class element to query
3489 * @return the set of [AnalysisError]s found on the passed [ClassElement], or` null` if there are none 3611 * @return the set of [AnalysisError]s found on the passed [ClassElement], or
3612 * `null` if there are none
3490 */ 3613 */
3491 Set<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[c lassElt]; 3614 Set<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[c lassElt];
3492 3615
3493 /** 3616 /**
3494 * Get and return a mapping between the set of all string names of the members inherited from the 3617 * Get and return a mapping between the set of all string names of the members inherited from the
3495 * passed [ClassElement] superclass hierarchy, and the associated [ExecutableE lement]. 3618 * passed [ClassElement] superclass hierarchy, and the associated [ExecutableE lement].
3619 *
3496 * @param classElt the class element to query 3620 * @param classElt the class element to query
3497 * @return a mapping between the set of all members inherited from the passed [ClassElement]superclass hierarchy, and the associated [ExecutableElement] 3621 * @return a mapping between the set of all members inherited from the passed [ClassElement]
3622 * superclass hierarchy, and the associated [ExecutableElement]
3498 */ 3623 */
3499 Map<String, ExecutableElement> getMapOfMembersInheritedFromClasses(ClassElemen t classElt) => computeClassChainLookupMap(classElt, new Set<ClassElement>()); 3624 Map<String, ExecutableElement> getMapOfMembersInheritedFromClasses(ClassElemen t classElt) => computeClassChainLookupMap(classElt, new Set<ClassElement>());
3500 3625
3501 /** 3626 /**
3502 * Get and return a mapping between the set of all string names of the members inherited from the 3627 * Get and return a mapping between the set of all string names of the members inherited from the
3503 * passed [ClassElement] interface hierarchy, and the associated [ExecutableEl ement]. 3628 * passed [ClassElement] interface hierarchy, and the associated [ExecutableEl ement].
3629 *
3504 * @param classElt the class element to query 3630 * @param classElt the class element to query
3505 * @return a mapping between the set of all string names of the members inheri ted from the passed[ClassElement] interface hierarchy, and the associated [Execu tableElement]. 3631 * @return a mapping between the set of all string names of the members inheri ted from the passed
3632 * [ClassElement] interface hierarchy, and the associated [ExecutableE lement].
3506 */ 3633 */
3507 Map<String, ExecutableElement> getMapOfMembersInheritedFromInterfaces(ClassEle ment classElt) => computeInterfaceLookupMap(classElt, new Set<ClassElement>()); 3634 Map<String, ExecutableElement> getMapOfMembersInheritedFromInterfaces(ClassEle ment classElt) => computeInterfaceLookupMap(classElt, new Set<ClassElement>());
3508 3635
3509 /** 3636 /**
3510 * Given some [ClassElement class element] and some member name, this returns the[ExecutableElement executable element] that the class inherits from the mixin s, 3637 * Given some [ClassElement] and some member name, this returns the
3638 * [ExecutableElement] that the class inherits from the mixins,
3511 * superclasses or interfaces, that has the member name, if no member is inher ited `null` is 3639 * superclasses or interfaces, that has the member name, if no member is inher ited `null` is
3512 * returned. 3640 * returned.
3641 *
3513 * @param classElt the class element to query 3642 * @param classElt the class element to query
3514 * @param memberName the name of the executable element to find and return 3643 * @param memberName the name of the executable element to find and return
3515 * @return the inherited executable element with the member name, or `null` if no such 3644 * @return the inherited executable element with the member name, or `null` if no such
3516 * member exists 3645 * member exists
3517 */ 3646 */
3518 ExecutableElement lookupInheritance(ClassElement classElt, String memberName) { 3647 ExecutableElement lookupInheritance(ClassElement classElt, String memberName) {
3519 if (memberName == null || memberName.isEmpty) { 3648 if (memberName == null || memberName.isEmpty) {
3520 return null; 3649 return null;
3521 } 3650 }
3522 ExecutableElement executable = computeClassChainLookupMap(classElt, new Set< ClassElement>())[memberName]; 3651 ExecutableElement executable = computeClassChainLookupMap(classElt, new Set< ClassElement>())[memberName];
3523 if (executable == null) { 3652 if (executable == null) {
3524 return computeInterfaceLookupMap(classElt, new Set<ClassElement>())[member Name]; 3653 return computeInterfaceLookupMap(classElt, new Set<ClassElement>())[member Name];
3525 } 3654 }
3526 return executable; 3655 return executable;
3527 } 3656 }
3528 3657
3529 /** 3658 /**
3530 * Given some [ClassElement class element] and some member name, this returns the[ExecutableElement executable element] that the class either declares itself, or 3659 * Given some [ClassElement] and some member name, this returns the
3660 * [ExecutableElement] that the class either declares itself, or
3531 * inherits, that has the member name, if no member is inherited `null` is ret urned. 3661 * inherits, that has the member name, if no member is inherited `null` is ret urned.
3662 *
3532 * @param classElt the class element to query 3663 * @param classElt the class element to query
3533 * @param memberName the name of the executable element to find and return 3664 * @param memberName the name of the executable element to find and return
3534 * @return the inherited executable element with the member name, or `null` if no such 3665 * @return the inherited executable element with the member name, or `null` if no such
3535 * member exists 3666 * member exists
3536 */ 3667 */
3537 ExecutableElement lookupMember(ClassElement classElt, String memberName) { 3668 ExecutableElement lookupMember(ClassElement classElt, String memberName) {
3538 ExecutableElement element = lookupMemberInClass(classElt, memberName); 3669 ExecutableElement element = lookupMemberInClass(classElt, memberName);
3539 if (element != null) { 3670 if (element != null) {
3540 return element; 3671 return element;
3541 } 3672 }
3542 return lookupInheritance(classElt, memberName); 3673 return lookupInheritance(classElt, memberName);
3543 } 3674 }
3544 3675
3545 /** 3676 /**
3546 * Set the new library element context. 3677 * Set the new library element context.
3678 *
3547 * @param library the new library element 3679 * @param library the new library element
3548 */ 3680 */
3549 void set libraryElement(LibraryElement library2) { 3681 void set libraryElement(LibraryElement library2) {
3550 this._library = library2; 3682 this._library = library2;
3551 } 3683 }
3552 3684
3553 /** 3685 /**
3554 * This method takes some inherited [FunctionType], and resolves all the param eterized types 3686 * This method takes some inherited [FunctionType], and resolves all the param eterized types
3555 * in the function type, dependent on the class in which it is being overridde n. 3687 * in the function type, dependent on the class in which it is being overridde n.
3688 *
3556 * @param baseFunctionType the function type that is being overridden 3689 * @param baseFunctionType the function type that is being overridden
3557 * @param memberName the name of the member, this is used to lookup the inheri tance path of the 3690 * @param memberName the name of the member, this is used to lookup the inheri tance path of the
3558 * override 3691 * override
3559 * @param definingType the type that is overriding the member 3692 * @param definingType the type that is overriding the member
3560 * @return the passed function type with any parameterized types substituted 3693 * @return the passed function type with any parameterized types substituted
3561 */ 3694 */
3562 FunctionType substituteTypeArgumentsInMemberFromInheritance(FunctionType baseF unctionType, String memberName, InterfaceType definingType) { 3695 FunctionType substituteTypeArgumentsInMemberFromInheritance(FunctionType baseF unctionType, String memberName, InterfaceType definingType) {
3563 if (baseFunctionType == null) { 3696 if (baseFunctionType == null) {
3564 return baseFunctionType; 3697 return baseFunctionType;
3565 } 3698 }
3566 Queue<InterfaceType> inheritancePath = new Queue<InterfaceType>(); 3699 Queue<InterfaceType> inheritancePath = new Queue<InterfaceType>();
3567 computeInheritancePath(inheritancePath, definingType, memberName); 3700 computeInheritancePath(inheritancePath, definingType, memberName);
3568 if (inheritancePath == null || inheritancePath.length < 2) { 3701 if (inheritancePath == null || inheritancePath.length < 2) {
3569 return baseFunctionType; 3702 return baseFunctionType;
3570 } 3703 }
3571 FunctionType functionTypeToReturn = baseFunctionType; 3704 FunctionType functionTypeToReturn = baseFunctionType;
3572 InterfaceType lastType = inheritancePath.removeLast(); 3705 InterfaceType lastType = inheritancePath.removeLast();
3573 while (inheritancePath.length > 0) { 3706 while (inheritancePath.length > 0) {
3574 List<Type2> parameterTypes = lastType.element.type.typeArguments; 3707 List<Type2> parameterTypes = lastType.element.type.typeArguments;
3575 List<Type2> argumentTypes = lastType.typeArguments; 3708 List<Type2> argumentTypes = lastType.typeArguments;
3576 functionTypeToReturn = functionTypeToReturn.substitute2(argumentTypes, par ameterTypes); 3709 functionTypeToReturn = functionTypeToReturn.substitute2(argumentTypes, par ameterTypes);
3577 lastType = inheritancePath.removeLast(); 3710 lastType = inheritancePath.removeLast();
3578 } 3711 }
3579 return functionTypeToReturn; 3712 return functionTypeToReturn;
3580 } 3713 }
3581 3714
3582 /** 3715 /**
3583 * Compute and return a mapping between the set of all string names of the mem bers inherited from 3716 * Compute and return a mapping between the set of all string names of the mem bers inherited from
3584 * the passed [ClassElement] superclass hierarchy, and the associated[Executab leElement]. 3717 * the passed [ClassElement] superclass hierarchy, and the associated
3718 * [ExecutableElement].
3719 *
3585 * @param classElt the class element to query 3720 * @param classElt the class element to query
3586 * @param visitedClasses a set of visited classes passed back into this method when it calls 3721 * @param visitedClasses a set of visited classes passed back into this method when it calls
3587 * itself recursively 3722 * itself recursively
3588 * @return a mapping between the set of all string names of the members inheri ted from the passed[ClassElement] superclass hierarchy, and the associated [Exec utableElement] 3723 * @return a mapping between the set of all string names of the members inheri ted from the passed
3724 * [ClassElement] superclass hierarchy, and the associated [Executable Element]
3589 */ 3725 */
3590 Map<String, ExecutableElement> computeClassChainLookupMap(ClassElement classEl t, Set<ClassElement> visitedClasses) { 3726 Map<String, ExecutableElement> computeClassChainLookupMap(ClassElement classEl t, Set<ClassElement> visitedClasses) {
3591 Map<String, ExecutableElement> resultMap = _classLookup[classElt]; 3727 Map<String, ExecutableElement> resultMap = _classLookup[classElt];
3592 if (resultMap != null) { 3728 if (resultMap != null) {
3593 return resultMap; 3729 return resultMap;
3594 } else { 3730 } else {
3595 resultMap = new Map<String, ExecutableElement>(); 3731 resultMap = new Map<String, ExecutableElement>();
3596 } 3732 }
3597 ClassElement superclassElt = null; 3733 ClassElement superclassElt = null;
3598 InterfaceType supertype = classElt.supertype; 3734 InterfaceType supertype = classElt.supertype;
(...skipping 20 matching lines...) Expand all
3619 recordMapWithClassMembers(resultMap, mixinElement); 3755 recordMapWithClassMembers(resultMap, mixinElement);
3620 } 3756 }
3621 } 3757 }
3622 _classLookup[classElt] = resultMap; 3758 _classLookup[classElt] = resultMap;
3623 return resultMap; 3759 return resultMap;
3624 } 3760 }
3625 3761
3626 /** 3762 /**
3627 * Compute and return the inheritance path given the context of a type and a m ember that is 3763 * Compute and return the inheritance path given the context of a type and a m ember that is
3628 * overridden in the inheritance path (for which the type is in the path). 3764 * overridden in the inheritance path (for which the type is in the path).
3765 *
3629 * @param chain the inheritance path that is built up as this method calls its elf recursively, 3766 * @param chain the inheritance path that is built up as this method calls its elf recursively,
3630 * when this method is called an empty [LinkedList] should be provided 3767 * when this method is called an empty [LinkedList] should be provide d
3631 * @param currentType the current type in the inheritance path 3768 * @param currentType the current type in the inheritance path
3632 * @param memberName the name of the member that is being looked up the inheri tance path 3769 * @param memberName the name of the member that is being looked up the inheri tance path
3633 */ 3770 */
3634 void computeInheritancePath(Queue<InterfaceType> chain, InterfaceType currentT ype, String memberName) { 3771 void computeInheritancePath(Queue<InterfaceType> chain, InterfaceType currentT ype, String memberName) {
3635 chain.add(currentType); 3772 chain.add(currentType);
3636 ClassElement classElt = currentType.element; 3773 ClassElement classElt = currentType.element;
3637 InterfaceType supertype = classElt.supertype; 3774 InterfaceType supertype = classElt.supertype;
3638 if (supertype == null) { 3775 if (supertype == null) {
3639 return; 3776 return;
3640 } 3777 }
(...skipping 23 matching lines...) Expand all
3664 ClassElement interfaceElement = interfaceType.element; 3801 ClassElement interfaceElement = interfaceType.element;
3665 if (interfaceElement != null && lookupMember(interfaceElement, memberName) != null) { 3802 if (interfaceElement != null && lookupMember(interfaceElement, memberName) != null) {
3666 computeInheritancePath(chain, interfaceType, memberName); 3803 computeInheritancePath(chain, interfaceType, memberName);
3667 return; 3804 return;
3668 } 3805 }
3669 } 3806 }
3670 } 3807 }
3671 3808
3672 /** 3809 /**
3673 * Compute and return a mapping between the set of all string names of the mem bers inherited from 3810 * Compute and return a mapping between the set of all string names of the mem bers inherited from
3674 * the passed [ClassElement] interface hierarchy, and the associated[Executabl eElement]. 3811 * the passed [ClassElement] interface hierarchy, and the associated
3812 * [ExecutableElement].
3813 *
3675 * @param classElt the class element to query 3814 * @param classElt the class element to query
3676 * @param visitedInterfaces a set of visited classes passed back into this met hod when it calls 3815 * @param visitedInterfaces a set of visited classes passed back into this met hod when it calls
3677 * itself recursively 3816 * itself recursively
3678 * @return a mapping between the set of all string names of the members inheri ted from the passed[ClassElement] interface hierarchy, and the associated [Execu tableElement] 3817 * @return a mapping between the set of all string names of the members inheri ted from the passed
3818 * [ClassElement] interface hierarchy, and the associated [ExecutableE lement]
3679 */ 3819 */
3680 Map<String, ExecutableElement> computeInterfaceLookupMap(ClassElement classElt , Set<ClassElement> visitedInterfaces) { 3820 Map<String, ExecutableElement> computeInterfaceLookupMap(ClassElement classElt , Set<ClassElement> visitedInterfaces) {
3681 Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt]; 3821 Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt];
3682 if (resultMap != null) { 3822 if (resultMap != null) {
3683 return resultMap; 3823 return resultMap;
3684 } else { 3824 } else {
3685 resultMap = new Map<String, ExecutableElement>(); 3825 resultMap = new Map<String, ExecutableElement>();
3686 } 3826 }
3687 InterfaceType supertype = classElt.supertype; 3827 InterfaceType supertype = classElt.supertype;
3688 ClassElement superclassElement = supertype != null ? supertype.element : nul l; 3828 ClassElement superclassElement = supertype != null ? supertype.element : nul l;
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3869 } 4009 }
3870 } 4010 }
3871 _interfaceLookup[classElt] = resultMap; 4011 _interfaceLookup[classElt] = resultMap;
3872 return resultMap; 4012 return resultMap;
3873 } 4013 }
3874 4014
3875 /** 4015 /**
3876 * Given some [ClassElement], this method finds and returns the [ExecutableEle ment] of 4016 * Given some [ClassElement], this method finds and returns the [ExecutableEle ment] of
3877 * the passed name in the class element. Static members, members in super type s and members not 4017 * the passed name in the class element. Static members, members in super type s and members not
3878 * accessible from the current library are not considered. 4018 * accessible from the current library are not considered.
4019 *
3879 * @param classElt the class element to query 4020 * @param classElt the class element to query
3880 * @param memberName the name of the member to lookup in the class 4021 * @param memberName the name of the member to lookup in the class
3881 * @return the found [ExecutableElement], or `null` if no such member was foun d 4022 * @return the found [ExecutableElement], or `null` if no such member was foun d
3882 */ 4023 */
3883 ExecutableElement lookupMemberInClass(ClassElement classElt, String memberName ) { 4024 ExecutableElement lookupMemberInClass(ClassElement classElt, String memberName ) {
3884 List<MethodElement> methods = classElt.methods; 4025 List<MethodElement> methods = classElt.methods;
3885 for (MethodElement method in methods) { 4026 for (MethodElement method in methods) {
3886 if (memberName == method.name && method.isAccessibleIn(_library) && !metho d.isStatic) { 4027 if (memberName == method.name && method.isAccessibleIn(_library) && !metho d.isStatic) {
3887 return method; 4028 return method;
3888 } 4029 }
3889 } 4030 }
3890 List<PropertyAccessorElement> accessors = classElt.accessors; 4031 List<PropertyAccessorElement> accessors = classElt.accessors;
3891 for (PropertyAccessorElement accessor in accessors) { 4032 for (PropertyAccessorElement accessor in accessors) {
3892 if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !a ccessor.isStatic) { 4033 if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !a ccessor.isStatic) {
3893 return accessor; 4034 return accessor;
3894 } 4035 }
3895 } 4036 }
3896 return null; 4037 return null;
3897 } 4038 }
3898 4039
3899 /** 4040 /**
3900 * Record the passed map with the set of all members (methods, getters and set ters) in the class 4041 * Record the passed map with the set of all members (methods, getters and set ters) in the class
3901 * into the passed map. 4042 * into the passed map.
4043 *
3902 * @param map some non-`null` 4044 * @param map some non-`null`
3903 * @param classElt the class element that will be recorded into the passed map 4045 * @param classElt the class element that will be recorded into the passed map
3904 */ 4046 */
3905 void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElemen t classElt) { 4047 void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElemen t classElt) {
3906 List<MethodElement> methods = classElt.methods; 4048 List<MethodElement> methods = classElt.methods;
3907 for (MethodElement method in methods) { 4049 for (MethodElement method in methods) {
3908 if (method.isAccessibleIn(_library) && !method.isStatic) { 4050 if (method.isAccessibleIn(_library) && !method.isStatic) {
3909 map[method.name] = method; 4051 map[method.name] = method;
3910 } 4052 }
3911 } 4053 }
3912 List<PropertyAccessorElement> accessors = classElt.accessors; 4054 List<PropertyAccessorElement> accessors = classElt.accessors;
3913 for (PropertyAccessorElement accessor in accessors) { 4055 for (PropertyAccessorElement accessor in accessors) {
3914 if (accessor.isAccessibleIn(_library) && !accessor.isStatic) { 4056 if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
3915 map[accessor.name] = accessor; 4057 map[accessor.name] = accessor;
3916 } 4058 }
3917 } 4059 }
3918 } 4060 }
3919 4061
3920 /** 4062 /**
3921 * This method is used to report errors on when they are found computing inher itance information. 4063 * This method is used to report errors on when they are found computing inher itance information.
3922 * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where thes e generated 4064 * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where thes e generated
3923 * error codes are reported back into the analysis engine. 4065 * error codes are reported back into the analysis engine.
4066 *
3924 * @param classElt the location of the source for which the exception occurred 4067 * @param classElt the location of the source for which the exception occurred
3925 * @param offset the offset of the location of the error 4068 * @param offset the offset of the location of the error
3926 * @param length the length of the location of the error 4069 * @param length the length of the location of the error
3927 * @param errorCode the error code to be associated with this error 4070 * @param errorCode the error code to be associated with this error
3928 * @param arguments the arguments used to build the error message 4071 * @param arguments the arguments used to build the error message
3929 */ 4072 */
3930 void reportError(ClassElement classElt, int offset, int length, ErrorCode erro rCode, List<Object> arguments) { 4073 void reportError(ClassElement classElt, int offset, int length, ErrorCode erro rCode, List<Object> arguments) {
3931 Set<AnalysisError> errorSet = _errorsInClassElement[classElt]; 4074 Set<AnalysisError> errorSet = _errorsInClassElement[classElt];
3932 if (errorSet == null) { 4075 if (errorSet == null) {
3933 errorSet = new Set<AnalysisError>(); 4076 errorSet = new Set<AnalysisError>();
3934 _errorsInClassElement[classElt] = errorSet; 4077 _errorsInClassElement[classElt] = errorSet;
3935 } 4078 }
3936 javaSetAdd(errorSet, new AnalysisError.con2(classElt.source, offset, length, errorCode, arguments)); 4079 javaSetAdd(errorSet, new AnalysisError.con2(classElt.source, offset, length, errorCode, arguments));
3937 } 4080 }
3938 } 4081 }
3939 /** 4082 /**
3940 * Instances of the class `Library` represent the data about a single library du ring the 4083 * Instances of the class `Library` represent the data about a single library du ring the
3941 * resolution of some (possibly different) library. They are not intended to be used except during 4084 * resolution of some (possibly different) library. They are not intended to be used except during
3942 * the resolution process. 4085 * the resolution process.
4086 *
3943 * @coverage dart.engine.resolver 4087 * @coverage dart.engine.resolver
3944 */ 4088 */
3945 class Library { 4089 class Library {
3946 4090
3947 /** 4091 /**
3948 * The analysis context in which this library is being analyzed. 4092 * The analysis context in which this library is being analyzed.
3949 */ 4093 */
3950 InternalAnalysisContext _analysisContext; 4094 InternalAnalysisContext _analysisContext;
3951 4095
3952 /** 4096 /**
(...skipping 12 matching lines...) Expand all
3965 Source _librarySource; 4109 Source _librarySource;
3966 4110
3967 /** 4111 /**
3968 * The library element representing this library. 4112 * The library element representing this library.
3969 */ 4113 */
3970 LibraryElementImpl _libraryElement; 4114 LibraryElementImpl _libraryElement;
3971 4115
3972 /** 4116 /**
3973 * A list containing all of the libraries that are imported into this library. 4117 * A list containing all of the libraries that are imported into this library.
3974 */ 4118 */
3975 Map<ImportDirective, Library> _importedLibraries = new Map<ImportDirective, Li brary>(); 4119 List<Library> _importedLibraries = _EMPTY_ARRAY;
3976 4120
3977 /** 4121 /**
3978 * A table mapping URI-based directive to the actual URI value. 4122 * A table mapping URI-based directive to the actual URI value.
3979 */ 4123 */
3980 Map<UriBasedDirective, String> _directiveUris = new Map<UriBasedDirective, Str ing>(); 4124 Map<UriBasedDirective, String> _directiveUris = new Map<UriBasedDirective, Str ing>();
3981 4125
3982 /** 4126 /**
3983 * A flag indicating whether this library explicitly imports core. 4127 * A flag indicating whether this library explicitly imports core.
3984 */ 4128 */
3985 bool _explicitlyImportsCore = false; 4129 bool _explicitlyImportsCore = false;
3986 4130
3987 /** 4131 /**
3988 * A list containing all of the libraries that are exported from this library. 4132 * A list containing all of the libraries that are exported from this library.
3989 */ 4133 */
3990 Map<ExportDirective, Library> _exportedLibraries = new Map<ExportDirective, Li brary>(); 4134 List<Library> _exportedLibraries = _EMPTY_ARRAY;
3991 4135
3992 /** 4136 /**
3993 * A table mapping the sources for the compilation units in this library to th eir corresponding 4137 * A table mapping the sources for the compilation units in this library to th eir corresponding
3994 * AST structures. 4138 * AST structures.
3995 */ 4139 */
3996 Map<Source, CompilationUnit> _astMap = new Map<Source, CompilationUnit>(); 4140 Map<Source, CompilationUnit> _astMap = new Map<Source, CompilationUnit>();
3997 4141
3998 /** 4142 /**
3999 * The library scope used when resolving elements within this library's compil ation units. 4143 * The library scope used when resolving elements within this library's compil ation units.
4000 */ 4144 */
4001 LibraryScope _libraryScope; 4145 LibraryScope _libraryScope;
4002 4146
4003 /** 4147 /**
4148 * An empty array that can be used to initialize lists of libraries.
4149 */
4150 static List<Library> _EMPTY_ARRAY = new List<Library>(0);
4151
4152 /**
4004 * Initialize a newly created data holder that can maintain the data associate d with a library. 4153 * Initialize a newly created data holder that can maintain the data associate d with a library.
4154 *
4005 * @param analysisContext the analysis context in which this library is being analyzed 4155 * @param analysisContext the analysis context in which this library is being analyzed
4006 * @param errorListener the listener to which analysis errors will be reported 4156 * @param errorListener the listener to which analysis errors will be reported
4007 * @param librarySource the source specifying the defining compilation unit of this library 4157 * @param librarySource the source specifying the defining compilation unit of this library
4008 */ 4158 */
4009 Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorLi stener, Source librarySource) { 4159 Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorLi stener, Source librarySource) {
4010 this._analysisContext = analysisContext; 4160 this._analysisContext = analysisContext;
4011 this._errorListener = errorListener; 4161 this._errorListener = errorListener;
4012 this._librarySource = librarySource; 4162 this._librarySource = librarySource;
4013 this._libraryElement = analysisContext.getLibraryElement(librarySource) as L ibraryElementImpl; 4163 this._libraryElement = analysisContext.getLibraryElement(librarySource) as L ibraryElementImpl;
4014 } 4164 }
4015 4165
4016 /** 4166 /**
4017 * Record that the given library is exported from this library.
4018 * @param importLibrary the library that is exported from this library
4019 */
4020 void addExport(ExportDirective directive, Library exportLibrary) {
4021 _exportedLibraries[directive] = exportLibrary;
4022 }
4023
4024 /**
4025 * Record that the given library is imported into this library.
4026 * @param importLibrary the library that is imported into this library
4027 */
4028 void addImport(ImportDirective directive, Library importLibrary) {
4029 _importedLibraries[directive] = importLibrary;
4030 }
4031
4032 /**
4033 * Return the AST structure associated with the given source. 4167 * Return the AST structure associated with the given source.
4168 *
4034 * @param source the source representing the compilation unit whose AST is to be returned 4169 * @param source the source representing the compilation unit whose AST is to be returned
4035 * @return the AST structure associated with the given source 4170 * @return the AST structure associated with the given source
4036 * @throws AnalysisException if an AST structure could not be created for the compilation unit 4171 * @throws AnalysisException if an AST structure could not be created for the compilation unit
4037 */ 4172 */
4038 CompilationUnit getAST(Source source) { 4173 CompilationUnit getAST(Source source) {
4039 CompilationUnit unit = _astMap[source]; 4174 CompilationUnit unit = _astMap[source];
4040 if (unit == null) { 4175 if (unit == null) {
4041 unit = _analysisContext.computeResolvableCompilationUnit(source); 4176 unit = _analysisContext.computeResolvableCompilationUnit(source);
4042 _astMap[source] = unit; 4177 _astMap[source] = unit;
4043 } 4178 }
4044 return unit; 4179 return unit;
4045 } 4180 }
4046 4181
4047 /** 4182 /**
4048 * Return a collection containing the sources for the compilation units in thi s library, including 4183 * Return a collection containing the sources for the compilation units in thi s library, including
4049 * the defining compilation unit. 4184 * the defining compilation unit.
4185 *
4050 * @return the sources for the compilation units in this library 4186 * @return the sources for the compilation units in this library
4051 */ 4187 */
4052 Set<Source> get compilationUnitSources => _astMap.keys.toSet(); 4188 Set<Source> get compilationUnitSources => _astMap.keys.toSet();
4053 4189
4054 /** 4190 /**
4055 * Return the AST structure associated with the defining compilation unit for this library. 4191 * Return the AST structure associated with the defining compilation unit for this library.
4192 *
4056 * @return the AST structure associated with the defining compilation unit for this library 4193 * @return the AST structure associated with the defining compilation unit for this library
4057 * @throws AnalysisException if an AST structure could not be created for the defining compilation 4194 * @throws AnalysisException if an AST structure could not be created for the defining compilation
4058 * unit 4195 * unit
4059 */ 4196 */
4060 CompilationUnit get definingCompilationUnit => getAST(librarySource); 4197 CompilationUnit get definingCompilationUnit => getAST(librarySource);
4061 4198
4062 /** 4199 /**
4063 * Return `true` if this library explicitly imports core. 4200 * Return `true` if this library explicitly imports core.
4201 *
4064 * @return `true` if this library explicitly imports core 4202 * @return `true` if this library explicitly imports core
4065 */ 4203 */
4066 bool get explicitlyImportsCore => _explicitlyImportsCore; 4204 bool get explicitlyImportsCore => _explicitlyImportsCore;
4067 4205
4068 /** 4206 /**
4069 * Return the library exported by the given directive.
4070 * @param directive the directive that exports the library to be returned
4071 * @return the library exported by the given directive
4072 */
4073 Library getExport(ExportDirective directive) => _exportedLibraries[directive];
4074
4075 /**
4076 * Return an array containing the libraries that are exported from this librar y. 4207 * Return an array containing the libraries that are exported from this librar y.
4208 *
4077 * @return an array containing the libraries that are exported from this libra ry 4209 * @return an array containing the libraries that are exported from this libra ry
4078 */ 4210 */
4079 List<Library> get exports { 4211 List<Library> get exports => _exportedLibraries;
4080 Set<Library> libraries = new Set<Library>();
4081 libraries.addAll(_exportedLibraries.values);
4082 return new List.from(libraries);
4083 }
4084
4085 /**
4086 * Return the library imported by the given directive.
4087 * @param directive the directive that imports the library to be returned
4088 * @return the library imported by the given directive
4089 */
4090 Library getImport(ImportDirective directive) => _importedLibraries[directive];
4091 4212
4092 /** 4213 /**
4093 * Return an array containing the libraries that are imported into this librar y. 4214 * Return an array containing the libraries that are imported into this librar y.
4215 *
4094 * @return an array containing the libraries that are imported into this libra ry 4216 * @return an array containing the libraries that are imported into this libra ry
4095 */ 4217 */
4096 List<Library> get imports { 4218 List<Library> get imports => _importedLibraries;
4097 Set<Library> libraries = new Set<Library>();
4098 libraries.addAll(_importedLibraries.values);
4099 return new List.from(libraries);
4100 }
4101 4219
4102 /** 4220 /**
4103 * Return an array containing the libraries that are either imported or export ed from this 4221 * Return an array containing the libraries that are either imported or export ed from this
4104 * library. 4222 * library.
4223 *
4105 * @return the libraries that are either imported or exported from this librar y 4224 * @return the libraries that are either imported or exported from this librar y
4106 */ 4225 */
4107 List<Library> get importsAndExports { 4226 List<Library> get importsAndExports {
4108 Set<Library> libraries = new Set<Library>(); 4227 Set<Library> libraries = new Set<Library>();
4109 libraries.addAll(_importedLibraries.values); 4228 for (Library library in _importedLibraries) {
4110 libraries.addAll(_exportedLibraries.values); 4229 javaSetAdd(libraries, library);
4230 }
4231 for (Library library in _exportedLibraries) {
4232 javaSetAdd(libraries, library);
4233 }
4111 return new List.from(libraries); 4234 return new List.from(libraries);
4112 } 4235 }
4113 4236
4114 /** 4237 /**
4115 * Return the inheritance manager for this library. 4238 * Return the inheritance manager for this library.
4239 *
4116 * @return the inheritance manager for this library 4240 * @return the inheritance manager for this library
4117 */ 4241 */
4118 InheritanceManager get inheritanceManager { 4242 InheritanceManager get inheritanceManager {
4119 if (_inheritanceManager == null) { 4243 if (_inheritanceManager == null) {
4120 return _inheritanceManager = new InheritanceManager(_libraryElement); 4244 return _inheritanceManager = new InheritanceManager(_libraryElement);
4121 } 4245 }
4122 return _inheritanceManager; 4246 return _inheritanceManager;
4123 } 4247 }
4124 4248
4125 /** 4249 /**
4126 * Return the library element representing this library, creating it if necess ary. 4250 * Return the library element representing this library, creating it if necess ary.
4251 *
4127 * @return the library element representing this library 4252 * @return the library element representing this library
4128 */ 4253 */
4129 LibraryElementImpl get libraryElement { 4254 LibraryElementImpl get libraryElement {
4130 if (_libraryElement == null) { 4255 if (_libraryElement == null) {
4131 try { 4256 try {
4132 _libraryElement = _analysisContext.computeLibraryElement(_librarySource) as LibraryElementImpl; 4257 _libraryElement = _analysisContext.computeLibraryElement(_librarySource) as LibraryElementImpl;
4133 } on AnalysisException catch (exception) { 4258 } on AnalysisException catch (exception) {
4134 AnalysisEngine.instance.logger.logError2("Could not compute ilbrary elem ent for ${_librarySource.fullName}", exception); 4259 AnalysisEngine.instance.logger.logError2("Could not compute ilbrary elem ent for ${_librarySource.fullName}", exception);
4135 } 4260 }
4136 } 4261 }
4137 return _libraryElement; 4262 return _libraryElement;
4138 } 4263 }
4139 4264
4140 /** 4265 /**
4141 * Return the library scope used when resolving elements within this library's compilation units. 4266 * Return the library scope used when resolving elements within this library's compilation units.
4267 *
4142 * @return the library scope used when resolving elements within this library' s compilation units 4268 * @return the library scope used when resolving elements within this library' s compilation units
4143 */ 4269 */
4144 LibraryScope get libraryScope { 4270 LibraryScope get libraryScope {
4145 if (_libraryScope == null) { 4271 if (_libraryScope == null) {
4146 _libraryScope = new LibraryScope(_libraryElement, _errorListener); 4272 _libraryScope = new LibraryScope(_libraryElement, _errorListener);
4147 } 4273 }
4148 return _libraryScope; 4274 return _libraryScope;
4149 } 4275 }
4150 4276
4151 /** 4277 /**
4152 * Return the source specifying the defining compilation unit of this library. 4278 * Return the source specifying the defining compilation unit of this library.
4279 *
4153 * @return the source specifying the defining compilation unit of this library 4280 * @return the source specifying the defining compilation unit of this library
4154 */ 4281 */
4155 Source get librarySource => _librarySource; 4282 Source get librarySource => _librarySource;
4156 4283
4157 /** 4284 /**
4158 * Return the result of resolving the URI of the given URI-based directive aga inst the URI of the 4285 * Return the result of resolving the URI of the given URI-based directive aga inst the URI of the
4159 * library, or `null` if the URI is not valid. If the URI is not valid, report the error. 4286 * library, or `null` if the URI is not valid. If the URI is not valid, report the error.
4287 *
4160 * @param directive the directive which URI should be resolved 4288 * @param directive the directive which URI should be resolved
4161 * @return the result of resolving the URI against the URI of the library 4289 * @return the result of resolving the URI against the URI of the library
4162 */ 4290 */
4163 Source getSource(UriBasedDirective directive) { 4291 Source getSource(UriBasedDirective directive) {
4164 StringLiteral uriLiteral = directive.uri; 4292 StringLiteral uriLiteral = directive.uri;
4165 if (uriLiteral is StringInterpolation) { 4293 if (uriLiteral is StringInterpolation) {
4166 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.o ffset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, [])); 4294 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.o ffset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
4167 return null; 4295 return null;
4168 } 4296 }
4169 String uriContent = uriLiteral.stringValue.trim(); 4297 String uriContent = uriLiteral.stringValue.trim();
(...skipping 12 matching lines...) Expand all
4182 } 4310 }
4183 4311
4184 /** 4312 /**
4185 * Returns the URI value of the given directive. 4313 * Returns the URI value of the given directive.
4186 */ 4314 */
4187 String getUri(UriBasedDirective directive) => _directiveUris[directive]; 4315 String getUri(UriBasedDirective directive) => _directiveUris[directive];
4188 4316
4189 /** 4317 /**
4190 * Set the AST structure associated with the defining compilation unit for thi s library to the 4318 * Set the AST structure associated with the defining compilation unit for thi s library to the
4191 * given AST structure. 4319 * given AST structure.
4320 *
4192 * @param unit the AST structure associated with the defining compilation unit for this library 4321 * @param unit the AST structure associated with the defining compilation unit for this library
4193 */ 4322 */
4194 void set definingCompilationUnit(CompilationUnit unit) { 4323 void set definingCompilationUnit(CompilationUnit unit) {
4195 _astMap[librarySource] = unit; 4324 _astMap[librarySource] = unit;
4196 } 4325 }
4197 4326
4198 /** 4327 /**
4199 * Set whether this library explicitly imports core to match the given value. 4328 * Set whether this library explicitly imports core to match the given value.
4329 *
4200 * @param explicitlyImportsCore `true` if this library explicitly imports core 4330 * @param explicitlyImportsCore `true` if this library explicitly imports core
4201 */ 4331 */
4202 void set explicitlyImportsCore(bool explicitlyImportsCore2) { 4332 void set explicitlyImportsCore(bool explicitlyImportsCore2) {
4203 this._explicitlyImportsCore = explicitlyImportsCore2; 4333 this._explicitlyImportsCore = explicitlyImportsCore2;
4204 } 4334 }
4205 4335
4206 /** 4336 /**
4337 * Set the libraries that are exported by this library to be those in the give n array.
4338 *
4339 * @param exportedLibraries the libraries that are exported by this library
4340 */
4341 void set exportedLibraries(List<Library> exportedLibraries2) {
4342 this._exportedLibraries = exportedLibraries2;
4343 }
4344
4345 /**
4346 * Set the libraries that are imported into this library to be those in the gi ven array.
4347 *
4348 * @param importedLibraries the libraries that are imported into this library
4349 */
4350 void set importedLibraries(List<Library> importedLibraries2) {
4351 this._importedLibraries = importedLibraries2;
4352 }
4353
4354 /**
4207 * Set the library element representing this library to the given library elem ent. 4355 * Set the library element representing this library to the given library elem ent.
4356 *
4208 * @param libraryElement the library element representing this library 4357 * @param libraryElement the library element representing this library
4209 */ 4358 */
4210 void set libraryElement(LibraryElementImpl libraryElement2) { 4359 void set libraryElement(LibraryElementImpl libraryElement2) {
4211 this._libraryElement = libraryElement2; 4360 this._libraryElement = libraryElement2;
4212 if (_inheritanceManager != null) { 4361 if (_inheritanceManager != null) {
4213 _inheritanceManager.libraryElement = libraryElement2; 4362 _inheritanceManager.libraryElement = libraryElement2;
4214 } 4363 }
4215 } 4364 }
4216 String toString() => _librarySource.shortName; 4365 String toString() => _librarySource.shortName;
4217 4366
4218 /** 4367 /**
4219 * Return the result of resolving the given URI against the URI of the library , or `null` if 4368 * Return the result of resolving the given URI against the URI of the library , or `null` if
4220 * the URI is not valid. 4369 * the URI is not valid.
4370 *
4221 * @param uri the URI to be resolved 4371 * @param uri the URI to be resolved
4222 * @return the result of resolving the given URI against the URI of the librar y 4372 * @return the result of resolving the given URI against the URI of the librar y
4223 */ 4373 */
4224 Source getSource2(String uri) { 4374 Source getSource2(String uri) {
4225 if (uri == null) { 4375 if (uri == null) {
4226 return null; 4376 return null;
4227 } 4377 }
4228 return _analysisContext.sourceFactory.resolveUri(_librarySource, uri); 4378 return _analysisContext.sourceFactory.resolveUri(_librarySource, uri);
4229 } 4379 }
4230 } 4380 }
4231 /** 4381 /**
4232 * Instances of the class `LibraryElementBuilder` build an element model for a s ingle library. 4382 * Instances of the class `LibraryElementBuilder` build an element model for a s ingle library.
4383 *
4233 * @coverage dart.engine.resolver 4384 * @coverage dart.engine.resolver
4234 */ 4385 */
4235 class LibraryElementBuilder { 4386 class LibraryElementBuilder {
4236 4387
4237 /** 4388 /**
4238 * The analysis context in which the element model will be built. 4389 * The analysis context in which the element model will be built.
4239 */ 4390 */
4240 InternalAnalysisContext _analysisContext; 4391 InternalAnalysisContext _analysisContext;
4241 4392
4242 /** 4393 /**
4243 * The listener to which errors will be reported. 4394 * The listener to which errors will be reported.
4244 */ 4395 */
4245 AnalysisErrorListener _errorListener; 4396 AnalysisErrorListener _errorListener;
4246 4397
4247 /** 4398 /**
4248 * The name of the function used as an entry point. 4399 * The name of the function used as an entry point.
4249 */ 4400 */
4250 static String _ENTRY_POINT_NAME = "main"; 4401 static String _ENTRY_POINT_NAME = "main";
4251 4402
4252 /** 4403 /**
4253 * Initialize a newly created library element builder. 4404 * Initialize a newly created library element builder.
4405 *
4254 * @param resolver the resolver for which the element model is being built 4406 * @param resolver the resolver for which the element model is being built
4255 */ 4407 */
4256 LibraryElementBuilder(LibraryResolver resolver) { 4408 LibraryElementBuilder(LibraryResolver resolver) {
4257 this._analysisContext = resolver.analysisContext; 4409 this._analysisContext = resolver.analysisContext;
4258 this._errorListener = resolver.errorListener; 4410 this._errorListener = resolver.errorListener;
4259 } 4411 }
4260 4412
4261 /** 4413 /**
4262 * Build the library element for the given library. 4414 * Build the library element for the given library.
4415 *
4263 * @param library the library for which an element model is to be built 4416 * @param library the library for which an element model is to be built
4264 * @return the library element that was built 4417 * @return the library element that was built
4265 * @throws AnalysisException if the analysis could not be performed 4418 * @throws AnalysisException if the analysis could not be performed
4266 */ 4419 */
4267 LibraryElementImpl buildLibrary(Library library) { 4420 LibraryElementImpl buildLibrary(Library library) {
4268 CompilationUnitBuilder builder = new CompilationUnitBuilder(); 4421 CompilationUnitBuilder builder = new CompilationUnitBuilder();
4269 Source librarySource = library.librarySource; 4422 Source librarySource = library.librarySource;
4270 CompilationUnit definingCompilationUnit = library.definingCompilationUnit; 4423 CompilationUnit definingCompilationUnit = library.definingCompilationUnit;
4271 CompilationUnitElementImpl definingCompilationUnitElement = builder.buildCom pilationUnit(librarySource, definingCompilationUnit); 4424 CompilationUnitElementImpl definingCompilationUnitElement = builder.buildCom pilationUnit(librarySource, definingCompilationUnit);
4272 NodeList<Directive> directives = definingCompilationUnit.directives; 4425 NodeList<Directive> directives = definingCompilationUnit.directives;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
4320 library.libraryElement = libraryElement; 4473 library.libraryElement = libraryElement;
4321 if (sourcedUnitCount > 0) { 4474 if (sourcedUnitCount > 0) {
4322 patchTopLevelAccessors(libraryElement); 4475 patchTopLevelAccessors(libraryElement);
4323 } 4476 }
4324 return libraryElement; 4477 return libraryElement;
4325 } 4478 }
4326 4479
4327 /** 4480 /**
4328 * Add all of the non-synthetic getters and setters defined in the given compi lation unit that 4481 * Add all of the non-synthetic getters and setters defined in the given compi lation unit that
4329 * have no corresponding accessor to one of the given collections. 4482 * have no corresponding accessor to one of the given collections.
4483 *
4330 * @param getters the map to which getters are to be added 4484 * @param getters the map to which getters are to be added
4331 * @param setters the list to which setters are to be added 4485 * @param setters the list to which setters are to be added
4332 * @param unit the compilation unit defining the accessors that are potentiall y being added 4486 * @param unit the compilation unit defining the accessors that are potentiall y being added
4333 */ 4487 */
4334 void collectAccessors(Map<String, PropertyAccessorElement> getters, List<Prope rtyAccessorElement> setters, CompilationUnitElement unit) { 4488 void collectAccessors(Map<String, PropertyAccessorElement> getters, List<Prope rtyAccessorElement> setters, CompilationUnitElement unit) {
4335 for (PropertyAccessorElement accessor in unit.accessors) { 4489 for (PropertyAccessorElement accessor in unit.accessors) {
4336 if (accessor.isGetter) { 4490 if (accessor.isGetter) {
4337 if (!accessor.isSynthetic && accessor.correspondingSetter == null) { 4491 if (!accessor.isSynthetic && accessor.correspondingSetter == null) {
4338 getters[accessor.displayName] = accessor; 4492 getters[accessor.displayName] = accessor;
4339 } 4493 }
4340 } else { 4494 } else {
4341 if (!accessor.isSynthetic && accessor.correspondingGetter == null) { 4495 if (!accessor.isSynthetic && accessor.correspondingGetter == null) {
4342 setters.add(accessor); 4496 setters.add(accessor);
4343 } 4497 }
4344 } 4498 }
4345 } 4499 }
4346 } 4500 }
4347 4501
4348 /** 4502 /**
4349 * Search the top-level functions defined in the given compilation unit for th e entry point. 4503 * Search the top-level functions defined in the given compilation unit for th e entry point.
4504 *
4350 * @param element the compilation unit to be searched 4505 * @param element the compilation unit to be searched
4351 * @return the entry point that was found, or `null` if the compilation unit d oes not define 4506 * @return the entry point that was found, or `null` if the compilation unit d oes not define
4352 * an entry point 4507 * an entry point
4353 */ 4508 */
4354 FunctionElement findEntryPoint(CompilationUnitElementImpl element) { 4509 FunctionElement findEntryPoint(CompilationUnitElementImpl element) {
4355 for (FunctionElement function in element.functions) { 4510 for (FunctionElement function in element.functions) {
4356 if (function.name == _ENTRY_POINT_NAME) { 4511 if (function.name == _ENTRY_POINT_NAME) {
4357 return function; 4512 return function;
4358 } 4513 }
4359 } 4514 }
4360 return null; 4515 return null;
4361 } 4516 }
4362 4517
4363 /** 4518 /**
4364 * Return the name of the library that the given part is declared to be a part of, or `null`if the part does not contain a part-of directive. 4519 * Return the name of the library that the given part is declared to be a part of, or `null`
4520 * if the part does not contain a part-of directive.
4521 *
4365 * @param library the library containing the part 4522 * @param library the library containing the part
4366 * @param partSource the source representing the part 4523 * @param partSource the source representing the part
4367 * @param directivesToResolve a list of directives that should be resolved to the library being 4524 * @param directivesToResolve a list of directives that should be resolved to the library being
4368 * built 4525 * built
4369 * @return the name of the library that the given part is declared to be a par t of 4526 * @return the name of the library that the given part is declared to be a par t of
4370 */ 4527 */
4371 String getPartLibraryName(Library library, Source partSource, List<Directive> directivesToResolve) { 4528 String getPartLibraryName(Library library, Source partSource, List<Directive> directivesToResolve) {
4372 try { 4529 try {
4373 CompilationUnit partUnit = library.getAST(partSource); 4530 CompilationUnit partUnit = library.getAST(partSource);
4374 for (Directive directive in partUnit.directives) { 4531 for (Directive directive in partUnit.directives) {
4375 if (directive is PartOfDirective) { 4532 if (directive is PartOfDirective) {
4376 directivesToResolve.add(directive); 4533 directivesToResolve.add(directive);
4377 LibraryIdentifier libraryName = ((directive as PartOfDirective)).libra ryName; 4534 LibraryIdentifier libraryName = ((directive as PartOfDirective)).libra ryName;
4378 if (libraryName != null) { 4535 if (libraryName != null) {
4379 return libraryName.name; 4536 return libraryName.name;
4380 } 4537 }
4381 } 4538 }
4382 } 4539 }
4383 } on AnalysisException catch (exception) { 4540 } on AnalysisException catch (exception) {
4384 } 4541 }
4385 return null; 4542 return null;
4386 } 4543 }
4387 4544
4388 /** 4545 /**
4389 * Look through all of the compilation units defined for the given library, lo oking for getters 4546 * Look through all of the compilation units defined for the given library, lo oking for getters
4390 * and setters that are defined in different compilation units but that have t he same names. If 4547 * and setters that are defined in different compilation units but that have t he same names. If
4391 * any are found, make sure that they have the same variable element. 4548 * any are found, make sure that they have the same variable element.
4549 *
4392 * @param libraryElement the library defining the compilation units to be proc essed 4550 * @param libraryElement the library defining the compilation units to be proc essed
4393 */ 4551 */
4394 void patchTopLevelAccessors(LibraryElementImpl libraryElement) { 4552 void patchTopLevelAccessors(LibraryElementImpl libraryElement) {
4395 Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAcces sorElement>(); 4553 Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAcces sorElement>();
4396 List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>(); 4554 List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>();
4397 collectAccessors(getters, setters, libraryElement.definingCompilationUnit); 4555 collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
4398 for (CompilationUnitElement unit in libraryElement.parts) { 4556 for (CompilationUnitElement unit in libraryElement.parts) {
4399 collectAccessors(getters, setters, unit); 4557 collectAccessors(getters, setters, unit);
4400 } 4558 }
4401 for (PropertyAccessorElement setter in setters) { 4559 for (PropertyAccessorElement setter in setters) {
4402 PropertyAccessorElement getter = getters[setter.displayName]; 4560 PropertyAccessorElement getter = getters[setter.displayName];
4403 if (getter != null) { 4561 if (getter != null) {
4404 PropertyInducingElementImpl variable = getter.variable as PropertyInduci ngElementImpl; 4562 PropertyInducingElementImpl variable = getter.variable as PropertyInduci ngElementImpl;
4405 variable.setter = setter; 4563 variable.setter = setter;
4406 ((setter as PropertyAccessorElementImpl)).variable = variable; 4564 ((setter as PropertyAccessorElementImpl)).variable = variable;
4407 } 4565 }
4408 } 4566 }
4409 } 4567 }
4410 } 4568 }
4411 /** 4569 /**
4412 * Instances of the class `LibraryResolver` are used to resolve one or more mutu ally dependent 4570 * Instances of the class `LibraryResolver` are used to resolve one or more mutu ally dependent
4413 * libraries within a single context. 4571 * libraries within a single context.
4572 *
4414 * @coverage dart.engine.resolver 4573 * @coverage dart.engine.resolver
4415 */ 4574 */
4416 class LibraryResolver { 4575 class LibraryResolver {
4417 4576
4418 /** 4577 /**
4419 * The analysis context in which the libraries are being analyzed. 4578 * The analysis context in which the libraries are being analyzed.
4420 */ 4579 */
4421 InternalAnalysisContext _analysisContext; 4580 InternalAnalysisContext _analysisContext;
4422 4581
4423 /** 4582 /**
4424 * The listener to which analysis errors will be reported, this error listener is either 4583 * The listener to which analysis errors will be reported, this error listener is either
4425 * references [recordingErrorListener], or it unions the passed[AnalysisErrorL istener] with the [recordingErrorListener]. 4584 * references [recordingErrorListener], or it unions the passed
4585 * [AnalysisErrorListener] with the [recordingErrorListener].
4426 */ 4586 */
4427 RecordingErrorListener _errorListener; 4587 RecordingErrorListener _errorListener;
4428 4588
4429 /** 4589 /**
4430 * A source object representing the core library (dart:core). 4590 * A source object representing the core library (dart:core).
4431 */ 4591 */
4432 Source _coreLibrarySource; 4592 Source _coreLibrarySource;
4433 4593
4434 /** 4594 /**
4435 * The object representing the core library. 4595 * The object representing the core library.
4436 */ 4596 */
4437 Library _coreLibrary; 4597 Library _coreLibrary;
4438 4598
4439 /** 4599 /**
4600 * A flag indicating whether analysis is to generate audit results (e.g. type inference based
4601 * information and pub best practices).
4602 */
4603 bool _audit = false;
4604
4605 /**
4440 * The object used to access the types from the core library. 4606 * The object used to access the types from the core library.
4441 */ 4607 */
4442 TypeProvider _typeProvider; 4608 TypeProvider _typeProvider;
4443 4609
4444 /** 4610 /**
4445 * A table mapping library sources to the information being maintained for tho se libraries. 4611 * A table mapping library sources to the information being maintained for tho se libraries.
4446 */ 4612 */
4447 Map<Source, Library> _libraryMap = new Map<Source, Library>(); 4613 Map<Source, Library> _libraryMap = new Map<Source, Library>();
4448 4614
4449 /** 4615 /**
4450 * A collection containing the libraries that are being resolved together. 4616 * A collection containing the libraries that are being resolved together.
4451 */ 4617 */
4452 Set<Library> _librariesInCycles; 4618 Set<Library> _librariesInCycles;
4453 4619
4454 /** 4620 /**
4455 * Initialize a newly created library resolver to resolve libraries within the given context. 4621 * Initialize a newly created library resolver to resolve libraries within the given context.
4622 *
4456 * @param analysisContext the analysis context in which the library is being a nalyzed 4623 * @param analysisContext the analysis context in which the library is being a nalyzed
4457 */ 4624 */
4458 LibraryResolver(InternalAnalysisContext analysisContext) { 4625 LibraryResolver(InternalAnalysisContext analysisContext) {
4459 this._analysisContext = analysisContext; 4626 this._analysisContext = analysisContext;
4460 this._errorListener = new RecordingErrorListener(); 4627 this._errorListener = new RecordingErrorListener();
4461 _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE) ; 4628 _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE) ;
4629 _audit = analysisContext.analysisOptions.audit;
4462 } 4630 }
4463 4631
4464 /** 4632 /**
4465 * Return the analysis context in which the libraries are being analyzed. 4633 * Return the analysis context in which the libraries are being analyzed.
4634 *
4466 * @return the analysis context in which the libraries are being analyzed 4635 * @return the analysis context in which the libraries are being analyzed
4467 */ 4636 */
4468 InternalAnalysisContext get analysisContext => _analysisContext; 4637 InternalAnalysisContext get analysisContext => _analysisContext;
4469 4638
4470 /** 4639 /**
4471 * Return the listener to which analysis errors will be reported. 4640 * Return the listener to which analysis errors will be reported.
4641 *
4472 * @return the listener to which analysis errors will be reported 4642 * @return the listener to which analysis errors will be reported
4473 */ 4643 */
4474 RecordingErrorListener get errorListener => _errorListener; 4644 RecordingErrorListener get errorListener => _errorListener;
4475 4645
4476 /** 4646 /**
4477 * Return an array containing information about all of the libraries that were resolved. 4647 * Return an array containing information about all of the libraries that were resolved.
4648 *
4478 * @return an array containing the libraries that were resolved 4649 * @return an array containing the libraries that were resolved
4479 */ 4650 */
4480 Set<Library> get resolvedLibraries => _librariesInCycles; 4651 Set<Library> get resolvedLibraries => _librariesInCycles;
4481 4652
4482 /** 4653 /**
4483 * Resolve the library specified by the given source in the given context. The library is assumed 4654 * Resolve the library specified by the given source in the given context. The library is assumed
4484 * to be embedded in the given source. 4655 * to be embedded in the given source.
4656 *
4485 * @param librarySource the source specifying the defining compilation unit of the library to be 4657 * @param librarySource the source specifying the defining compilation unit of the library to be
4486 * resolved 4658 * resolved
4487 * @param unit the compilation unit representing the embedded library 4659 * @param unit the compilation unit representing the embedded library
4488 * @param fullAnalysis `true` if a full analysis should be performed 4660 * @param fullAnalysis `true` if a full analysis should be performed
4489 * @return the element representing the resolved library 4661 * @return the element representing the resolved library
4490 * @throws AnalysisException if the library could not be resolved for some rea son 4662 * @throws AnalysisException if the library could not be resolved for some rea son
4491 */ 4663 */
4492 LibraryElement resolveEmbeddedLibrary(Source librarySource, CompilationUnit un it, bool fullAnalysis) { 4664 LibraryElement resolveEmbeddedLibrary(Source librarySource, CompilationUnit un it, bool fullAnalysis) {
4493 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi ne.LibraryResolver.resolveEmbeddedLibrary"); 4665 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi ne.LibraryResolver.resolveEmbeddedLibrary");
4494 try { 4666 try {
4495 instrumentation.metric("fullAnalysis", fullAnalysis); 4667 instrumentation.metric("fullAnalysis", fullAnalysis);
4496 instrumentation.data3("fullName", librarySource.fullName); 4668 instrumentation.data3("fullName", librarySource.fullName);
(...skipping 29 matching lines...) Expand all
4526 instrumentation.log(); 4698 instrumentation.log();
4527 } 4699 }
4528 } 4700 }
4529 4701
4530 /** 4702 /**
4531 * Resolve the library specified by the given source in the given context. 4703 * Resolve the library specified by the given source in the given context.
4532 * 4704 *
4533 * Note that because Dart allows circular imports between libraries, it is pos sible that more than 4705 * Note that because Dart allows circular imports between libraries, it is pos sible that more than
4534 * one library will need to be resolved. In such cases the error listener can receive errors from 4706 * one library will need to be resolved. In such cases the error listener can receive errors from
4535 * multiple libraries. 4707 * multiple libraries.
4708 *
4536 * @param librarySource the source specifying the defining compilation unit of the library to be 4709 * @param librarySource the source specifying the defining compilation unit of the library to be
4537 * resolved 4710 * resolved
4538 * @param fullAnalysis `true` if a full analysis should be performed 4711 * @param fullAnalysis `true` if a full analysis should be performed
4539 * @return the element representing the resolved library 4712 * @return the element representing the resolved library
4540 * @throws AnalysisException if the library could not be resolved for some rea son 4713 * @throws AnalysisException if the library could not be resolved for some rea son
4541 */ 4714 */
4542 LibraryElement resolveLibrary(Source librarySource, bool fullAnalysis) { 4715 LibraryElement resolveLibrary(Source librarySource, bool fullAnalysis) {
4543 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi ne.LibraryResolver.resolveLibrary"); 4716 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi ne.LibraryResolver.resolveLibrary");
4544 try { 4717 try {
4545 instrumentation.metric("fullAnalysis", fullAnalysis); 4718 instrumentation.metric("fullAnalysis", fullAnalysis);
4546 instrumentation.data3("fullName", librarySource.fullName); 4719 instrumentation.data3("fullName", librarySource.fullName);
4547 Library targetLibrary = createLibrary(librarySource); 4720 Library targetLibrary = createLibrary(librarySource);
(...skipping 28 matching lines...) Expand all
4576 instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size", lib.compilationUnitSources.length); 4749 instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size", lib.compilationUnitSources.length);
4577 } 4750 }
4578 return targetLibrary.libraryElement; 4751 return targetLibrary.libraryElement;
4579 } finally { 4752 } finally {
4580 instrumentation.log(); 4753 instrumentation.log();
4581 } 4754 }
4582 } 4755 }
4583 4756
4584 /** 4757 /**
4585 * Add a dependency to the given map from the referencing library to the refer enced library. 4758 * Add a dependency to the given map from the referencing library to the refer enced library.
4759 *
4586 * @param dependencyMap the map to which the dependency is to be added 4760 * @param dependencyMap the map to which the dependency is to be added
4587 * @param referencingLibrary the library that references the referenced librar y 4761 * @param referencingLibrary the library that references the referenced librar y
4588 * @param referencedLibrary the library referenced by the referencing library 4762 * @param referencedLibrary the library referenced by the referencing library
4589 */ 4763 */
4590 void addDependencyToMap(Map<Library, List<Library>> dependencyMap, Library ref erencingLibrary, Library referencedLibrary) { 4764 void addDependencyToMap(Map<Library, List<Library>> dependencyMap, Library ref erencingLibrary, Library referencedLibrary) {
4591 List<Library> dependentLibraries = dependencyMap[referencedLibrary]; 4765 List<Library> dependentLibraries = dependencyMap[referencedLibrary];
4592 if (dependentLibraries == null) { 4766 if (dependentLibraries == null) {
4593 dependentLibraries = new List<Library>(); 4767 dependentLibraries = new List<Library>();
4594 dependencyMap[referencedLibrary] = dependentLibraries; 4768 dependencyMap[referencedLibrary] = dependentLibraries;
4595 } 4769 }
4596 dependentLibraries.add(referencingLibrary); 4770 dependentLibraries.add(referencingLibrary);
4597 } 4771 }
4598 4772
4599 /** 4773 /**
4600 * Given a library that is part of a cycle that includes the root library, add to the given set of 4774 * Given a library that is part of a cycle that includes the root library, add to the given set of
4601 * libraries all of the libraries reachable from the root library that are als o included in the 4775 * libraries all of the libraries reachable from the root library that are als o included in the
4602 * cycle. 4776 * cycle.
4777 *
4603 * @param library the library to be added to the collection of libraries in cy cles 4778 * @param library the library to be added to the collection of libraries in cy cles
4604 * @param librariesInCycle a collection of the libraries that are in the cycle 4779 * @param librariesInCycle a collection of the libraries that are in the cycle
4605 * @param dependencyMap a table mapping libraries to the collection of librari es from which those 4780 * @param dependencyMap a table mapping libraries to the collection of librari es from which those
4606 * libraries are referenced 4781 * libraries are referenced
4607 */ 4782 */
4608 void addLibrariesInCycle(Library library, Set<Library> librariesInCycle, Map<L ibrary, List<Library>> dependencyMap) { 4783 void addLibrariesInCycle(Library library, Set<Library> librariesInCycle, Map<L ibrary, List<Library>> dependencyMap) {
4609 if (javaSetAdd(librariesInCycle, library)) { 4784 if (javaSetAdd(librariesInCycle, library)) {
4610 List<Library> dependentLibraries = dependencyMap[library]; 4785 List<Library> dependentLibraries = dependencyMap[library];
4611 if (dependentLibraries != null) { 4786 if (dependentLibraries != null) {
4612 for (Library dependentLibrary in dependentLibraries) { 4787 for (Library dependentLibrary in dependentLibraries) {
4613 addLibrariesInCycle(dependentLibrary, librariesInCycle, dependencyMap) ; 4788 addLibrariesInCycle(dependentLibrary, librariesInCycle, dependencyMap) ;
4614 } 4789 }
4615 } 4790 }
4616 } 4791 }
4617 } 4792 }
4618 4793
4619 /** 4794 /**
4620 * Add the given library, and all libraries reachable from it that have not al ready been visited, 4795 * Add the given library, and all libraries reachable from it that have not al ready been visited,
4621 * to the given dependency map. 4796 * to the given dependency map.
4797 *
4622 * @param library the library currently being added to the dependency map 4798 * @param library the library currently being added to the dependency map
4623 * @param dependencyMap the dependency map being computed 4799 * @param dependencyMap the dependency map being computed
4624 * @param visitedLibraries the libraries that have already been visited, used to prevent infinite 4800 * @param visitedLibraries the libraries that have already been visited, used to prevent infinite
4625 * recursion 4801 * recursion
4626 */ 4802 */
4627 void addToDependencyMap(Library library, Map<Library, List<Library>> dependenc yMap, Set<Library> visitedLibraries) { 4803 void addToDependencyMap(Library library, Map<Library, List<Library>> dependenc yMap, Set<Library> visitedLibraries) {
4628 if (javaSetAdd(visitedLibraries, library)) { 4804 if (javaSetAdd(visitedLibraries, library)) {
4629 for (Library referencedLibrary in library.importsAndExports) { 4805 for (Library referencedLibrary in library.importsAndExports) {
4630 addDependencyToMap(dependencyMap, library, referencedLibrary); 4806 addDependencyToMap(dependencyMap, library, referencedLibrary);
4631 addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries); 4807 addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries);
4632 } 4808 }
4633 if (!library.explicitlyImportsCore && library != _coreLibrary) { 4809 if (!library.explicitlyImportsCore && library != _coreLibrary) {
4634 addDependencyToMap(dependencyMap, library, _coreLibrary); 4810 addDependencyToMap(dependencyMap, library, _coreLibrary);
4635 } 4811 }
4636 } 4812 }
4637 } 4813 }
4638 4814
4639 /** 4815 /**
4640 * Build the element model representing the combinators declared by the given directive. 4816 * Build the element model representing the combinators declared by the given directive.
4817 *
4641 * @param directive the directive that declares the combinators 4818 * @param directive the directive that declares the combinators
4642 * @return an array containing the import combinators that were built 4819 * @return an array containing the import combinators that were built
4643 */ 4820 */
4644 List<NamespaceCombinator> buildCombinators(NamespaceDirective directive) { 4821 List<NamespaceCombinator> buildCombinators(NamespaceDirective directive) {
4645 List<NamespaceCombinator> combinators = new List<NamespaceCombinator>(); 4822 List<NamespaceCombinator> combinators = new List<NamespaceCombinator>();
4646 for (Combinator combinator in directive.combinators) { 4823 for (Combinator combinator in directive.combinators) {
4647 if (combinator is HideCombinator) { 4824 if (combinator is HideCombinator) {
4648 HideElementCombinatorImpl hide = new HideElementCombinatorImpl(); 4825 HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
4649 hide.hiddenNames = getIdentifiers(((combinator as HideCombinator)).hidde nNames); 4826 hide.hiddenNames = getIdentifiers(((combinator as HideCombinator)).hidde nNames);
4650 combinators.add(hide); 4827 combinators.add(hide);
4651 } else { 4828 } else {
4652 ShowElementCombinatorImpl show = new ShowElementCombinatorImpl(); 4829 ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
4653 show.shownNames = getIdentifiers(((combinator as ShowCombinator)).shownN ames); 4830 show.shownNames = getIdentifiers(((combinator as ShowCombinator)).shownN ames);
4654 combinators.add(show); 4831 combinators.add(show);
4655 } 4832 }
4656 } 4833 }
4657 return new List.from(combinators); 4834 return new List.from(combinators);
4658 } 4835 }
4659 4836
4660 /** 4837 /**
4661 * Every library now has a corresponding [LibraryElement], so it is now possib le to resolve 4838 * Every library now has a corresponding [LibraryElement], so it is now possib le to resolve
4662 * the import and export directives. 4839 * the import and export directives.
4840 *
4663 * @throws AnalysisException if the defining compilation unit for any of the l ibraries could not 4841 * @throws AnalysisException if the defining compilation unit for any of the l ibraries could not
4664 * be accessed 4842 * be accessed
4665 */ 4843 */
4666 void buildDirectiveModels() { 4844 void buildDirectiveModels() {
4667 for (Library library in _librariesInCycles) { 4845 for (Library library in _librariesInCycles) {
4668 Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixEle mentImpl>(); 4846 Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixEle mentImpl>();
4669 List<ImportElement> imports = new List<ImportElement>(); 4847 List<ImportElement> imports = new List<ImportElement>();
4670 List<ExportElement> exports = new List<ExportElement>(); 4848 List<ExportElement> exports = new List<ExportElement>();
4671 for (Directive directive in library.definingCompilationUnit.directives) { 4849 for (Directive directive in library.definingCompilationUnit.directives) {
4672 if (directive is ImportDirective) { 4850 if (directive is ImportDirective) {
4673 ImportDirective importDirective = directive as ImportDirective; 4851 ImportDirective importDirective = directive as ImportDirective;
4674 Library importedLibrary = library.getImport(importDirective); 4852 Source importedSource = library.getSource(importDirective);
4675 if (importedLibrary != null) { 4853 if (importedSource != null) {
4676 ImportElementImpl importElement = new ImportElementImpl(); 4854 Library importedLibrary = _libraryMap[importedSource];
4677 importElement.uri = library.getUri(importDirective); 4855 if (importedLibrary != null) {
4678 importElement.combinators = buildCombinators(importDirective); 4856 ImportElementImpl importElement = new ImportElementImpl();
4679 LibraryElement importedLibraryElement = importedLibrary.libraryEleme nt; 4857 importElement.uri = library.getUri(importDirective);
4680 if (importedLibraryElement != null) { 4858 importElement.combinators = buildCombinators(importDirective);
4681 importElement.importedLibrary = importedLibraryElement; 4859 LibraryElement importedLibraryElement = importedLibrary.libraryEle ment;
4860 if (importedLibraryElement != null) {
4861 importElement.importedLibrary = importedLibraryElement;
4862 }
4863 SimpleIdentifier prefixNode = ((directive as ImportDirective)).pre fix;
4864 if (prefixNode != null) {
4865 String prefixName = prefixNode.name;
4866 PrefixElementImpl prefix = nameToPrefixMap[prefixName];
4867 if (prefix == null) {
4868 prefix = new PrefixElementImpl(prefixNode);
4869 nameToPrefixMap[prefixName] = prefix;
4870 }
4871 importElement.prefix = prefix;
4872 }
4873 directive.element = importElement;
4874 imports.add(importElement);
4875 if (doesCompilationUnitHavePartOfDirective(importedLibrary.getAST( importedSource))) {
4876 StringLiteral uriLiteral = importDirective.uri;
4877 _errorListener.onError(new AnalysisError.con2(library.librarySou rce, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LI BRARY, [uriLiteral.toSource()]));
4878 }
4682 } 4879 }
4683 SimpleIdentifier prefixNode = ((directive as ImportDirective)).prefi x;
4684 if (prefixNode != null) {
4685 String prefixName = prefixNode.name;
4686 PrefixElementImpl prefix = nameToPrefixMap[prefixName];
4687 if (prefix == null) {
4688 prefix = new PrefixElementImpl(prefixNode);
4689 nameToPrefixMap[prefixName] = prefix;
4690 }
4691 importElement.prefix = prefix;
4692 }
4693 directive.element = importElement;
4694 imports.add(importElement);
4695 } 4880 }
4696 } else if (directive is ExportDirective) { 4881 } else if (directive is ExportDirective) {
4697 ExportDirective exportDirective = directive as ExportDirective; 4882 ExportDirective exportDirective = directive as ExportDirective;
4698 ExportElementImpl exportElement = new ExportElementImpl(); 4883 Source exportedSource = library.getSource(exportDirective);
4699 exportElement.uri = library.getUri(exportDirective); 4884 if (exportedSource != null) {
4700 exportElement.combinators = buildCombinators(exportDirective); 4885 Library exportedLibrary = _libraryMap[exportedSource];
4701 Library exportedLibrary = library.getExport(exportDirective); 4886 if (exportedLibrary != null) {
4702 if (exportedLibrary != null) { 4887 ExportElementImpl exportElement = new ExportElementImpl();
4703 LibraryElement exportedLibraryElement = exportedLibrary.libraryEleme nt; 4888 exportElement.uri = library.getUri(exportDirective);
4704 if (exportedLibraryElement != null) { 4889 exportElement.combinators = buildCombinators(exportDirective);
4705 exportElement.exportedLibrary = exportedLibraryElement; 4890 LibraryElement exportedLibraryElement = exportedLibrary.libraryEle ment;
4891 if (exportedLibraryElement != null) {
4892 exportElement.exportedLibrary = exportedLibraryElement;
4893 }
4894 directive.element = exportElement;
4895 exports.add(exportElement);
4896 if (doesCompilationUnitHavePartOfDirective(exportedLibrary.getAST( exportedSource))) {
4897 StringLiteral uriLiteral = exportDirective.uri;
4898 _errorListener.onError(new AnalysisError.con2(library.librarySou rce, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LI BRARY, [uriLiteral.toSource()]));
4899 }
4706 } 4900 }
4707 directive.element = exportElement;
4708 exports.add(exportElement);
4709 } 4901 }
4710 } 4902 }
4711 } 4903 }
4712 Source librarySource = library.librarySource; 4904 Source librarySource = library.librarySource;
4713 if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource) { 4905 if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource) {
4714 ImportElementImpl importElement = new ImportElementImpl(); 4906 ImportElementImpl importElement = new ImportElementImpl();
4715 importElement.importedLibrary = _coreLibrary.libraryElement; 4907 importElement.importedLibrary = _coreLibrary.libraryElement;
4716 importElement.synthetic = true; 4908 importElement.synthetic = true;
4717 imports.add(importElement); 4909 imports.add(importElement);
4718 } 4910 }
4719 LibraryElementImpl libraryElement = library.libraryElement; 4911 LibraryElementImpl libraryElement = library.libraryElement;
4720 libraryElement.imports = new List.from(imports); 4912 libraryElement.imports = new List.from(imports);
4721 libraryElement.exports = new List.from(exports); 4913 libraryElement.exports = new List.from(exports);
4722 } 4914 }
4723 } 4915 }
4724 4916
4725 /** 4917 /**
4726 * Build element models for all of the libraries in the current cycle. 4918 * Build element models for all of the libraries in the current cycle.
4919 *
4727 * @throws AnalysisException if any of the element models cannot be built 4920 * @throws AnalysisException if any of the element models cannot be built
4728 */ 4921 */
4729 void buildElementModels() { 4922 void buildElementModels() {
4730 for (Library library in _librariesInCycles) { 4923 for (Library library in _librariesInCycles) {
4731 LibraryElementBuilder builder = new LibraryElementBuilder(this); 4924 LibraryElementBuilder builder = new LibraryElementBuilder(this);
4732 LibraryElementImpl libraryElement = builder.buildLibrary(library); 4925 LibraryElementImpl libraryElement = builder.buildLibrary(library);
4733 library.libraryElement = libraryElement; 4926 library.libraryElement = libraryElement;
4734 } 4927 }
4735 } 4928 }
4736 4929
4737 /** 4930 /**
4738 * Resolve the type hierarchy across all of the types declared in the librarie s in the current 4931 * Resolve the type hierarchy across all of the types declared in the librarie s in the current
4739 * cycle. 4932 * cycle.
4933 *
4740 * @throws AnalysisException if any of the type hierarchies could not be resol ved 4934 * @throws AnalysisException if any of the type hierarchies could not be resol ved
4741 */ 4935 */
4742 void buildTypeHierarchies() { 4936 void buildTypeHierarchies() {
4743 for (Library library in _librariesInCycles) { 4937 for (Library library in _librariesInCycles) {
4744 for (Source source in library.compilationUnitSources) { 4938 for (Source source in library.compilationUnitSources) {
4745 TypeResolverVisitor visitor = new TypeResolverVisitor.con1(library, sour ce, _typeProvider); 4939 TypeResolverVisitor visitor = new TypeResolverVisitor.con1(library, sour ce, _typeProvider);
4746 library.getAST(source).accept(visitor); 4940 library.getAST(source).accept(visitor);
4747 } 4941 }
4748 } 4942 }
4749 } 4943 }
4750 4944
4751 /** 4945 /**
4752 * Compute a dependency map of libraries reachable from the given library. A d ependency map is a 4946 * Compute a dependency map of libraries reachable from the given library. A d ependency map is a
4753 * table that maps individual libraries to a list of the libraries that either import or export 4947 * table that maps individual libraries to a list of the libraries that either import or export
4754 * those libraries. 4948 * those libraries.
4755 * 4949 *
4756 * This map is used to compute all of the libraries involved in a cycle that i nclude the root 4950 * This map is used to compute all of the libraries involved in a cycle that i nclude the root
4757 * library. Given that we only add libraries that are reachable from the root library, when we 4951 * library. Given that we only add libraries that are reachable from the root library, when we
4758 * work backward we are guaranteed to only get libraries in the cycle. 4952 * work backward we are guaranteed to only get libraries in the cycle.
4953 *
4759 * @param library the library currently being added to the dependency map 4954 * @param library the library currently being added to the dependency map
4760 */ 4955 */
4761 Map<Library, List<Library>> computeDependencyMap(Library library) { 4956 Map<Library, List<Library>> computeDependencyMap(Library library) {
4762 Map<Library, List<Library>> dependencyMap = new Map<Library, List<Library>>( ); 4957 Map<Library, List<Library>> dependencyMap = new Map<Library, List<Library>>( );
4763 addToDependencyMap(library, dependencyMap, new Set<Library>()); 4958 addToDependencyMap(library, dependencyMap, new Set<Library>());
4764 return dependencyMap; 4959 return dependencyMap;
4765 } 4960 }
4766 4961
4767 /** 4962 /**
4768 * Return a collection containing all of the libraries reachable from the give n library that are 4963 * Return a collection containing all of the libraries reachable from the give n library that are
4769 * contained in a cycle that includes the given library. 4964 * contained in a cycle that includes the given library.
4965 *
4770 * @param library the library that must be included in any cycles whose member s are to be returned 4966 * @param library the library that must be included in any cycles whose member s are to be returned
4771 * @return all of the libraries referenced by the given library that have a ci rcular reference 4967 * @return all of the libraries referenced by the given library that have a ci rcular reference
4772 * back to the given library 4968 * back to the given library
4773 */ 4969 */
4774 Set<Library> computeLibrariesInCycles(Library library) { 4970 Set<Library> computeLibrariesInCycles(Library library) {
4775 Map<Library, List<Library>> dependencyMap = computeDependencyMap(library); 4971 Map<Library, List<Library>> dependencyMap = computeDependencyMap(library);
4776 Set<Library> librariesInCycle = new Set<Library>(); 4972 Set<Library> librariesInCycle = new Set<Library>();
4777 addLibrariesInCycle(library, librariesInCycle, dependencyMap); 4973 addLibrariesInCycle(library, librariesInCycle, dependencyMap);
4778 return librariesInCycle; 4974 return librariesInCycle;
4779 } 4975 }
4780 4976
4781 /** 4977 /**
4782 * Recursively traverse the libraries reachable from the given library, creati ng instances of the 4978 * Recursively traverse the libraries reachable from the given library, creati ng instances of the
4783 * class [Library] to represent them, and record the references in the library objects. 4979 * class [Library] to represent them, and record the references in the library objects.
4980 *
4784 * @param library the library to be processed to find libraries that have not yet been traversed 4981 * @param library the library to be processed to find libraries that have not yet been traversed
4785 * @throws AnalysisException if some portion of the library graph could not be traversed 4982 * @throws AnalysisException if some portion of the library graph could not be traversed
4786 */ 4983 */
4787 void computeLibraryDependencies(Library library) { 4984 void computeLibraryDependencies(Library library) {
4985 Source librarySource = library.librarySource;
4986 List<Library> importedLibraries = new List<Library>();
4788 bool explicitlyImportsCore = false; 4987 bool explicitlyImportsCore = false;
4789 CompilationUnit unit = library.definingCompilationUnit; 4988 for (Source importedSource in _analysisContext.computeImportedLibraries(libr arySource)) {
4790 for (Directive directive in unit.directives) { 4989 if (importedSource == _coreLibrarySource) {
4791 if (directive is ImportDirective) { 4990 explicitlyImportsCore = true;
4792 ImportDirective importDirective = directive as ImportDirective; 4991 }
4793 Source importedSource = library.getSource(importDirective); 4992 Library importedLibrary = _libraryMap[importedSource];
4794 if (importedSource != null) { 4993 if (importedLibrary == null) {
4795 if (importedSource == _coreLibrarySource) { 4994 importedLibrary = createLibraryOrNull(importedSource);
4796 explicitlyImportsCore = true; 4995 if (importedLibrary != null) {
4797 } 4996 computeLibraryDependencies(importedLibrary);
4798 Library importedLibrary = _libraryMap[importedSource];
4799 if (importedLibrary == null) {
4800 importedLibrary = createLibraryOrNull(importedSource);
4801 if (importedLibrary != null) {
4802 computeLibraryDependencies(importedLibrary);
4803 }
4804 }
4805 if (importedLibrary != null) {
4806 library.addImport(importDirective, importedLibrary);
4807 if (doesCompilationUnitHavePartOfDirective(importedLibrary.getAST(im portedSource))) {
4808 StringLiteral uriLiteral = importDirective.uri;
4809 _errorListener.onError(new AnalysisError.con2(library.librarySourc e, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LIBR ARY, [uriLiteral.toSource()]));
4810 }
4811 }
4812 }
4813 } else if (directive is ExportDirective) {
4814 ExportDirective exportDirective = directive as ExportDirective;
4815 Source exportedSource = library.getSource(exportDirective);
4816 if (exportedSource != null) {
4817 Library exportedLibrary = _libraryMap[exportedSource];
4818 if (exportedLibrary == null) {
4819 exportedLibrary = createLibraryOrNull(exportedSource);
4820 if (exportedLibrary != null) {
4821 computeLibraryDependencies(exportedLibrary);
4822 }
4823 }
4824 if (exportedLibrary != null) {
4825 library.addExport(exportDirective, exportedLibrary);
4826 if (doesCompilationUnitHavePartOfDirective(exportedLibrary.getAST(ex portedSource))) {
4827 StringLiteral uriLiteral = exportDirective.uri;
4828 _errorListener.onError(new AnalysisError.con2(library.librarySourc e, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIBR ARY, [uriLiteral.toSource()]));
4829 }
4830 }
4831 } 4997 }
4832 } 4998 }
4999 if (importedLibrary != null) {
5000 importedLibraries.add(importedLibrary);
5001 }
4833 } 5002 }
5003 library.importedLibraries = new List.from(importedLibraries);
5004 List<Library> exportedLibraries = new List<Library>();
5005 for (Source exportedSource in _analysisContext.computeExportedLibraries(libr arySource)) {
5006 Library exportedLibrary = _libraryMap[exportedSource];
5007 if (exportedLibrary == null) {
5008 exportedLibrary = createLibraryOrNull(exportedSource);
5009 if (exportedLibrary != null) {
5010 computeLibraryDependencies(exportedLibrary);
5011 }
5012 }
5013 if (exportedLibrary != null) {
5014 exportedLibraries.add(exportedLibrary);
5015 }
5016 }
5017 library.exportedLibraries = new List.from(exportedLibraries);
4834 library.explicitlyImportsCore = explicitlyImportsCore; 5018 library.explicitlyImportsCore = explicitlyImportsCore;
4835 if (!explicitlyImportsCore && _coreLibrarySource != library.librarySource) { 5019 if (!explicitlyImportsCore && _coreLibrarySource != library.librarySource) {
4836 Library importedLibrary = _libraryMap[_coreLibrarySource]; 5020 Library importedLibrary = _libraryMap[_coreLibrarySource];
4837 if (importedLibrary == null) { 5021 if (importedLibrary == null) {
4838 importedLibrary = createLibraryOrNull(_coreLibrarySource); 5022 importedLibrary = createLibraryOrNull(_coreLibrarySource);
4839 if (importedLibrary != null) { 5023 if (importedLibrary != null) {
4840 computeLibraryDependencies(importedLibrary); 5024 computeLibraryDependencies(importedLibrary);
4841 } 5025 }
4842 } 5026 }
4843 } 5027 }
4844 } 5028 }
4845 5029
4846 /** 5030 /**
4847 * Create an object to represent the information about the library defined by the compilation unit 5031 * Create an object to represent the information about the library defined by the compilation unit
4848 * with the given source. 5032 * with the given source.
5033 *
4849 * @param librarySource the source of the library's defining compilation unit 5034 * @param librarySource the source of the library's defining compilation unit
4850 * @return the library object that was created 5035 * @return the library object that was created
4851 * @throws AnalysisException if the library source is not valid 5036 * @throws AnalysisException if the library source is not valid
4852 */ 5037 */
4853 Library createLibrary(Source librarySource) { 5038 Library createLibrary(Source librarySource) {
4854 Library library = new Library(_analysisContext, _errorListener, librarySourc e); 5039 Library library = new Library(_analysisContext, _errorListener, librarySourc e);
4855 library.definingCompilationUnit; 5040 library.definingCompilationUnit;
4856 _libraryMap[librarySource] = library; 5041 _libraryMap[librarySource] = library;
4857 return library; 5042 return library;
4858 } 5043 }
4859 5044
4860 /** 5045 /**
4861 * Create an object to represent the information about the library defined by the compilation unit 5046 * Create an object to represent the information about the library defined by the compilation unit
4862 * with the given source. 5047 * with the given source.
5048 *
4863 * @param librarySource the source of the library's defining compilation unit 5049 * @param librarySource the source of the library's defining compilation unit
4864 * @return the library object that was created 5050 * @return the library object that was created
4865 * @throws AnalysisException if the library source is not valid 5051 * @throws AnalysisException if the library source is not valid
4866 */ 5052 */
4867 Library createLibrary2(Source librarySource, CompilationUnit unit) { 5053 Library createLibrary2(Source librarySource, CompilationUnit unit) {
4868 Library library = new Library(_analysisContext, _errorListener, librarySourc e); 5054 Library library = new Library(_analysisContext, _errorListener, librarySourc e);
4869 library.definingCompilationUnit = unit; 5055 library.definingCompilationUnit = unit;
4870 _libraryMap[librarySource] = library; 5056 _libraryMap[librarySource] = library;
4871 return library; 5057 return library;
4872 } 5058 }
4873 5059
4874 /** 5060 /**
4875 * Create an object to represent the information about the library defined by the compilation unit 5061 * Create an object to represent the information about the library defined by the compilation unit
4876 * with the given source. Return the library object that was created, or `null ` if the 5062 * with the given source. Return the library object that was created, or `null ` if the
4877 * source is not valid. 5063 * source is not valid.
5064 *
4878 * @param librarySource the source of the library's defining compilation unit 5065 * @param librarySource the source of the library's defining compilation unit
4879 * @return the library object that was created 5066 * @return the library object that was created
4880 */ 5067 */
4881 Library createLibraryOrNull(Source librarySource) { 5068 Library createLibraryOrNull(Source librarySource) {
4882 if (!librarySource.exists()) { 5069 if (!librarySource.exists()) {
4883 return null; 5070 return null;
4884 } 5071 }
4885 Library library = new Library(_analysisContext, _errorListener, librarySourc e); 5072 Library library = new Library(_analysisContext, _errorListener, librarySourc e);
4886 try { 5073 try {
4887 library.definingCompilationUnit; 5074 library.definingCompilationUnit;
4888 } on AnalysisException catch (exception) { 5075 } on AnalysisException catch (exception) {
4889 return null; 5076 return null;
4890 } 5077 }
4891 _libraryMap[librarySource] = library; 5078 _libraryMap[librarySource] = library;
4892 return library; 5079 return library;
4893 } 5080 }
4894 5081
4895 /** 5082 /**
4896 * Return `true` if and only if the passed [CompilationUnit] has a part-of dir ective. 5083 * Return `true` if and only if the passed [CompilationUnit] has a part-of dir ective.
5084 *
4897 * @param node the [CompilationUnit] to test 5085 * @param node the [CompilationUnit] to test
4898 * @return `true` if and only if the passed [CompilationUnit] has a part-of di rective 5086 * @return `true` if and only if the passed [CompilationUnit] has a part-of di rective
4899 */ 5087 */
4900 bool doesCompilationUnitHavePartOfDirective(CompilationUnit node) { 5088 bool doesCompilationUnitHavePartOfDirective(CompilationUnit node) {
4901 NodeList<Directive> directives = node.directives; 5089 NodeList<Directive> directives = node.directives;
4902 for (Directive directive in directives) { 5090 for (Directive directive in directives) {
4903 if (directive is PartOfDirective) { 5091 if (directive is PartOfDirective) {
4904 return true; 5092 return true;
4905 } 5093 }
4906 } 5094 }
4907 return false; 5095 return false;
4908 } 5096 }
4909 5097
4910 /** 5098 /**
4911 * Return an array containing the lexical identifiers associated with the node s in the given list. 5099 * Return an array containing the lexical identifiers associated with the node s in the given list.
5100 *
4912 * @param names the AST nodes representing the identifiers 5101 * @param names the AST nodes representing the identifiers
4913 * @return the lexical identifiers associated with the nodes in the list 5102 * @return the lexical identifiers associated with the nodes in the list
4914 */ 5103 */
4915 List<String> getIdentifiers(NodeList<SimpleIdentifier> names) { 5104 List<String> getIdentifiers(NodeList<SimpleIdentifier> names) {
4916 int count = names.length; 5105 int count = names.length;
4917 List<String> identifiers = new List<String>(count); 5106 List<String> identifiers = new List<String>(count);
4918 for (int i = 0; i < count; i++) { 5107 for (int i = 0; i < count; i++) {
4919 identifiers[i] = names[i].name; 5108 identifiers[i] = names[i].name;
4920 } 5109 }
4921 return identifiers; 5110 return identifiers;
(...skipping 14 matching lines...) Expand all
4936 } on AnalysisException catch (exception) { 5125 } on AnalysisException catch (exception) {
4937 AnalysisEngine.instance.logger.logError2("Internal Error: Could not ac cess AST for ${source.fullName} during constant evaluation", exception); 5126 AnalysisEngine.instance.logger.logError2("Internal Error: Could not ac cess AST for ${source.fullName} during constant evaluation", exception);
4938 } 5127 }
4939 } 5128 }
4940 } 5129 }
4941 computer.computeValues(); 5130 computer.computeValues();
4942 } 5131 }
4943 5132
4944 /** 5133 /**
4945 * Resolve the identifiers and perform type analysis in the libraries in the c urrent cycle. 5134 * Resolve the identifiers and perform type analysis in the libraries in the c urrent cycle.
5135 *
4946 * @throws AnalysisException if any of the identifiers could not be resolved o r if any of the 5136 * @throws AnalysisException if any of the identifiers could not be resolved o r if any of the
4947 * libraries could not have their types analyzed 5137 * libraries could not have their types analyzed
4948 */ 5138 */
4949 void resolveReferencesAndTypes() { 5139 void resolveReferencesAndTypes() {
4950 for (Library library in _librariesInCycles) { 5140 for (Library library in _librariesInCycles) {
4951 resolveReferencesAndTypes2(library); 5141 resolveReferencesAndTypes2(library);
4952 } 5142 }
4953 } 5143 }
4954 5144
4955 /** 5145 /**
4956 * Resolve the identifiers and perform type analysis in the given library. 5146 * Resolve the identifiers and perform type analysis in the given library.
5147 *
4957 * @param library the library to be resolved 5148 * @param library the library to be resolved
4958 * @throws AnalysisException if any of the identifiers could not be resolved o r if the types in 5149 * @throws AnalysisException if any of the identifiers could not be resolved o r if the types in
4959 * the library cannot be analyzed 5150 * the library cannot be analyzed
4960 */ 5151 */
4961 void resolveReferencesAndTypes2(Library library) { 5152 void resolveReferencesAndTypes2(Library library) {
4962 for (Source source in library.compilationUnitSources) { 5153 for (Source source in library.compilationUnitSources) {
4963 ResolverVisitor visitor = new ResolverVisitor.con1(library, source, _typeP rovider); 5154 ResolverVisitor visitor = new ResolverVisitor.con1(library, source, _typeP rovider);
4964 library.getAST(source).accept(visitor); 5155 library.getAST(source).accept(visitor);
4965 } 5156 }
4966 } 5157 }
4967 5158
4968 /** 5159 /**
4969 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier] analysis in the current cycle. 5160 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier]
5161 * analysis in the current cycle.
5162 *
4970 * @throws AnalysisException if any of the identifiers could not be resolved o r if the types in 5163 * @throws AnalysisException if any of the identifiers could not be resolved o r if the types in
4971 * the library cannot be analyzed 5164 * the library cannot be analyzed
4972 */ 5165 */
4973 void runAdditionalAnalyses() { 5166 void runAdditionalAnalyses() {
4974 for (Library library in _librariesInCycles) { 5167 for (Library library in _librariesInCycles) {
4975 runAdditionalAnalyses2(library); 5168 runAdditionalAnalyses2(library);
4976 } 5169 }
4977 } 5170 }
4978 5171
4979 /** 5172 /**
4980 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier] analysis in the given library. 5173 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier]
5174 * analysis in the given library.
5175 *
4981 * @param library the library to have the extra analyses processes run 5176 * @param library the library to have the extra analyses processes run
4982 * @throws AnalysisException if any of the identifiers could not be resolved o r if the types in 5177 * @throws AnalysisException if any of the identifiers could not be resolved o r if the types in
4983 * the library cannot be analyzed 5178 * the library cannot be analyzed
4984 */ 5179 */
4985 void runAdditionalAnalyses2(Library library) { 5180 void runAdditionalAnalyses2(Library library) {
4986 for (Source source in library.compilationUnitSources) { 5181 for (Source source in library.compilationUnitSources) {
4987 ErrorReporter errorReporter = new ErrorReporter(_errorListener, source); 5182 ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
4988 CompilationUnit unit = library.getAST(source); 5183 CompilationUnit unit = library.getAST(source);
4989 ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _t ypeProvider); 5184 ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _t ypeProvider);
4990 unit.accept(constantVerifier); 5185 unit.accept(constantVerifier);
4991 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.lib raryElement, _typeProvider, library.inheritanceManager); 5186 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.lib raryElement, _typeProvider, library.inheritanceManager);
4992 unit.accept(errorVerifier); 5187 unit.accept(errorVerifier);
5188 if (_audit) {
5189 unit.accept(new PubVerifier(_analysisContext, errorReporter));
5190 }
4993 } 5191 }
4994 } 5192 }
4995 } 5193 }
4996 /** 5194 /**
4997 * Instances of the class `ResolverVisitor` are used to resolve the nodes within a single 5195 * Instances of the class `ResolverVisitor` are used to resolve the nodes within a single
4998 * compilation unit. 5196 * compilation unit.
5197 *
4999 * @coverage dart.engine.resolver 5198 * @coverage dart.engine.resolver
5000 */ 5199 */
5001 class ResolverVisitor extends ScopedVisitor { 5200 class ResolverVisitor extends ScopedVisitor {
5002 5201
5003 /** 5202 /**
5004 * The object used to resolve the element associated with the current node. 5203 * The object used to resolve the element associated with the current node.
5005 */ 5204 */
5006 ElementResolver _elementResolver; 5205 ElementResolver _elementResolver;
5007 5206
5008 /** 5207 /**
(...skipping 13 matching lines...) Expand all
5022 */ 5221 */
5023 ExecutableElement _enclosingFunction = null; 5222 ExecutableElement _enclosingFunction = null;
5024 5223
5025 /** 5224 /**
5026 * The object keeping track of which elements have had their types overridden. 5225 * The object keeping track of which elements have had their types overridden.
5027 */ 5226 */
5028 TypeOverrideManager _overrideManager = new TypeOverrideManager(); 5227 TypeOverrideManager _overrideManager = new TypeOverrideManager();
5029 5228
5030 /** 5229 /**
5031 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 5230 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
5231 *
5032 * @param library the library containing the compilation unit being resolved 5232 * @param library the library containing the compilation unit being resolved
5033 * @param source the source representing the compilation unit being visited 5233 * @param source the source representing the compilation unit being visited
5034 * @param typeProvider the object used to access the types from the core libra ry 5234 * @param typeProvider the object used to access the types from the core libra ry
5035 */ 5235 */
5036 ResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider ) : super.con1(library, source, typeProvider) { 5236 ResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider ) : super.con1(library, source, typeProvider) {
5037 _jtd_constructor_274_impl(library, source, typeProvider); 5237 _jtd_constructor_274_impl(library, source, typeProvider);
5038 } 5238 }
5039 _jtd_constructor_274_impl(Library library, Source source, TypeProvider typePro vider) { 5239 _jtd_constructor_274_impl(Library library, Source source, TypeProvider typePro vider) {
5040 this._elementResolver = new ElementResolver(this); 5240 this._elementResolver = new ElementResolver(this);
5041 this._typeAnalyzer = new StaticTypeAnalyzer(this); 5241 this._typeAnalyzer = new StaticTypeAnalyzer(this);
5042 } 5242 }
5043 5243
5044 /** 5244 /**
5045 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 5245 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
5246 *
5046 * @param definingLibrary the element for the library containing the compilati on unit being 5247 * @param definingLibrary the element for the library containing the compilati on unit being
5047 * visited 5248 * visited
5048 * @param source the source representing the compilation unit being visited 5249 * @param source the source representing the compilation unit being visited
5049 * @param typeProvider the object used to access the types from the core libra ry 5250 * @param typeProvider the object used to access the types from the core libra ry
5050 * @param errorListener the error listener that will be informed of any errors that are found 5251 * @param errorListener the error listener that will be informed of any errors that are found
5051 * during resolution 5252 * during resolution
5052 */ 5253 */
5053 ResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvid er typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibra ry, source, typeProvider, errorListener) { 5254 ResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvid er typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibra ry, source, typeProvider, errorListener) {
5054 _jtd_constructor_275_impl(definingLibrary, source, typeProvider, errorListen er); 5255 _jtd_constructor_275_impl(definingLibrary, source, typeProvider, errorListen er);
5055 } 5256 }
5056 _jtd_constructor_275_impl(LibraryElement definingLibrary, Source source, TypeP rovider typeProvider, AnalysisErrorListener errorListener) { 5257 _jtd_constructor_275_impl(LibraryElement definingLibrary, Source source, TypeP rovider typeProvider, AnalysisErrorListener errorListener) {
5057 this._elementResolver = new ElementResolver(this); 5258 this._elementResolver = new ElementResolver(this);
5058 this._typeAnalyzer = new StaticTypeAnalyzer(this); 5259 this._typeAnalyzer = new StaticTypeAnalyzer(this);
5059 } 5260 }
5060 5261
5061 /** 5262 /**
5062 * Return the object keeping track of which elements have had their types over ridden. 5263 * Return the object keeping track of which elements have had their types over ridden.
5264 *
5063 * @return the object keeping track of which elements have had their types ove rridden 5265 * @return the object keeping track of which elements have had their types ove rridden
5064 */ 5266 */
5065 TypeOverrideManager get overrideManager => _overrideManager; 5267 TypeOverrideManager get overrideManager => _overrideManager;
5066 Object visitAsExpression(AsExpression node) { 5268 Object visitAsExpression(AsExpression node) {
5067 super.visitAsExpression(node); 5269 super.visitAsExpression(node);
5068 VariableElement element = getOverridableElement(node.expression); 5270 VariableElement element = getOverridableElement(node.expression);
5069 if (element != null) { 5271 if (element != null) {
5070 override(element, node.type.type); 5272 override(element, node.type.type);
5071 } 5273 }
5072 return null; 5274 return null;
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
5281 try { 5483 try {
5282 _enclosingFunction = node.element; 5484 _enclosingFunction = node.element;
5283 _overrideManager.enterScope(); 5485 _overrideManager.enterScope();
5284 super.visitFunctionExpression(node); 5486 super.visitFunctionExpression(node);
5285 } finally { 5487 } finally {
5286 _overrideManager.exitScope(); 5488 _overrideManager.exitScope();
5287 _enclosingFunction = outerFunction; 5489 _enclosingFunction = outerFunction;
5288 } 5490 }
5289 return null; 5491 return null;
5290 } 5492 }
5493 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
5494 safelyVisit(node.function);
5495 node.accept(_elementResolver);
5496 inferFunctionExpressionsParametersTypes(node.argumentList);
5497 safelyVisit(node.argumentList);
5498 node.accept(_typeAnalyzer);
5499 return null;
5500 }
5291 Object visitHideCombinator(HideCombinator node) => null; 5501 Object visitHideCombinator(HideCombinator node) => null;
5292 Object visitIfStatement(IfStatement node) { 5502 Object visitIfStatement(IfStatement node) {
5293 Expression condition = node.condition; 5503 Expression condition = node.condition;
5294 safelyVisit(condition); 5504 safelyVisit(condition);
5295 Map<Element, Type2> thenOverrides = null; 5505 Map<Element, Type2> thenOverrides = null;
5296 Statement thenStatement = node.thenStatement; 5506 Statement thenStatement = node.thenStatement;
5297 if (thenStatement != null) { 5507 if (thenStatement != null) {
5298 try { 5508 try {
5299 _overrideManager.enterScope(); 5509 _overrideManager.enterScope();
5300 propagateTrueState(condition); 5510 propagateTrueState(condition);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
5340 try { 5550 try {
5341 _enclosingFunction = node.element; 5551 _enclosingFunction = node.element;
5342 super.visitMethodDeclaration(node); 5552 super.visitMethodDeclaration(node);
5343 } finally { 5553 } finally {
5344 _enclosingFunction = outerFunction; 5554 _enclosingFunction = outerFunction;
5345 } 5555 }
5346 return null; 5556 return null;
5347 } 5557 }
5348 Object visitMethodInvocation(MethodInvocation node) { 5558 Object visitMethodInvocation(MethodInvocation node) {
5349 safelyVisit(node.target); 5559 safelyVisit(node.target);
5560 node.accept(_elementResolver);
5561 inferFunctionExpressionsParametersTypes(node.argumentList);
5350 safelyVisit(node.argumentList); 5562 safelyVisit(node.argumentList);
5351 node.accept(_elementResolver);
5352 node.accept(_typeAnalyzer); 5563 node.accept(_typeAnalyzer);
5353 return null; 5564 return null;
5354 } 5565 }
5355 Object visitNode(ASTNode node) { 5566 Object visitNode(ASTNode node) {
5356 node.visitChildren(this); 5567 node.visitChildren(this);
5357 node.accept(_elementResolver); 5568 node.accept(_elementResolver);
5358 node.accept(_typeAnalyzer); 5569 node.accept(_typeAnalyzer);
5359 return null; 5570 return null;
5360 } 5571 }
5361 Object visitPrefixedIdentifier(PrefixedIdentifier node) { 5572 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
5427 } 5638 }
5428 } 5639 }
5429 node.accept(_elementResolver); 5640 node.accept(_elementResolver);
5430 node.accept(_typeAnalyzer); 5641 node.accept(_typeAnalyzer);
5431 return null; 5642 return null;
5432 } 5643 }
5433 5644
5434 /** 5645 /**
5435 * Return the class element representing the class containing the current node , or `null` if 5646 * Return the class element representing the class containing the current node , or `null` if
5436 * the current node is not contained in a class. 5647 * the current node is not contained in a class.
5648 *
5437 * @return the class element representing the class containing the current nod e 5649 * @return the class element representing the class containing the current nod e
5438 */ 5650 */
5439 ClassElement get enclosingClass => _enclosingClass; 5651 ClassElement get enclosingClass => _enclosingClass;
5440 5652
5441 /** 5653 /**
5442 * Return the element representing the function containing the current node, o r `null` if 5654 * Return the element representing the function containing the current node, o r `null` if
5443 * the current node is not contained in a function. 5655 * the current node is not contained in a function.
5656 *
5444 * @return the element representing the function containing the current node 5657 * @return the element representing the function containing the current node
5445 */ 5658 */
5446 ExecutableElement get enclosingFunction => _enclosingFunction; 5659 ExecutableElement get enclosingFunction => _enclosingFunction;
5447 5660
5448 /** 5661 /**
5449 * Return the element associated with the given expression whose type can be o verridden, or`null` if there is no element whose type can be overridden. 5662 * Return the element associated with the given expression whose type can be o verridden, or
5663 * `null` if there is no element whose type can be overridden.
5664 *
5450 * @param expression the expression with which the element is associated 5665 * @param expression the expression with which the element is associated
5451 * @return the element associated with the given expression 5666 * @return the element associated with the given expression
5452 */ 5667 */
5453 VariableElement getOverridableElement(Expression expression) { 5668 VariableElement getOverridableElement(Expression expression) {
5454 Element element = null; 5669 Element element = null;
5455 if (expression is SimpleIdentifier) { 5670 if (expression is SimpleIdentifier) {
5456 element = ((expression as SimpleIdentifier)).element; 5671 element = ((expression as SimpleIdentifier)).element;
5457 } else if (expression is PrefixedIdentifier) { 5672 } else if (expression is PrefixedIdentifier) {
5458 element = ((expression as PrefixedIdentifier)).element; 5673 element = ((expression as PrefixedIdentifier)).element;
5459 } else if (expression is PropertyAccess) { 5674 } else if (expression is PropertyAccess) {
5460 element = ((expression as PropertyAccess)).propertyName.element; 5675 element = ((expression as PropertyAccess)).propertyName.element;
5461 } 5676 }
5462 if (element is VariableElement) { 5677 if (element is VariableElement) {
5463 return element as VariableElement; 5678 return element as VariableElement;
5464 } 5679 }
5465 return null; 5680 return null;
5466 } 5681 }
5467 5682
5468 /** 5683 /**
5469 * If it is appropriate to do so, override the current type of the given eleme nt with the given 5684 * If it is appropriate to do so, override the current type of the given eleme nt with the given
5470 * type. Generally speaking, it is appropriate if the given type is more speci fic than the current 5685 * type. Generally speaking, it is appropriate if the given type is more speci fic than the current
5471 * type. 5686 * type.
5687 *
5472 * @param element the element whose type might be overridden 5688 * @param element the element whose type might be overridden
5473 * @param potentialType the potential type of the element 5689 * @param potentialType the potential type of the element
5474 */ 5690 */
5475 void override(VariableElement element, Type2 potentialType) { 5691 void override(VariableElement element, Type2 potentialType) {
5476 if (potentialType == null || identical(potentialType, BottomTypeImpl.instanc e)) { 5692 if (potentialType == null || identical(potentialType, BottomTypeImpl.instanc e)) {
5477 return; 5693 return;
5478 } 5694 }
5479 if (element is PropertyInducingElement) { 5695 if (element is PropertyInducingElement) {
5480 PropertyInducingElement variable = element as PropertyInducingElement; 5696 PropertyInducingElement variable = element as PropertyInducingElement;
5481 if (!variable.isConst && !variable.isFinal) { 5697 if (!variable.isConst && !variable.isFinal) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
5520 safelyVisit(node.body); 5736 safelyVisit(node.body);
5521 node.updaters.accept(this); 5737 node.updaters.accept(this);
5522 } finally { 5738 } finally {
5523 _overrideManager.exitScope(); 5739 _overrideManager.exitScope();
5524 } 5740 }
5525 } 5741 }
5526 5742
5527 /** 5743 /**
5528 * Return the best type information available for the given element. If the ty pe of the element 5744 * Return the best type information available for the given element. If the ty pe of the element
5529 * has been overridden, then return the overriding type. Otherwise, return the static type. 5745 * has been overridden, then return the overriding type. Otherwise, return the static type.
5746 *
5530 * @param element the element for which type information is to be returned 5747 * @param element the element for which type information is to be returned
5531 * @return the best type information available for the given element 5748 * @return the best type information available for the given element
5532 */ 5749 */
5533 Type2 getBestType(Element element) { 5750 Type2 getBestType(Element element) {
5534 Type2 bestType = _overrideManager.getType(element); 5751 Type2 bestType = _overrideManager.getType(element);
5535 if (bestType == null) { 5752 if (bestType == null) {
5536 if (element is LocalVariableElement) { 5753 if (element is LocalVariableElement) {
5537 bestType = ((element as LocalVariableElement)).type; 5754 bestType = ((element as LocalVariableElement)).type;
5538 } else if (element is ParameterElement) { 5755 } else if (element is ParameterElement) {
5539 bestType = ((element as ParameterElement)).type; 5756 bestType = ((element as ParameterElement)).type;
5540 } 5757 }
5541 } 5758 }
5542 return bestType; 5759 return bestType;
5543 } 5760 }
5544 5761
5545 /** 5762 /**
5546 * The given expression is the expression used to compute the iterator for a f or-each statement. 5763 * The given expression is the expression used to compute the iterator for a f or-each statement.
5547 * Attempt to compute the type of objects that will be assigned to the loop va riable and return 5764 * Attempt to compute the type of objects that will be assigned to the loop va riable and return
5548 * that type. Return `null` if the type could not be determined. 5765 * that type. Return `null` if the type could not be determined.
5766 *
5549 * @param iterator the iterator for a for-each statement 5767 * @param iterator the iterator for a for-each statement
5550 * @return the type of objects that will be assigned to the loop variable 5768 * @return the type of objects that will be assigned to the loop variable
5551 */ 5769 */
5552 Type2 getIteratorElementType(Expression iteratorExpression) { 5770 Type2 getIteratorElementType(Expression iteratorExpression) {
5553 Type2 expressionType = iteratorExpression.staticType; 5771 Type2 expressionType = iteratorExpression.staticType;
5554 if (expressionType is InterfaceType) { 5772 if (expressionType is InterfaceType) {
5555 PropertyAccessorElement iterator = ((expressionType as InterfaceType)).loo kUpGetter("iterator", definingLibrary); 5773 PropertyAccessorElement iterator = ((expressionType as InterfaceType)).loo kUpGetter("iterator", definingLibrary);
5556 if (iterator == null) { 5774 if (iterator == null) {
5557 return null; 5775 return null;
5558 } 5776 }
5559 Type2 iteratorType = iterator.type.returnType; 5777 Type2 iteratorType = iterator.type.returnType;
5560 if (iteratorType is InterfaceType) { 5778 if (iteratorType is InterfaceType) {
5561 PropertyAccessorElement current = ((iteratorType as InterfaceType)).look UpGetter("current", definingLibrary); 5779 PropertyAccessorElement current = ((iteratorType as InterfaceType)).look UpGetter("current", definingLibrary);
5562 if (current == null) { 5780 if (current == null) {
5563 return null; 5781 return null;
5564 } 5782 }
5565 return current.type.returnType; 5783 return current.type.returnType;
5566 } 5784 }
5567 } 5785 }
5568 return null; 5786 return null;
5569 } 5787 }
5570 5788
5571 /** 5789 /**
5790 * If given "mayBeClosure" is [FunctionExpression] without explicit parameters types and its
5791 * required type is [FunctionType], then infer parameters types from [Function Type].
5792 */
5793 void inferFunctionExpressionParametersTypes(Expression mayBeClosure, Type2 may ByFunctionType) {
5794 if (mayBeClosure is! FunctionExpression) {
5795 return;
5796 }
5797 FunctionExpression closure = mayBeClosure as FunctionExpression;
5798 if (mayByFunctionType is! FunctionType) {
5799 return;
5800 }
5801 FunctionType expectedClosureType = mayByFunctionType as FunctionType;
5802 closure.propagatedType = expectedClosureType;
5803 NodeList<FormalParameter> parameters = closure.parameters.parameters;
5804 List<ParameterElement> expectedParameters = expectedClosureType.parameters;
5805 for (int i = 0; i < parameters.length && i < expectedParameters.length; i++) {
5806 FormalParameter parameter = parameters[i];
5807 ParameterElement element = parameter.element;
5808 Type2 currentType = getBestType(element);
5809 Type2 expectedType = expectedParameters[i].type;
5810 if (currentType == null || expectedType.isMoreSpecificThan(currentType)) {
5811 _overrideManager.setType(element, expectedType);
5812 }
5813 }
5814 }
5815
5816 /**
5817 * Try to infer types of parameters of the [FunctionExpression] arguments.
5818 */
5819 void inferFunctionExpressionsParametersTypes(ArgumentList argumentList) {
5820 for (Expression argument in argumentList.arguments) {
5821 ParameterElement parameter = argument.parameterElement;
5822 if (parameter == null) {
5823 parameter = argument.staticParameterElement;
5824 }
5825 if (parameter != null) {
5826 inferFunctionExpressionParametersTypes(argument, parameter.type);
5827 }
5828 }
5829 }
5830
5831 /**
5572 * Return `true` if the given expression terminates abruptly (that is, if any expression 5832 * Return `true` if the given expression terminates abruptly (that is, if any expression
5573 * following the given expression will not be reached). 5833 * following the given expression will not be reached).
5834 *
5574 * @param expression the expression being tested 5835 * @param expression the expression being tested
5575 * @return `true` if the given expression terminates abruptly 5836 * @return `true` if the given expression terminates abruptly
5576 */ 5837 */
5577 bool isAbruptTermination(Expression expression2) { 5838 bool isAbruptTermination(Expression expression2) {
5578 while (expression2 is ParenthesizedExpression) { 5839 while (expression2 is ParenthesizedExpression) {
5579 expression2 = ((expression2 as ParenthesizedExpression)).expression; 5840 expression2 = ((expression2 as ParenthesizedExpression)).expression;
5580 } 5841 }
5581 return expression2 is ThrowExpression || expression2 is RethrowExpression; 5842 return expression2 is ThrowExpression || expression2 is RethrowExpression;
5582 } 5843 }
5583 5844
5584 /** 5845 /**
5585 * Return `true` if the given statement terminates abruptly (that is, if any s tatement 5846 * Return `true` if the given statement terminates abruptly (that is, if any s tatement
5586 * following the given statement will not be reached). 5847 * following the given statement will not be reached).
5848 *
5587 * @param statement the statement being tested 5849 * @param statement the statement being tested
5588 * @return `true` if the given statement terminates abruptly 5850 * @return `true` if the given statement terminates abruptly
5589 */ 5851 */
5590 bool isAbruptTermination2(Statement statement) { 5852 bool isAbruptTermination2(Statement statement) {
5591 if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) { 5853 if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) {
5592 return true; 5854 return true;
5593 } else if (statement is ExpressionStatement) { 5855 } else if (statement is ExpressionStatement) {
5594 return isAbruptTermination(((statement as ExpressionStatement)).expression ); 5856 return isAbruptTermination(((statement as ExpressionStatement)).expression );
5595 } else if (statement is Block) { 5857 } else if (statement is Block) {
5596 NodeList<Statement> statements = ((statement as Block)).statements; 5858 NodeList<Statement> statements = ((statement as Block)).statements;
5597 int size = statements.length; 5859 int size = statements.length;
5598 if (size == 0) { 5860 if (size == 0) {
5599 return false; 5861 return false;
5600 } 5862 }
5601 return isAbruptTermination2(statements[size - 1]); 5863 return isAbruptTermination2(statements[size - 1]);
5602 } 5864 }
5603 return false; 5865 return false;
5604 } 5866 }
5605 5867
5606 /** 5868 /**
5607 * Propagate any type information that results from knowing that the given con dition will have 5869 * Propagate any type information that results from knowing that the given con dition will have
5608 * been evaluated to 'false'. 5870 * been evaluated to 'false'.
5871 *
5609 * @param condition the condition that will have evaluated to 'false' 5872 * @param condition the condition that will have evaluated to 'false'
5610 */ 5873 */
5611 void propagateFalseState(Expression condition) { 5874 void propagateFalseState(Expression condition) {
5612 if (condition is BinaryExpression) { 5875 if (condition is BinaryExpression) {
5613 BinaryExpression binary = condition as BinaryExpression; 5876 BinaryExpression binary = condition as BinaryExpression;
5614 if (identical(binary.operator.type, sc.TokenType.BAR_BAR)) { 5877 if (identical(binary.operator.type, sc.TokenType.BAR_BAR)) {
5615 propagateFalseState(binary.leftOperand); 5878 propagateFalseState(binary.leftOperand);
5616 propagateFalseState(binary.rightOperand); 5879 propagateFalseState(binary.rightOperand);
5617 } 5880 }
5618 } else if (condition is IsExpression) { 5881 } else if (condition is IsExpression) {
(...skipping 10 matching lines...) Expand all
5629 propagateTrueState(prefix.operand); 5892 propagateTrueState(prefix.operand);
5630 } 5893 }
5631 } else if (condition is ParenthesizedExpression) { 5894 } else if (condition is ParenthesizedExpression) {
5632 propagateFalseState(((condition as ParenthesizedExpression)).expression); 5895 propagateFalseState(((condition as ParenthesizedExpression)).expression);
5633 } 5896 }
5634 } 5897 }
5635 5898
5636 /** 5899 /**
5637 * Propagate any type information that results from knowing that the given exp ression will have 5900 * Propagate any type information that results from knowing that the given exp ression will have
5638 * been evaluated without altering the flow of execution. 5901 * been evaluated without altering the flow of execution.
5902 *
5639 * @param expression the expression that will have been evaluated 5903 * @param expression the expression that will have been evaluated
5640 */ 5904 */
5641 void propagateState(Expression expression) { 5905 void propagateState(Expression expression) {
5642 } 5906 }
5643 5907
5644 /** 5908 /**
5645 * Propagate any type information that results from knowing that the given con dition will have 5909 * Propagate any type information that results from knowing that the given con dition will have
5646 * been evaluated to 'true'. 5910 * been evaluated to 'true'.
5911 *
5647 * @param condition the condition that will have evaluated to 'true' 5912 * @param condition the condition that will have evaluated to 'true'
5648 */ 5913 */
5649 void propagateTrueState(Expression condition) { 5914 void propagateTrueState(Expression condition) {
5650 if (condition is BinaryExpression) { 5915 if (condition is BinaryExpression) {
5651 BinaryExpression binary = condition as BinaryExpression; 5916 BinaryExpression binary = condition as BinaryExpression;
5652 if (identical(binary.operator.type, sc.TokenType.AMPERSAND_AMPERSAND)) { 5917 if (identical(binary.operator.type, sc.TokenType.AMPERSAND_AMPERSAND)) {
5653 propagateTrueState(binary.leftOperand); 5918 propagateTrueState(binary.leftOperand);
5654 propagateTrueState(binary.rightOperand); 5919 propagateTrueState(binary.rightOperand);
5655 } 5920 }
5656 } else if (condition is IsExpression) { 5921 } else if (condition is IsExpression) {
(...skipping 20 matching lines...) Expand all
5677 get nameScope_J2DAccessor => _nameScope; 5942 get nameScope_J2DAccessor => _nameScope;
5678 set nameScope_J2DAccessor(__v) => _nameScope = __v; 5943 set nameScope_J2DAccessor(__v) => _nameScope = __v;
5679 get typeAnalyzer_J2DAccessor => _typeAnalyzer; 5944 get typeAnalyzer_J2DAccessor => _typeAnalyzer;
5680 set typeAnalyzer_J2DAccessor(__v) => _typeAnalyzer = __v; 5945 set typeAnalyzer_J2DAccessor(__v) => _typeAnalyzer = __v;
5681 get enclosingClass_J2DAccessor => _enclosingClass; 5946 get enclosingClass_J2DAccessor => _enclosingClass;
5682 set enclosingClass_J2DAccessor(__v) => _enclosingClass = __v; 5947 set enclosingClass_J2DAccessor(__v) => _enclosingClass = __v;
5683 } 5948 }
5684 /** 5949 /**
5685 * The abstract class `ScopedVisitor` maintains name and label scopes as an AST structure is 5950 * The abstract class `ScopedVisitor` maintains name and label scopes as an AST structure is
5686 * being visited. 5951 * being visited.
5952 *
5687 * @coverage dart.engine.resolver 5953 * @coverage dart.engine.resolver
5688 */ 5954 */
5689 abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> { 5955 abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
5690 5956
5691 /** 5957 /**
5692 * The element for the library containing the compilation unit being visited. 5958 * The element for the library containing the compilation unit being visited.
5693 */ 5959 */
5694 LibraryElement _definingLibrary; 5960 LibraryElement _definingLibrary;
5695 5961
5696 /** 5962 /**
(...skipping 10 matching lines...) Expand all
5707 * The scope used to resolve identifiers. 5973 * The scope used to resolve identifiers.
5708 */ 5974 */
5709 Scope _nameScope; 5975 Scope _nameScope;
5710 5976
5711 /** 5977 /**
5712 * The object used to access the types from the core library. 5978 * The object used to access the types from the core library.
5713 */ 5979 */
5714 TypeProvider _typeProvider; 5980 TypeProvider _typeProvider;
5715 5981
5716 /** 5982 /**
5717 * The scope used to resolve labels for `break` and `continue` statements, or` null` if no labels have been defined in the current context. 5983 * The scope used to resolve labels for `break` and `continue` statements, or
5984 * `null` if no labels have been defined in the current context.
5718 */ 5985 */
5719 LabelScope _labelScope; 5986 LabelScope _labelScope;
5720 5987
5721 /** 5988 /**
5722 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 5989 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
5990 *
5723 * @param library the library containing the compilation unit being resolved 5991 * @param library the library containing the compilation unit being resolved
5724 * @param source the source representing the compilation unit being visited 5992 * @param source the source representing the compilation unit being visited
5725 * @param typeProvider the object used to access the types from the core libra ry 5993 * @param typeProvider the object used to access the types from the core libra ry
5726 */ 5994 */
5727 ScopedVisitor.con1(Library library, Source source2, TypeProvider typeProvider2 ) { 5995 ScopedVisitor.con1(Library library, Source source2, TypeProvider typeProvider2 ) {
5728 _jtd_constructor_276_impl(library, source2, typeProvider2); 5996 _jtd_constructor_276_impl(library, source2, typeProvider2);
5729 } 5997 }
5730 _jtd_constructor_276_impl(Library library, Source source2, TypeProvider typePr ovider2) { 5998 _jtd_constructor_276_impl(Library library, Source source2, TypeProvider typePr ovider2) {
5731 this._definingLibrary = library.libraryElement; 5999 this._definingLibrary = library.libraryElement;
5732 this._source = source2; 6000 this._source = source2;
5733 LibraryScope libraryScope = library.libraryScope; 6001 LibraryScope libraryScope = library.libraryScope;
5734 this._errorListener = libraryScope.errorListener; 6002 this._errorListener = libraryScope.errorListener;
5735 this._nameScope = libraryScope; 6003 this._nameScope = libraryScope;
5736 this._typeProvider = typeProvider2; 6004 this._typeProvider = typeProvider2;
5737 } 6005 }
5738 6006
5739 /** 6007 /**
5740 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 6008 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
6009 *
5741 * @param definingLibrary the element for the library containing the compilati on unit being 6010 * @param definingLibrary the element for the library containing the compilati on unit being
5742 * visited 6011 * visited
5743 * @param source the source representing the compilation unit being visited 6012 * @param source the source representing the compilation unit being visited
5744 * @param typeProvider the object used to access the types from the core libra ry 6013 * @param typeProvider the object used to access the types from the core libra ry
5745 * @param errorListener the error listener that will be informed of any errors that are found 6014 * @param errorListener the error listener that will be informed of any errors that are found
5746 * during resolution 6015 * during resolution
5747 */ 6016 */
5748 ScopedVisitor.con2(LibraryElement definingLibrary2, Source source2, TypeProvid er typeProvider2, AnalysisErrorListener errorListener2) { 6017 ScopedVisitor.con2(LibraryElement definingLibrary2, Source source2, TypeProvid er typeProvider2, AnalysisErrorListener errorListener2) {
5749 _jtd_constructor_277_impl(definingLibrary2, source2, typeProvider2, errorLis tener2); 6018 _jtd_constructor_277_impl(definingLibrary2, source2, typeProvider2, errorLis tener2);
5750 } 6019 }
5751 _jtd_constructor_277_impl(LibraryElement definingLibrary2, Source source2, Typ eProvider typeProvider2, AnalysisErrorListener errorListener2) { 6020 _jtd_constructor_277_impl(LibraryElement definingLibrary2, Source source2, Typ eProvider typeProvider2, AnalysisErrorListener errorListener2) {
5752 this._definingLibrary = definingLibrary2; 6021 this._definingLibrary = definingLibrary2;
5753 this._source = source2; 6022 this._source = source2;
5754 this._errorListener = errorListener2; 6023 this._errorListener = errorListener2;
5755 this._nameScope = new LibraryScope(definingLibrary2, errorListener2); 6024 this._nameScope = new LibraryScope(definingLibrary2, errorListener2);
5756 this._typeProvider = typeProvider2; 6025 this._typeProvider = typeProvider2;
5757 } 6026 }
5758 6027
5759 /** 6028 /**
5760 * Return the library element for the library containing the compilation unit being resolved. 6029 * Return the library element for the library containing the compilation unit being resolved.
6030 *
5761 * @return the library element for the library containing the compilation unit being resolved 6031 * @return the library element for the library containing the compilation unit being resolved
5762 */ 6032 */
5763 LibraryElement get definingLibrary => _definingLibrary; 6033 LibraryElement get definingLibrary => _definingLibrary;
5764 6034
5765 /** 6035 /**
5766 * Return the object used to access the types from the core library. 6036 * Return the object used to access the types from the core library.
6037 *
5767 * @return the object used to access the types from the core library 6038 * @return the object used to access the types from the core library
5768 */ 6039 */
5769 TypeProvider get typeProvider => _typeProvider; 6040 TypeProvider get typeProvider => _typeProvider;
5770 Object visitBlock(Block node) { 6041 Object visitBlock(Block node) {
5771 Scope outerScope = _nameScope; 6042 Scope outerScope = _nameScope;
5772 _nameScope = new EnclosedScope(_nameScope); 6043 _nameScope = new EnclosedScope(_nameScope);
5773 try { 6044 try {
5774 super.visitBlock(node); 6045 super.visitBlock(node);
5775 } finally { 6046 } finally {
5776 _nameScope = outerScope; 6047 _nameScope = outerScope;
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
5984 try { 6255 try {
5985 super.visitWhileStatement(node); 6256 super.visitWhileStatement(node);
5986 } finally { 6257 } finally {
5987 _labelScope = outerScope; 6258 _labelScope = outerScope;
5988 } 6259 }
5989 return null; 6260 return null;
5990 } 6261 }
5991 6262
5992 /** 6263 /**
5993 * Return the label scope in which the current node is being resolved. 6264 * Return the label scope in which the current node is being resolved.
6265 *
5994 * @return the label scope in which the current node is being resolved 6266 * @return the label scope in which the current node is being resolved
5995 */ 6267 */
5996 LabelScope get labelScope => _labelScope; 6268 LabelScope get labelScope => _labelScope;
5997 6269
5998 /** 6270 /**
5999 * Return the name scope in which the current node is being resolved. 6271 * Return the name scope in which the current node is being resolved.
6272 *
6000 * @return the name scope in which the current node is being resolved 6273 * @return the name scope in which the current node is being resolved
6001 */ 6274 */
6002 Scope get nameScope => _nameScope; 6275 Scope get nameScope => _nameScope;
6003 6276
6004 /** 6277 /**
6005 * Report an error with the given error code and arguments. 6278 * Report an error with the given error code and arguments.
6279 *
6006 * @param errorCode the error code of the error to be reported 6280 * @param errorCode the error code of the error to be reported
6007 * @param node the node specifying the location of the error 6281 * @param node the node specifying the location of the error
6008 * @param arguments the arguments to the error, used to compose the error mess age 6282 * @param arguments the arguments to the error, used to compose the error mess age
6009 */ 6283 */
6010 void reportError(ErrorCode errorCode, ASTNode node, List<Object> arguments) { 6284 void reportError(ErrorCode errorCode, ASTNode node, List<Object> arguments) {
6011 _errorListener.onError(new AnalysisError.con2(_source, node.offset, node.len gth, errorCode, arguments)); 6285 _errorListener.onError(new AnalysisError.con2(_source, node.offset, node.len gth, errorCode, arguments));
6012 } 6286 }
6013 6287
6014 /** 6288 /**
6015 * Report an error with the given error code and arguments. 6289 * Report an error with the given error code and arguments.
6290 *
6016 * @param errorCode the error code of the error to be reported 6291 * @param errorCode the error code of the error to be reported
6017 * @param offset the offset of the location of the error 6292 * @param offset the offset of the location of the error
6018 * @param length the length of the location of the error 6293 * @param length the length of the location of the error
6019 * @param arguments the arguments to the error, used to compose the error mess age 6294 * @param arguments the arguments to the error, used to compose the error mess age
6020 */ 6295 */
6021 void reportError5(ErrorCode errorCode, int offset, int length, List<Object> ar guments) { 6296 void reportError5(ErrorCode errorCode, int offset, int length, List<Object> ar guments) {
6022 _errorListener.onError(new AnalysisError.con2(_source, offset, length, error Code, arguments)); 6297 _errorListener.onError(new AnalysisError.con2(_source, offset, length, error Code, arguments));
6023 } 6298 }
6024 6299
6025 /** 6300 /**
6026 * Report an error with the given error code and arguments. 6301 * Report an error with the given error code and arguments.
6302 *
6027 * @param errorCode the error code of the error to be reported 6303 * @param errorCode the error code of the error to be reported
6028 * @param token the token specifying the location of the error 6304 * @param token the token specifying the location of the error
6029 * @param arguments the arguments to the error, used to compose the error mess age 6305 * @param arguments the arguments to the error, used to compose the error mess age
6030 */ 6306 */
6031 void reportError6(ErrorCode errorCode, sc.Token token, List<Object> arguments) { 6307 void reportError6(ErrorCode errorCode, sc.Token token, List<Object> arguments) {
6032 _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.l ength, errorCode, arguments)); 6308 _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.l ength, errorCode, arguments));
6033 } 6309 }
6034 6310
6035 /** 6311 /**
6036 * Visit the given AST node if it is not null. 6312 * Visit the given AST node if it is not null.
6313 *
6037 * @param node the node to be visited 6314 * @param node the node to be visited
6038 */ 6315 */
6039 void safelyVisit(ASTNode node) { 6316 void safelyVisit(ASTNode node) {
6040 if (node != null) { 6317 if (node != null) {
6041 node.accept(this); 6318 node.accept(this);
6042 } 6319 }
6043 } 6320 }
6044 6321
6045 /** 6322 /**
6046 * Visit the given statement after it's scope has been created. This replaces the normal call to 6323 * Visit the given statement after it's scope has been created. This replaces the normal call to
6047 * the inherited visit method so that ResolverVisitor can intervene when type propagation is 6324 * the inherited visit method so that ResolverVisitor can intervene when type propagation is
6048 * enabled. 6325 * enabled.
6326 *
6049 * @param node the statement to be visited 6327 * @param node the statement to be visited
6050 */ 6328 */
6051 void visitForEachStatementInScope(ForEachStatement node) { 6329 void visitForEachStatementInScope(ForEachStatement node) {
6052 safelyVisit(node.iterator); 6330 safelyVisit(node.iterator);
6053 safelyVisit(node.loopVariable); 6331 safelyVisit(node.loopVariable);
6054 safelyVisit(node.body); 6332 safelyVisit(node.body);
6055 } 6333 }
6056 6334
6057 /** 6335 /**
6058 * Visit the given statement after it's scope has been created. This replaces the normal call to 6336 * Visit the given statement after it's scope has been created. This replaces the normal call to
6059 * the inherited visit method so that ResolverVisitor can intervene when type propagation is 6337 * the inherited visit method so that ResolverVisitor can intervene when type propagation is
6060 * enabled. 6338 * enabled.
6339 *
6061 * @param node the statement to be visited 6340 * @param node the statement to be visited
6062 */ 6341 */
6063 void visitForStatementInScope(ForStatement node) { 6342 void visitForStatementInScope(ForStatement node) {
6064 super.visitForStatement(node); 6343 super.visitForStatement(node);
6065 } 6344 }
6066 6345
6067 /** 6346 /**
6068 * Add scopes for each of the given labels. 6347 * Add scopes for each of the given labels.
6348 *
6069 * @param labels the labels for which new scopes are to be added 6349 * @param labels the labels for which new scopes are to be added
6070 * @return the scope that was in effect before the new scopes were added 6350 * @return the scope that was in effect before the new scopes were added
6071 */ 6351 */
6072 LabelScope addScopesFor(NodeList<Label> labels) { 6352 LabelScope addScopesFor(NodeList<Label> labels) {
6073 LabelScope outerScope = _labelScope; 6353 LabelScope outerScope = _labelScope;
6074 for (Label label in labels) { 6354 for (Label label in labels) {
6075 SimpleIdentifier labelNameNode = label.label; 6355 SimpleIdentifier labelNameNode = label.label;
6076 String labelName = labelNameNode.name; 6356 String labelName = labelNameNode.name;
6077 LabelElement labelElement = labelNameNode.element as LabelElement; 6357 LabelElement labelElement = labelNameNode.element as LabelElement;
6078 _labelScope = new LabelScope.con2(_labelScope, labelName, labelElement); 6358 _labelScope = new LabelScope.con2(_labelScope, labelName, labelElement);
6079 } 6359 }
6080 return outerScope; 6360 return outerScope;
6081 } 6361 }
6082 } 6362 }
6083 /** 6363 /**
6084 * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. F irst, they 6364 * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. F irst, they
6085 * compute the static type of every expression. Second, they look for any static type errors or 6365 * compute the static type of every expression. Second, they look for any static type errors or
6086 * warnings that might need to be generated. The requirements for the type analy zer are: 6366 * warnings that might need to be generated. The requirements for the type analy zer are:
6087 * <ol> 6367 * <ol>
6088 * * Every element that refers to types should be fully populated. 6368 * * Every element that refers to types should be fully populated.
6089 * * Every node representing an expression should be resolved to the Type of the expression. 6369 * * Every node representing an expression should be resolved to the Type of the expression.
6090 * </ol> 6370 * </ol>
6371 *
6091 * @coverage dart.engine.resolver 6372 * @coverage dart.engine.resolver
6092 */ 6373 */
6093 class StaticTypeAnalyzer extends SimpleASTVisitor<Object> { 6374 class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
6094 6375
6095 /** 6376 /**
6096 * Create a table mapping HTML tag names to the names of the classes (in 'dart :html') that 6377 * Create a table mapping HTML tag names to the names of the classes (in 'dart :html') that
6097 * implement those tags. 6378 * implement those tags.
6379 *
6098 * @return the table that was created 6380 * @return the table that was created
6099 */ 6381 */
6100 static Map<String, String> createHtmlTagToClassMap() { 6382 static Map<String, String> createHtmlTagToClassMap() {
6101 Map<String, String> map = new Map<String, String>(); 6383 Map<String, String> map = new Map<String, String>();
6102 map["a"] = "AnchorElement"; 6384 map["a"] = "AnchorElement";
6103 map["area"] = "AreaElement"; 6385 map["area"] = "AreaElement";
6104 map["br"] = "BRElement"; 6386 map["br"] = "BRElement";
6105 map["base"] = "BaseElement"; 6387 map["base"] = "BaseElement";
6106 map["body"] = "BodyElement"; 6388 map["body"] = "BodyElement";
6107 map["button"] = "ButtonElement"; 6389 map["button"] = "ButtonElement";
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
6180 * nodes are not within a class. 6462 * nodes are not within a class.
6181 */ 6463 */
6182 InterfaceType _thisType; 6464 InterfaceType _thisType;
6183 6465
6184 /** 6466 /**
6185 * The object keeping track of which elements have had their types overridden. 6467 * The object keeping track of which elements have had their types overridden.
6186 */ 6468 */
6187 TypeOverrideManager _overrideManager; 6469 TypeOverrideManager _overrideManager;
6188 6470
6189 /** 6471 /**
6472 * A table mapping [ExecutableElement]s to their propagated return types.
6473 */
6474 Map<ExecutableElement, Type2> _propagatedReturnTypes = new Map<ExecutableEleme nt, Type2>();
6475
6476 /**
6190 * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement 6477 * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
6191 * those tags. 6478 * those tags.
6192 */ 6479 */
6193 static Map<String, String> _HTML_ELEMENT_TO_CLASS_MAP = createHtmlTagToClassMa p(); 6480 static Map<String, String> _HTML_ELEMENT_TO_CLASS_MAP = createHtmlTagToClassMa p();
6194 6481
6195 /** 6482 /**
6196 * Initialize a newly created type analyzer. 6483 * Initialize a newly created type analyzer.
6484 *
6197 * @param resolver the resolver driving this participant 6485 * @param resolver the resolver driving this participant
6198 */ 6486 */
6199 StaticTypeAnalyzer(ResolverVisitor resolver) { 6487 StaticTypeAnalyzer(ResolverVisitor resolver) {
6200 this._resolver = resolver; 6488 this._resolver = resolver;
6201 _typeProvider = resolver.typeProvider; 6489 _typeProvider = resolver.typeProvider;
6202 _dynamicType = _typeProvider.dynamicType; 6490 _dynamicType = _typeProvider.dynamicType;
6203 _overrideManager = resolver.overrideManager; 6491 _overrideManager = resolver.overrideManager;
6204 } 6492 }
6205 6493
6206 /** 6494 /**
6207 * Set the type of the class being analyzed to the given type. 6495 * Set the type of the class being analyzed to the given type.
6496 *
6208 * @param thisType the type representing the class containing the nodes being analyzed 6497 * @param thisType the type representing the class containing the nodes being analyzed
6209 */ 6498 */
6210 void set thisType(InterfaceType thisType2) { 6499 void set thisType(InterfaceType thisType2) {
6211 this._thisType = thisType2; 6500 this._thisType = thisType2;
6212 } 6501 }
6213 6502
6214 /** 6503 /**
6215 * The Dart Language Specification, 12.5: <blockquote>The static type of a str ing literal is`String`.</blockquote> 6504 * The Dart Language Specification, 12.5: <blockquote>The static type of a str ing literal is
6505 * `String`.</blockquote>
6216 */ 6506 */
6217 Object visitAdjacentStrings(AdjacentStrings node) { 6507 Object visitAdjacentStrings(AdjacentStrings node) {
6218 recordStaticType(node, _typeProvider.stringType); 6508 recordStaticType(node, _typeProvider.stringType);
6219 return null; 6509 return null;
6220 } 6510 }
6221 6511
6222 /** 6512 /**
6223 * The Dart Language Specification, 12.33: <blockquote>The static type of an a rgument definition 6513 * The Dart Language Specification, 12.33: <blockquote>The static type of an a rgument definition
6224 * test is `bool`.</blockquote> 6514 * test is `bool`.</blockquote>
6225 */ 6515 */
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
6259 * 6549 *
6260 * ... an assignment of the form <i>e<sub>1</sub>.v = e<sub>2</sub></i> ... 6550 * ... an assignment of the form <i>e<sub>1</sub>.v = e<sub>2</sub></i> ...
6261 * 6551 *
6262 * Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static typ e warning if 6552 * Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static typ e warning if
6263 * <i>T</i> does not have an accessible instance setter named <i>v=</i>. It is a static type 6553 * <i>T</i> does not have an accessible instance setter named <i>v=</i>. It is a static type
6264 * warning if the static type of <i>e<sub>2</sub></i> may not be assigned to < i>T</i>. 6554 * warning if the static type of <i>e<sub>2</sub></i> may not be assigned to < i>T</i>.
6265 * 6555 *
6266 * The static type of the expression <i>e<sub>1</sub>.v = e<sub>2</sub></i> is the static type of 6556 * The static type of the expression <i>e<sub>1</sub>.v = e<sub>2</sub></i> is the static type of
6267 * <i>e<sub>2</sub></i>. 6557 * <i>e<sub>2</sub></i>.
6268 * 6558 *
6269 * ... an assignment of the form <i>e<sub>1</sub>\[e<sub>2</sub>\] = e<sub>3</ sub></i> ... 6559 * ... an assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</su b></i> ...
6270 * 6560 *
6271 * The static type of the expression <i>e<sub>1</sub>\[e<sub>2</sub>\] = e<sub >3</sub></i> is the 6561 * The static type of the expression <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3 </sub></i> is the
6272 * static type of <i>e<sub>3</sub></i>. 6562 * static type of <i>e<sub>3</sub></i>.
6273 * 6563 *
6274 * A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound 6564 * A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound
6275 * assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e< /i>. A compound 6565 * assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e< /i>. A compound
6276 * assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivale nt to <i>((x) => x.v 6566 * assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivale nt to <i>((x) => x.v
6277 * = x.v op e<sub>2</sub>)(e<sub>1</sub>)</i> where <i>x</i> is a variable tha t is not used in 6567 * = x.v op e<sub>2</sub>)(e<sub>1</sub>)</i> where <i>x</i> is a variable tha t is not used in
6278 * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>\[e <sub>2</sub>\] op= 6568 * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>[e< sub>2</sub>] op=
6279 * e<sub>3</sub></i> is equivalent to <i>((a, i) => a\[i\] = a\[i\] op e<sub>3 </sub>)(e<sub>1</sub>, 6569 * e<sub>3</sub></i> is equivalent to <i>((a, i) => a[i] = a[i] op e<sub>3</su b>)(e<sub>1</sub>,
6280 * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in 6570 * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in
6281 * <i>e<sub>3</sub></i>.</blockquote> 6571 * <i>e<sub>3</sub></i>.</blockquote>
6282 */ 6572 */
6283 Object visitAssignmentExpression(AssignmentExpression node) { 6573 Object visitAssignmentExpression(AssignmentExpression node) {
6284 sc.TokenType operator = node.operator.type; 6574 sc.TokenType operator = node.operator.type;
6285 if (identical(operator, sc.TokenType.EQ)) { 6575 if (identical(operator, sc.TokenType.EQ)) {
6286 Expression rightHandSide = node.rightHandSide; 6576 Expression rightHandSide = node.rightHandSide;
6287 Type2 staticType = getStaticType(rightHandSide); 6577 Type2 staticType = getStaticType(rightHandSide);
6288 recordStaticType(node, staticType); 6578 recordStaticType(node, staticType);
6289 Type2 overrideType = staticType; 6579 Type2 overrideType = staticType;
6290 Type2 propagatedType = getPropagatedType(rightHandSide); 6580 Type2 propagatedType = getPropagatedType(rightHandSide);
6291 if (propagatedType != null) { 6581 if (propagatedType != null) {
6292 if (propagatedType.isMoreSpecificThan(staticType)) { 6582 if (propagatedType.isMoreSpecificThan(staticType)) {
6293 recordPropagatedType(node, propagatedType); 6583 recordPropagatedType2(node, propagatedType);
6294 } 6584 }
6295 overrideType = propagatedType; 6585 overrideType = propagatedType;
6296 } 6586 }
6297 VariableElement element = _resolver.getOverridableElement(node.leftHandSid e); 6587 VariableElement element = _resolver.getOverridableElement(node.leftHandSid e);
6298 if (element != null) { 6588 if (element != null) {
6299 _resolver.override(element, overrideType); 6589 _resolver.override(element, overrideType);
6300 } 6590 }
6301 } else { 6591 } else {
6302 ExecutableElement staticMethodElement = node.staticElement; 6592 ExecutableElement staticMethodElement = node.staticElement;
6303 Type2 staticType = computeReturnType(staticMethodElement); 6593 Type2 staticType = computeStaticReturnType(staticMethodElement);
6304 recordStaticType(node, staticType); 6594 recordStaticType(node, staticType);
6305 MethodElement propagatedMethodElement = node.element; 6595 MethodElement propagatedMethodElement = node.element;
6306 if (propagatedMethodElement != staticMethodElement) { 6596 if (propagatedMethodElement != staticMethodElement) {
6307 Type2 propagatedType = computeReturnType(propagatedMethodElement); 6597 Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
6308 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) { 6598 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) {
6309 recordPropagatedType(node, propagatedType); 6599 recordPropagatedType2(node, propagatedType);
6310 } 6600 }
6311 } 6601 }
6312 } 6602 }
6313 return null; 6603 return null;
6314 } 6604 }
6315 6605
6316 /** 6606 /**
6317 * The Dart Language Specification, 12.20: <blockquote>The static type of a lo gical boolean 6607 * The Dart Language Specification, 12.20: <blockquote>The static type of a lo gical boolean
6318 * expression is `bool`.</blockquote> 6608 * expression is `bool`.</blockquote>
6319 * 6609 *
(...skipping 25 matching lines...) Expand all
6345 * <i>super.op(e<sub>2</sub>)</i>.</blockquote> 6635 * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
6346 * 6636 *
6347 * The Dart Language Specification, 12.26: <blockquote>A multiplicative expres sion of the form 6637 * The Dart Language Specification, 12.26: <blockquote>A multiplicative expres sion of the form
6348 * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocatio n 6638 * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocatio n
6349 * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A multiplicative expression of the form <i>super op 6639 * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A multiplicative expression of the form <i>super op
6350 * e<sub>2</sub></i> is equivalent to the method invocation 6640 * e<sub>2</sub></i> is equivalent to the method invocation
6351 * <i>super.op(e<sub>2</sub>)</i>.</blockquote> 6641 * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
6352 */ 6642 */
6353 Object visitBinaryExpression(BinaryExpression node) { 6643 Object visitBinaryExpression(BinaryExpression node) {
6354 ExecutableElement staticMethodElement = node.staticElement; 6644 ExecutableElement staticMethodElement = node.staticElement;
6355 Type2 staticType = computeReturnType(staticMethodElement); 6645 Type2 staticType = computeStaticReturnType(staticMethodElement);
6356 staticType = refineBinaryExpressionType(node, staticType); 6646 staticType = refineBinaryExpressionType(node, staticType);
6357 recordStaticType(node, staticType); 6647 recordStaticType(node, staticType);
6358 MethodElement propagatedMethodElement = node.element; 6648 MethodElement propagatedMethodElement = node.element;
6359 if (propagatedMethodElement != staticMethodElement) { 6649 if (propagatedMethodElement != staticMethodElement) {
6360 Type2 propagatedType = computeReturnType(propagatedMethodElement); 6650 Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
6361 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType )) { 6651 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType )) {
6362 recordPropagatedType(node, propagatedType); 6652 recordPropagatedType2(node, propagatedType);
6363 } 6653 }
6364 } 6654 }
6365 return null; 6655 return null;
6366 } 6656 }
6367 6657
6368 /** 6658 /**
6369 * The Dart Language Specification, 12.4: <blockquote>The static type of a boo lean literal is 6659 * The Dart Language Specification, 12.4: <blockquote>The static type of a boo lean literal is
6370 * bool.</blockquote> 6660 * bool.</blockquote>
6371 */ 6661 */
6372 Object visitBooleanLiteral(BooleanLiteral node) { 6662 Object visitBooleanLiteral(BooleanLiteral node) {
6373 recordStaticType(node, _typeProvider.boolType); 6663 recordStaticType(node, _typeProvider.boolType);
6374 return null; 6664 return null;
6375 } 6665 }
6376 6666
6377 /** 6667 /**
6378 * The Dart Language Specification, 12.15.2: <blockquote>A cascaded method inv ocation expression 6668 * The Dart Language Specification, 12.15.2: <blockquote>A cascaded method inv ocation expression
6379 * of the form <i>e..suffix</i> is equivalent to the expression <i>(t) {t.suff ix; return 6669 * of the form <i>e..suffix</i> is equivalent to the expression <i>(t) {t.suff ix; return
6380 * t;}(e)</i>.</blockquote> 6670 * t;}(e)</i>.</blockquote>
6381 */ 6671 */
6382 Object visitCascadeExpression(CascadeExpression node) { 6672 Object visitCascadeExpression(CascadeExpression node) {
6383 recordStaticType(node, getStaticType(node.target)); 6673 recordStaticType(node, getStaticType(node.target));
6384 recordPropagatedType(node, getPropagatedType(node.target)); 6674 recordPropagatedType2(node, getPropagatedType(node.target));
6385 return null; 6675 return null;
6386 } 6676 }
6387 6677
6388 /** 6678 /**
6389 * The Dart Language Specification, 12.19: <blockquote> ... a conditional expr ession <i>c</i> of 6679 * The Dart Language Specification, 12.19: <blockquote> ... a conditional expr ession <i>c</i> of
6390 * the form <i>e<sub>1</sub> ? e<sub>2</sub> : e<sub>3</sub></i> ... 6680 * the form <i>e<sub>1</sub> ? e<sub>2</sub> : e<sub>3</sub></i> ...
6391 * 6681 *
6392 * It is a static type warning if the type of e<sub>1</sub> may not be assigne d to `bool`. 6682 * It is a static type warning if the type of e<sub>1</sub> may not be assigne d to `bool`.
6393 * 6683 *
6394 * The static type of <i>c</i> is the least upper bound of the static type of <i>e<sub>2</sub></i> 6684 * The static type of <i>c</i> is the least upper bound of the static type of <i>e<sub>2</sub></i>
(...skipping 17 matching lines...) Expand all
6412 Type2 propagatedElseType = getPropagatedType(node.elseExpression); 6702 Type2 propagatedElseType = getPropagatedType(node.elseExpression);
6413 if (propagatedThenType != null || propagatedElseType != null) { 6703 if (propagatedThenType != null || propagatedElseType != null) {
6414 if (propagatedThenType == null) { 6704 if (propagatedThenType == null) {
6415 propagatedThenType = staticThenType; 6705 propagatedThenType = staticThenType;
6416 } 6706 }
6417 if (propagatedElseType == null) { 6707 if (propagatedElseType == null) {
6418 propagatedElseType = staticElseType; 6708 propagatedElseType = staticElseType;
6419 } 6709 }
6420 Type2 propagatedType = propagatedThenType.getLeastUpperBound(propagatedEls eType); 6710 Type2 propagatedType = propagatedThenType.getLeastUpperBound(propagatedEls eType);
6421 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType )) { 6711 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType )) {
6422 recordPropagatedType(node, propagatedType); 6712 recordPropagatedType2(node, propagatedType);
6423 } 6713 }
6424 } 6714 }
6425 return null; 6715 return null;
6426 } 6716 }
6427 6717
6428 /** 6718 /**
6429 * The Dart Language Specification, 12.3: <blockquote>The static type of a lit eral double is 6719 * The Dart Language Specification, 12.3: <blockquote>The static type of a lit eral double is
6430 * double.</blockquote> 6720 * double.</blockquote>
6431 */ 6721 */
6432 Object visitDoubleLiteral(DoubleLiteral node) { 6722 Object visitDoubleLiteral(DoubleLiteral node) {
6433 recordStaticType(node, _typeProvider.doubleType); 6723 recordStaticType(node, _typeProvider.doubleType);
6434 return null; 6724 return null;
6435 } 6725 }
6436 Object visitFunctionDeclaration(FunctionDeclaration node) { 6726 Object visitFunctionDeclaration(FunctionDeclaration node) {
6437 FunctionExpression function = node.functionExpression; 6727 FunctionExpression function = node.functionExpression;
6438 ExecutableElementImpl functionElement = node.element as ExecutableElementImp l; 6728 ExecutableElementImpl functionElement = node.element as ExecutableElementImp l;
6439 functionElement.returnType = computeReturnType2(node); 6729 functionElement.returnType = computeStaticReturnType2(node);
6730 recordPropagatedType(functionElement, function.body);
6440 FunctionTypeImpl functionType = functionElement.type as FunctionTypeImpl; 6731 FunctionTypeImpl functionType = functionElement.type as FunctionTypeImpl;
6441 setTypeInformation(functionType, function.parameters); 6732 setTypeInformation(functionType, function.parameters);
6442 recordStaticType(function, functionType); 6733 recordStaticType(function, functionType);
6443 return null; 6734 return null;
6444 } 6735 }
6445 6736
6446 /** 6737 /**
6447 * The Dart Language Specification, 12.9: <blockquote>The static type of a fun ction literal of the 6738 * The Dart Language Specification, 12.9: <blockquote>The static type of a fun ction literal of the
6448 * form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;, T<sub>n</sub> a<sub>n</sub> , \[T<sub>n+1</sub> 6739 * form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;, T<sub>n</sub> a<sub>n</sub> , [T<sub>n+1</sub>
6449 * x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub> = dk\]) => e</i> is 6740 * x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub> = dk]) => e </i> is
6450 * <i>(T<sub>1</sub>, &hellip;, Tn, \[T<sub>n+1</sub> x<sub>n+1</sub>, &hellip ;, T<sub>n+k</sub> 6741 * <i>(T<sub>1</sub>, &hellip;, Tn, [T<sub>n+1</sub> x<sub>n+1</sub>, &hellip; , T<sub>n+k</sub>
6451 * x<sub>n+k</sub>\]) &rarr; T<sub>0</sub></i>, where <i>T<sub>0</sub></i> is the static type of 6742 * x<sub>n+k</sub>]) &rarr; T<sub>0</sub></i>, where <i>T<sub>0</sub></i> is t he static type of
6452 * <i>e</i>. In any case where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is 6743 * <i>e</i>. In any case where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is
6453 * considered to have been specified as dynamic. 6744 * considered to have been specified as dynamic.
6454 * 6745 *
6455 * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1 </sub>, &hellip;, 6746 * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1 </sub>, &hellip;,
6456 * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip ;, T<sub>n+k</sub> 6747 * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip ;, T<sub>n+k</sub>
6457 * x<sub>n+k</sub> : dk}) => e</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</su b>, {T<sub>n+1</sub> 6748 * x<sub>n+k</sub> : dk}) => e</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</su b>, {T<sub>n+1</sub>
6458 * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; T<sub>0 </sub></i>, where 6749 * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; T<sub>0 </sub></i>, where
6459 * <i>T<sub>0</sub></i> is the static type of <i>e</i>. In any case where <i>T <sub>i</sub>, 1 6750 * <i>T<sub>0</sub></i> is the static type of <i>e</i>. In any case where <i>T <sub>i</sub>, 1
6460 * &lt;= i &lt;= n</i>, is not specified, it is considered to have been specif ied as dynamic. 6751 * &lt;= i &lt;= n</i>, is not specified, it is considered to have been specif ied as dynamic.
6461 * 6752 *
6462 * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1 </sub>, &hellip;, 6753 * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1 </sub>, &hellip;,
6463 * T<sub>n</sub> a<sub>n</sub>, \[T<sub>n+1</sub> x<sub>n+1</sub> = d1, &helli p;, T<sub>n+k</sub> 6754 * T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub> x<sub>n+1</sub> = d1, &hellip ;, T<sub>n+k</sub>
6464 * x<sub>n+k</sub> = dk\]) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</su b>, \[T<sub>n+1</sub> 6755 * x<sub>n+k</sub> = dk]) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub >, [T<sub>n+1</sub>
6465 * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>\]) &rarr; dynami c</i>. In any case 6756 * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>]) &rarr; dynamic </i>. In any case
6466 * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is cons idered to have been 6757 * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is cons idered to have been
6467 * specified as dynamic. 6758 * specified as dynamic.
6468 * 6759 *
6469 * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1 </sub>, &hellip;, 6760 * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1 </sub>, &hellip;,
6470 * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip ;, T<sub>n+k</sub> 6761 * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip ;, T<sub>n+k</sub>
6471 * x<sub>n+k</sub> : dk}) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub >, {T<sub>n+1</sub> 6762 * x<sub>n+k</sub> : dk}) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub >, {T<sub>n+1</sub>
6472 * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; dynamic </i>. In any case 6763 * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; dynamic </i>. In any case
6473 * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is cons idered to have been 6764 * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is cons idered to have been
6474 * specified as dynamic.</blockquote> 6765 * specified as dynamic.</blockquote>
6475 */ 6766 */
6476 Object visitFunctionExpression(FunctionExpression node) { 6767 Object visitFunctionExpression(FunctionExpression node) {
6477 if (node.parent is FunctionDeclaration) { 6768 if (node.parent is FunctionDeclaration) {
6478 return null; 6769 return null;
6479 } 6770 }
6480 ExecutableElementImpl functionElement = node.element as ExecutableElementImp l; 6771 ExecutableElementImpl functionElement = node.element as ExecutableElementImp l;
6481 functionElement.returnType = computeReturnType3(node); 6772 functionElement.returnType = computeStaticReturnType3(node);
6773 recordPropagatedType(functionElement, node.body);
6482 FunctionTypeImpl functionType = node.element.type as FunctionTypeImpl; 6774 FunctionTypeImpl functionType = node.element.type as FunctionTypeImpl;
6483 setTypeInformation(functionType, node.parameters); 6775 setTypeInformation(functionType, node.parameters);
6484 recordStaticType(node, functionType); 6776 recordStaticType(node, functionType);
6485 return null; 6777 return null;
6486 } 6778 }
6487 6779
6488 /** 6780 /**
6489 * The Dart Language Specification, 12.14.4: <blockquote>A function expression invocation <i>i</i> 6781 * The Dart Language Specification, 12.14.4: <blockquote>A function expression invocation <i>i</i>
6490 * has the form <i>e<sub>f</sub>(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub >n+1</sub>: 6782 * has the form <i>e<sub>f</sub>(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub >n+1</sub>:
6491 * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i> e<sub>f</sub></i> is 6783 * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i> e<sub>f</sub></i> is
6492 * an expression. 6784 * an expression.
6493 * 6785 *
6494 * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub> </i> may not be 6786 * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub> </i> may not be
6495 * assigned to a function type. 6787 * assigned to a function type.
6496 * 6788 *
6497 * If <i>F</i> is not a function type, the static type of <i>i</i> is dynamic. Otherwise the 6789 * If <i>F</i> is not a function type, the static type of <i>i</i> is dynamic. Otherwise the
6498 * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquot e> 6790 * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquot e>
6499 */ 6791 */
6500 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { 6792 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
6501 ExecutableElement staticMethodElement = node.staticElement; 6793 ExecutableElement staticMethodElement = node.staticElement;
6502 Type2 staticType = computeReturnType(staticMethodElement); 6794 Type2 staticStaticType = computeStaticReturnType(staticMethodElement);
6503 recordStaticType(node, staticType); 6795 recordStaticType(node, staticStaticType);
6796 Type2 staticPropagatedType = computePropagatedReturnType(staticMethodElement );
6797 if (staticPropagatedType != null && (staticStaticType == null || staticPropa gatedType.isMoreSpecificThan(staticStaticType))) {
6798 recordPropagatedType2(node, staticPropagatedType);
6799 }
6504 ExecutableElement propagatedMethodElement = node.element; 6800 ExecutableElement propagatedMethodElement = node.element;
6505 Type2 propagatedType = computeReturnType(propagatedMethodElement); 6801 if (propagatedMethodElement != staticMethodElement) {
6506 if (staticType == null) { 6802 Type2 propagatedStaticType = computeStaticReturnType(propagatedMethodEleme nt);
6507 recordStaticType(node, propagatedType); 6803 if (propagatedStaticType != null && (staticStaticType == null || propagate dStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == nu ll || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
6508 } else if (propagatedType != null && propagatedType.isMoreSpecificThan(stati cType)) { 6804 recordPropagatedType2(node, propagatedStaticType);
6509 recordPropagatedType(node, propagatedType); 6805 }
6806 Type2 propagatedPropagatedType = computePropagatedReturnType(propagatedMet hodElement);
6807 if (propagatedPropagatedType != null && (staticStaticType == null || propa gatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedTy pe == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan (propagatedStaticType))) {
6808 recordPropagatedType2(node, propagatedPropagatedType);
6809 }
6510 } 6810 }
6511 return null; 6811 return null;
6512 } 6812 }
6513 6813
6514 /** 6814 /**
6515 * The Dart Language Specification, 12.29: <blockquote>An assignable expressio n of the form 6815 * The Dart Language Specification, 12.29: <blockquote>An assignable expressio n of the form
6516 * <i>e<sub>1</sub>\[e<sub>2</sub>\]</i> is evaluated as a method invocation o f the operator method 6816 * <i>e<sub>1</sub>[e<sub>2</sub>]</i> is evaluated as a method invocation of the operator method
6517 * <i>\[\]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</bl ockquote> 6817 * <i>[]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</bloc kquote>
6518 */ 6818 */
6519 Object visitIndexExpression(IndexExpression node) { 6819 Object visitIndexExpression(IndexExpression node) {
6520 if (node.inSetterContext()) { 6820 if (node.inSetterContext()) {
6521 ExecutableElement staticMethodElement = node.staticElement; 6821 ExecutableElement staticMethodElement = node.staticElement;
6522 Type2 staticType = computeArgumentType(staticMethodElement); 6822 Type2 staticType = computeArgumentType(staticMethodElement);
6523 recordStaticType(node, staticType); 6823 recordStaticType(node, staticType);
6524 MethodElement propagatedMethodElement = node.element; 6824 MethodElement propagatedMethodElement = node.element;
6525 if (propagatedMethodElement != staticMethodElement) { 6825 if (propagatedMethodElement != staticMethodElement) {
6526 Type2 propagatedType = computeArgumentType(propagatedMethodElement); 6826 Type2 propagatedType = computeArgumentType(propagatedMethodElement);
6527 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) { 6827 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) {
6528 recordPropagatedType(node, propagatedType); 6828 recordPropagatedType2(node, propagatedType);
6529 } 6829 }
6530 } 6830 }
6531 } else { 6831 } else {
6532 ExecutableElement staticMethodElement = node.staticElement; 6832 ExecutableElement staticMethodElement = node.staticElement;
6533 Type2 staticType = computeReturnType(staticMethodElement); 6833 Type2 staticType = computeStaticReturnType(staticMethodElement);
6534 recordStaticType(node, staticType); 6834 recordStaticType(node, staticType);
6535 MethodElement propagatedMethodElement = node.element; 6835 MethodElement propagatedMethodElement = node.element;
6536 if (propagatedMethodElement != staticMethodElement) { 6836 if (propagatedMethodElement != staticMethodElement) {
6537 Type2 propagatedType = computeReturnType(propagatedMethodElement); 6837 Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
6538 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) { 6838 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) {
6539 recordPropagatedType(node, propagatedType); 6839 recordPropagatedType2(node, propagatedType);
6540 } 6840 }
6541 } 6841 }
6542 } 6842 }
6543 return null; 6843 return null;
6544 } 6844 }
6545 6845
6546 /** 6846 /**
6547 * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of 6847 * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of
6548 * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new 6848 * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new
6549 * T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>.</blockquote> 6849 * T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>.</blockquote>
6550 * 6850 *
6551 * The Dart Language Specification, 12.11.2: <blockquote>The static type of a constant object 6851 * The Dart Language Specification, 12.11.2: <blockquote>The static type of a constant object
6552 * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub> n</sub>)</i> or the 6852 * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub> n</sub>)</i> or the
6553 * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </ blockquote> 6853 * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </ blockquote>
6554 */ 6854 */
6555 Object visitInstanceCreationExpression(InstanceCreationExpression node) { 6855 Object visitInstanceCreationExpression(InstanceCreationExpression node) {
6556 recordStaticType(node, node.constructorName.type.type); 6856 recordStaticType(node, node.constructorName.type.type);
6557 ConstructorElement element = node.element; 6857 ConstructorElement element = node.element;
6558 if (element != null && "Element" == element.enclosingElement.name && "tag" = = element.name) { 6858 if (element != null && "Element" == element.enclosingElement.name && "tag" = = element.name) {
6559 LibraryElement library = element.library; 6859 LibraryElement library = element.library;
6560 if (isHtmlLibrary(library)) { 6860 if (isHtmlLibrary(library)) {
6561 Type2 returnType = getFirstArgumentAsType2(library, node.argumentList, _ HTML_ELEMENT_TO_CLASS_MAP); 6861 Type2 returnType = getFirstArgumentAsType2(library, node.argumentList, _ HTML_ELEMENT_TO_CLASS_MAP);
6562 if (returnType != null) { 6862 if (returnType != null) {
6563 recordPropagatedType(node, returnType); 6863 recordPropagatedType2(node, returnType);
6564 } 6864 }
6565 } 6865 }
6566 } 6866 }
6567 return null; 6867 return null;
6568 } 6868 }
6569 6869
6570 /** 6870 /**
6571 * The Dart Language Specification, 12.3: <blockquote>The static type of an in teger literal is`int`.</blockquote> 6871 * The Dart Language Specification, 12.3: <blockquote>The static type of an in teger literal is
6872 * `int`.</blockquote>
6572 */ 6873 */
6573 Object visitIntegerLiteral(IntegerLiteral node) { 6874 Object visitIntegerLiteral(IntegerLiteral node) {
6574 recordStaticType(node, _typeProvider.intType); 6875 recordStaticType(node, _typeProvider.intType);
6575 return null; 6876 return null;
6576 } 6877 }
6577 6878
6578 /** 6879 /**
6579 * The Dart Language Specification, 12.31: <blockquote>It is a static warning if <i>T</i> does not 6880 * The Dart Language Specification, 12.31: <blockquote>It is a static warning if <i>T</i> does not
6580 * denote a type available in the current lexical scope. 6881 * denote a type available in the current lexical scope.
6581 * 6882 *
6582 * The static type of an is-expression is `bool`.</blockquote> 6883 * The static type of an is-expression is `bool`.</blockquote>
6583 */ 6884 */
6584 Object visitIsExpression(IsExpression node) { 6885 Object visitIsExpression(IsExpression node) {
6585 recordStaticType(node, _typeProvider.boolType); 6886 recordStaticType(node, _typeProvider.boolType);
6586 return null; 6887 return null;
6587 } 6888 }
6588 6889
6589 /** 6890 /**
6590 * The Dart Language Specification, 12.6: <blockquote>The static type of a lis t literal of the 6891 * The Dart Language Specification, 12.6: <blockquote>The static type of a lis t literal of the
6591 * form <i><b>const</b> &lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i > or the form 6892 * form <i><b>const</b> &lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or the form
6592 * <i>&lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is `List&lt;E&gt ;`. The static 6893 * <i>&lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;E&gt;` . The static
6593 * type a list literal of the form <i><b>const</b> \[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> or 6894 * type a list literal of the form <i><b>const</b> [e<sub>1</sub>, &hellip;, e <sub>n</sub>]</i> or
6594 * the form <i>\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is `List&lt;dyna mic&gt;`.</blockquote> 6895 * the form <i>[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;dynami c&gt;`
6896 * .</blockquote>
6595 */ 6897 */
6596 Object visitListLiteral(ListLiteral node) { 6898 Object visitListLiteral(ListLiteral node) {
6597 Type2 staticType = _dynamicType; 6899 Type2 staticType = _dynamicType;
6598 TypeArgumentList typeArguments = node.typeArguments; 6900 TypeArgumentList typeArguments = node.typeArguments;
6599 if (typeArguments != null) { 6901 if (typeArguments != null) {
6600 NodeList<TypeName> arguments = typeArguments.arguments; 6902 NodeList<TypeName> arguments = typeArguments.arguments;
6601 if (arguments != null && arguments.length == 1) { 6903 if (arguments != null && arguments.length == 1) {
6602 TypeName argumentTypeName = arguments[0]; 6904 TypeName argumentTypeName = arguments[0];
6603 Type2 argumentType = getType2(argumentTypeName); 6905 Type2 argumentType = getType2(argumentTypeName);
6604 if (argumentType != null) { 6906 if (argumentType != null) {
(...skipping 11 matching lines...) Expand all
6616 if (propagatedType != elementType) { 6918 if (propagatedType != elementType) {
6617 propagatedType = _dynamicType; 6919 propagatedType = _dynamicType;
6618 } else { 6920 } else {
6619 propagatedType = propagatedType.getLeastUpperBound(elementType); 6921 propagatedType = propagatedType.getLeastUpperBound(elementType);
6620 if (propagatedType == null) { 6922 if (propagatedType == null) {
6621 propagatedType = _dynamicType; 6923 propagatedType = _dynamicType;
6622 } 6924 }
6623 } 6925 }
6624 } 6926 }
6625 if (propagatedType.isMoreSpecificThan(staticType)) { 6927 if (propagatedType.isMoreSpecificThan(staticType)) {
6626 recordPropagatedType(node, _typeProvider.listType.substitute5(<Type2> [p ropagatedType])); 6928 recordPropagatedType2(node, _typeProvider.listType.substitute5(<Type2> [ propagatedType]));
6627 } 6929 }
6628 } 6930 }
6629 return null; 6931 return null;
6630 } 6932 }
6631 6933
6632 /** 6934 /**
6633 * The Dart Language Specification, 12.7: <blockquote>The static type of a map literal of the form 6935 * The Dart Language Specification, 12.7: <blockquote>The static type of a map literal of the form
6634 * <i><b>const</b> &lt;String, V&gt; {k<sub>1</sub>:e<sub>1</sub>, &hellip;, 6936 * <i><b>const</b> &lt;String, V&gt; {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
6635 * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>&lt;String, V&gt; {k<sub>1< /sub>:e<sub>1</sub>, 6937 * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>&lt;String, V&gt; {k<sub>1< /sub>:e<sub>1</sub>,
6636 * &hellip;, k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;String, V&gt;`. The s tatic type a 6938 * &hellip;, k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;String, V&gt;`. The s tatic type a
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
6690 } 6992 }
6691 bool betterKey = propagatedKeyType != null && propagatedKeyType.isMoreSpec ificThan(staticKeyType); 6993 bool betterKey = propagatedKeyType != null && propagatedKeyType.isMoreSpec ificThan(staticKeyType);
6692 bool betterValue = propagatedValueType != null && propagatedValueType.isMo reSpecificThan(staticValueType); 6994 bool betterValue = propagatedValueType != null && propagatedValueType.isMo reSpecificThan(staticValueType);
6693 if (betterKey || betterValue) { 6995 if (betterKey || betterValue) {
6694 if (!betterKey) { 6996 if (!betterKey) {
6695 propagatedKeyType = staticKeyType; 6997 propagatedKeyType = staticKeyType;
6696 } 6998 }
6697 if (!betterValue) { 6999 if (!betterValue) {
6698 propagatedValueType = staticValueType; 7000 propagatedValueType = staticValueType;
6699 } 7001 }
6700 recordPropagatedType(node, _typeProvider.mapType.substitute5(<Type2> [pr opagatedKeyType, propagatedValueType])); 7002 recordPropagatedType2(node, _typeProvider.mapType.substitute5(<Type2> [p ropagatedKeyType, propagatedValueType]));
6701 } 7003 }
6702 } 7004 }
6703 return null; 7005 return null;
6704 } 7006 }
6705 7007
6706 /** 7008 /**
6707 * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method in vocation <i>i</i> 7009 * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method in vocation <i>i</i>
6708 * has the form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub> : a<sub>n+1</sub>, 7010 * has the form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub> : a<sub>n+1</sub>,
6709 * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. 7011 * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
6710 * 7012 *
(...skipping 27 matching lines...) Expand all
6738 * If <i>S.m</i> does not exist, or if <i>F</i> is not a function type, the st atic type of 7040 * If <i>S.m</i> does not exist, or if <i>F</i> is not a function type, the st atic type of
6739 * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of 7041 * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
6740 * <i>F</i>.</blockquote> 7042 * <i>F</i>.</blockquote>
6741 */ 7043 */
6742 Object visitMethodInvocation(MethodInvocation node) { 7044 Object visitMethodInvocation(MethodInvocation node) {
6743 SimpleIdentifier methodNameNode = node.methodName; 7045 SimpleIdentifier methodNameNode = node.methodName;
6744 Element staticMethodElement = methodNameNode.staticElement; 7046 Element staticMethodElement = methodNameNode.staticElement;
6745 if (staticMethodElement == null) { 7047 if (staticMethodElement == null) {
6746 staticMethodElement = methodNameNode.element; 7048 staticMethodElement = methodNameNode.element;
6747 } 7049 }
6748 Type2 staticType = computeReturnType(staticMethodElement); 7050 Type2 staticStaticType = computeStaticReturnType(staticMethodElement);
6749 recordStaticType(node, staticType); 7051 recordStaticType(node, staticStaticType);
7052 Type2 staticPropagatedType = computePropagatedReturnType(staticMethodElement );
7053 if (staticPropagatedType != null && (staticStaticType == null || staticPropa gatedType.isMoreSpecificThan(staticStaticType))) {
7054 recordPropagatedType2(node, staticPropagatedType);
7055 }
6750 String methodName = methodNameNode.name; 7056 String methodName = methodNameNode.name;
7057 if (methodName == "then") {
7058 Expression target = node.realTarget;
7059 Type2 targetType = getBestType(target);
7060 if (isAsyncFutureType(targetType)) {
7061 NodeList<Expression> arguments = node.argumentList.arguments;
7062 if (arguments.length == 1) {
7063 Expression closureArg = arguments[0];
7064 if (closureArg is FunctionExpression) {
7065 FunctionExpression closureExpr = closureArg as FunctionExpression;
7066 Type2 returnType = computePropagatedReturnType(closureExpr.element);
7067 if (returnType != null) {
7068 InterfaceTypeImpl newFutureType;
7069 if (isAsyncFutureType(returnType)) {
7070 newFutureType = returnType as InterfaceTypeImpl;
7071 } else {
7072 InterfaceType futureType = targetType as InterfaceType;
7073 newFutureType = new InterfaceTypeImpl.con1(futureType.element);
7074 newFutureType.typeArguments = <Type2> [returnType];
7075 }
7076 recordPropagatedType2(node, newFutureType);
7077 return null;
7078 }
7079 }
7080 }
7081 }
7082 }
6751 if (methodName == "\$dom_createEvent") { 7083 if (methodName == "\$dom_createEvent") {
6752 Expression target = node.realTarget; 7084 Expression target = node.realTarget;
6753 if (target != null) { 7085 if (target != null) {
6754 Type2 targetType = getBestType(target); 7086 Type2 targetType = getBestType(target);
6755 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) { 7087 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
6756 LibraryElement library = targetType.element.library; 7088 LibraryElement library = targetType.element.library;
6757 if (isHtmlLibrary(library)) { 7089 if (isHtmlLibrary(library)) {
6758 Type2 returnType = getFirstArgumentAsType(library, node.argumentList ); 7090 Type2 returnType = getFirstArgumentAsType(library, node.argumentList );
6759 if (returnType != null) { 7091 if (returnType != null) {
6760 recordPropagatedType(node, returnType); 7092 recordPropagatedType2(node, returnType);
6761 } 7093 }
6762 } 7094 }
6763 } 7095 }
6764 } 7096 }
6765 } else if (methodName == "query") { 7097 } else if (methodName == "query") {
6766 Expression target = node.realTarget; 7098 Expression target = node.realTarget;
6767 if (target == null) { 7099 if (target == null) {
6768 Element methodElement = methodNameNode.element; 7100 Element methodElement = methodNameNode.element;
6769 if (methodElement != null) { 7101 if (methodElement != null) {
6770 LibraryElement library = methodElement.library; 7102 LibraryElement library = methodElement.library;
6771 if (isHtmlLibrary(library)) { 7103 if (isHtmlLibrary(library)) {
6772 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentLis t); 7104 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentLis t);
6773 if (returnType != null) { 7105 if (returnType != null) {
6774 recordPropagatedType(node, returnType); 7106 recordPropagatedType2(node, returnType);
6775 } 7107 }
6776 } 7108 }
6777 } 7109 }
6778 } else { 7110 } else {
6779 Type2 targetType = getBestType(target); 7111 Type2 targetType = getBestType(target);
6780 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) { 7112 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
6781 LibraryElement library = targetType.element.library; 7113 LibraryElement library = targetType.element.library;
6782 if (isHtmlLibrary(library)) { 7114 if (isHtmlLibrary(library)) {
6783 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentLis t); 7115 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentLis t);
6784 if (returnType != null) { 7116 if (returnType != null) {
6785 recordPropagatedType(node, returnType); 7117 recordPropagatedType2(node, returnType);
6786 } 7118 }
6787 } 7119 }
6788 } 7120 }
6789 } 7121 }
6790 } else if (methodName == "\$dom_createElement") { 7122 } else if (methodName == "\$dom_createElement") {
6791 Expression target = node.realTarget; 7123 Expression target = node.realTarget;
6792 Type2 targetType = getBestType(target); 7124 Type2 targetType = getBestType(target);
6793 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || t argetType.name == "Document")) { 7125 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || t argetType.name == "Document")) {
6794 LibraryElement library = targetType.element.library; 7126 LibraryElement library = targetType.element.library;
6795 if (isHtmlLibrary(library)) { 7127 if (isHtmlLibrary(library)) {
6796 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList) ; 7128 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList) ;
6797 if (returnType != null) { 7129 if (returnType != null) {
6798 recordPropagatedType(node, returnType); 7130 recordPropagatedType2(node, returnType);
6799 } 7131 }
6800 } 7132 }
6801 } 7133 }
6802 } else if (methodName == "JS") { 7134 } else if (methodName == "JS") {
6803 Type2 returnType = getFirstArgumentAsType(_typeProvider.objectType.element .library, node.argumentList); 7135 Type2 returnType = getFirstArgumentAsType(_typeProvider.objectType.element .library, node.argumentList);
6804 if (returnType != null) { 7136 if (returnType != null) {
6805 recordPropagatedType(node, returnType); 7137 recordPropagatedType2(node, returnType);
6806 } 7138 }
6807 } else { 7139 } else {
6808 Element propagatedElement = methodNameNode.element; 7140 Element propagatedElement = methodNameNode.element;
6809 if (propagatedElement != staticMethodElement) { 7141 if (propagatedElement != staticMethodElement) {
6810 Type2 propagatedType = computeReturnType(propagatedElement); 7142 Type2 propagatedStaticType = computeStaticReturnType(propagatedElement);
6811 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) { 7143 if (propagatedStaticType != null && (staticStaticType == null || propaga tedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
6812 recordPropagatedType(node, propagatedType); 7144 recordPropagatedType2(node, propagatedStaticType);
7145 }
7146 Type2 propagatedPropagatedType = computePropagatedReturnType(propagatedE lement);
7147 if (propagatedPropagatedType != null && (staticStaticType == null || pro pagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagated Type == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType )) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificTh an(propagatedStaticType))) {
7148 recordPropagatedType2(node, propagatedPropagatedType);
6813 } 7149 }
6814 } 7150 }
6815 } 7151 }
6816 return null; 7152 return null;
6817 } 7153 }
6818 Object visitNamedExpression(NamedExpression node) { 7154 Object visitNamedExpression(NamedExpression node) {
6819 Expression expression = node.expression; 7155 Expression expression = node.expression;
6820 recordStaticType(node, getStaticType(expression)); 7156 recordStaticType(node, getStaticType(expression));
6821 recordPropagatedType(node, getPropagatedType(expression)); 7157 recordPropagatedType2(node, getPropagatedType(expression));
6822 return null; 7158 return null;
6823 } 7159 }
6824 7160
6825 /** 7161 /**
6826 * The Dart Language Specification, 12.2: <blockquote>The static type of `null ` is bottom. 7162 * The Dart Language Specification, 12.2: <blockquote>The static type of `null ` is bottom.
6827 * </blockquote> 7163 * </blockquote>
6828 */ 7164 */
6829 Object visitNullLiteral(NullLiteral node) { 7165 Object visitNullLiteral(NullLiteral node) {
6830 recordStaticType(node, _typeProvider.bottomType); 7166 recordStaticType(node, _typeProvider.bottomType);
6831 return null; 7167 return null;
6832 } 7168 }
6833 Object visitParenthesizedExpression(ParenthesizedExpression node) { 7169 Object visitParenthesizedExpression(ParenthesizedExpression node) {
6834 Expression expression = node.expression; 7170 Expression expression = node.expression;
6835 recordStaticType(node, getStaticType(expression)); 7171 recordStaticType(node, getStaticType(expression));
6836 recordPropagatedType(node, getPropagatedType(expression)); 7172 recordPropagatedType2(node, getPropagatedType(expression));
6837 return null; 7173 return null;
6838 } 7174 }
6839 7175
6840 /** 7176 /**
6841 * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form 7177 * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form
6842 * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1; 7178 * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1;
6843 * return r}()</i>. 7179 * return r}()</i>.
6844 * 7180 *
6845 * A postfix expression of the form <i>C.v++</i> is equivalent to <i>(){var r = C.v; C.v = r + 1; 7181 * A postfix expression of the form <i>C.v++</i> is equivalent to <i>(){var r = C.v; C.v = r + 1;
6846 * return r}()</i>. 7182 * return r}()</i>.
6847 * 7183 *
6848 * A postfix expression of the form <i>e1.v++</i> is equivalent to <i>(x){var r = x.v; x.v = r + 7184 * A postfix expression of the form <i>e1.v++</i> is equivalent to <i>(x){var r = x.v; x.v = r +
6849 * 1; return r}(e1)</i>. 7185 * 1; return r}(e1)</i>.
6850 * 7186 *
6851 * A postfix expression of the form <i>e1\[e2\]++</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\] 7187 * A postfix expression of the form <i>e1[e2]++</i> is equivalent to <i>(a, i) {var r = a[i]; a[i]
6852 * = r + 1; return r}(e1, e2)</i> 7188 * = r + 1; return r}(e1, e2)</i>
6853 * 7189 *
6854 * A postfix expression of the form <i>v--</i>, where <i>v</i> is an identifie r, is equivalent to 7190 * A postfix expression of the form <i>v--</i>, where <i>v</i> is an identifie r, is equivalent to
6855 * <i>(){var r = v; v = r - 1; return r}()</i>. 7191 * <i>(){var r = v; v = r - 1; return r}()</i>.
6856 * 7192 *
6857 * A postfix expression of the form <i>C.v--</i> is equivalent to <i>(){var r = C.v; C.v = r - 1; 7193 * A postfix expression of the form <i>C.v--</i> is equivalent to <i>(){var r = C.v; C.v = r - 1;
6858 * return r}()</i>. 7194 * return r}()</i>.
6859 * 7195 *
6860 * A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r - 7196 * A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r -
6861 * 1; return r}(e1)</i>. 7197 * 1; return r}(e1)</i>.
6862 * 7198 *
6863 * A postfix expression of the form <i>e1\[e2\]--</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\] 7199 * A postfix expression of the form <i>e1[e2]--</i> is equivalent to <i>(a, i) {var r = a[i]; a[i]
6864 * = r - 1; return r}(e1, e2)</i></blockquote> 7200 * = r - 1; return r}(e1, e2)</i></blockquote>
6865 */ 7201 */
6866 Object visitPostfixExpression(PostfixExpression node) { 7202 Object visitPostfixExpression(PostfixExpression node) {
6867 Expression operand = node.operand; 7203 Expression operand = node.operand;
6868 Type2 staticType = getStaticType(operand); 7204 Type2 staticType = getStaticType(operand);
6869 sc.TokenType operator = node.operator.type; 7205 sc.TokenType operator = node.operator.type;
6870 if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, sc. TokenType.PLUS_PLUS)) { 7206 if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, sc. TokenType.PLUS_PLUS)) {
6871 Type2 intType = _typeProvider.intType; 7207 Type2 intType = _typeProvider.intType;
6872 if (identical(getStaticType(node.operand), intType)) { 7208 if (identical(getStaticType(node.operand), intType)) {
6873 staticType = intType; 7209 staticType = intType;
6874 } 7210 }
6875 } 7211 }
6876 recordStaticType(node, staticType); 7212 recordStaticType(node, staticType);
6877 recordPropagatedType(node, getPropagatedType(operand)); 7213 recordPropagatedType2(node, getPropagatedType(operand));
6878 return null; 7214 return null;
6879 } 7215 }
6880 7216
6881 /** 7217 /**
6882 * See [visitSimpleIdentifier]. 7218 * See [visitSimpleIdentifier].
6883 */ 7219 */
6884 Object visitPrefixedIdentifier(PrefixedIdentifier node) { 7220 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
6885 SimpleIdentifier prefixedIdentifier = node.identifier; 7221 SimpleIdentifier prefixedIdentifier = node.identifier;
6886 Element element = prefixedIdentifier.element; 7222 Element element = prefixedIdentifier.element;
6887 Type2 staticType = _dynamicType; 7223 Type2 staticType = _dynamicType;
(...skipping 13 matching lines...) Expand all
6901 staticType = ((element as ExecutableElement)).type; 7237 staticType = ((element as ExecutableElement)).type;
6902 } else if (element is TypeVariableElement) { 7238 } else if (element is TypeVariableElement) {
6903 staticType = ((element as TypeVariableElement)).type; 7239 staticType = ((element as TypeVariableElement)).type;
6904 } else if (element is VariableElement) { 7240 } else if (element is VariableElement) {
6905 staticType = ((element as VariableElement)).type; 7241 staticType = ((element as VariableElement)).type;
6906 } 7242 }
6907 recordStaticType(prefixedIdentifier, staticType); 7243 recordStaticType(prefixedIdentifier, staticType);
6908 recordStaticType(node, staticType); 7244 recordStaticType(node, staticType);
6909 Type2 propagatedType = _overrideManager.getType(element); 7245 Type2 propagatedType = _overrideManager.getType(element);
6910 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) { 7246 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
6911 recordPropagatedType(prefixedIdentifier, propagatedType); 7247 recordPropagatedType2(prefixedIdentifier, propagatedType);
6912 recordPropagatedType(node, propagatedType); 7248 recordPropagatedType2(node, propagatedType);
6913 } 7249 }
6914 return null; 7250 return null;
6915 } 7251 }
6916 7252
6917 /** 7253 /**
6918 * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u </i> of the form 7254 * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u </i> of the form
6919 * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the 7255 * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the
6920 * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i >.</blockquote> 7256 * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i >.</blockquote>
6921 */ 7257 */
6922 Object visitPrefixExpression(PrefixExpression node) { 7258 Object visitPrefixExpression(PrefixExpression node) {
6923 sc.TokenType operator = node.operator.type; 7259 sc.TokenType operator = node.operator.type;
6924 if (identical(operator, sc.TokenType.BANG)) { 7260 if (identical(operator, sc.TokenType.BANG)) {
6925 recordStaticType(node, _typeProvider.boolType); 7261 recordStaticType(node, _typeProvider.boolType);
6926 } else { 7262 } else {
6927 ExecutableElement staticMethodElement = node.staticElement; 7263 ExecutableElement staticMethodElement = node.staticElement;
6928 Type2 staticType = computeReturnType(staticMethodElement); 7264 Type2 staticType = computeStaticReturnType(staticMethodElement);
6929 if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, s c.TokenType.PLUS_PLUS)) { 7265 if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, s c.TokenType.PLUS_PLUS)) {
6930 Type2 intType = _typeProvider.intType; 7266 Type2 intType = _typeProvider.intType;
6931 if (identical(getStaticType(node.operand), intType)) { 7267 if (identical(getStaticType(node.operand), intType)) {
6932 staticType = intType; 7268 staticType = intType;
6933 } 7269 }
6934 } 7270 }
6935 recordStaticType(node, staticType); 7271 recordStaticType(node, staticType);
6936 MethodElement propagatedMethodElement = node.element; 7272 MethodElement propagatedMethodElement = node.element;
6937 if (propagatedMethodElement != staticMethodElement) { 7273 if (propagatedMethodElement != staticMethodElement) {
6938 Type2 propagatedType = computeReturnType(propagatedMethodElement); 7274 Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
6939 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) { 7275 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) {
6940 recordPropagatedType(node, propagatedType); 7276 recordPropagatedType2(node, propagatedType);
6941 } 7277 }
6942 } 7278 }
6943 } 7279 }
6944 return null; 7280 return null;
6945 } 7281 }
6946 7282
6947 /** 7283 /**
6948 * The Dart Language Specification, 12.13: <blockquote> Property extraction al lows for a member of 7284 * The Dart Language Specification, 12.13: <blockquote> Property extraction al lows for a member of
6949 * an object to be concisely extracted from the object. If <i>o</i> is an obje ct, and if <i>m</i> 7285 * an object to be concisely extracted from the object. If <i>o</i> is an obje ct, and if <i>m</i>
6950 * is the name of a method member of <i>o</i>, then 7286 * is the name of a method member of <i>o</i>, then
6951 * 7287 *
6952 * * <i>o.m</i> is defined to be equivalent to: <i>(r<sub>1</sub>, &hellip;, r <sub>n</sub>, 7288 * * <i>o.m</i> is defined to be equivalent to: <i>(r<sub>1</sub>, &hellip;, r <sub>n</sub>,
6953 * {p<sub>1</sub> : d<sub>1</sub>, &hellip;, p<sub>k</sub> : d<sub>k</sub>}){r eturn 7289 * {p<sub>1</sub> : d<sub>1</sub>, &hellip;, p<sub>k</sub> : d<sub>k</sub>}){r eturn
6954 * o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>, p<sub>1</sub>: p<sub>1</sub>, & hellip;, 7290 * o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>, p<sub>1</sub>: p<sub>1</sub>, & hellip;,
6955 * p<sub>k</sub>: p<sub>k</sub>);}</i> if <i>m</i> has required parameters <i> r<sub>1</sub>, 7291 * p<sub>k</sub>: p<sub>k</sub>);}</i> if <i>m</i> has required parameters <i> r<sub>1</sub>,
6956 * &hellip;, r<sub>n</sub></i>, and named parameters <i>p<sub>1</sub> &hellip; p<sub>k</sub></i> 7292 * &hellip;, r<sub>n</sub></i>, and named parameters <i>p<sub>1</sub> &hellip; p<sub>k</sub></i>
6957 * with defaults <i>d<sub>1</sub>, &hellip;, d<sub>k</sub></i>. 7293 * with defaults <i>d<sub>1</sub>, &hellip;, d<sub>k</sub></i>.
6958 * * <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, \[p<sub>1</sub> = d<sub>1</su b>, &hellip;, 7294 * * <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, [p<sub>1</sub> = d<sub>1</sub >, &hellip;,
6959 * p<sub>k</sub> = d<sub>k</sub>\]){return o.m(r<sub>1</sub>, &hellip;, r<sub> n</sub>, 7295 * p<sub>k</sub> = d<sub>k</sub>]){return o.m(r<sub>1</sub>, &hellip;, r<sub>n </sub>,
6960 * p<sub>1</sub>, &hellip;, p<sub>k</sub>);}</i> if <i>m</i> has required para meters 7296 * p<sub>1</sub>, &hellip;, p<sub>k</sub>);}</i> if <i>m</i> has required para meters
6961 * <i>r<sub>1</sub>, &hellip;, r<sub>n</sub></i>, and optional positional para meters 7297 * <i>r<sub>1</sub>, &hellip;, r<sub>n</sub></i>, and optional positional para meters
6962 * <i>p<sub>1</sub> &hellip; p<sub>k</sub></i> with defaults <i>d<sub>1</sub>, &hellip;, 7298 * <i>p<sub>1</sub> &hellip; p<sub>k</sub></i> with defaults <i>d<sub>1</sub>, &hellip;,
6963 * d<sub>k</sub></i>. 7299 * d<sub>k</sub></i>.
6964 * 7300 *
6965 * Otherwise, if <i>m</i> is the name of a getter member of <i>o</i> (declared implicitly or 7301 * Otherwise, if <i>m</i> is the name of a getter member of <i>o</i> (declared implicitly or
6966 * explicitly) then <i>o.m</i> evaluates to the result of invoking the getter. </blockquote> 7302 * explicitly) then <i>o.m</i> evaluates to the result of invoking the getter. </blockquote>
6967 * 7303 *
6968 * The Dart Language Specification, 12.17: <blockquote> ... a getter invocatio n <i>i</i> of the 7304 * The Dart Language Specification, 12.17: <blockquote> ... a getter invocatio n <i>i</i> of the
6969 * form <i>e.m</i> ... 7305 * form <i>e.m</i> ...
(...skipping 24 matching lines...) Expand all
6994 if (element is MethodElement) { 7330 if (element is MethodElement) {
6995 staticType = ((element as MethodElement)).type; 7331 staticType = ((element as MethodElement)).type;
6996 } else if (element is PropertyAccessorElement) { 7332 } else if (element is PropertyAccessorElement) {
6997 staticType = getType((element as PropertyAccessorElement), node.target != null ? getStaticType(node.target) : null); 7333 staticType = getType((element as PropertyAccessorElement), node.target != null ? getStaticType(node.target) : null);
6998 } else { 7334 } else {
6999 } 7335 }
7000 recordStaticType(propertyName, staticType); 7336 recordStaticType(propertyName, staticType);
7001 recordStaticType(node, staticType); 7337 recordStaticType(node, staticType);
7002 Type2 propagatedType = _overrideManager.getType(element); 7338 Type2 propagatedType = _overrideManager.getType(element);
7003 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) { 7339 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
7004 recordPropagatedType(node, propagatedType); 7340 recordPropagatedType2(node, propagatedType);
7005 } 7341 }
7006 return null; 7342 return null;
7007 } 7343 }
7008 7344
7009 /** 7345 /**
7010 * The Dart Language Specification, 12.9: <blockquote>The static type of a ret hrow expression is 7346 * The Dart Language Specification, 12.9: <blockquote>The static type of a ret hrow expression is
7011 * bottom.</blockquote> 7347 * bottom.</blockquote>
7012 */ 7348 */
7013 Object visitRethrowExpression(RethrowExpression node) { 7349 Object visitRethrowExpression(RethrowExpression node) {
7014 recordStaticType(node, _typeProvider.bottomType); 7350 recordStaticType(node, _typeProvider.bottomType);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
7079 } else if (element is VariableElement) { 7415 } else if (element is VariableElement) {
7080 staticType = ((element as VariableElement)).type; 7416 staticType = ((element as VariableElement)).type;
7081 } else if (element is PrefixElement) { 7417 } else if (element is PrefixElement) {
7082 return null; 7418 return null;
7083 } else { 7419 } else {
7084 staticType = _dynamicType; 7420 staticType = _dynamicType;
7085 } 7421 }
7086 recordStaticType(node, staticType); 7422 recordStaticType(node, staticType);
7087 Type2 propagatedType = _overrideManager.getType(element); 7423 Type2 propagatedType = _overrideManager.getType(element);
7088 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) { 7424 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
7089 recordPropagatedType(node, propagatedType); 7425 recordPropagatedType2(node, propagatedType);
7090 } 7426 }
7091 return null; 7427 return null;
7092 } 7428 }
7093 7429
7094 /** 7430 /**
7095 * The Dart Language Specification, 12.5: <blockquote>The static type of a str ing literal is`String`.</blockquote> 7431 * The Dart Language Specification, 12.5: <blockquote>The static type of a str ing literal is
7432 * `String`.</blockquote>
7096 */ 7433 */
7097 Object visitSimpleStringLiteral(SimpleStringLiteral node) { 7434 Object visitSimpleStringLiteral(SimpleStringLiteral node) {
7098 recordStaticType(node, _typeProvider.stringType); 7435 recordStaticType(node, _typeProvider.stringType);
7099 return null; 7436 return null;
7100 } 7437 }
7101 7438
7102 /** 7439 /**
7103 * The Dart Language Specification, 12.5: <blockquote>The static type of a str ing literal is`String`.</blockquote> 7440 * The Dart Language Specification, 12.5: <blockquote>The static type of a str ing literal is
7441 * `String`.</blockquote>
7104 */ 7442 */
7105 Object visitStringInterpolation(StringInterpolation node) { 7443 Object visitStringInterpolation(StringInterpolation node) {
7106 recordStaticType(node, _typeProvider.stringType); 7444 recordStaticType(node, _typeProvider.stringType);
7107 return null; 7445 return null;
7108 } 7446 }
7109 Object visitSuperExpression(SuperExpression node) { 7447 Object visitSuperExpression(SuperExpression node) {
7110 if (_thisType == null) { 7448 if (_thisType == null) {
7111 recordStaticType(node, _dynamicType); 7449 recordStaticType(node, _dynamicType);
7112 } else { 7450 } else {
7113 recordStaticType(node, _thisType); 7451 recordStaticType(node, _thisType);
(...skipping 19 matching lines...) Expand all
7133 * bottom.</blockquote> 7471 * bottom.</blockquote>
7134 */ 7472 */
7135 Object visitThrowExpression(ThrowExpression node) { 7473 Object visitThrowExpression(ThrowExpression node) {
7136 recordStaticType(node, _typeProvider.bottomType); 7474 recordStaticType(node, _typeProvider.bottomType);
7137 return null; 7475 return null;
7138 } 7476 }
7139 Object visitVariableDeclaration(VariableDeclaration node) { 7477 Object visitVariableDeclaration(VariableDeclaration node) {
7140 Expression initializer = node.initializer; 7478 Expression initializer = node.initializer;
7141 if (initializer != null) { 7479 if (initializer != null) {
7142 Type2 rightType = getBestType(initializer); 7480 Type2 rightType = getBestType(initializer);
7143 VariableElement element = node.name.element as VariableElement; 7481 SimpleIdentifier name = node.name;
7482 recordPropagatedType2(name, rightType);
7483 VariableElement element = name.element as VariableElement;
7144 if (element != null) { 7484 if (element != null) {
7145 _resolver.override(element, rightType); 7485 _resolver.override(element, rightType);
7146 } 7486 }
7147 } 7487 }
7148 return null; 7488 return null;
7149 } 7489 }
7150 7490
7151 /** 7491 /**
7152 * Record that the static type of the given node is the type of the second arg ument to the method 7492 * Record that the static type of the given node is the type of the second arg ument to the method
7153 * represented by the given element. 7493 * represented by the given element.
7494 *
7154 * @param element the element representing the method invoked by the given nod e 7495 * @param element the element representing the method invoked by the given nod e
7155 */ 7496 */
7156 Type2 computeArgumentType(ExecutableElement element) { 7497 Type2 computeArgumentType(ExecutableElement element) {
7157 if (element != null) { 7498 if (element != null) {
7158 List<ParameterElement> parameters = element.parameters; 7499 List<ParameterElement> parameters = element.parameters;
7159 if (parameters != null && parameters.length == 2) { 7500 if (parameters != null && parameters.length == 2) {
7160 return parameters[1].type; 7501 return parameters[1].type;
7161 } 7502 }
7162 } 7503 }
7163 return _dynamicType; 7504 return _dynamicType;
7164 } 7505 }
7165 7506
7166 /** 7507 /**
7167 * Compute the return type of the method or function represented by the given element. 7508 * Compute the propagated return type of the method or function represented by the given element.
7509 *
7168 * @param element the element representing the method or function invoked by t he given node 7510 * @param element the element representing the method or function invoked by t he given node
7169 * @return the return type that was computed 7511 * @return the propagated return type that was computed
7170 */ 7512 */
7171 Type2 computeReturnType(Element element) { 7513 Type2 computePropagatedReturnType(Element element) {
7514 if (element is ExecutableElement) {
7515 return _propagatedReturnTypes[element];
7516 }
7517 return null;
7518 }
7519
7520 /**
7521 * Given a function body, compute the propagated return type of the function. The propagated
7522 * return type of functions with a block body is the least upper bound of all
7523 * [ReturnStatement] expressions, with an expression body it is the type of th e expression.
7524 *
7525 * @param body the boy of the function whose propagated return type is to be c omputed
7526 * @return the propagated return type that was computed
7527 */
7528 Type2 computePropagatedReturnType2(FunctionBody body) {
7529 if (body is ExpressionFunctionBody) {
7530 ExpressionFunctionBody expressionBody = body as ExpressionFunctionBody;
7531 return getBestType(expressionBody.expression);
7532 }
7533 if (body is BlockFunctionBody) {
7534 List<Type2> result = [null];
7535 body.accept(new GeneralizingASTVisitor_8(this, result));
7536 return result[0];
7537 }
7538 return null;
7539 }
7540
7541 /**
7542 * Compute the static return type of the method or function represented by the given element.
7543 *
7544 * @param element the element representing the method or function invoked by t he given node
7545 * @return the static return type that was computed
7546 */
7547 Type2 computeStaticReturnType(Element element) {
7172 if (element is PropertyAccessorElement) { 7548 if (element is PropertyAccessorElement) {
7173 FunctionType propertyType = ((element as PropertyAccessorElement)).type; 7549 FunctionType propertyType = ((element as PropertyAccessorElement)).type;
7174 if (propertyType != null) { 7550 if (propertyType != null) {
7175 Type2 returnType = propertyType.returnType; 7551 Type2 returnType = propertyType.returnType;
7176 if (returnType is InterfaceType) { 7552 if (returnType is InterfaceType) {
7177 if (identical(returnType, _typeProvider.functionType)) { 7553 if (identical(returnType, _typeProvider.functionType)) {
7178 return _dynamicType; 7554 return _dynamicType;
7179 } 7555 }
7180 MethodElement callMethod = ((returnType as InterfaceType)).lookUpMetho d(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary); 7556 MethodElement callMethod = ((returnType as InterfaceType)).lookUpMetho d(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary);
7181 if (callMethod != null) { 7557 if (callMethod != null) {
(...skipping 19 matching lines...) Expand all
7201 } else if (element is VariableElement) { 7577 } else if (element is VariableElement) {
7202 Type2 variableType = ((element as VariableElement)).type; 7578 Type2 variableType = ((element as VariableElement)).type;
7203 if (variableType is FunctionType) { 7579 if (variableType is FunctionType) {
7204 return ((variableType as FunctionType)).returnType; 7580 return ((variableType as FunctionType)).returnType;
7205 } 7581 }
7206 } 7582 }
7207 return _dynamicType; 7583 return _dynamicType;
7208 } 7584 }
7209 7585
7210 /** 7586 /**
7211 * Given a function declaration, compute the return type of the function. The return type of 7587 * Given a function declaration, compute the return static type of the functio n. The return type
7212 * functions with a block body is `dynamicType`, with an expression body it is the type of 7588 * of functions with a block body is `dynamicType`, with an expression body it is the type
7213 * the expression. 7589 * of the expression.
7214 * @param node the function expression whose return type is to be computed 7590 *
7215 * @return the return type that was computed 7591 * @param node the function expression whose static return type is to be compu ted
7592 * @return the static return type that was computed
7216 */ 7593 */
7217 Type2 computeReturnType2(FunctionDeclaration node) { 7594 Type2 computeStaticReturnType2(FunctionDeclaration node) {
7218 TypeName returnType = node.returnType; 7595 TypeName returnType = node.returnType;
7219 if (returnType == null) { 7596 if (returnType == null) {
7220 return _dynamicType; 7597 return _dynamicType;
7221 } 7598 }
7222 return returnType.type; 7599 return returnType.type;
7223 } 7600 }
7224 7601
7225 /** 7602 /**
7226 * Given a function expression, compute the return type of the function. The r eturn type of 7603 * Given a function expression, compute the return type of the function. The r eturn type of
7227 * functions with a block body is `dynamicType`, with an expression body it is the type of 7604 * functions with a block body is `dynamicType`, with an expression body it is the type of
7228 * the expression. 7605 * the expression.
7606 *
7229 * @param node the function expression whose return type is to be computed 7607 * @param node the function expression whose return type is to be computed
7230 * @return the return type that was computed 7608 * @return the return type that was computed
7231 */ 7609 */
7232 Type2 computeReturnType3(FunctionExpression node) { 7610 Type2 computeStaticReturnType3(FunctionExpression node) {
7233 FunctionBody body = node.body; 7611 FunctionBody body = node.body;
7234 if (body is ExpressionFunctionBody) { 7612 if (body is ExpressionFunctionBody) {
7235 return getStaticType(((body as ExpressionFunctionBody)).expression); 7613 return getStaticType(((body as ExpressionFunctionBody)).expression);
7236 } 7614 }
7237 return _dynamicType; 7615 return _dynamicType;
7238 } 7616 }
7239 7617
7240 /** 7618 /**
7241 * Return the propagated type of the given expression if it is available, or t he static type if 7619 * Return the propagated type of the given expression if it is available, or t he static type if
7242 * there is no propagated type. 7620 * there is no propagated type.
7621 *
7243 * @param expression the expression whose type is to be returned 7622 * @param expression the expression whose type is to be returned
7244 * @return the propagated or static type of the given expression 7623 * @return the propagated or static type of the given expression
7245 */ 7624 */
7246 Type2 getBestType(Expression expression) { 7625 Type2 getBestType(Expression expression) {
7247 Type2 type = expression.propagatedType; 7626 Type2 type = expression.propagatedType;
7248 if (type == null) { 7627 if (type == null) {
7249 type = expression.staticType; 7628 type = expression.staticType;
7250 if (type == null) { 7629 if (type == null) {
7251 return _dynamicType; 7630 return _dynamicType;
7252 } 7631 }
7253 } 7632 }
7254 return type; 7633 return type;
7255 } 7634 }
7256 7635
7257 /** 7636 /**
7258 * If the given argument list contains at least one argument, and if the argum ent is a simple 7637 * If the given argument list contains at least one argument, and if the argum ent is a simple
7259 * string literal, then parse that argument as a query string and return the t ype specified by the 7638 * string literal, then parse that argument as a query string and return the t ype specified by the
7260 * argument. 7639 * argument.
7640 *
7261 * @param library the library in which the specified type would be defined 7641 * @param library the library in which the specified type would be defined
7262 * @param argumentList the list of arguments from which a type is to be extrac ted 7642 * @param argumentList the list of arguments from which a type is to be extrac ted
7263 * @return the type specified by the first argument in the argument list 7643 * @return the type specified by the first argument in the argument list
7264 */ 7644 */
7265 Type2 getFirstArgumentAsQuery(LibraryElement library, ArgumentList argumentLis t) { 7645 Type2 getFirstArgumentAsQuery(LibraryElement library, ArgumentList argumentLis t) {
7266 String argumentValue = getFirstArgumentAsString(argumentList); 7646 String argumentValue = getFirstArgumentAsString(argumentList);
7267 if (argumentValue != null) { 7647 if (argumentValue != null) {
7268 if (argumentValue.contains(" ")) { 7648 if (argumentValue.contains(" ")) {
7269 return null; 7649 return null;
7270 } 7650 }
7271 String tag = argumentValue; 7651 String tag = argumentValue;
7272 tag = StringUtilities.substringBefore(tag, ":"); 7652 tag = StringUtilities.substringBefore(tag, ":");
7273 tag = StringUtilities.substringBefore(tag, "["); 7653 tag = StringUtilities.substringBefore(tag, "[");
7274 tag = StringUtilities.substringBefore(tag, "."); 7654 tag = StringUtilities.substringBefore(tag, ".");
7275 tag = StringUtilities.substringBefore(tag, "#"); 7655 tag = StringUtilities.substringBefore(tag, "#");
7276 tag = _HTML_ELEMENT_TO_CLASS_MAP[tag.toLowerCase()]; 7656 tag = _HTML_ELEMENT_TO_CLASS_MAP[tag.toLowerCase()];
7277 ClassElement returnType = library.getType(tag); 7657 ClassElement returnType = library.getType(tag);
7278 if (returnType != null) { 7658 if (returnType != null) {
7279 return returnType.type; 7659 return returnType.type;
7280 } 7660 }
7281 } 7661 }
7282 return null; 7662 return null;
7283 } 7663 }
7284 7664
7285 /** 7665 /**
7286 * If the given argument list contains at least one argument, and if the argum ent is a simple 7666 * If the given argument list contains at least one argument, and if the argum ent is a simple
7287 * string literal, return the String value of the argument. 7667 * string literal, return the String value of the argument.
7668 *
7288 * @param argumentList the list of arguments from which a string value is to b e extracted 7669 * @param argumentList the list of arguments from which a string value is to b e extracted
7289 * @return the string specified by the first argument in the argument list 7670 * @return the string specified by the first argument in the argument list
7290 */ 7671 */
7291 String getFirstArgumentAsString(ArgumentList argumentList) { 7672 String getFirstArgumentAsString(ArgumentList argumentList) {
7292 NodeList<Expression> arguments = argumentList.arguments; 7673 NodeList<Expression> arguments = argumentList.arguments;
7293 if (arguments.length > 0) { 7674 if (arguments.length > 0) {
7294 Expression argument = arguments[0]; 7675 Expression argument = arguments[0];
7295 if (argument is SimpleStringLiteral) { 7676 if (argument is SimpleStringLiteral) {
7296 return ((argument as SimpleStringLiteral)).value; 7677 return ((argument as SimpleStringLiteral)).value;
7297 } 7678 }
7298 } 7679 }
7299 return null; 7680 return null;
7300 } 7681 }
7301 7682
7302 /** 7683 /**
7303 * If the given argument list contains at least one argument, and if the argum ent is a simple 7684 * If the given argument list contains at least one argument, and if the argum ent is a simple
7304 * string literal, and if the value of the argument is the name of a class def ined within the 7685 * string literal, and if the value of the argument is the name of a class def ined within the
7305 * given library, return the type specified by the argument. 7686 * given library, return the type specified by the argument.
7687 *
7306 * @param library the library in which the specified type would be defined 7688 * @param library the library in which the specified type would be defined
7307 * @param argumentList the list of arguments from which a type is to be extrac ted 7689 * @param argumentList the list of arguments from which a type is to be extrac ted
7308 * @return the type specified by the first argument in the argument list 7690 * @return the type specified by the first argument in the argument list
7309 */ 7691 */
7310 Type2 getFirstArgumentAsType(LibraryElement library, ArgumentList argumentList ) => getFirstArgumentAsType2(library, argumentList, null); 7692 Type2 getFirstArgumentAsType(LibraryElement library, ArgumentList argumentList ) => getFirstArgumentAsType2(library, argumentList, null);
7311 7693
7312 /** 7694 /**
7313 * If the given argument list contains at least one argument, and if the argum ent is a simple 7695 * If the given argument list contains at least one argument, and if the argum ent is a simple
7314 * string literal, and if the value of the argument is the name of a class def ined within the 7696 * string literal, and if the value of the argument is the name of a class def ined within the
7315 * given library, return the type specified by the argument. 7697 * given library, return the type specified by the argument.
7698 *
7316 * @param library the library in which the specified type would be defined 7699 * @param library the library in which the specified type would be defined
7317 * @param argumentList the list of arguments from which a type is to be extrac ted 7700 * @param argumentList the list of arguments from which a type is to be extrac ted
7318 * @return the type specified by the first argument in the argument list 7701 * @return the type specified by the first argument in the argument list
7319 */ 7702 */
7320 Type2 getFirstArgumentAsType2(LibraryElement library, ArgumentList argumentLis t, Map<String, String> nameMap) { 7703 Type2 getFirstArgumentAsType2(LibraryElement library, ArgumentList argumentLis t, Map<String, String> nameMap) {
7321 String argumentValue = getFirstArgumentAsString(argumentList); 7704 String argumentValue = getFirstArgumentAsString(argumentList);
7322 if (argumentValue != null) { 7705 if (argumentValue != null) {
7323 if (nameMap != null) { 7706 if (nameMap != null) {
7324 argumentValue = nameMap[argumentValue.toLowerCase()]; 7707 argumentValue = nameMap[argumentValue.toLowerCase()];
7325 } 7708 }
7326 ClassElement returnType = library.getType(argumentValue); 7709 ClassElement returnType = library.getType(argumentValue);
7327 if (returnType != null) { 7710 if (returnType != null) {
7328 return returnType.type; 7711 return returnType.type;
7329 } 7712 }
7330 } 7713 }
7331 return null; 7714 return null;
7332 } 7715 }
7333 7716
7334 /** 7717 /**
7335 * Return the propagated type of the given expression. 7718 * Return the propagated type of the given expression.
7719 *
7336 * @param expression the expression whose type is to be returned 7720 * @param expression the expression whose type is to be returned
7337 * @return the propagated type of the given expression 7721 * @return the propagated type of the given expression
7338 */ 7722 */
7339 Type2 getPropagatedType(Expression expression) { 7723 Type2 getPropagatedType(Expression expression) {
7340 Type2 type = expression.propagatedType; 7724 Type2 type = expression.propagatedType;
7341 return type; 7725 return type;
7342 } 7726 }
7343 7727
7344 /** 7728 /**
7345 * Return the static type of the given expression. 7729 * Return the static type of the given expression.
7730 *
7346 * @param expression the expression whose type is to be returned 7731 * @param expression the expression whose type is to be returned
7347 * @return the static type of the given expression 7732 * @return the static type of the given expression
7348 */ 7733 */
7349 Type2 getStaticType(Expression expression) { 7734 Type2 getStaticType(Expression expression) {
7350 Type2 type = expression.staticType; 7735 Type2 type = expression.staticType;
7351 if (type == null) { 7736 if (type == null) {
7352 return _dynamicType; 7737 return _dynamicType;
7353 } 7738 }
7354 return type; 7739 return type;
7355 } 7740 }
7356 7741
7357 /** 7742 /**
7358 * Return the type that should be recorded for a node that resolved to the giv en accessor. 7743 * Return the type that should be recorded for a node that resolved to the giv en accessor.
7744 *
7359 * @param accessor the accessor that the node resolved to 7745 * @param accessor the accessor that the node resolved to
7360 * @param context if the accessor element has context \[by being the RHS of a[ PrefixedIdentifier] or [PropertyAccess]\], and the return type of the 7746 * @param context if the accessor element has context [by being the RHS of a
7361 * accessor is a parameter type, then the type of the LHS can be used to get m ore 7747 * [PrefixedIdentifier] or [PropertyAccess]], and the return type of the
7362 * specific type information 7748 * accessor is a parameter type, then the type of the LHS can be used to get more
7749 * specific type information
7363 * @return the type that should be recorded for a node that resolved to the gi ven accessor 7750 * @return the type that should be recorded for a node that resolved to the gi ven accessor
7364 */ 7751 */
7365 Type2 getType(PropertyAccessorElement accessor, Type2 context) { 7752 Type2 getType(PropertyAccessorElement accessor, Type2 context) {
7366 FunctionType functionType = accessor.type; 7753 FunctionType functionType = accessor.type;
7367 if (functionType == null) { 7754 if (functionType == null) {
7368 return _dynamicType; 7755 return _dynamicType;
7369 } 7756 }
7370 if (accessor.isSetter) { 7757 if (accessor.isSetter) {
7371 List<Type2> parameterTypes = functionType.normalParameterTypes; 7758 List<Type2> parameterTypes = functionType.normalParameterTypes;
7372 if (parameterTypes != null && parameterTypes.length > 0) { 7759 if (parameterTypes != null && parameterTypes.length > 0) {
(...skipping 19 matching lines...) Expand all
7392 return interfaceTypeContext.typeArguments[i]; 7779 return interfaceTypeContext.typeArguments[i];
7393 } 7780 }
7394 } 7781 }
7395 } 7782 }
7396 } 7783 }
7397 return returnType; 7784 return returnType;
7398 } 7785 }
7399 7786
7400 /** 7787 /**
7401 * Return the type represented by the given type name. 7788 * Return the type represented by the given type name.
7789 *
7402 * @param typeName the type name representing the type to be returned 7790 * @param typeName the type name representing the type to be returned
7403 * @return the type represented by the type name 7791 * @return the type represented by the type name
7404 */ 7792 */
7405 Type2 getType2(TypeName typeName) { 7793 Type2 getType2(TypeName typeName) {
7406 Type2 type = typeName.type; 7794 Type2 type = typeName.type;
7407 if (type == null) { 7795 if (type == null) {
7408 return _dynamicType; 7796 return _dynamicType;
7409 } 7797 }
7410 return type; 7798 return type;
7411 } 7799 }
7412 7800
7413 /** 7801 /**
7802 * Return `true` if the given [Type] is the `Future` form the 'dart:async'
7803 * library.
7804 */
7805 bool isAsyncFutureType(Type2 type) => type is InterfaceType && type.name == "F uture" && isAsyncLibrary(type.element.library);
7806
7807 /**
7808 * Return `true` if the given library is the 'dart:async' library.
7809 *
7810 * @param library the library being tested
7811 * @return `true` if the library is 'dart:async'
7812 */
7813 bool isAsyncLibrary(LibraryElement library) => library.name == "dart.async";
7814
7815 /**
7414 * Return `true` if the given library is the 'dart:html' library. 7816 * Return `true` if the given library is the 'dart:html' library.
7817 *
7415 * @param library the library being tested 7818 * @param library the library being tested
7416 * @return `true` if the library is 'dart:html' 7819 * @return `true` if the library is 'dart:html'
7417 */ 7820 */
7418 bool isHtmlLibrary(LibraryElement library) => library.name == "dart.dom.html"; 7821 bool isHtmlLibrary(LibraryElement library) => library.name == "dart.dom.html";
7419 7822
7420 /** 7823 /**
7421 * Return `true` if the given node is not a type literal. 7824 * Return `true` if the given node is not a type literal.
7825 *
7422 * @param node the node being tested 7826 * @param node the node being tested
7423 * @return `true` if the given node is not a type literal 7827 * @return `true` if the given node is not a type literal
7424 */ 7828 */
7425 bool isNotTypeLiteral(Identifier node) { 7829 bool isNotTypeLiteral(Identifier node) {
7426 ASTNode parent = node.parent; 7830 ASTNode parent = node.parent;
7427 return parent is TypeName || (parent is PrefixedIdentifier && (parent.parent is TypeName || identical(((parent as PrefixedIdentifier)).prefix, node))) || (p arent is PropertyAccess && identical(((parent as PropertyAccess)).target, node)) || (parent is MethodInvocation && identical(node, ((parent as MethodInvocation) ).target)); 7831 return parent is TypeName || (parent is PrefixedIdentifier && (parent.parent is TypeName || identical(((parent as PrefixedIdentifier)).prefix, node))) || (p arent is PropertyAccess && identical(((parent as PropertyAccess)).target, node)) || (parent is MethodInvocation && identical(node, ((parent as MethodInvocation) ).target));
7428 } 7832 }
7429 7833
7430 /** 7834 /**
7835 * Given a function element and its body, compute and record the propagated re turn type of the
7836 * function.
7837 *
7838 * @param functionElement the function element to record propagated return typ e for
7839 * @param body the boy of the function whose propagated return type is to be c omputed
7840 * @return the propagated return type that was computed, may be `null` if it i s not more
7841 * specific than the static return type.
7842 */
7843 void recordPropagatedType(ExecutableElement functionElement, FunctionBody body ) {
7844 Type2 propagatedReturnType = computePropagatedReturnType2(body);
7845 if (propagatedReturnType == null) {
7846 return;
7847 }
7848 if (identical(propagatedReturnType, BottomTypeImpl.instance)) {
7849 return;
7850 }
7851 Type2 staticReturnType = functionElement.returnType;
7852 if (!propagatedReturnType.isMoreSpecificThan(staticReturnType)) {
7853 return;
7854 }
7855 _propagatedReturnTypes[functionElement] = propagatedReturnType;
7856 }
7857
7858 /**
7431 * Record that the propagated type of the given node is the given type. 7859 * Record that the propagated type of the given node is the given type.
7860 *
7432 * @param expression the node whose type is to be recorded 7861 * @param expression the node whose type is to be recorded
7433 * @param type the propagated type of the node 7862 * @param type the propagated type of the node
7434 */ 7863 */
7435 void recordPropagatedType(Expression expression, Type2 type) { 7864 void recordPropagatedType2(Expression expression, Type2 type) {
7436 if (type != null && !type.isDynamic) { 7865 if (type != null && !type.isDynamic) {
7437 expression.propagatedType = type; 7866 expression.propagatedType = type;
7438 } 7867 }
7439 } 7868 }
7440 7869
7441 /** 7870 /**
7442 * Record that the static type of the given node is the given type. 7871 * Record that the static type of the given node is the given type.
7872 *
7443 * @param expression the node whose type is to be recorded 7873 * @param expression the node whose type is to be recorded
7444 * @param type the static type of the node 7874 * @param type the static type of the node
7445 */ 7875 */
7446 void recordStaticType(Expression expression, Type2 type) { 7876 void recordStaticType(Expression expression, Type2 type) {
7447 if (type == null) { 7877 if (type == null) {
7448 expression.staticType = _dynamicType; 7878 expression.staticType = _dynamicType;
7449 } else { 7879 } else {
7450 expression.staticType = type; 7880 expression.staticType = type;
7451 } 7881 }
7452 } 7882 }
7453 7883
7454 /** 7884 /**
7455 * Attempts to make a better guess for the static type of the given binary exp ression. 7885 * Attempts to make a better guess for the static type of the given binary exp ression.
7886 *
7456 * @param node the binary expression to analyze 7887 * @param node the binary expression to analyze
7457 * @param staticType the static type of the expression as resolved 7888 * @param staticType the static type of the expression as resolved
7458 * @return the better type guess, or the same static type as given 7889 * @return the better type guess, or the same static type as given
7459 */ 7890 */
7460 Type2 refineBinaryExpressionType(BinaryExpression node, Type2 staticType) { 7891 Type2 refineBinaryExpressionType(BinaryExpression node, Type2 staticType) {
7461 sc.TokenType operator = node.operator.type; 7892 sc.TokenType operator = node.operator.type;
7462 if (identical(operator, sc.TokenType.AMPERSAND_AMPERSAND) || identical(opera tor, sc.TokenType.BAR_BAR) || identical(operator, sc.TokenType.EQ_EQ) || identic al(operator, sc.TokenType.BANG_EQ)) { 7893 if (identical(operator, sc.TokenType.AMPERSAND_AMPERSAND) || identical(opera tor, sc.TokenType.BAR_BAR) || identical(operator, sc.TokenType.EQ_EQ) || identic al(operator, sc.TokenType.BANG_EQ)) {
7463 return _typeProvider.boolType; 7894 return _typeProvider.boolType;
7464 } 7895 }
7465 if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenT ype.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc .TokenType.STAR)) { 7896 if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenT ype.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc .TokenType.STAR)) {
7466 Type2 doubleType = _typeProvider.doubleType; 7897 Type2 doubleType = _typeProvider.doubleType;
7467 if (identical(getStaticType(node.leftOperand), _typeProvider.intType) && i dentical(getStaticType(node.rightOperand), doubleType)) { 7898 if (identical(getStaticType(node.leftOperand), _typeProvider.intType) && i dentical(getStaticType(node.rightOperand), doubleType)) {
7468 return doubleType; 7899 return doubleType;
7469 } 7900 }
7470 } 7901 }
7471 if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenT ype.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc .TokenType.STAR) || identical(operator, sc.TokenType.TILDE_SLASH)) { 7902 if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenT ype.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc .TokenType.STAR) || identical(operator, sc.TokenType.TILDE_SLASH)) {
7472 Type2 intType = _typeProvider.intType; 7903 Type2 intType = _typeProvider.intType;
7473 if (identical(getStaticType(node.leftOperand), intType) && identical(getSt aticType(node.rightOperand), intType)) { 7904 if (identical(getStaticType(node.leftOperand), intType) && identical(getSt aticType(node.rightOperand), intType)) {
7474 staticType = intType; 7905 staticType = intType;
7475 } 7906 }
7476 } 7907 }
7477 return staticType; 7908 return staticType;
7478 } 7909 }
7479 7910
7480 /** 7911 /**
7481 * Set the return type and parameter type information for the given function t ype based on the 7912 * Set the return type and parameter type information for the given function t ype based on the
7482 * given return type and parameter elements. 7913 * given return type and parameter elements.
7914 *
7483 * @param functionType the function type to be filled in 7915 * @param functionType the function type to be filled in
7484 * @param parameters the elements representing the parameters to the function 7916 * @param parameters the elements representing the parameters to the function
7485 */ 7917 */
7486 void setTypeInformation(FunctionTypeImpl functionType, FormalParameterList par ameterList) { 7918 void setTypeInformation(FunctionTypeImpl functionType, FormalParameterList par ameterList) {
7487 List<Type2> normalParameterTypes = new List<Type2>(); 7919 List<Type2> normalParameterTypes = new List<Type2>();
7488 List<Type2> optionalParameterTypes = new List<Type2>(); 7920 List<Type2> optionalParameterTypes = new List<Type2>();
7489 LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>(); 7921 LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>();
7490 if (parameterList != null) { 7922 if (parameterList != null) {
7491 for (ParameterElement parameter in parameterList.elements) { 7923 for (ParameterElement parameter in parameterList.elements) {
7492 while (true) { 7924 while (true) {
7493 if (parameter.parameterKind == ParameterKind.REQUIRED) { 7925 if (parameter.parameterKind == ParameterKind.REQUIRED) {
7494 normalParameterTypes.add(parameter.type); 7926 normalParameterTypes.add(parameter.type);
7495 } else if (parameter.parameterKind == ParameterKind.POSITIONAL) { 7927 } else if (parameter.parameterKind == ParameterKind.POSITIONAL) {
7496 optionalParameterTypes.add(parameter.type); 7928 optionalParameterTypes.add(parameter.type);
7497 } else if (parameter.parameterKind == ParameterKind.NAMED) { 7929 } else if (parameter.parameterKind == ParameterKind.NAMED) {
7498 namedParameterTypes[parameter.name] = parameter.type; 7930 namedParameterTypes[parameter.name] = parameter.type;
7499 } 7931 }
7500 break; 7932 break;
7501 } 7933 }
7502 } 7934 }
7503 } 7935 }
7504 functionType.normalParameterTypes = new List.from(normalParameterTypes); 7936 functionType.normalParameterTypes = new List.from(normalParameterTypes);
7505 functionType.optionalParameterTypes = new List.from(optionalParameterTypes); 7937 functionType.optionalParameterTypes = new List.from(optionalParameterTypes);
7506 functionType.namedParameterTypes = namedParameterTypes; 7938 functionType.namedParameterTypes = namedParameterTypes;
7507 } 7939 }
7508 get thisType_J2DAccessor => _thisType; 7940 get thisType_J2DAccessor => _thisType;
7509 set thisType_J2DAccessor(__v) => _thisType = __v; 7941 set thisType_J2DAccessor(__v) => _thisType = __v;
7510 } 7942 }
7943 class GeneralizingASTVisitor_8 extends GeneralizingASTVisitor<Object> {
7944 final StaticTypeAnalyzer StaticTypeAnalyzer_this;
7945 List<Type2> result;
7946 GeneralizingASTVisitor_8(this.StaticTypeAnalyzer_this, this.result) : super();
7947 Object visitExpression(Expression node) => null;
7948 Object visitReturnStatement(ReturnStatement node) {
7949 Type2 type;
7950 Expression expression = node.expression;
7951 if (expression != null) {
7952 type = StaticTypeAnalyzer_this.getBestType(expression);
7953 } else {
7954 type = BottomTypeImpl.instance;
7955 }
7956 if (result[0] == null) {
7957 result[0] = type;
7958 } else {
7959 result[0] = result[0].getLeastUpperBound(type);
7960 }
7961 return null;
7962 }
7963 }
7511 /** 7964 /**
7512 * Instances of the class `TypeOverrideManager` manage the ability to override t he type of an 7965 * Instances of the class `TypeOverrideManager` manage the ability to override t he type of an
7513 * element within a given context. 7966 * element within a given context.
7514 */ 7967 */
7515 class TypeOverrideManager { 7968 class TypeOverrideManager {
7516 7969
7517 /** 7970 /**
7518 * The current override scope, or `null` if no scope has been entered. 7971 * The current override scope, or `null` if no scope has been entered.
7519 */ 7972 */
7520 TypeOverrideManager_TypeOverrideScope _currentScope; 7973 TypeOverrideManager_TypeOverrideScope _currentScope;
7521 7974
7522 /** 7975 /**
7523 * Apply a set of overrides that were previously captured. 7976 * Apply a set of overrides that were previously captured.
7977 *
7524 * @param overrides the overrides to be applied 7978 * @param overrides the overrides to be applied
7525 */ 7979 */
7526 void applyOverrides(Map<Element, Type2> overrides) { 7980 void applyOverrides(Map<Element, Type2> overrides) {
7527 if (_currentScope == null) { 7981 if (_currentScope == null) {
7528 throw new IllegalStateException("Cannot apply overrides without a scope"); 7982 throw new IllegalStateException("Cannot apply overrides without a scope");
7529 } 7983 }
7530 _currentScope.applyOverrides(overrides); 7984 _currentScope.applyOverrides(overrides);
7531 } 7985 }
7532 7986
7533 /** 7987 /**
7534 * Return a table mapping the elements whose type is overridden in the current scope to the 7988 * Return a table mapping the elements whose type is overridden in the current scope to the
7535 * overriding type. 7989 * overriding type.
7990 *
7536 * @return the overrides in the current scope 7991 * @return the overrides in the current scope
7537 */ 7992 */
7538 Map<Element, Type2> captureLocalOverrides() { 7993 Map<Element, Type2> captureLocalOverrides() {
7539 if (_currentScope == null) { 7994 if (_currentScope == null) {
7540 throw new IllegalStateException("Cannot capture local overrides without a scope"); 7995 throw new IllegalStateException("Cannot capture local overrides without a scope");
7541 } 7996 }
7542 return _currentScope.captureLocalOverrides(); 7997 return _currentScope.captureLocalOverrides();
7543 } 7998 }
7544 7999
7545 /** 8000 /**
7546 * Return a map from the elements for the variables in the given list that hav e their types 8001 * Return a map from the elements for the variables in the given list that hav e their types
7547 * overridden to the overriding type. 8002 * overridden to the overriding type.
8003 *
7548 * @param variableList the list of variables whose overriding types are to be captured 8004 * @param variableList the list of variables whose overriding types are to be captured
7549 * @return a table mapping elements to their overriding types 8005 * @return a table mapping elements to their overriding types
7550 */ 8006 */
7551 Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) { 8007 Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
7552 if (_currentScope == null) { 8008 if (_currentScope == null) {
7553 throw new IllegalStateException("Cannot capture overrides without a scope" ); 8009 throw new IllegalStateException("Cannot capture overrides without a scope" );
7554 } 8010 }
7555 return _currentScope.captureOverrides(variableList); 8011 return _currentScope.captureOverrides(variableList);
7556 } 8012 }
7557 8013
(...skipping 10 matching lines...) Expand all
7568 void exitScope() { 8024 void exitScope() {
7569 if (_currentScope == null) { 8025 if (_currentScope == null) {
7570 throw new IllegalStateException("No scope to exit"); 8026 throw new IllegalStateException("No scope to exit");
7571 } 8027 }
7572 _currentScope = _currentScope._outerScope; 8028 _currentScope = _currentScope._outerScope;
7573 } 8029 }
7574 8030
7575 /** 8031 /**
7576 * Return the overridden type of the given element, or `null` if the type of t he element has 8032 * Return the overridden type of the given element, or `null` if the type of t he element has
7577 * not been overridden. 8033 * not been overridden.
8034 *
7578 * @param element the element whose type might have been overridden 8035 * @param element the element whose type might have been overridden
7579 * @return the overridden type of the given element 8036 * @return the overridden type of the given element
7580 */ 8037 */
7581 Type2 getType(Element element) { 8038 Type2 getType(Element element) {
7582 if (_currentScope == null) { 8039 if (_currentScope == null) {
7583 return null; 8040 return null;
7584 } 8041 }
7585 return _currentScope.getType(element); 8042 return _currentScope.getType(element);
7586 } 8043 }
7587 8044
7588 /** 8045 /**
7589 * Set the overridden type of the given element to the given type 8046 * Set the overridden type of the given element to the given type
8047 *
7590 * @param element the element whose type might have been overridden 8048 * @param element the element whose type might have been overridden
7591 * @param type the overridden type of the given element 8049 * @param type the overridden type of the given element
7592 */ 8050 */
7593 void setType(Element element, Type2 type) { 8051 void setType(Element element, Type2 type) {
7594 if (_currentScope == null) { 8052 if (_currentScope == null) {
7595 throw new IllegalStateException("Cannot override without a scope"); 8053 throw new IllegalStateException("Cannot override without a scope");
7596 } 8054 }
7597 _currentScope.setType(element, type); 8055 _currentScope.setType(element, type);
7598 } 8056 }
7599 } 8057 }
7600 /** 8058 /**
7601 * Instances of the class `TypeOverrideScope` represent a scope in which the typ es of 8059 * Instances of the class `TypeOverrideScope` represent a scope in which the typ es of
7602 * elements can be overridden. 8060 * elements can be overridden.
7603 */ 8061 */
7604 class TypeOverrideManager_TypeOverrideScope { 8062 class TypeOverrideManager_TypeOverrideScope {
7605 8063
7606 /** 8064 /**
7607 * The outer scope in which types might be overridden. 8065 * The outer scope in which types might be overridden.
7608 */ 8066 */
7609 TypeOverrideManager_TypeOverrideScope _outerScope; 8067 TypeOverrideManager_TypeOverrideScope _outerScope;
7610 8068
7611 /** 8069 /**
7612 * A table mapping elements to the overridden type of that element. 8070 * A table mapping elements to the overridden type of that element.
7613 */ 8071 */
7614 Map<Element, Type2> _overridenTypes = new Map<Element, Type2>(); 8072 Map<Element, Type2> _overridenTypes = new Map<Element, Type2>();
7615 8073
7616 /** 8074 /**
7617 * Initialize a newly created scope to be an empty child of the given scope. 8075 * Initialize a newly created scope to be an empty child of the given scope.
8076 *
7618 * @param outerScope the outer scope in which types might be overridden 8077 * @param outerScope the outer scope in which types might be overridden
7619 */ 8078 */
7620 TypeOverrideManager_TypeOverrideScope(TypeOverrideManager_TypeOverrideScope ou terScope) { 8079 TypeOverrideManager_TypeOverrideScope(TypeOverrideManager_TypeOverrideScope ou terScope) {
7621 this._outerScope = outerScope; 8080 this._outerScope = outerScope;
7622 } 8081 }
7623 8082
7624 /** 8083 /**
7625 * Apply a set of overrides that were previously captured. 8084 * Apply a set of overrides that were previously captured.
8085 *
7626 * @param overrides the overrides to be applied 8086 * @param overrides the overrides to be applied
7627 */ 8087 */
7628 void applyOverrides(Map<Element, Type2> overrides) { 8088 void applyOverrides(Map<Element, Type2> overrides) {
7629 for (MapEntry<Element, Type2> entry in getMapEntrySet(overrides)) { 8089 for (MapEntry<Element, Type2> entry in getMapEntrySet(overrides)) {
7630 _overridenTypes[entry.getKey()] = entry.getValue(); 8090 _overridenTypes[entry.getKey()] = entry.getValue();
7631 } 8091 }
7632 } 8092 }
7633 8093
7634 /** 8094 /**
7635 * Return a table mapping the elements whose type is overridden in the current scope to the 8095 * Return a table mapping the elements whose type is overridden in the current scope to the
7636 * overriding type. 8096 * overriding type.
8097 *
7637 * @return the overrides in the current scope 8098 * @return the overrides in the current scope
7638 */ 8099 */
7639 Map<Element, Type2> captureLocalOverrides() => _overridenTypes; 8100 Map<Element, Type2> captureLocalOverrides() => _overridenTypes;
7640 8101
7641 /** 8102 /**
7642 * Return a map from the elements for the variables in the given list that hav e their types 8103 * Return a map from the elements for the variables in the given list that hav e their types
7643 * overridden to the overriding type. 8104 * overridden to the overriding type.
8105 *
7644 * @param variableList the list of variables whose overriding types are to be captured 8106 * @param variableList the list of variables whose overriding types are to be captured
7645 * @return a table mapping elements to their overriding types 8107 * @return a table mapping elements to their overriding types
7646 */ 8108 */
7647 Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) { 8109 Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
7648 Map<Element, Type2> overrides = new Map<Element, Type2>(); 8110 Map<Element, Type2> overrides = new Map<Element, Type2>();
7649 if (variableList.isConst || variableList.isFinal) { 8111 if (variableList.isConst || variableList.isFinal) {
7650 for (VariableDeclaration variable in variableList.variables) { 8112 for (VariableDeclaration variable in variableList.variables) {
7651 Element element = variable.element; 8113 Element element = variable.element;
7652 if (element != null) { 8114 if (element != null) {
7653 Type2 type = _overridenTypes[element]; 8115 Type2 type = _overridenTypes[element];
7654 if (type != null) { 8116 if (type != null) {
7655 overrides[element] = type; 8117 overrides[element] = type;
7656 } 8118 }
7657 } 8119 }
7658 } 8120 }
7659 } 8121 }
7660 return overrides; 8122 return overrides;
7661 } 8123 }
7662 8124
7663 /** 8125 /**
7664 * Return the overridden type of the given element, or `null` if the type of t he element 8126 * Return the overridden type of the given element, or `null` if the type of t he element
7665 * has not been overridden. 8127 * has not been overridden.
8128 *
7666 * @param element the element whose type might have been overridden 8129 * @param element the element whose type might have been overridden
7667 * @return the overridden type of the given element 8130 * @return the overridden type of the given element
7668 */ 8131 */
7669 Type2 getType(Element element) { 8132 Type2 getType(Element element) {
7670 Type2 type = _overridenTypes[element]; 8133 Type2 type = _overridenTypes[element];
7671 if (type == null && element is PropertyAccessorElement) { 8134 if (type == null && element is PropertyAccessorElement) {
7672 type = _overridenTypes[((element as PropertyAccessorElement)).variable]; 8135 type = _overridenTypes[((element as PropertyAccessorElement)).variable];
7673 } 8136 }
7674 if (type != null) { 8137 if (type != null) {
7675 return type; 8138 return type;
7676 } else if (_outerScope != null) { 8139 } else if (_outerScope != null) {
7677 return _outerScope.getType(element); 8140 return _outerScope.getType(element);
7678 } 8141 }
7679 return null; 8142 return null;
7680 } 8143 }
7681 8144
7682 /** 8145 /**
7683 * Set the overridden type of the given element to the given type 8146 * Set the overridden type of the given element to the given type
8147 *
7684 * @param element the element whose type might have been overridden 8148 * @param element the element whose type might have been overridden
7685 * @param type the overridden type of the given element 8149 * @param type the overridden type of the given element
7686 */ 8150 */
7687 void setType(Element element, Type2 type) { 8151 void setType(Element element, Type2 type) {
7688 _overridenTypes[element] = type; 8152 _overridenTypes[element] = type;
7689 } 8153 }
7690 } 8154 }
7691 /** 8155 /**
7692 * The interface `TypeProvider` defines the behavior of objects that provide acc ess to types 8156 * The interface `TypeProvider` defines the behavior of objects that provide acc ess to types
7693 * defined by the language. 8157 * defined by the language.
8158 *
7694 * @coverage dart.engine.resolver 8159 * @coverage dart.engine.resolver
7695 */ 8160 */
7696 abstract class TypeProvider { 8161 abstract class TypeProvider {
7697 8162
7698 /** 8163 /**
7699 * Return the type representing the built-in type 'bool'. 8164 * Return the type representing the built-in type 'bool'.
8165 *
7700 * @return the type representing the built-in type 'bool' 8166 * @return the type representing the built-in type 'bool'
7701 */ 8167 */
7702 InterfaceType get boolType; 8168 InterfaceType get boolType;
7703 8169
7704 /** 8170 /**
7705 * Return the type representing the type 'bottom'. 8171 * Return the type representing the type 'bottom'.
8172 *
7706 * @return the type representing the type 'bottom' 8173 * @return the type representing the type 'bottom'
7707 */ 8174 */
7708 Type2 get bottomType; 8175 Type2 get bottomType;
7709 8176
7710 /** 8177 /**
7711 * Return the type representing the built-in type 'double'. 8178 * Return the type representing the built-in type 'double'.
8179 *
7712 * @return the type representing the built-in type 'double' 8180 * @return the type representing the built-in type 'double'
7713 */ 8181 */
7714 InterfaceType get doubleType; 8182 InterfaceType get doubleType;
7715 8183
7716 /** 8184 /**
7717 * Return the type representing the built-in type 'dynamic'. 8185 * Return the type representing the built-in type 'dynamic'.
8186 *
7718 * @return the type representing the built-in type 'dynamic' 8187 * @return the type representing the built-in type 'dynamic'
7719 */ 8188 */
7720 Type2 get dynamicType; 8189 Type2 get dynamicType;
7721 8190
7722 /** 8191 /**
7723 * Return the type representing the built-in type 'Function'. 8192 * Return the type representing the built-in type 'Function'.
8193 *
7724 * @return the type representing the built-in type 'Function' 8194 * @return the type representing the built-in type 'Function'
7725 */ 8195 */
7726 InterfaceType get functionType; 8196 InterfaceType get functionType;
7727 8197
7728 /** 8198 /**
7729 * Return the type representing the built-in type 'int'. 8199 * Return the type representing the built-in type 'int'.
8200 *
7730 * @return the type representing the built-in type 'int' 8201 * @return the type representing the built-in type 'int'
7731 */ 8202 */
7732 InterfaceType get intType; 8203 InterfaceType get intType;
7733 8204
7734 /** 8205 /**
7735 * Return the type representing the built-in type 'List'. 8206 * Return the type representing the built-in type 'List'.
8207 *
7736 * @return the type representing the built-in type 'List' 8208 * @return the type representing the built-in type 'List'
7737 */ 8209 */
7738 InterfaceType get listType; 8210 InterfaceType get listType;
7739 8211
7740 /** 8212 /**
7741 * Return the type representing the built-in type 'Map'. 8213 * Return the type representing the built-in type 'Map'.
8214 *
7742 * @return the type representing the built-in type 'Map' 8215 * @return the type representing the built-in type 'Map'
7743 */ 8216 */
7744 InterfaceType get mapType; 8217 InterfaceType get mapType;
7745 8218
7746 /** 8219 /**
7747 * Return the type representing the built-in type 'num'. 8220 * Return the type representing the built-in type 'num'.
8221 *
7748 * @return the type representing the built-in type 'num' 8222 * @return the type representing the built-in type 'num'
7749 */ 8223 */
7750 InterfaceType get numType; 8224 InterfaceType get numType;
7751 8225
7752 /** 8226 /**
7753 * Return the type representing the built-in type 'Object'. 8227 * Return the type representing the built-in type 'Object'.
8228 *
7754 * @return the type representing the built-in type 'Object' 8229 * @return the type representing the built-in type 'Object'
7755 */ 8230 */
7756 InterfaceType get objectType; 8231 InterfaceType get objectType;
7757 8232
7758 /** 8233 /**
7759 * Return the type representing the built-in type 'StackTrace'. 8234 * Return the type representing the built-in type 'StackTrace'.
8235 *
7760 * @return the type representing the built-in type 'StackTrace' 8236 * @return the type representing the built-in type 'StackTrace'
7761 */ 8237 */
7762 InterfaceType get stackTraceType; 8238 InterfaceType get stackTraceType;
7763 8239
7764 /** 8240 /**
7765 * Return the type representing the built-in type 'String'. 8241 * Return the type representing the built-in type 'String'.
8242 *
7766 * @return the type representing the built-in type 'String' 8243 * @return the type representing the built-in type 'String'
7767 */ 8244 */
7768 InterfaceType get stringType; 8245 InterfaceType get stringType;
7769 8246
7770 /** 8247 /**
8248 * Return the type representing the built-in type 'Symbol'.
8249 *
8250 * @return the type representing the built-in type 'Symbol'
8251 */
8252 InterfaceType get symbolType;
8253
8254 /**
7771 * Return the type representing the built-in type 'Type'. 8255 * Return the type representing the built-in type 'Type'.
8256 *
7772 * @return the type representing the built-in type 'Type' 8257 * @return the type representing the built-in type 'Type'
7773 */ 8258 */
7774 InterfaceType get typeType; 8259 InterfaceType get typeType;
7775 } 8260 }
7776 /** 8261 /**
7777 * Instances of the class `TypeProviderImpl` provide access to types defined by the language 8262 * Instances of the class `TypeProviderImpl` provide access to types defined by the language
7778 * by looking for those types in the element model for the core library. 8263 * by looking for those types in the element model for the core library.
8264 *
7779 * @coverage dart.engine.resolver 8265 * @coverage dart.engine.resolver
7780 */ 8266 */
7781 class TypeProviderImpl implements TypeProvider { 8267 class TypeProviderImpl implements TypeProvider {
7782 8268
7783 /** 8269 /**
7784 * The type representing the built-in type 'bool'. 8270 * The type representing the built-in type 'bool'.
7785 */ 8271 */
7786 InterfaceType _boolType; 8272 InterfaceType _boolType;
7787 8273
7788 /** 8274 /**
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
7834 * The type representing the built-in type 'StackTrace'. 8320 * The type representing the built-in type 'StackTrace'.
7835 */ 8321 */
7836 InterfaceType _stackTraceType; 8322 InterfaceType _stackTraceType;
7837 8323
7838 /** 8324 /**
7839 * The type representing the built-in type 'String'. 8325 * The type representing the built-in type 'String'.
7840 */ 8326 */
7841 InterfaceType _stringType; 8327 InterfaceType _stringType;
7842 8328
7843 /** 8329 /**
8330 * The type representing the built-in type 'Symbol'.
8331 */
8332 InterfaceType _symbolType;
8333
8334 /**
7844 * The type representing the built-in type 'Type'. 8335 * The type representing the built-in type 'Type'.
7845 */ 8336 */
7846 InterfaceType _typeType; 8337 InterfaceType _typeType;
7847 8338
7848 /** 8339 /**
7849 * Initialize a newly created type provider to provide the types defined in th e given library. 8340 * Initialize a newly created type provider to provide the types defined in th e given library.
8341 *
7850 * @param coreLibrary the element representing the core library (dart:core). 8342 * @param coreLibrary the element representing the core library (dart:core).
7851 */ 8343 */
7852 TypeProviderImpl(LibraryElement coreLibrary) { 8344 TypeProviderImpl(LibraryElement coreLibrary) {
7853 initializeFrom(coreLibrary); 8345 initializeFrom(coreLibrary);
7854 } 8346 }
7855 InterfaceType get boolType => _boolType; 8347 InterfaceType get boolType => _boolType;
7856 Type2 get bottomType => _bottomType; 8348 Type2 get bottomType => _bottomType;
7857 InterfaceType get doubleType => _doubleType; 8349 InterfaceType get doubleType => _doubleType;
7858 Type2 get dynamicType => _dynamicType; 8350 Type2 get dynamicType => _dynamicType;
7859 InterfaceType get functionType => _functionType; 8351 InterfaceType get functionType => _functionType;
7860 InterfaceType get intType => _intType; 8352 InterfaceType get intType => _intType;
7861 InterfaceType get listType => _listType; 8353 InterfaceType get listType => _listType;
7862 InterfaceType get mapType => _mapType; 8354 InterfaceType get mapType => _mapType;
7863 InterfaceType get numType => _numType; 8355 InterfaceType get numType => _numType;
7864 InterfaceType get objectType => _objectType; 8356 InterfaceType get objectType => _objectType;
7865 InterfaceType get stackTraceType => _stackTraceType; 8357 InterfaceType get stackTraceType => _stackTraceType;
7866 InterfaceType get stringType => _stringType; 8358 InterfaceType get stringType => _stringType;
8359 InterfaceType get symbolType => _symbolType;
7867 InterfaceType get typeType => _typeType; 8360 InterfaceType get typeType => _typeType;
7868 8361
7869 /** 8362 /**
7870 * Return the type with the given name from the given namespace, or `null` if there is no 8363 * Return the type with the given name from the given namespace, or `null` if there is no
7871 * class with the given name. 8364 * class with the given name.
8365 *
7872 * @param namespace the namespace in which to search for the given name 8366 * @param namespace the namespace in which to search for the given name
7873 * @param typeName the name of the type being searched for 8367 * @param typeName the name of the type being searched for
7874 * @return the type that was found 8368 * @return the type that was found
7875 */ 8369 */
7876 InterfaceType getType(Namespace namespace, String typeName) { 8370 InterfaceType getType(Namespace namespace, String typeName) {
7877 Element element = namespace.get(typeName); 8371 Element element = namespace.get(typeName);
7878 if (element == null) { 8372 if (element == null) {
7879 AnalysisEngine.instance.logger.logInformation("No definition of type ${typ eName}"); 8373 AnalysisEngine.instance.logger.logInformation("No definition of type ${typ eName}");
7880 return null; 8374 return null;
7881 } 8375 }
7882 return ((element as ClassElement)).type; 8376 return ((element as ClassElement)).type;
7883 } 8377 }
7884 8378
7885 /** 8379 /**
7886 * Initialize the types provided by this type provider from the given library. 8380 * Initialize the types provided by this type provider from the given library.
8381 *
7887 * @param library the library containing the definitions of the core types 8382 * @param library the library containing the definitions of the core types
7888 */ 8383 */
7889 void initializeFrom(LibraryElement library) { 8384 void initializeFrom(LibraryElement library) {
7890 Namespace namespace = new NamespaceBuilder().createPublicNamespace(library); 8385 Namespace namespace = new NamespaceBuilder().createPublicNamespace(library);
7891 _boolType = getType(namespace, "bool"); 8386 _boolType = getType(namespace, "bool");
7892 _bottomType = BottomTypeImpl.instance; 8387 _bottomType = BottomTypeImpl.instance;
7893 _doubleType = getType(namespace, "double"); 8388 _doubleType = getType(namespace, "double");
7894 _dynamicType = DynamicTypeImpl.instance; 8389 _dynamicType = DynamicTypeImpl.instance;
7895 _functionType = getType(namespace, "Function"); 8390 _functionType = getType(namespace, "Function");
7896 _intType = getType(namespace, "int"); 8391 _intType = getType(namespace, "int");
7897 _listType = getType(namespace, "List"); 8392 _listType = getType(namespace, "List");
7898 _mapType = getType(namespace, "Map"); 8393 _mapType = getType(namespace, "Map");
7899 _numType = getType(namespace, "num"); 8394 _numType = getType(namespace, "num");
7900 _objectType = getType(namespace, "Object"); 8395 _objectType = getType(namespace, "Object");
7901 _stackTraceType = getType(namespace, "StackTrace"); 8396 _stackTraceType = getType(namespace, "StackTrace");
7902 _stringType = getType(namespace, "String"); 8397 _stringType = getType(namespace, "String");
8398 _symbolType = getType(namespace, "Symbol");
7903 _typeType = getType(namespace, "Type"); 8399 _typeType = getType(namespace, "Type");
7904 } 8400 }
7905 } 8401 }
7906 /** 8402 /**
7907 * Instances of the class `TypeResolverVisitor` are used to resolve the types as sociated with 8403 * Instances of the class `TypeResolverVisitor` are used to resolve the types as sociated with
7908 * the elements in the element model. This includes the types of superclasses, m ixins, interfaces, 8404 * the elements in the element model. This includes the types of superclasses, m ixins, interfaces,
7909 * fields, methods, parameters, and local variables. As a side-effect, this also finishes building 8405 * fields, methods, parameters, and local variables. As a side-effect, this also finishes building
7910 * the type hierarchy. 8406 * the type hierarchy.
8407 *
7911 * @coverage dart.engine.resolver 8408 * @coverage dart.engine.resolver
7912 */ 8409 */
7913 class TypeResolverVisitor extends ScopedVisitor { 8410 class TypeResolverVisitor extends ScopedVisitor {
7914 8411
7915 /** 8412 /**
7916 * The type representing the type 'dynamic'. 8413 * The type representing the type 'dynamic'.
7917 */ 8414 */
7918 Type2 _dynamicType; 8415 Type2 _dynamicType;
7919 8416
7920 /** 8417 /**
7921 * The flag specifying if currently visited class references 'super' expressio n. 8418 * The flag specifying if currently visited class references 'super' expressio n.
7922 */ 8419 */
7923 bool _hasReferenceToSuper = false; 8420 bool _hasReferenceToSuper = false;
7924 8421
7925 /** 8422 /**
7926 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 8423 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
8424 *
7927 * @param library the library containing the compilation unit being resolved 8425 * @param library the library containing the compilation unit being resolved
7928 * @param source the source representing the compilation unit being visited 8426 * @param source the source representing the compilation unit being visited
7929 * @param typeProvider the object used to access the types from the core libra ry 8427 * @param typeProvider the object used to access the types from the core libra ry
7930 */ 8428 */
7931 TypeResolverVisitor.con1(Library library, Source source, TypeProvider typeProv ider) : super.con1(library, source, typeProvider) { 8429 TypeResolverVisitor.con1(Library library, Source source, TypeProvider typeProv ider) : super.con1(library, source, typeProvider) {
7932 _jtd_constructor_282_impl(library, source, typeProvider); 8430 _jtd_constructor_282_impl(library, source, typeProvider);
7933 } 8431 }
7934 _jtd_constructor_282_impl(Library library, Source source, TypeProvider typePro vider) { 8432 _jtd_constructor_282_impl(Library library, Source source, TypeProvider typePro vider) {
7935 _dynamicType = typeProvider.dynamicType; 8433 _dynamicType = typeProvider.dynamicType;
7936 } 8434 }
7937 8435
7938 /** 8436 /**
7939 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 8437 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
8438 *
7940 * @param definingLibrary the element for the library containing the compilati on unit being 8439 * @param definingLibrary the element for the library containing the compilati on unit being
7941 * visited 8440 * visited
7942 * @param source the source representing the compilation unit being visited 8441 * @param source the source representing the compilation unit being visited
7943 * @param typeProvider the object used to access the types from the core libra ry 8442 * @param typeProvider the object used to access the types from the core libra ry
7944 * @param errorListener the error listener that will be informed of any errors that are found 8443 * @param errorListener the error listener that will be informed of any errors that are found
7945 * during resolution 8444 * during resolution
7946 */ 8445 */
7947 TypeResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypePr ovider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingL ibrary, source, typeProvider, errorListener) { 8446 TypeResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypePr ovider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingL ibrary, source, typeProvider, errorListener) {
7948 _jtd_constructor_283_impl(definingLibrary, source, typeProvider, errorListen er); 8447 _jtd_constructor_283_impl(definingLibrary, source, typeProvider, errorListen er);
7949 } 8448 }
7950 _jtd_constructor_283_impl(LibraryElement definingLibrary, Source source, TypeP rovider typeProvider, AnalysisErrorListener errorListener) { 8449 _jtd_constructor_283_impl(LibraryElement definingLibrary, Source source, TypeP rovider typeProvider, AnalysisErrorListener errorListener) {
7951 _dynamicType = typeProvider.dynamicType; 8450 _dynamicType = typeProvider.dynamicType;
7952 } 8451 }
7953 Object visitCatchClause(CatchClause node) { 8452 Object visitCatchClause(CatchClause node) {
7954 super.visitCatchClause(node); 8453 super.visitCatchClause(node);
7955 SimpleIdentifier exception = node.exceptionParameter; 8454 SimpleIdentifier exception = node.exceptionParameter;
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
8169 if (argumentList != null) { 8668 if (argumentList != null) {
8170 } 8669 }
8171 typeName.staticType = voidType; 8670 typeName.staticType = voidType;
8172 node.type = voidType; 8671 node.type = voidType;
8173 return null; 8672 return null;
8174 } 8673 }
8175 ASTNode parent = node.parent; 8674 ASTNode parent = node.parent;
8176 if (typeName is PrefixedIdentifier && parent is ConstructorName && argumen tList == null) { 8675 if (typeName is PrefixedIdentifier && parent is ConstructorName && argumen tList == null) {
8177 ConstructorName name = parent as ConstructorName; 8676 ConstructorName name = parent as ConstructorName;
8178 if (name.name == null) { 8677 if (name.name == null) {
8179 SimpleIdentifier prefix = ((typeName as PrefixedIdentifier)).prefix; 8678 PrefixedIdentifier prefixedIdentifier = typeName as PrefixedIdentifier ;
8679 SimpleIdentifier prefix = prefixedIdentifier.prefix;
8180 element = nameScope.lookup(prefix, definingLibrary); 8680 element = nameScope.lookup(prefix, definingLibrary);
8181 if (element is PrefixElement) { 8681 if (element is PrefixElement) {
8682 if (parent.parent is InstanceCreationExpression && ((parent.parent a s InstanceCreationExpression)).isConst) {
8683 reportError(CompileTimeErrorCode.CONST_WITH_NON_TYPE, prefixedIden tifier.identifier, [prefixedIdentifier.identifier.name]);
8684 } else {
8685 reportError(StaticWarningCode.NEW_WITH_NON_TYPE, prefixedIdentifie r.identifier, [prefixedIdentifier.identifier.name]);
8686 }
8182 return null; 8687 return null;
8183 } else if (element != null) { 8688 } else if (element != null) {
8184 name.name = ((typeName as PrefixedIdentifier)).identifier; 8689 name.name = prefixedIdentifier.identifier;
8185 name.period = ((typeName as PrefixedIdentifier)).period; 8690 name.period = prefixedIdentifier.period;
8186 node.name = prefix; 8691 node.name = prefix;
8187 typeName = prefix; 8692 typeName = prefix;
8188 } 8693 }
8189 } 8694 }
8190 } 8695 }
8191 } 8696 }
8192 bool elementValid = element is! MultiplyDefinedElement; 8697 bool elementValid = element is! MultiplyDefinedElement;
8193 if (elementValid && element is! ClassElement && isTypeNameInInstanceCreation Expression(node)) { 8698 if (elementValid && element is! ClassElement && isTypeNameInInstanceCreation Expression(node)) {
8194 SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName); 8699 SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
8195 InstanceCreationExpression creation = node.parent.parent as InstanceCreati onExpression; 8700 InstanceCreationExpression creation = node.parent.parent as InstanceCreati onExpression;
(...skipping 16 matching lines...) Expand all
8212 if (typeNameSimple.name == "boolean") { 8717 if (typeNameSimple.name == "boolean") {
8213 reportError(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, [ ]); 8718 reportError(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, [ ]);
8214 } else if (isTypeNameInCatchClause(node)) { 8719 } else if (isTypeNameInCatchClause(node)) {
8215 reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeN ame.name]); 8720 reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeN ame.name]);
8216 } else if (isTypeNameInAsExpression(node)) { 8721 } else if (isTypeNameInAsExpression(node)) {
8217 reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name ]); 8722 reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name ]);
8218 } else if (isTypeNameInIsExpression(node)) { 8723 } else if (isTypeNameInIsExpression(node)) {
8219 reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.na me]); 8724 reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.na me]);
8220 } else if (isTypeNameTargetInRedirectedConstructor(node)) { 8725 } else if (isTypeNameTargetInRedirectedConstructor(node)) {
8221 reportError(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName .name]); 8726 reportError(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName .name]);
8727 } else if (isTypeNameInTypeArgumentList(node)) {
8728 reportError(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [ typeName.name]);
8222 } else { 8729 } else {
8223 reportError(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name] ); 8730 reportError(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name] );
8224 } 8731 }
8225 elementValid = false; 8732 elementValid = false;
8226 } 8733 }
8227 if (!elementValid) { 8734 if (!elementValid) {
8228 setElement(typeName, _dynamicType.element); 8735 setElement(typeName, _dynamicType.element);
8229 typeName.staticType = _dynamicType; 8736 typeName.staticType = _dynamicType;
8230 node.type = _dynamicType; 8737 node.type = _dynamicType;
8231 return null; 8738 return null;
(...skipping 16 matching lines...) Expand all
8248 if (type != null) { 8755 if (type != null) {
8249 node.type = type; 8756 node.type = type;
8250 } 8757 }
8251 } else { 8758 } else {
8252 if (isTypeNameInCatchClause(node)) { 8759 if (isTypeNameInCatchClause(node)) {
8253 reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeN ame.name]); 8760 reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeN ame.name]);
8254 } else if (isTypeNameInAsExpression(node)) { 8761 } else if (isTypeNameInAsExpression(node)) {
8255 reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name ]); 8762 reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name ]);
8256 } else if (isTypeNameInIsExpression(node)) { 8763 } else if (isTypeNameInIsExpression(node)) {
8257 reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.na me]); 8764 reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.na me]);
8765 } else if (isTypeNameTargetInRedirectedConstructor(node)) {
8766 reportError(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName .name]);
8767 } else if (isTypeNameInTypeArgumentList(node)) {
8768 reportError(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [ typeName.name]);
8258 } else { 8769 } else {
8259 ASTNode parent = typeName.parent; 8770 ASTNode parent = typeName.parent;
8260 while (parent is TypeName) { 8771 while (parent is TypeName) {
8261 parent = parent.parent; 8772 parent = parent.parent;
8262 } 8773 }
8263 if (parent is ExtendsClause || parent is ImplementsClause || parent is W ithClause || parent is ClassTypeAlias) { 8774 if (parent is ExtendsClause || parent is ImplementsClause || parent is W ithClause || parent is ClassTypeAlias) {
8264 } else { 8775 } else {
8265 reportError(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]); 8776 reportError(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
8266 } 8777 }
8267 } 8778 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
8350 } 8861 }
8351 } 8862 }
8352 } else { 8863 } else {
8353 } 8864 }
8354 return null; 8865 return null;
8355 } 8866 }
8356 8867
8357 /** 8868 /**
8358 * Given a type name representing the return type of a function, compute the r eturn type of the 8869 * Given a type name representing the return type of a function, compute the r eturn type of the
8359 * function. 8870 * function.
8871 *
8360 * @param returnType the type name representing the return type of the functio n 8872 * @param returnType the type name representing the return type of the functio n
8361 * @return the return type that was computed 8873 * @return the return type that was computed
8362 */ 8874 */
8363 Type2 computeReturnType(TypeName returnType) { 8875 Type2 computeReturnType(TypeName returnType) {
8364 if (returnType == null) { 8876 if (returnType == null) {
8365 return _dynamicType; 8877 return _dynamicType;
8366 } else { 8878 } else {
8367 return returnType.type; 8879 return returnType.type;
8368 } 8880 }
8369 } 8881 }
8370 8882
8371 /** 8883 /**
8372 * Return the class element that represents the class whose name was provided. 8884 * Return the class element that represents the class whose name was provided.
8885 *
8373 * @param identifier the name from the declaration of a class 8886 * @param identifier the name from the declaration of a class
8374 * @return the class element that represents the class 8887 * @return the class element that represents the class
8375 */ 8888 */
8376 ClassElementImpl getClassElement(SimpleIdentifier identifier) { 8889 ClassElementImpl getClassElement(SimpleIdentifier identifier) {
8377 if (identifier == null) { 8890 if (identifier == null) {
8378 return null; 8891 return null;
8379 } 8892 }
8380 Element element = identifier.element; 8893 Element element = identifier.element;
8381 if (element is! ClassElementImpl) { 8894 if (element is! ClassElementImpl) {
8382 return null; 8895 return null;
8383 } 8896 }
8384 return element as ClassElementImpl; 8897 return element as ClassElementImpl;
8385 } 8898 }
8386 8899
8387 /** 8900 /**
8388 * Return an array containing all of the elements associated with the paramete rs in the given 8901 * Return an array containing all of the elements associated with the paramete rs in the given
8389 * list. 8902 * list.
8903 *
8390 * @param parameterList the list of parameters whose elements are to be return ed 8904 * @param parameterList the list of parameters whose elements are to be return ed
8391 * @return the elements associated with the parameters 8905 * @return the elements associated with the parameters
8392 */ 8906 */
8393 List<ParameterElement> getElements(FormalParameterList parameterList) { 8907 List<ParameterElement> getElements(FormalParameterList parameterList) {
8394 List<ParameterElement> elements = new List<ParameterElement>(); 8908 List<ParameterElement> elements = new List<ParameterElement>();
8395 for (FormalParameter parameter in parameterList.parameters) { 8909 for (FormalParameter parameter in parameterList.parameters) {
8396 ParameterElement element = parameter.identifier.element as ParameterElemen t; 8910 ParameterElement element = parameter.identifier.element as ParameterElemen t;
8397 if (element != null) { 8911 if (element != null) {
8398 elements.add(element); 8912 elements.add(element);
8399 } 8913 }
8400 } 8914 }
8401 return new List.from(elements); 8915 return new List.from(elements);
8402 } 8916 }
8403 8917
8404 /** 8918 /**
8405 * The number of type arguments in the given type name does not match the numb er of parameters in 8919 * The number of type arguments in the given type name does not match the numb er of parameters in
8406 * the corresponding class element. Return the error code that should be used to report this 8920 * the corresponding class element. Return the error code that should be used to report this
8407 * error. 8921 * error.
8922 *
8408 * @param node the type name with the wrong number of type arguments 8923 * @param node the type name with the wrong number of type arguments
8409 * @return the error code that should be used to report that the wrong number of type arguments 8924 * @return the error code that should be used to report that the wrong number of type arguments
8410 * were provided 8925 * were provided
8411 */ 8926 */
8412 ErrorCode getInvalidTypeParametersErrorCode(TypeName node) { 8927 ErrorCode getInvalidTypeParametersErrorCode(TypeName node) {
8413 ASTNode parent = node.parent; 8928 ASTNode parent = node.parent;
8414 if (parent is ConstructorName) { 8929 if (parent is ConstructorName) {
8415 parent = parent.parent; 8930 parent = parent.parent;
8416 if (parent is InstanceCreationExpression) { 8931 if (parent is InstanceCreationExpression) {
8417 if (((parent as InstanceCreationExpression)).isConst) { 8932 if (((parent as InstanceCreationExpression)).isConst) {
8418 return CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS; 8933 return CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS;
8419 } else { 8934 } else {
8420 return CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS; 8935 return CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS;
8421 } 8936 }
8422 } 8937 }
8423 } 8938 }
8424 return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS; 8939 return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
8425 } 8940 }
8426 8941
8427 /** 8942 /**
8428 * Given the multiple elements to which a single name could potentially be res olved, return the 8943 * Given the multiple elements to which a single name could potentially be res olved, return the
8429 * single interface type that should be used, or `null` if there is no clear c hoice. 8944 * single interface type that should be used, or `null` if there is no clear c hoice.
8945 *
8430 * @param elements the elements to which a single name could potentially be re solved 8946 * @param elements the elements to which a single name could potentially be re solved
8431 * @return the single interface type that should be used for the type name 8947 * @return the single interface type that should be used for the type name
8432 */ 8948 */
8433 InterfaceType getType(List<Element> elements) { 8949 InterfaceType getType(List<Element> elements) {
8434 InterfaceType type = null; 8950 InterfaceType type = null;
8435 for (Element element in elements) { 8951 for (Element element in elements) {
8436 if (element is ClassElement) { 8952 if (element is ClassElement) {
8437 if (type != null) { 8953 if (type != null) {
8438 return null; 8954 return null;
8439 } 8955 }
8440 type = ((element as ClassElement)).type; 8956 type = ((element as ClassElement)).type;
8441 } 8957 }
8442 } 8958 }
8443 return type; 8959 return type;
8444 } 8960 }
8445 8961
8446 /** 8962 /**
8447 * Return the type represented by the given type name. 8963 * Return the type represented by the given type name.
8964 *
8448 * @param typeName the type name representing the type to be returned 8965 * @param typeName the type name representing the type to be returned
8449 * @return the type represented by the type name 8966 * @return the type represented by the type name
8450 */ 8967 */
8451 Type2 getType3(TypeName typeName) { 8968 Type2 getType3(TypeName typeName) {
8452 Type2 type = typeName.type; 8969 Type2 type = typeName.type;
8453 if (type == null) { 8970 if (type == null) {
8454 return _dynamicType; 8971 return _dynamicType;
8455 } 8972 }
8456 return type; 8973 return type;
8457 } 8974 }
8458 8975
8459 /** 8976 /**
8460 * Return the type arguments associated with the given type. 8977 * Return the type arguments associated with the given type.
8978 *
8461 * @param type the type whole type arguments are to be returned 8979 * @param type the type whole type arguments are to be returned
8462 * @return the type arguments associated with the given type 8980 * @return the type arguments associated with the given type
8463 */ 8981 */
8464 List<Type2> getTypeArguments(Type2 type) { 8982 List<Type2> getTypeArguments(Type2 type) {
8465 if (type is InterfaceType) { 8983 if (type is InterfaceType) {
8466 return ((type as InterfaceType)).typeArguments; 8984 return ((type as InterfaceType)).typeArguments;
8467 } else if (type is FunctionType) { 8985 } else if (type is FunctionType) {
8468 return ((type as FunctionType)).typeArguments; 8986 return ((type as FunctionType)).typeArguments;
8469 } 8987 }
8470 return TypeImpl.EMPTY_ARRAY; 8988 return TypeImpl.EMPTY_ARRAY;
8471 } 8989 }
8472 8990
8473 /** 8991 /**
8474 * Returns the simple identifier of the given (may be qualified) type name. 8992 * Returns the simple identifier of the given (may be qualified) type name.
8993 *
8475 * @param typeName the (may be qualified) qualified type name 8994 * @param typeName the (may be qualified) qualified type name
8476 * @return the simple identifier of the given (may be qualified) type name. 8995 * @return the simple identifier of the given (may be qualified) type name.
8477 */ 8996 */
8478 SimpleIdentifier getTypeSimpleIdentifier(Identifier typeName) { 8997 SimpleIdentifier getTypeSimpleIdentifier(Identifier typeName) {
8479 if (typeName is SimpleIdentifier) { 8998 if (typeName is SimpleIdentifier) {
8480 return typeName as SimpleIdentifier; 8999 return typeName as SimpleIdentifier;
8481 } else { 9000 } else {
8482 return ((typeName as PrefixedIdentifier)).identifier; 9001 return ((typeName as PrefixedIdentifier)).identifier;
8483 } 9002 }
8484 } 9003 }
8485 9004
8486 /** 9005 /**
8487 * Checks if the given type name is used as the type in an as expression. 9006 * Checks if the given type name is used as the type in an as expression.
9007 *
8488 * @param typeName the type name to analyzer 9008 * @param typeName the type name to analyzer
8489 * @return `true` if the given type name is used as the type in an as expressi on 9009 * @return `true` if the given type name is used as the type in an as expressi on
8490 */ 9010 */
8491 bool isTypeNameInAsExpression(TypeName typeName) { 9011 bool isTypeNameInAsExpression(TypeName typeName) {
8492 ASTNode parent = typeName.parent; 9012 ASTNode parent = typeName.parent;
8493 if (parent is AsExpression) { 9013 if (parent is AsExpression) {
8494 AsExpression asExpression = parent as AsExpression; 9014 AsExpression asExpression = parent as AsExpression;
8495 return identical(asExpression.type, typeName); 9015 return identical(asExpression.type, typeName);
8496 } 9016 }
8497 return false; 9017 return false;
8498 } 9018 }
8499 9019
8500 /** 9020 /**
8501 * Checks if the given type name is used as the exception type in a catch clau se. 9021 * Checks if the given type name is used as the exception type in a catch clau se.
9022 *
8502 * @param typeName the type name to analyzer 9023 * @param typeName the type name to analyzer
8503 * @return `true` if the given type name is used as the exception type in a ca tch clause 9024 * @return `true` if the given type name is used as the exception type in a ca tch clause
8504 */ 9025 */
8505 bool isTypeNameInCatchClause(TypeName typeName) { 9026 bool isTypeNameInCatchClause(TypeName typeName) {
8506 ASTNode parent = typeName.parent; 9027 ASTNode parent = typeName.parent;
8507 if (parent is CatchClause) { 9028 if (parent is CatchClause) {
8508 CatchClause catchClause = parent as CatchClause; 9029 CatchClause catchClause = parent as CatchClause;
8509 return identical(catchClause.exceptionType, typeName); 9030 return identical(catchClause.exceptionType, typeName);
8510 } 9031 }
8511 return false; 9032 return false;
8512 } 9033 }
8513 9034
8514 /** 9035 /**
8515 * Checks if the given type name is used as the type in an instance creation e xpression. 9036 * Checks if the given type name is used as the type in an instance creation e xpression.
9037 *
8516 * @param typeName the type name to analyzer 9038 * @param typeName the type name to analyzer
8517 * @return `true` if the given type name is used as the type in an instance cr eation 9039 * @return `true` if the given type name is used as the type in an instance cr eation
8518 * expression 9040 * expression
8519 */ 9041 */
8520 bool isTypeNameInInstanceCreationExpression(TypeName typeName) { 9042 bool isTypeNameInInstanceCreationExpression(TypeName typeName) {
8521 ASTNode parent = typeName.parent; 9043 ASTNode parent = typeName.parent;
8522 if (parent is ConstructorName && parent.parent is InstanceCreationExpression ) { 9044 if (parent is ConstructorName && parent.parent is InstanceCreationExpression ) {
8523 ConstructorName constructorName = parent as ConstructorName; 9045 ConstructorName constructorName = parent as ConstructorName;
8524 return constructorName != null && identical(constructorName.type, typeName ); 9046 return constructorName != null && identical(constructorName.type, typeName );
8525 } 9047 }
8526 return false; 9048 return false;
8527 } 9049 }
8528 9050
8529 /** 9051 /**
8530 * Checks if the given type name is used as the type in an is expression. 9052 * Checks if the given type name is used as the type in an is expression.
9053 *
8531 * @param typeName the type name to analyzer 9054 * @param typeName the type name to analyzer
8532 * @return `true` if the given type name is used as the type in an is expressi on 9055 * @return `true` if the given type name is used as the type in an is expressi on
8533 */ 9056 */
8534 bool isTypeNameInIsExpression(TypeName typeName) { 9057 bool isTypeNameInIsExpression(TypeName typeName) {
8535 ASTNode parent = typeName.parent; 9058 ASTNode parent = typeName.parent;
8536 if (parent is IsExpression) { 9059 if (parent is IsExpression) {
8537 IsExpression isExpression = parent as IsExpression; 9060 IsExpression isExpression = parent as IsExpression;
8538 return identical(isExpression.type, typeName); 9061 return identical(isExpression.type, typeName);
8539 } 9062 }
8540 return false; 9063 return false;
8541 } 9064 }
8542 9065
8543 /** 9066 /**
9067 * Checks if the given type name used in a type argument list.
9068 *
9069 * @param typeName the type name to analyzer
9070 * @return `true` if the given type name is in a type argument list
9071 */
9072 bool isTypeNameInTypeArgumentList(TypeName typeName) => typeName.parent is Typ eArgumentList;
9073
9074 /**
8544 * Checks if the given type name is the target in a redirected constructor. 9075 * Checks if the given type name is the target in a redirected constructor.
9076 *
8545 * @param typeName the type name to analyzer 9077 * @param typeName the type name to analyzer
8546 * @return `true` if the given type name is used as the type in a redirected c onstructor 9078 * @return `true` if the given type name is used as the type in a redirected c onstructor
8547 */ 9079 */
8548 bool isTypeNameTargetInRedirectedConstructor(TypeName typeName) { 9080 bool isTypeNameTargetInRedirectedConstructor(TypeName typeName) {
8549 ASTNode parent = typeName.parent; 9081 ASTNode parent = typeName.parent;
8550 if (parent is ConstructorName) { 9082 if (parent is ConstructorName) {
8551 ConstructorName constructorName = parent as ConstructorName; 9083 ConstructorName constructorName = parent as ConstructorName;
8552 parent = constructorName.parent; 9084 parent = constructorName.parent;
8553 if (parent is ConstructorDeclaration) { 9085 if (parent is ConstructorDeclaration) {
8554 ConstructorDeclaration constructorDeclaration = parent as ConstructorDec laration; 9086 ConstructorDeclaration constructorDeclaration = parent as ConstructorDec laration;
8555 return constructorName == constructorDeclaration.redirectedConstructor; 9087 return constructorName == constructorDeclaration.redirectedConstructor;
8556 } 9088 }
8557 } 9089 }
8558 return false; 9090 return false;
8559 } 9091 }
8560 9092
8561 /** 9093 /**
8562 * Record that the static type of the given node is the given type. 9094 * Record that the static type of the given node is the given type.
9095 *
8563 * @param expression the node whose type is to be recorded 9096 * @param expression the node whose type is to be recorded
8564 * @param type the static type of the node 9097 * @param type the static type of the node
8565 */ 9098 */
8566 Object recordType(Expression expression, Type2 type) { 9099 Object recordType(Expression expression, Type2 type) {
8567 if (type == null) { 9100 if (type == null) {
8568 expression.staticType = _dynamicType; 9101 expression.staticType = _dynamicType;
8569 } else { 9102 } else {
8570 expression.staticType = type; 9103 expression.staticType = type;
8571 } 9104 }
8572 return null; 9105 return null;
8573 } 9106 }
8574 9107
8575 /** 9108 /**
8576 * Resolve the types in the given with and implements clauses and associate th ose types with the 9109 * Resolve the types in the given with and implements clauses and associate th ose types with the
8577 * given class element. 9110 * given class element.
9111 *
8578 * @param classElement the class element with which the mixin and interface ty pes are to be 9112 * @param classElement the class element with which the mixin and interface ty pes are to be
8579 * associated 9113 * associated
8580 * @param withClause the with clause to be resolved 9114 * @param withClause the with clause to be resolved
8581 * @param implementsClause the implements clause to be resolved 9115 * @param implementsClause the implements clause to be resolved
8582 */ 9116 */
8583 void resolve(ClassElementImpl classElement, WithClause withClause, ImplementsC lause implementsClause) { 9117 void resolve(ClassElementImpl classElement, WithClause withClause, ImplementsC lause implementsClause) {
8584 if (withClause != null) { 9118 if (withClause != null) {
8585 List<InterfaceType> mixinTypes = resolveTypes(withClause.mixinTypes, Compi leTimeErrorCode.MIXIN_OF_NON_CLASS); 9119 List<InterfaceType> mixinTypes = resolveTypes(withClause.mixinTypes, Compi leTimeErrorCode.MIXIN_OF_NON_CLASS);
8586 if (classElement != null) { 9120 if (classElement != null) {
8587 classElement.mixins = mixinTypes; 9121 classElement.mixins = mixinTypes;
8588 } 9122 }
8589 } 9123 }
(...skipping 27 matching lines...) Expand all
8617 } 9151 }
8618 } 9152 }
8619 if (classElement != null) { 9153 if (classElement != null) {
8620 classElement.interfaces = interfaceTypes; 9154 classElement.interfaces = interfaceTypes;
8621 } 9155 }
8622 } 9156 }
8623 } 9157 }
8624 9158
8625 /** 9159 /**
8626 * Return the type specified by the given name. 9160 * Return the type specified by the given name.
9161 *
8627 * @param typeName the type name specifying the type to be returned 9162 * @param typeName the type name specifying the type to be returned
8628 * @param nonTypeError the error to produce if the type name is defined to be something other than 9163 * @param nonTypeError the error to produce if the type name is defined to be something other than
8629 * a type 9164 * a type
8630 * @return the type specified by the type name 9165 * @return the type specified by the type name
8631 */ 9166 */
8632 InterfaceType resolveType(TypeName typeName, ErrorCode nonTypeError) { 9167 InterfaceType resolveType(TypeName typeName, ErrorCode nonTypeError) {
8633 Type2 type = typeName.type; 9168 Type2 type = typeName.type;
8634 if (type is InterfaceType) { 9169 if (type is InterfaceType) {
8635 return type as InterfaceType; 9170 return type as InterfaceType;
8636 } 9171 }
8637 Identifier name = typeName.name; 9172 Identifier name = typeName.name;
8638 if (name.name != sc.Keyword.DYNAMIC.syntax) { 9173 if (name.name != sc.Keyword.DYNAMIC.syntax) {
8639 reportError(nonTypeError, name, [name.name]); 9174 reportError(nonTypeError, name, [name.name]);
8640 } 9175 }
8641 return null; 9176 return null;
8642 } 9177 }
8643 9178
8644 /** 9179 /**
8645 * Resolve the types in the given list of type names. 9180 * Resolve the types in the given list of type names.
9181 *
8646 * @param typeNames the type names to be resolved 9182 * @param typeNames the type names to be resolved
8647 * @param nonTypeError the error to produce if the type name is defined to be something other than 9183 * @param nonTypeError the error to produce if the type name is defined to be something other than
8648 * a type 9184 * a type
8649 * @return an array containing all of the types that were resolved. 9185 * @return an array containing all of the types that were resolved.
8650 */ 9186 */
8651 List<InterfaceType> resolveTypes(NodeList<TypeName> typeNames, ErrorCode nonTy peError) { 9187 List<InterfaceType> resolveTypes(NodeList<TypeName> typeNames, ErrorCode nonTy peError) {
8652 List<InterfaceType> types = new List<InterfaceType>(); 9188 List<InterfaceType> types = new List<InterfaceType>();
8653 for (TypeName typeName in typeNames) { 9189 for (TypeName typeName in typeNames) {
8654 InterfaceType type = resolveType(typeName, nonTypeError); 9190 InterfaceType type = resolveType(typeName, nonTypeError);
8655 if (type != null) { 9191 if (type != null) {
8656 types.add(type); 9192 types.add(type);
8657 } 9193 }
8658 } 9194 }
(...skipping 14 matching lines...) Expand all
8673 prefix.staticElement = prefixElement; 9209 prefix.staticElement = prefixElement;
8674 prefix.element = prefixElement; 9210 prefix.element = prefixElement;
8675 } 9211 }
8676 } 9212 }
8677 } 9213 }
8678 } 9214 }
8679 9215
8680 /** 9216 /**
8681 * Set the return type and parameter type information for the given function t ype based on the 9217 * Set the return type and parameter type information for the given function t ype based on the
8682 * given return type and parameter elements. 9218 * given return type and parameter elements.
9219 *
8683 * @param functionType the function type to be filled in 9220 * @param functionType the function type to be filled in
8684 * @param parameters the elements representing the parameters to the function 9221 * @param parameters the elements representing the parameters to the function
8685 */ 9222 */
8686 void setTypeInformation(FunctionTypeImpl functionType, List<ParameterElement> parameters) { 9223 void setTypeInformation(FunctionTypeImpl functionType, List<ParameterElement> parameters) {
8687 List<Type2> normalParameterTypes = new List<Type2>(); 9224 List<Type2> normalParameterTypes = new List<Type2>();
8688 List<Type2> optionalParameterTypes = new List<Type2>(); 9225 List<Type2> optionalParameterTypes = new List<Type2>();
8689 LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>(); 9226 LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>();
8690 for (ParameterElement parameter in parameters) { 9227 for (ParameterElement parameter in parameters) {
8691 while (true) { 9228 while (true) {
8692 if (parameter.parameterKind == ParameterKind.REQUIRED) { 9229 if (parameter.parameterKind == ParameterKind.REQUIRED) {
(...skipping 12 matching lines...) Expand all
8705 if (!optionalParameterTypes.isEmpty) { 9242 if (!optionalParameterTypes.isEmpty) {
8706 functionType.optionalParameterTypes = new List.from(optionalParameterTypes ); 9243 functionType.optionalParameterTypes = new List.from(optionalParameterTypes );
8707 } 9244 }
8708 if (!namedParameterTypes.isEmpty) { 9245 if (!namedParameterTypes.isEmpty) {
8709 functionType.namedParameterTypes = namedParameterTypes; 9246 functionType.namedParameterTypes = namedParameterTypes;
8710 } 9247 }
8711 } 9248 }
8712 } 9249 }
8713 /** 9250 /**
8714 * Instances of the class `ClassScope` implement the scope defined by a class. 9251 * Instances of the class `ClassScope` implement the scope defined by a class.
9252 *
8715 * @coverage dart.engine.resolver 9253 * @coverage dart.engine.resolver
8716 */ 9254 */
8717 class ClassScope extends EnclosedScope { 9255 class ClassScope extends EnclosedScope {
8718 9256
8719 /** 9257 /**
8720 * Initialize a newly created scope enclosed within another scope. 9258 * Initialize a newly created scope enclosed within another scope.
9259 *
8721 * @param enclosingScope the scope in which this scope is lexically enclosed 9260 * @param enclosingScope the scope in which this scope is lexically enclosed
8722 * @param typeElement the element representing the type represented by this sc ope 9261 * @param typeElement the element representing the type represented by this sc ope
8723 */ 9262 */
8724 ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new Enclose dScope(enclosingScope)) { 9263 ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new Enclose dScope(enclosingScope)) {
8725 defineTypeParameters(typeElement); 9264 defineTypeParameters(typeElement);
8726 defineMembers(typeElement); 9265 defineMembers(typeElement);
8727 } 9266 }
8728 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { 9267 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
8729 if (existing is PropertyAccessorElement && duplicate is MethodElement) { 9268 if (existing is PropertyAccessorElement && duplicate is MethodElement) {
8730 if (existing.nameOffset < duplicate.nameOffset) { 9269 if (existing.nameOffset < duplicate.nameOffset) {
8731 return new AnalysisError.con2(duplicate.source, duplicate.nameOffset, du plicate.displayName.length, CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAM E, [existing.displayName]); 9270 return new AnalysisError.con2(duplicate.source, duplicate.nameOffset, du plicate.displayName.length, CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAM E, [existing.displayName]);
8732 } else { 9271 } else {
8733 return new AnalysisError.con2(existing.source, existing.nameOffset, exis ting.displayName.length, CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME, [existing.displayName]); 9272 return new AnalysisError.con2(existing.source, existing.nameOffset, exis ting.displayName.length, CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME, [existing.displayName]);
8734 } 9273 }
8735 } 9274 }
8736 return super.getErrorForDuplicate(existing, duplicate); 9275 return super.getErrorForDuplicate(existing, duplicate);
8737 } 9276 }
8738 9277
8739 /** 9278 /**
8740 * Define the instance members defined by the class. 9279 * Define the instance members defined by the class.
9280 *
8741 * @param typeElement the element representing the type represented by this sc ope 9281 * @param typeElement the element representing the type represented by this sc ope
8742 */ 9282 */
8743 void defineMembers(ClassElement typeElement) { 9283 void defineMembers(ClassElement typeElement) {
8744 for (PropertyAccessorElement accessor in typeElement.accessors) { 9284 for (PropertyAccessorElement accessor in typeElement.accessors) {
8745 define(accessor); 9285 define(accessor);
8746 } 9286 }
8747 for (MethodElement method in typeElement.methods) { 9287 for (MethodElement method in typeElement.methods) {
8748 define(method); 9288 define(method);
8749 } 9289 }
8750 } 9290 }
8751 9291
8752 /** 9292 /**
8753 * Define the type parameters for the class. 9293 * Define the type parameters for the class.
9294 *
8754 * @param typeElement the element representing the type represented by this sc ope 9295 * @param typeElement the element representing the type represented by this sc ope
8755 */ 9296 */
8756 void defineTypeParameters(ClassElement typeElement) { 9297 void defineTypeParameters(ClassElement typeElement) {
8757 Scope parameterScope = enclosingScope; 9298 Scope parameterScope = enclosingScope;
8758 for (TypeVariableElement parameter in typeElement.typeVariables) { 9299 for (TypeVariableElement parameter in typeElement.typeVariables) {
8759 parameterScope.define(parameter); 9300 parameterScope.define(parameter);
8760 } 9301 }
8761 } 9302 }
8762 } 9303 }
8763 /** 9304 /**
8764 * Instances of the class `EnclosedScope` implement a scope that is lexically en closed in 9305 * Instances of the class `EnclosedScope` implement a scope that is lexically en closed in
8765 * another scope. 9306 * another scope.
9307 *
8766 * @coverage dart.engine.resolver 9308 * @coverage dart.engine.resolver
8767 */ 9309 */
8768 class EnclosedScope extends Scope { 9310 class EnclosedScope extends Scope {
8769 9311
8770 /** 9312 /**
8771 * The scope in which this scope is lexically enclosed. 9313 * The scope in which this scope is lexically enclosed.
8772 */ 9314 */
8773 Scope _enclosingScope; 9315 Scope _enclosingScope;
8774 9316
8775 /** 9317 /**
8776 * Initialize a newly created scope enclosed within another scope. 9318 * Initialize a newly created scope enclosed within another scope.
9319 *
8777 * @param enclosingScope the scope in which this scope is lexically enclosed 9320 * @param enclosingScope the scope in which this scope is lexically enclosed
8778 */ 9321 */
8779 EnclosedScope(Scope enclosingScope) { 9322 EnclosedScope(Scope enclosingScope) {
8780 this._enclosingScope = enclosingScope; 9323 this._enclosingScope = enclosingScope;
8781 } 9324 }
8782 LibraryElement get definingLibrary => _enclosingScope.definingLibrary; 9325 LibraryElement get definingLibrary => _enclosingScope.definingLibrary;
8783 AnalysisErrorListener get errorListener => _enclosingScope.errorListener; 9326 AnalysisErrorListener get errorListener => _enclosingScope.errorListener;
8784 9327
8785 /** 9328 /**
8786 * Return the scope in which this scope is lexically enclosed. 9329 * Return the scope in which this scope is lexically enclosed.
9330 *
8787 * @return the scope in which this scope is lexically enclosed 9331 * @return the scope in which this scope is lexically enclosed
8788 */ 9332 */
8789 Scope get enclosingScope => _enclosingScope; 9333 Scope get enclosingScope => _enclosingScope;
8790 Element lookup3(Identifier identifier, String name, LibraryElement referencing Library) { 9334 Element lookup3(Identifier identifier, String name, LibraryElement referencing Library) {
8791 Element element = localLookup(name, referencingLibrary); 9335 Element element = localLookup(name, referencingLibrary);
8792 if (element != null) { 9336 if (element != null) {
8793 return element; 9337 return element;
8794 } 9338 }
8795 return _enclosingScope.lookup3(identifier, name, referencingLibrary); 9339 return _enclosingScope.lookup3(identifier, name, referencingLibrary);
8796 } 9340 }
8797 } 9341 }
8798 /** 9342 /**
8799 * Instances of the class `FunctionScope` implement the scope defined by a funct ion. 9343 * Instances of the class `FunctionScope` implement the scope defined by a funct ion.
9344 *
8800 * @coverage dart.engine.resolver 9345 * @coverage dart.engine.resolver
8801 */ 9346 */
8802 class FunctionScope extends EnclosedScope { 9347 class FunctionScope extends EnclosedScope {
8803 9348
8804 /** 9349 /**
8805 * Initialize a newly created scope enclosed within another scope. 9350 * Initialize a newly created scope enclosed within another scope.
9351 *
8806 * @param enclosingScope the scope in which this scope is lexically enclosed 9352 * @param enclosingScope the scope in which this scope is lexically enclosed
8807 * @param functionElement the element representing the type represented by thi s scope 9353 * @param functionElement the element representing the type represented by thi s scope
8808 */ 9354 */
8809 FunctionScope(Scope enclosingScope, ExecutableElement functionElement) : super (new EnclosedScope(enclosingScope)) { 9355 FunctionScope(Scope enclosingScope, ExecutableElement functionElement) : super (new EnclosedScope(enclosingScope)) {
8810 defineParameters(functionElement); 9356 defineParameters(functionElement);
8811 } 9357 }
8812 9358
8813 /** 9359 /**
8814 * Define the parameters for the given function in the scope that encloses thi s function. 9360 * Define the parameters for the given function in the scope that encloses thi s function.
9361 *
8815 * @param functionElement the element representing the function represented by this scope 9362 * @param functionElement the element representing the function represented by this scope
8816 */ 9363 */
8817 void defineParameters(ExecutableElement functionElement) { 9364 void defineParameters(ExecutableElement functionElement) {
8818 Scope parameterScope = enclosingScope; 9365 Scope parameterScope = enclosingScope;
8819 if (functionElement.enclosingElement is ExecutableElement) { 9366 if (functionElement.enclosingElement is ExecutableElement) {
8820 String name = functionElement.name; 9367 String name = functionElement.name;
8821 if (name != null && !name.isEmpty) { 9368 if (name != null && !name.isEmpty) {
8822 parameterScope.define(functionElement); 9369 parameterScope.define(functionElement);
8823 } 9370 }
8824 } 9371 }
8825 for (ParameterElement parameter in functionElement.parameters) { 9372 for (ParameterElement parameter in functionElement.parameters) {
8826 if (!parameter.isInitializingFormal) { 9373 if (!parameter.isInitializingFormal) {
8827 parameterScope.define(parameter); 9374 parameterScope.define(parameter);
8828 } 9375 }
8829 } 9376 }
8830 } 9377 }
8831 } 9378 }
8832 /** 9379 /**
8833 * Instances of the class `FunctionTypeScope` implement the scope defined by a f unction type 9380 * Instances of the class `FunctionTypeScope` implement the scope defined by a f unction type
8834 * alias. 9381 * alias.
9382 *
8835 * @coverage dart.engine.resolver 9383 * @coverage dart.engine.resolver
8836 */ 9384 */
8837 class FunctionTypeScope extends EnclosedScope { 9385 class FunctionTypeScope extends EnclosedScope {
8838 9386
8839 /** 9387 /**
8840 * Initialize a newly created scope enclosed within another scope. 9388 * Initialize a newly created scope enclosed within another scope.
9389 *
8841 * @param enclosingScope the scope in which this scope is lexically enclosed 9390 * @param enclosingScope the scope in which this scope is lexically enclosed
8842 * @param typeElement the element representing the type alias represented by t his scope 9391 * @param typeElement the element representing the type alias represented by t his scope
8843 */ 9392 */
8844 FunctionTypeScope(Scope enclosingScope, FunctionTypeAliasElement typeElement) : super(new EnclosedScope(enclosingScope)) { 9393 FunctionTypeScope(Scope enclosingScope, FunctionTypeAliasElement typeElement) : super(new EnclosedScope(enclosingScope)) {
8845 defineTypeVariables(typeElement); 9394 defineTypeVariables(typeElement);
8846 defineParameters(typeElement); 9395 defineParameters(typeElement);
8847 } 9396 }
8848 9397
8849 /** 9398 /**
8850 * Define the parameters for the function type alias. 9399 * Define the parameters for the function type alias.
9400 *
8851 * @param typeElement the element representing the type represented by this sc ope 9401 * @param typeElement the element representing the type represented by this sc ope
8852 */ 9402 */
8853 void defineParameters(FunctionTypeAliasElement typeElement) { 9403 void defineParameters(FunctionTypeAliasElement typeElement) {
8854 for (ParameterElement parameter in typeElement.parameters) { 9404 for (ParameterElement parameter in typeElement.parameters) {
8855 define(parameter); 9405 define(parameter);
8856 } 9406 }
8857 } 9407 }
8858 9408
8859 /** 9409 /**
8860 * Define the type variables for the function type alias. 9410 * Define the type variables for the function type alias.
9411 *
8861 * @param typeElement the element representing the type represented by this sc ope 9412 * @param typeElement the element representing the type represented by this sc ope
8862 */ 9413 */
8863 void defineTypeVariables(FunctionTypeAliasElement typeElement) { 9414 void defineTypeVariables(FunctionTypeAliasElement typeElement) {
8864 Scope typeVariableScope = enclosingScope; 9415 Scope typeVariableScope = enclosingScope;
8865 for (TypeVariableElement typeVariable in typeElement.typeVariables) { 9416 for (TypeVariableElement typeVariable in typeElement.typeVariables) {
8866 typeVariableScope.define(typeVariable); 9417 typeVariableScope.define(typeVariable);
8867 } 9418 }
8868 } 9419 }
8869 } 9420 }
8870 /** 9421 /**
8871 * Instances of the class `LabelScope` represent a scope in which a single label is defined. 9422 * Instances of the class `LabelScope` represent a scope in which a single label is defined.
9423 *
8872 * @coverage dart.engine.resolver 9424 * @coverage dart.engine.resolver
8873 */ 9425 */
8874 class LabelScope { 9426 class LabelScope {
8875 9427
8876 /** 9428 /**
8877 * The label scope enclosing this label scope. 9429 * The label scope enclosing this label scope.
8878 */ 9430 */
8879 LabelScope _outerScope; 9431 LabelScope _outerScope;
8880 9432
8881 /** 9433 /**
8882 * The label defined in this scope. 9434 * The label defined in this scope.
8883 */ 9435 */
8884 String _label; 9436 String _label;
8885 9437
8886 /** 9438 /**
8887 * The element to which the label resolves. 9439 * The element to which the label resolves.
8888 */ 9440 */
8889 LabelElement _element; 9441 LabelElement _element;
8890 9442
8891 /** 9443 /**
8892 * The marker used to look up a label element for an unlabeled `break` or `con tinue`. 9444 * The marker used to look up a label element for an unlabeled `break` or `con tinue`.
8893 */ 9445 */
8894 static String EMPTY_LABEL = ""; 9446 static String EMPTY_LABEL = "";
8895 9447
8896 /** 9448 /**
8897 * The label element returned for scopes that can be the target of an unlabele d `break` or`continue`. 9449 * The label element returned for scopes that can be the target of an unlabele d `break` or
9450 * `continue`.
8898 */ 9451 */
8899 static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier.full(ne w sc.StringToken(sc.TokenType.IDENTIFIER, "", 0)); 9452 static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier.full(ne w sc.StringToken(sc.TokenType.IDENTIFIER, "", 0));
8900 9453
8901 /** 9454 /**
8902 * Initialize a newly created scope to represent the potential target of an un labeled`break` or `continue`. 9455 * Initialize a newly created scope to represent the potential target of an un labeled
9456 * `break` or `continue`.
9457 *
8903 * @param outerScope the label scope enclosing the new label scope 9458 * @param outerScope the label scope enclosing the new label scope
8904 * @param onSwitchStatement `true` if this label is associated with a `switch` statement 9459 * @param onSwitchStatement `true` if this label is associated with a `switch`
9460 * statement
8905 * @param onSwitchMember `true` if this label is associated with a `switch` me mber 9461 * @param onSwitchMember `true` if this label is associated with a `switch` me mber
8906 */ 9462 */
8907 LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMe mber) { 9463 LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMe mber) {
8908 _jtd_constructor_288_impl(outerScope, onSwitchStatement, onSwitchMember); 9464 _jtd_constructor_288_impl(outerScope, onSwitchStatement, onSwitchMember);
8909 } 9465 }
8910 _jtd_constructor_288_impl(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) { 9466 _jtd_constructor_288_impl(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
8911 _jtd_constructor_289_impl(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMP TY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember)); 9467 _jtd_constructor_289_impl(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMP TY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember));
8912 } 9468 }
8913 9469
8914 /** 9470 /**
8915 * Initialize a newly created scope to represent the given label. 9471 * Initialize a newly created scope to represent the given label.
9472 *
8916 * @param outerScope the label scope enclosing the new label scope 9473 * @param outerScope the label scope enclosing the new label scope
8917 * @param label the label defined in this scope 9474 * @param label the label defined in this scope
8918 * @param element the element to which the label resolves 9475 * @param element the element to which the label resolves
8919 */ 9476 */
8920 LabelScope.con2(LabelScope outerScope2, String label2, LabelElement element2) { 9477 LabelScope.con2(LabelScope outerScope2, String label2, LabelElement element2) {
8921 _jtd_constructor_289_impl(outerScope2, label2, element2); 9478 _jtd_constructor_289_impl(outerScope2, label2, element2);
8922 } 9479 }
8923 _jtd_constructor_289_impl(LabelScope outerScope2, String label2, LabelElement element2) { 9480 _jtd_constructor_289_impl(LabelScope outerScope2, String label2, LabelElement element2) {
8924 this._outerScope = outerScope2; 9481 this._outerScope = outerScope2;
8925 this._label = label2; 9482 this._label = label2;
8926 this._element = element2; 9483 this._element = element2;
8927 } 9484 }
8928 9485
8929 /** 9486 /**
8930 * Return the label element corresponding to the given label, or `null` if the given label 9487 * Return the label element corresponding to the given label, or `null` if the given label
8931 * is not defined in this scope. 9488 * is not defined in this scope.
9489 *
8932 * @param targetLabel the label being looked up 9490 * @param targetLabel the label being looked up
8933 * @return the label element corresponding to the given label 9491 * @return the label element corresponding to the given label
8934 */ 9492 */
8935 LabelElement lookup(SimpleIdentifier targetLabel) => lookup2(targetLabel.name) ; 9493 LabelElement lookup(SimpleIdentifier targetLabel) => lookup2(targetLabel.name) ;
8936 9494
8937 /** 9495 /**
8938 * Return the label element corresponding to the given label, or `null` if the given label 9496 * Return the label element corresponding to the given label, or `null` if the given label
8939 * is not defined in this scope. 9497 * is not defined in this scope.
9498 *
8940 * @param targetLabel the label being looked up 9499 * @param targetLabel the label being looked up
8941 * @return the label element corresponding to the given label 9500 * @return the label element corresponding to the given label
8942 */ 9501 */
8943 LabelElement lookup2(String targetLabel) { 9502 LabelElement lookup2(String targetLabel) {
8944 if (_label == targetLabel) { 9503 if (_label == targetLabel) {
8945 return _element; 9504 return _element;
8946 } else if (_outerScope != null) { 9505 } else if (_outerScope != null) {
8947 return _outerScope.lookup2(targetLabel); 9506 return _outerScope.lookup2(targetLabel);
8948 } else { 9507 } else {
8949 return null; 9508 return null;
8950 } 9509 }
8951 } 9510 }
8952 } 9511 }
8953 /** 9512 /**
8954 * Instances of the class `LibraryImportScope` represent the scope containing al l of the names 9513 * Instances of the class `LibraryImportScope` represent the scope containing al l of the names
8955 * available from imported libraries. 9514 * available from imported libraries.
9515 *
8956 * @coverage dart.engine.resolver 9516 * @coverage dart.engine.resolver
8957 */ 9517 */
8958 class LibraryImportScope extends Scope { 9518 class LibraryImportScope extends Scope {
8959 9519
8960 /** 9520 /**
8961 * @return `true` if the given [Identifier] is the part of type annotation. 9521 * @return `true` if the given [Identifier] is the part of type annotation.
8962 */ 9522 */
8963 static bool isTypeAnnotation(Identifier identifier) { 9523 static bool isTypeAnnotation(Identifier identifier) {
8964 ASTNode parent = identifier.parent; 9524 ASTNode parent = identifier.parent;
8965 if (parent is TypeName) { 9525 if (parent is TypeName) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
9013 AnalysisErrorListener _errorListener; 9573 AnalysisErrorListener _errorListener;
9014 9574
9015 /** 9575 /**
9016 * A list of the namespaces representing the names that are available in this scope from imported 9576 * A list of the namespaces representing the names that are available in this scope from imported
9017 * libraries. 9577 * libraries.
9018 */ 9578 */
9019 List<Namespace> _importedNamespaces = new List<Namespace>(); 9579 List<Namespace> _importedNamespaces = new List<Namespace>();
9020 9580
9021 /** 9581 /**
9022 * Initialize a newly created scope representing the names imported into the g iven library. 9582 * Initialize a newly created scope representing the names imported into the g iven library.
9583 *
9023 * @param definingLibrary the element representing the library that imports th e names defined in 9584 * @param definingLibrary the element representing the library that imports th e names defined in
9024 * this scope 9585 * this scope
9025 * @param errorListener the listener that is to be informed when an error is e ncountered 9586 * @param errorListener the listener that is to be informed when an error is e ncountered
9026 */ 9587 */
9027 LibraryImportScope(LibraryElement definingLibrary, AnalysisErrorListener error Listener) { 9588 LibraryImportScope(LibraryElement definingLibrary, AnalysisErrorListener error Listener) {
9028 this._definingLibrary = definingLibrary; 9589 this._definingLibrary = definingLibrary;
9029 this._errorListener = errorListener; 9590 this._errorListener = errorListener;
9030 createImportedNamespaces(definingLibrary); 9591 createImportedNamespaces(definingLibrary);
9031 } 9592 }
9032 void define(Element element) { 9593 void define(Element element) {
9033 if (!Scope.isPrivateName(element.displayName)) { 9594 if (!Scope.isPrivateName(element.displayName)) {
9034 super.define(element); 9595 super.define(element);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
9069 } 9630 }
9070 if (foundElement != null) { 9631 if (foundElement != null) {
9071 defineWithoutChecking2(name, foundElement); 9632 defineWithoutChecking2(name, foundElement);
9072 } 9633 }
9073 return foundElement; 9634 return foundElement;
9074 } 9635 }
9075 9636
9076 /** 9637 /**
9077 * Create all of the namespaces associated with the libraries imported into th is library. The 9638 * Create all of the namespaces associated with the libraries imported into th is library. The
9078 * names are not added to this scope, but are stored for later reference. 9639 * names are not added to this scope, but are stored for later reference.
9640 *
9079 * @param definingLibrary the element representing the library that imports th e libraries for 9641 * @param definingLibrary the element representing the library that imports th e libraries for
9080 * which namespaces will be created 9642 * which namespaces will be created
9081 */ 9643 */
9082 void createImportedNamespaces(LibraryElement definingLibrary) { 9644 void createImportedNamespaces(LibraryElement definingLibrary) {
9083 NamespaceBuilder builder = new NamespaceBuilder(); 9645 NamespaceBuilder builder = new NamespaceBuilder();
9084 for (ImportElement element in definingLibrary.imports) { 9646 for (ImportElement element in definingLibrary.imports) {
9085 _importedNamespaces.add(builder.createImportNamespace(element)); 9647 _importedNamespaces.add(builder.createImportNamespace(element));
9086 } 9648 }
9087 } 9649 }
9088 } 9650 }
9089 /** 9651 /**
9090 * Instances of the class `LibraryScope` implement a scope containing all of the names defined 9652 * Instances of the class `LibraryScope` implement a scope containing all of the names defined
9091 * in a given library. 9653 * in a given library.
9654 *
9092 * @coverage dart.engine.resolver 9655 * @coverage dart.engine.resolver
9093 */ 9656 */
9094 class LibraryScope extends EnclosedScope { 9657 class LibraryScope extends EnclosedScope {
9095 9658
9096 /** 9659 /**
9097 * Initialize a newly created scope representing the names defined in the give n library. 9660 * Initialize a newly created scope representing the names defined in the give n library.
9661 *
9098 * @param definingLibrary the element representing the library represented by this scope 9662 * @param definingLibrary the element representing the library represented by this scope
9099 * @param errorListener the listener that is to be informed when an error is e ncountered 9663 * @param errorListener the listener that is to be informed when an error is e ncountered
9100 */ 9664 */
9101 LibraryScope(LibraryElement definingLibrary, AnalysisErrorListener errorListen er) : super(new LibraryImportScope(definingLibrary, errorListener)) { 9665 LibraryScope(LibraryElement definingLibrary, AnalysisErrorListener errorListen er) : super(new LibraryImportScope(definingLibrary, errorListener)) {
9102 defineTopLevelNames(definingLibrary); 9666 defineTopLevelNames(definingLibrary);
9103 } 9667 }
9104 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { 9668 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
9105 if (existing is PrefixElement) { 9669 if (existing is PrefixElement) {
9106 int offset = duplicate.nameOffset; 9670 int offset = duplicate.nameOffset;
9107 if (duplicate is PropertyAccessorElement) { 9671 if (duplicate is PropertyAccessorElement) {
9108 PropertyAccessorElement accessor = duplicate as PropertyAccessorElement; 9672 PropertyAccessorElement accessor = duplicate as PropertyAccessorElement;
9109 if (accessor.isSynthetic) { 9673 if (accessor.isSynthetic) {
9110 offset = accessor.variable.nameOffset; 9674 offset = accessor.variable.nameOffset;
9111 } 9675 }
9112 } 9676 }
9113 return new AnalysisError.con2(source, offset, duplicate.displayName.length , CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayN ame]); 9677 return new AnalysisError.con2(source, offset, duplicate.displayName.length , CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayN ame]);
9114 } 9678 }
9115 return super.getErrorForDuplicate(existing, duplicate); 9679 return super.getErrorForDuplicate(existing, duplicate);
9116 } 9680 }
9117 9681
9118 /** 9682 /**
9119 * Add to this scope all of the public top-level names that are defined in the given compilation 9683 * Add to this scope all of the public top-level names that are defined in the given compilation
9120 * unit. 9684 * unit.
9685 *
9121 * @param compilationUnit the compilation unit defining the top-level names to be added to this 9686 * @param compilationUnit the compilation unit defining the top-level names to be added to this
9122 * scope 9687 * scope
9123 */ 9688 */
9124 void defineLocalNames(CompilationUnitElement compilationUnit) { 9689 void defineLocalNames(CompilationUnitElement compilationUnit) {
9125 for (PropertyAccessorElement element in compilationUnit.accessors) { 9690 for (PropertyAccessorElement element in compilationUnit.accessors) {
9126 define(element); 9691 define(element);
9127 } 9692 }
9128 for (FunctionElement element in compilationUnit.functions) { 9693 for (FunctionElement element in compilationUnit.functions) {
9129 define(element); 9694 define(element);
9130 } 9695 }
9131 for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases ) { 9696 for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases ) {
9132 define(element); 9697 define(element);
9133 } 9698 }
9134 for (ClassElement element in compilationUnit.types) { 9699 for (ClassElement element in compilationUnit.types) {
9135 define(element); 9700 define(element);
9136 } 9701 }
9137 } 9702 }
9138 9703
9139 /** 9704 /**
9140 * Add to this scope all of the names that are explicitly defined in the given library. 9705 * Add to this scope all of the names that are explicitly defined in the given library.
9706 *
9141 * @param definingLibrary the element representing the library that defines th e names in this 9707 * @param definingLibrary the element representing the library that defines th e names in this
9142 * scope 9708 * scope
9143 */ 9709 */
9144 void defineTopLevelNames(LibraryElement definingLibrary) { 9710 void defineTopLevelNames(LibraryElement definingLibrary) {
9145 for (PrefixElement prefix in definingLibrary.prefixes) { 9711 for (PrefixElement prefix in definingLibrary.prefixes) {
9146 define(prefix); 9712 define(prefix);
9147 } 9713 }
9148 defineLocalNames(definingLibrary.definingCompilationUnit); 9714 defineLocalNames(definingLibrary.definingCompilationUnit);
9149 for (CompilationUnitElement compilationUnit in definingLibrary.parts) { 9715 for (CompilationUnitElement compilationUnit in definingLibrary.parts) {
9150 defineLocalNames(compilationUnit); 9716 defineLocalNames(compilationUnit);
9151 } 9717 }
9152 } 9718 }
9153 } 9719 }
9154 /** 9720 /**
9155 * Instances of the class `Namespace` implement a mapping of identifiers to the elements 9721 * Instances of the class `Namespace` implement a mapping of identifiers to the elements
9156 * represented by those identifiers. Namespaces are the building blocks for scop es. 9722 * represented by those identifiers. Namespaces are the building blocks for scop es.
9723 *
9157 * @coverage dart.engine.resolver 9724 * @coverage dart.engine.resolver
9158 */ 9725 */
9159 class Namespace { 9726 class Namespace {
9160 9727
9161 /** 9728 /**
9162 * A table mapping names that are defined in this namespace to the element rep resenting the thing 9729 * A table mapping names that are defined in this namespace to the element rep resenting the thing
9163 * declared with that name. 9730 * declared with that name.
9164 */ 9731 */
9165 Map<String, Element> _definedNames; 9732 Map<String, Element> _definedNames;
9166 9733
9167 /** 9734 /**
9168 * An empty namespace. 9735 * An empty namespace.
9169 */ 9736 */
9170 static Namespace EMPTY = new Namespace(new Map<String, Element>()); 9737 static Namespace EMPTY = new Namespace(new Map<String, Element>());
9171 9738
9172 /** 9739 /**
9173 * Initialize a newly created namespace to have the given defined names. 9740 * Initialize a newly created namespace to have the given defined names.
9741 *
9174 * @param definedNames the mapping from names that are defined in this namespa ce to the 9742 * @param definedNames the mapping from names that are defined in this namespa ce to the
9175 * corresponding elements 9743 * corresponding elements
9176 */ 9744 */
9177 Namespace(Map<String, Element> definedNames) { 9745 Namespace(Map<String, Element> definedNames) {
9178 this._definedNames = definedNames; 9746 this._definedNames = definedNames;
9179 } 9747 }
9180 9748
9181 /** 9749 /**
9182 * Return the element in this namespace that is available to the containing sc ope using the given 9750 * Return the element in this namespace that is available to the containing sc ope using the given
9183 * name. 9751 * name.
9752 *
9184 * @param name the name used to reference the 9753 * @param name the name used to reference the
9185 * @return the element represented by the given identifier 9754 * @return the element represented by the given identifier
9186 */ 9755 */
9187 Element get(String name) => _definedNames[name]; 9756 Element get(String name) => _definedNames[name];
9188 9757
9189 /** 9758 /**
9190 * Return a table containing the same mappings as those defined by this namesp ace. 9759 * Return a table containing the same mappings as those defined by this namesp ace.
9760 *
9191 * @return a table containing the same mappings as those defined by this names pace 9761 * @return a table containing the same mappings as those defined by this names pace
9192 */ 9762 */
9193 Map<String, Element> get definedNames => new Map<String, Element>.from(_define dNames); 9763 Map<String, Element> get definedNames => new Map<String, Element>.from(_define dNames);
9194 } 9764 }
9195 /** 9765 /**
9196 * Instances of the class `NamespaceBuilder` are used to build a `Namespace`. Na mespace 9766 * Instances of the class `NamespaceBuilder` are used to build a `Namespace`. Na mespace
9197 * builders are thread-safe and re-usable. 9767 * builders are thread-safe and re-usable.
9768 *
9198 * @coverage dart.engine.resolver 9769 * @coverage dart.engine.resolver
9199 */ 9770 */
9200 class NamespaceBuilder { 9771 class NamespaceBuilder {
9201 9772
9202 /** 9773 /**
9203 * Create a namespace representing the export namespace of the given [ExportEl ement]. 9774 * Create a namespace representing the export namespace of the given [ExportEl ement].
9775 *
9204 * @param element the export element whose export namespace is to be created 9776 * @param element the export element whose export namespace is to be created
9205 * @return the export namespace that was created 9777 * @return the export namespace that was created
9206 */ 9778 */
9207 Namespace createExportNamespace(ExportElement element) { 9779 Namespace createExportNamespace(ExportElement element) {
9208 LibraryElement exportedLibrary = element.exportedLibrary; 9780 LibraryElement exportedLibrary = element.exportedLibrary;
9209 if (exportedLibrary == null) { 9781 if (exportedLibrary == null) {
9210 return Namespace.EMPTY; 9782 return Namespace.EMPTY;
9211 } 9783 }
9212 Map<String, Element> definedNames = createExportMapping(exportedLibrary, new Set<LibraryElement>()); 9784 Map<String, Element> definedNames = createExportMapping(exportedLibrary, new Set<LibraryElement>());
9213 definedNames = apply(definedNames, element.combinators); 9785 definedNames = apply(definedNames, element.combinators);
9214 return new Namespace(definedNames); 9786 return new Namespace(definedNames);
9215 } 9787 }
9216 9788
9217 /** 9789 /**
9218 * Create a namespace representing the export namespace of the given library. 9790 * Create a namespace representing the export namespace of the given library.
9791 *
9219 * @param library the library whose export namespace is to be created 9792 * @param library the library whose export namespace is to be created
9220 * @return the export namespace that was created 9793 * @return the export namespace that was created
9221 */ 9794 */
9222 Namespace createExportNamespace2(LibraryElement library) => new Namespace(crea teExportMapping(library, new Set<LibraryElement>())); 9795 Namespace createExportNamespace2(LibraryElement library) => new Namespace(crea teExportMapping(library, new Set<LibraryElement>()));
9223 9796
9224 /** 9797 /**
9225 * Create a namespace representing the import namespace of the given library. 9798 * Create a namespace representing the import namespace of the given library.
9799 *
9226 * @param library the library whose import namespace is to be created 9800 * @param library the library whose import namespace is to be created
9227 * @return the import namespace that was created 9801 * @return the import namespace that was created
9228 */ 9802 */
9229 Namespace createImportNamespace(ImportElement element) { 9803 Namespace createImportNamespace(ImportElement element) {
9230 LibraryElement importedLibrary = element.importedLibrary; 9804 LibraryElement importedLibrary = element.importedLibrary;
9231 if (importedLibrary == null) { 9805 if (importedLibrary == null) {
9232 return Namespace.EMPTY; 9806 return Namespace.EMPTY;
9233 } 9807 }
9234 Map<String, Element> definedNames = createExportMapping(importedLibrary, new Set<LibraryElement>()); 9808 Map<String, Element> definedNames = createExportMapping(importedLibrary, new Set<LibraryElement>());
9235 definedNames = apply(definedNames, element.combinators); 9809 definedNames = apply(definedNames, element.combinators);
9236 definedNames = apply2(definedNames, element.prefix); 9810 definedNames = apply2(definedNames, element.prefix);
9237 return new Namespace(definedNames); 9811 return new Namespace(definedNames);
9238 } 9812 }
9239 9813
9240 /** 9814 /**
9241 * Create a namespace representing the public namespace of the given library. 9815 * Create a namespace representing the public namespace of the given library.
9816 *
9242 * @param library the library whose public namespace is to be created 9817 * @param library the library whose public namespace is to be created
9243 * @return the public namespace that was created 9818 * @return the public namespace that was created
9244 */ 9819 */
9245 Namespace createPublicNamespace(LibraryElement library) { 9820 Namespace createPublicNamespace(LibraryElement library) {
9246 Map<String, Element> definedNames = new Map<String, Element>(); 9821 Map<String, Element> definedNames = new Map<String, Element>();
9247 addPublicNames(definedNames, library.definingCompilationUnit); 9822 addPublicNames(definedNames, library.definingCompilationUnit);
9248 for (CompilationUnitElement compilationUnit in library.parts) { 9823 for (CompilationUnitElement compilationUnit in library.parts) {
9249 addPublicNames(definedNames, compilationUnit); 9824 addPublicNames(definedNames, compilationUnit);
9250 } 9825 }
9251 return new Namespace(definedNames); 9826 return new Namespace(definedNames);
9252 } 9827 }
9253 9828
9254 /** 9829 /**
9255 * Add all of the names in the given namespace to the given mapping table. 9830 * Add all of the names in the given namespace to the given mapping table.
9831 *
9256 * @param definedNames the mapping table to which the names in the given names pace are to be added 9832 * @param definedNames the mapping table to which the names in the given names pace are to be added
9257 * @param namespace the namespace containing the names to be added to this nam espace 9833 * @param namespace the namespace containing the names to be added to this nam espace
9258 */ 9834 */
9259 void addAll(Map<String, Element> definedNames, Map<String, Element> newNames) { 9835 void addAll(Map<String, Element> definedNames, Map<String, Element> newNames) {
9260 for (MapEntry<String, Element> entry in getMapEntrySet(newNames)) { 9836 for (MapEntry<String, Element> entry in getMapEntrySet(newNames)) {
9261 definedNames[entry.getKey()] = entry.getValue(); 9837 definedNames[entry.getKey()] = entry.getValue();
9262 } 9838 }
9263 } 9839 }
9264 9840
9265 /** 9841 /**
9266 * Add all of the names in the given namespace to the given mapping table. 9842 * Add all of the names in the given namespace to the given mapping table.
9843 *
9267 * @param definedNames the mapping table to which the names in the given names pace are to be added 9844 * @param definedNames the mapping table to which the names in the given names pace are to be added
9268 * @param namespace the namespace containing the names to be added to this nam espace 9845 * @param namespace the namespace containing the names to be added to this nam espace
9269 */ 9846 */
9270 void addAll2(Map<String, Element> definedNames2, Namespace namespace) { 9847 void addAll2(Map<String, Element> definedNames2, Namespace namespace) {
9271 if (namespace != null) { 9848 if (namespace != null) {
9272 addAll(definedNames2, namespace.definedNames); 9849 addAll(definedNames2, namespace.definedNames);
9273 } 9850 }
9274 } 9851 }
9275 9852
9276 /** 9853 /**
9277 * Add the given element to the given mapping table if it has a publicly visib le name. 9854 * Add the given element to the given mapping table if it has a publicly visib le name.
9855 *
9278 * @param definedNames the mapping table to which the public name is to be add ed 9856 * @param definedNames the mapping table to which the public name is to be add ed
9279 * @param element the element to be added 9857 * @param element the element to be added
9280 */ 9858 */
9281 void addIfPublic(Map<String, Element> definedNames, Element element) { 9859 void addIfPublic(Map<String, Element> definedNames, Element element) {
9282 String name = element.name; 9860 String name = element.name;
9283 if (name != null && !Scope.isPrivateName(name)) { 9861 if (name != null && !Scope.isPrivateName(name)) {
9284 definedNames[name] = element; 9862 definedNames[name] = element;
9285 } 9863 }
9286 } 9864 }
9287 9865
9288 /** 9866 /**
9289 * Add to the given mapping table all of the public top-level names that are d efined in the given 9867 * Add to the given mapping table all of the public top-level names that are d efined in the given
9290 * compilation unit. 9868 * compilation unit.
9869 *
9291 * @param definedNames the mapping table to which the public names are to be a dded 9870 * @param definedNames the mapping table to which the public names are to be a dded
9292 * @param compilationUnit the compilation unit defining the top-level names to be added to this 9871 * @param compilationUnit the compilation unit defining the top-level names to be added to this
9293 * namespace 9872 * namespace
9294 */ 9873 */
9295 void addPublicNames(Map<String, Element> definedNames, CompilationUnitElement compilationUnit) { 9874 void addPublicNames(Map<String, Element> definedNames, CompilationUnitElement compilationUnit) {
9296 for (PropertyAccessorElement element in compilationUnit.accessors) { 9875 for (PropertyAccessorElement element in compilationUnit.accessors) {
9297 addIfPublic(definedNames, element); 9876 addIfPublic(definedNames, element);
9298 } 9877 }
9299 for (FunctionElement element in compilationUnit.functions) { 9878 for (FunctionElement element in compilationUnit.functions) {
9300 addIfPublic(definedNames, element); 9879 addIfPublic(definedNames, element);
9301 } 9880 }
9302 for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases ) { 9881 for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases ) {
9303 addIfPublic(definedNames, element); 9882 addIfPublic(definedNames, element);
9304 } 9883 }
9305 for (ClassElement element in compilationUnit.types) { 9884 for (ClassElement element in compilationUnit.types) {
9306 addIfPublic(definedNames, element); 9885 addIfPublic(definedNames, element);
9307 } 9886 }
9308 } 9887 }
9309 9888
9310 /** 9889 /**
9311 * Apply the given combinators to all of the names in the given mapping table. 9890 * Apply the given combinators to all of the names in the given mapping table.
9891 *
9312 * @param definedNames the mapping table to which the namespace operations are to be applied 9892 * @param definedNames the mapping table to which the namespace operations are to be applied
9313 * @param combinators the combinators to be applied 9893 * @param combinators the combinators to be applied
9314 */ 9894 */
9315 Map<String, Element> apply(Map<String, Element> definedNames, List<NamespaceCo mbinator> combinators) { 9895 Map<String, Element> apply(Map<String, Element> definedNames, List<NamespaceCo mbinator> combinators) {
9316 for (NamespaceCombinator combinator in combinators) { 9896 for (NamespaceCombinator combinator in combinators) {
9317 if (combinator is HideElementCombinator) { 9897 if (combinator is HideElementCombinator) {
9318 hide(definedNames, ((combinator as HideElementCombinator)).hiddenNames); 9898 hide(definedNames, ((combinator as HideElementCombinator)).hiddenNames);
9319 } else if (combinator is ShowElementCombinator) { 9899 } else if (combinator is ShowElementCombinator) {
9320 definedNames = show(definedNames, ((combinator as ShowElementCombinator) ).shownNames); 9900 definedNames = show(definedNames, ((combinator as ShowElementCombinator) ).shownNames);
9321 } else { 9901 } else {
9322 AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${c ombinator.runtimeType.toString()}"); 9902 AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${c ombinator.runtimeType.toString()}");
9323 } 9903 }
9324 } 9904 }
9325 return definedNames; 9905 return definedNames;
9326 } 9906 }
9327 9907
9328 /** 9908 /**
9329 * Apply the given prefix to all of the names in the table of defined names. 9909 * Apply the given prefix to all of the names in the table of defined names.
9910 *
9330 * @param definedNames the names that were defined before this operation 9911 * @param definedNames the names that were defined before this operation
9331 * @param prefixElement the element defining the prefix to be added to the nam es 9912 * @param prefixElement the element defining the prefix to be added to the nam es
9332 */ 9913 */
9333 Map<String, Element> apply2(Map<String, Element> definedNames, PrefixElement p refixElement) { 9914 Map<String, Element> apply2(Map<String, Element> definedNames, PrefixElement p refixElement) {
9334 if (prefixElement != null) { 9915 if (prefixElement != null) {
9335 String prefix = prefixElement.name; 9916 String prefix = prefixElement.name;
9336 Map<String, Element> newNames = new Map<String, Element>(); 9917 Map<String, Element> newNames = new Map<String, Element>();
9337 for (MapEntry<String, Element> entry in getMapEntrySet(definedNames)) { 9918 for (MapEntry<String, Element> entry in getMapEntrySet(definedNames)) {
9338 newNames["${prefix}.${entry.getKey()}"] = entry.getValue(); 9919 newNames["${prefix}.${entry.getKey()}"] = entry.getValue();
9339 } 9920 }
9340 return newNames; 9921 return newNames;
9341 } else { 9922 } else {
9342 return definedNames; 9923 return definedNames;
9343 } 9924 }
9344 } 9925 }
9345 9926
9346 /** 9927 /**
9347 * Create a mapping table representing the export namespace of the given libra ry. 9928 * Create a mapping table representing the export namespace of the given libra ry.
9929 *
9348 * @param library the library whose public namespace is to be created 9930 * @param library the library whose public namespace is to be created
9349 * @param visitedElements a set of libraries that do not need to be visited wh en processing the 9931 * @param visitedElements a set of libraries that do not need to be visited wh en processing the
9350 * export directives of the given library because all of the names defined by them will 9932 * export directives of the given library because all of the names de fined by them will
9351 * be added by another library 9933 * be added by another library
9352 * @return the mapping table that was created 9934 * @return the mapping table that was created
9353 */ 9935 */
9354 Map<String, Element> createExportMapping(LibraryElement library, Set<LibraryEl ement> visitedElements) { 9936 Map<String, Element> createExportMapping(LibraryElement library, Set<LibraryEl ement> visitedElements) {
9355 javaSetAdd(visitedElements, library); 9937 javaSetAdd(visitedElements, library);
9356 try { 9938 try {
9357 Map<String, Element> definedNames = new Map<String, Element>(); 9939 Map<String, Element> definedNames = new Map<String, Element>();
9358 for (ExportElement element in library.exports) { 9940 for (ExportElement element in library.exports) {
9359 LibraryElement exportedLibrary = element.exportedLibrary; 9941 LibraryElement exportedLibrary = element.exportedLibrary;
9360 if (exportedLibrary != null && !visitedElements.contains(exportedLibrary )) { 9942 if (exportedLibrary != null && !visitedElements.contains(exportedLibrary )) {
9361 Map<String, Element> exportedNames = createExportMapping(exportedLibra ry, visitedElements); 9943 Map<String, Element> exportedNames = createExportMapping(exportedLibra ry, visitedElements);
9362 exportedNames = apply(exportedNames, element.combinators); 9944 exportedNames = apply(exportedNames, element.combinators);
9363 addAll(definedNames, exportedNames); 9945 addAll(definedNames, exportedNames);
9364 } 9946 }
9365 } 9947 }
9366 addAll2(definedNames, ((library.context as InternalAnalysisContext)).getPu blicNamespace(library)); 9948 addAll2(definedNames, ((library.context as InternalAnalysisContext)).getPu blicNamespace(library));
9367 return definedNames; 9949 return definedNames;
9368 } finally { 9950 } finally {
9369 visitedElements.remove(library); 9951 visitedElements.remove(library);
9370 } 9952 }
9371 } 9953 }
9372 9954
9373 /** 9955 /**
9374 * Hide all of the given names by removing them from the given collection of d efined names. 9956 * Hide all of the given names by removing them from the given collection of d efined names.
9957 *
9375 * @param definedNames the names that were defined before this operation 9958 * @param definedNames the names that were defined before this operation
9376 * @param hiddenNames the names to be hidden 9959 * @param hiddenNames the names to be hidden
9377 */ 9960 */
9378 void hide(Map<String, Element> definedNames, List<String> hiddenNames) { 9961 void hide(Map<String, Element> definedNames, List<String> hiddenNames) {
9379 for (String name in hiddenNames) { 9962 for (String name in hiddenNames) {
9380 definedNames.remove(name); 9963 definedNames.remove(name);
9381 definedNames.remove("${name}="); 9964 definedNames.remove("${name}=");
9382 } 9965 }
9383 } 9966 }
9384 9967
9385 /** 9968 /**
9386 * Show only the given names by removing all other names from the given collec tion of defined 9969 * Show only the given names by removing all other names from the given collec tion of defined
9387 * names. 9970 * names.
9971 *
9388 * @param definedNames the names that were defined before this operation 9972 * @param definedNames the names that were defined before this operation
9389 * @param shownNames the names to be shown 9973 * @param shownNames the names to be shown
9390 */ 9974 */
9391 Map<String, Element> show(Map<String, Element> definedNames, List<String> show nNames) { 9975 Map<String, Element> show(Map<String, Element> definedNames, List<String> show nNames) {
9392 Map<String, Element> newNames = new Map<String, Element>(); 9976 Map<String, Element> newNames = new Map<String, Element>();
9393 for (String name in shownNames) { 9977 for (String name in shownNames) {
9394 Element element = definedNames[name]; 9978 Element element = definedNames[name];
9395 if (element != null) { 9979 if (element != null) {
9396 newNames[name] = element; 9980 newNames[name] = element;
9397 } 9981 }
9398 String setterName = "${name}="; 9982 String setterName = "${name}=";
9399 element = definedNames[setterName]; 9983 element = definedNames[setterName];
9400 if (element != null) { 9984 if (element != null) {
9401 newNames[setterName] = element; 9985 newNames[setterName] = element;
9402 } 9986 }
9403 } 9987 }
9404 return newNames; 9988 return newNames;
9405 } 9989 }
9406 } 9990 }
9407 /** 9991 /**
9408 * The abstract class `Scope` defines the behavior common to name scopes used by the resolver 9992 * The abstract class `Scope` defines the behavior common to name scopes used by the resolver
9409 * to determine which names are visible at any given point in the code. 9993 * to determine which names are visible at any given point in the code.
9994 *
9410 * @coverage dart.engine.resolver 9995 * @coverage dart.engine.resolver
9411 */ 9996 */
9412 abstract class Scope { 9997 abstract class Scope {
9413 9998
9414 /** 9999 /**
9415 * The prefix used to mark an identifier as being private to its library. 10000 * The prefix used to mark an identifier as being private to its library.
9416 */ 10001 */
9417 static String PRIVATE_NAME_PREFIX = "_"; 10002 static String PRIVATE_NAME_PREFIX = "_";
9418 10003
9419 /** 10004 /**
9420 * The suffix added to the declared name of a setter when looking up the sette r. Used to 10005 * The suffix added to the declared name of a setter when looking up the sette r. Used to
9421 * disambiguate between a getter and a setter that have the same name. 10006 * disambiguate between a getter and a setter that have the same name.
9422 */ 10007 */
9423 static String SETTER_SUFFIX = "="; 10008 static String SETTER_SUFFIX = "=";
9424 10009
9425 /** 10010 /**
9426 * The name used to look up the method used to implement the unary minus opera tor. Used to 10011 * The name used to look up the method used to implement the unary minus opera tor. Used to
9427 * disambiguate between the unary and binary operators. 10012 * disambiguate between the unary and binary operators.
9428 */ 10013 */
9429 static String UNARY_MINUS = "unary-"; 10014 static String UNARY_MINUS = "unary-";
9430 10015
9431 /** 10016 /**
9432 * Return `true` if the given name is a library-private name. 10017 * Return `true` if the given name is a library-private name.
10018 *
9433 * @param name the name being tested 10019 * @param name the name being tested
9434 * @return `true` if the given name is a library-private name 10020 * @return `true` if the given name is a library-private name
9435 */ 10021 */
9436 static bool isPrivateName(String name) => name != null && name.startsWith(PRIV ATE_NAME_PREFIX); 10022 static bool isPrivateName(String name) => name != null && name.startsWith(PRIV ATE_NAME_PREFIX);
9437 10023
9438 /** 10024 /**
9439 * A table mapping names that are defined in this scope to the element represe nting the thing 10025 * A table mapping names that are defined in this scope to the element represe nting the thing
9440 * declared with that name. 10026 * declared with that name.
9441 */ 10027 */
9442 Map<String, Element> _definedNames = new Map<String, Element>(); 10028 Map<String, Element> _definedNames = new Map<String, Element>();
9443 10029
9444 /** 10030 /**
9445 * Add the given element to this scope. If there is already an element with th e given name defined 10031 * Add the given element to this scope. If there is already an element with th e given name defined
9446 * in this scope, then an error will be generated and the original element wil l continue to be 10032 * in this scope, then an error will be generated and the original element wil l continue to be
9447 * mapped to the name. If there is an element with the given name in an enclos ing scope, then a 10033 * mapped to the name. If there is an element with the given name in an enclos ing scope, then a
9448 * warning will be generated but the given element will hide the inherited ele ment. 10034 * warning will be generated but the given element will hide the inherited ele ment.
10035 *
9449 * @param element the element to be added to this scope 10036 * @param element the element to be added to this scope
9450 */ 10037 */
9451 void define(Element element) { 10038 void define(Element element) {
9452 String name = getName(element); 10039 String name = getName(element);
9453 if (name != null && !name.isEmpty) { 10040 if (name != null && !name.isEmpty) {
9454 if (_definedNames.containsKey(name)) { 10041 if (_definedNames.containsKey(name)) {
9455 errorListener.onError(getErrorForDuplicate(_definedNames[name], element) ); 10042 errorListener.onError(getErrorForDuplicate(_definedNames[name], element) );
9456 } else { 10043 } else {
9457 _definedNames[name] = element; 10044 _definedNames[name] = element;
9458 } 10045 }
9459 } 10046 }
9460 } 10047 }
9461 10048
9462 /** 10049 /**
9463 * Return the element with which the given identifier is associated, or `null` if the name 10050 * Return the element with which the given identifier is associated, or `null` if the name
9464 * is not defined within this scope. 10051 * is not defined within this scope.
10052 *
9465 * @param identifier the identifier associated with the element to be returned 10053 * @param identifier the identifier associated with the element to be returned
9466 * @param referencingLibrary the library that contains the reference to the na me, used to 10054 * @param referencingLibrary the library that contains the reference to the na me, used to
9467 * implement library-level privacy 10055 * implement library-level privacy
9468 * @return the element with which the given identifier is associated 10056 * @return the element with which the given identifier is associated
9469 */ 10057 */
9470 Element lookup(Identifier identifier, LibraryElement referencingLibrary) => lo okup3(identifier, identifier.name, referencingLibrary); 10058 Element lookup(Identifier identifier, LibraryElement referencingLibrary) => lo okup3(identifier, identifier.name, referencingLibrary);
9471 10059
9472 /** 10060 /**
9473 * Add the given element to this scope without checking for duplication or hid ing. 10061 * Add the given element to this scope without checking for duplication or hid ing.
10062 *
9474 * @param element the element to be added to this scope 10063 * @param element the element to be added to this scope
9475 */ 10064 */
9476 void defineWithoutChecking(Element element) { 10065 void defineWithoutChecking(Element element) {
9477 _definedNames[getName(element)] = element; 10066 _definedNames[getName(element)] = element;
9478 } 10067 }
9479 10068
9480 /** 10069 /**
9481 * Add the given element to this scope without checking for duplication or hid ing. 10070 * Add the given element to this scope without checking for duplication or hid ing.
10071 *
9482 * @param name the name of the element to be added 10072 * @param name the name of the element to be added
9483 * @param element the element to be added to this scope 10073 * @param element the element to be added to this scope
9484 */ 10074 */
9485 void defineWithoutChecking2(String name, Element element) { 10075 void defineWithoutChecking2(String name, Element element) {
9486 _definedNames[name] = element; 10076 _definedNames[name] = element;
9487 } 10077 }
9488 10078
9489 /** 10079 /**
9490 * Return the element representing the library in which this scope is enclosed . 10080 * Return the element representing the library in which this scope is enclosed .
10081 *
9491 * @return the element representing the library in which this scope is enclose d 10082 * @return the element representing the library in which this scope is enclose d
9492 */ 10083 */
9493 LibraryElement get definingLibrary; 10084 LibraryElement get definingLibrary;
9494 10085
9495 /** 10086 /**
9496 * Return the error code to be used when reporting that a name being defined l ocally conflicts 10087 * Return the error code to be used when reporting that a name being defined l ocally conflicts
9497 * with another element of the same name in the local scope. 10088 * with another element of the same name in the local scope.
10089 *
9498 * @param existing the first element to be declared with the conflicting name 10090 * @param existing the first element to be declared with the conflicting name
9499 * @param duplicate another element declared with the conflicting name 10091 * @param duplicate another element declared with the conflicting name
9500 * @return the error code used to report duplicate names within a scope 10092 * @return the error code used to report duplicate names within a scope
9501 */ 10093 */
9502 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { 10094 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
9503 Source source = duplicate.source; 10095 Source source = duplicate.source;
9504 if (source == null) { 10096 if (source == null) {
9505 source = source; 10097 source = source;
9506 } 10098 }
9507 return new AnalysisError.con2(source, duplicate.nameOffset, duplicate.displa yName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName]) ; 10099 return new AnalysisError.con2(source, duplicate.nameOffset, duplicate.displa yName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName]) ;
9508 } 10100 }
9509 10101
9510 /** 10102 /**
9511 * Return the listener that is to be informed when an error is encountered. 10103 * Return the listener that is to be informed when an error is encountered.
10104 *
9512 * @return the listener that is to be informed when an error is encountered 10105 * @return the listener that is to be informed when an error is encountered
9513 */ 10106 */
9514 AnalysisErrorListener get errorListener; 10107 AnalysisErrorListener get errorListener;
9515 10108
9516 /** 10109 /**
9517 * Return the source object representing the compilation unit with which error s related to this 10110 * Return the source object representing the compilation unit with which error s related to this
9518 * scope should be associated. 10111 * scope should be associated.
10112 *
9519 * @return the source object with which errors should be associated 10113 * @return the source object with which errors should be associated
9520 */ 10114 */
9521 Source get source => definingLibrary.definingCompilationUnit.source; 10115 Source get source => definingLibrary.definingCompilationUnit.source;
9522 10116
9523 /** 10117 /**
9524 * Return the element with which the given name is associated, or `null` if th e name is not 10118 * Return the element with which the given name is associated, or `null` if th e name is not
9525 * defined within this scope. This method only returns elements that are direc tly defined within 10119 * defined within this scope. This method only returns elements that are direc tly defined within
9526 * this scope, not elements that are defined in an enclosing scope. 10120 * this scope, not elements that are defined in an enclosing scope.
10121 *
9527 * @param name the name associated with the element to be returned 10122 * @param name the name associated with the element to be returned
9528 * @param referencingLibrary the library that contains the reference to the na me, used to 10123 * @param referencingLibrary the library that contains the reference to the na me, used to
9529 * implement library-level privacy 10124 * implement library-level privacy
9530 * @return the element with which the given name is associated 10125 * @return the element with which the given name is associated
9531 */ 10126 */
9532 Element localLookup(String name, LibraryElement referencingLibrary) => _define dNames[name]; 10127 Element localLookup(String name, LibraryElement referencingLibrary) => _define dNames[name];
9533 10128
9534 /** 10129 /**
9535 * Return the element with which the given name is associated, or `null` if th e name is not 10130 * Return the element with which the given name is associated, or `null` if th e name is not
9536 * defined within this scope. 10131 * defined within this scope.
10132 *
9537 * @param identifier the identifier node to lookup element for, used to report correct kind of a 10133 * @param identifier the identifier node to lookup element for, used to report correct kind of a
9538 * problem and associate problem with 10134 * problem and associate problem with
9539 * @param name the name associated with the element to be returned 10135 * @param name the name associated with the element to be returned
9540 * @param referencingLibrary the library that contains the reference to the na me, used to 10136 * @param referencingLibrary the library that contains the reference to the na me, used to
9541 * implement library-level privacy 10137 * implement library-level privacy
9542 * @return the element with which the given name is associated 10138 * @return the element with which the given name is associated
9543 */ 10139 */
9544 Element lookup3(Identifier identifier, String name, LibraryElement referencing Library); 10140 Element lookup3(Identifier identifier, String name, LibraryElement referencing Library);
9545 10141
9546 /** 10142 /**
9547 * Return the name that will be used to look up the given element. 10143 * Return the name that will be used to look up the given element.
10144 *
9548 * @param element the element whose look-up name is to be returned 10145 * @param element the element whose look-up name is to be returned
9549 * @return the name that will be used to look up the given element 10146 * @return the name that will be used to look up the given element
9550 */ 10147 */
9551 String getName(Element element) { 10148 String getName(Element element) {
9552 if (element is MethodElement) { 10149 if (element is MethodElement) {
9553 MethodElement method = element as MethodElement; 10150 MethodElement method = element as MethodElement;
9554 if (method.name == "-" && method.parameters.length == 0) { 10151 if (method.name == "-" && method.parameters.length == 0) {
9555 return UNARY_MINUS; 10152 return UNARY_MINUS;
9556 } 10153 }
9557 } 10154 }
9558 return element.name; 10155 return element.name;
9559 } 10156 }
9560 } 10157 }
9561 /** 10158 /**
9562 * Instances of the class `ConstantVerifier` traverse an AST structure looking f or additional 10159 * Instances of the class `ConstantVerifier` traverse an AST structure looking f or additional
9563 * errors and warnings not covered by the parser and resolver. In particular, it looks for errors 10160 * errors and warnings not covered by the parser and resolver. In particular, it looks for errors
9564 * and warnings related to constant expressions. 10161 * and warnings related to constant expressions.
10162 *
9565 * @coverage dart.engine.resolver 10163 * @coverage dart.engine.resolver
9566 */ 10164 */
9567 class ConstantVerifier extends RecursiveASTVisitor<Object> { 10165 class ConstantVerifier extends RecursiveASTVisitor<Object> {
9568 10166
9569 /** 10167 /**
9570 * The error reporter by which errors will be reported. 10168 * The error reporter by which errors will be reported.
9571 */ 10169 */
9572 ErrorReporter _errorReporter; 10170 ErrorReporter _errorReporter;
9573 10171
9574 /** 10172 /**
(...skipping 11 matching lines...) Expand all
9586 */ 10184 */
9587 InterfaceType _numType; 10185 InterfaceType _numType;
9588 10186
9589 /** 10187 /**
9590 * The type representing the type 'string'. 10188 * The type representing the type 'string'.
9591 */ 10189 */
9592 InterfaceType _stringType; 10190 InterfaceType _stringType;
9593 10191
9594 /** 10192 /**
9595 * Initialize a newly created constant verifier. 10193 * Initialize a newly created constant verifier.
10194 *
9596 * @param errorReporter the error reporter by which errors will be reported 10195 * @param errorReporter the error reporter by which errors will be reported
9597 */ 10196 */
9598 ConstantVerifier(ErrorReporter errorReporter, TypeProvider typeProvider) { 10197 ConstantVerifier(ErrorReporter errorReporter, TypeProvider typeProvider) {
9599 this._errorReporter = errorReporter; 10198 this._errorReporter = errorReporter;
9600 this._boolType = typeProvider.boolType; 10199 this._boolType = typeProvider.boolType;
9601 this._intType = typeProvider.intType; 10200 this._intType = typeProvider.intType;
9602 this._numType = typeProvider.numType; 10201 this._numType = typeProvider.numType;
9603 this._stringType = typeProvider.stringType; 10202 this._stringType = typeProvider.stringType;
9604 } 10203 }
9605 Object visitConstructorDeclaration(ConstructorDeclaration node) { 10204 Object visitConstructorDeclaration(ConstructorDeclaration node) {
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
9690 reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CON STANT_VALUE); 10289 reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CON STANT_VALUE);
9691 } 10290 }
9692 } 10291 }
9693 return null; 10292 return null;
9694 } 10293 }
9695 10294
9696 /** 10295 /**
9697 * Return `true` if the given value is the result of evaluating an expression whose value is 10296 * Return `true` if the given value is the result of evaluating an expression whose value is
9698 * a valid key in a const map literal. Keys in const map literals must be eith er a string, number, 10297 * a valid key in a const map literal. Keys in const map literals must be eith er a string, number,
9699 * boolean, list, map, or null. 10298 * boolean, list, map, or null.
10299 *
9700 * @param value 10300 * @param value
9701 * @return `true` if the given value is a valid key in a const map literal 10301 * @return `true` if the given value is a valid key in a const map literal
9702 */ 10302 */
9703 bool isValidConstMapKey(Object value) => true; 10303 bool isValidConstMapKey(Object value) => true;
9704 10304
9705 /** 10305 /**
9706 * If the given result represents one or more errors, report those errors. Exc ept for special 10306 * If the given result represents one or more errors, report those errors. Exc ept for special
9707 * cases, use the given error code rather than the one reported in the error. 10307 * cases, use the given error code rather than the one reported in the error.
10308 *
9708 * @param result the result containing any errors that need to be reported 10309 * @param result the result containing any errors that need to be reported
9709 * @param errorCode the error code to be used if the result represents an erro r 10310 * @param errorCode the error code to be used if the result represents an erro r
9710 */ 10311 */
9711 void reportErrors(EvaluationResultImpl result, ErrorCode errorCode2) { 10312 void reportErrors(EvaluationResultImpl result, ErrorCode errorCode2) {
9712 if (result is ErrorResult) { 10313 if (result is ErrorResult) {
9713 for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) { 10314 for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
9714 ErrorCode dataErrorCode = data.errorCode; 10315 ErrorCode dataErrorCode = data.errorCode;
9715 if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCE PTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM _STRING) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identic al(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) { 10316 if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCE PTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRIN G) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || ide ntical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identical(dat aErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) {
9716 _errorReporter.reportError2(dataErrorCode, data.node, []); 10317 _errorReporter.reportError2(dataErrorCode, data.node, []);
9717 } else { 10318 } else {
9718 _errorReporter.reportError2(errorCode2, data.node, []); 10319 _errorReporter.reportError2(errorCode2, data.node, []);
9719 } 10320 }
9720 } 10321 }
9721 } 10322 }
9722 } 10323 }
9723 10324
9724 /** 10325 /**
9725 * Validate that the given expression is a compile time constant. Return the v alue of the compile 10326 * Validate that the given expression is a compile time constant. Return the v alue of the compile
9726 * time constant, or `null` if the expression is not a compile time constant. 10327 * time constant, or `null` if the expression is not a compile time constant.
10328 *
9727 * @param expression the expression to be validated 10329 * @param expression the expression to be validated
9728 * @param errorCode the error code to be used if the expression is not a compi le time constant 10330 * @param errorCode the error code to be used if the expression is not a compi le time constant
9729 * @return the value of the compile time constant 10331 * @return the value of the compile time constant
9730 */ 10332 */
9731 EvaluationResultImpl validate(Expression expression, ErrorCode errorCode) { 10333 EvaluationResultImpl validate(Expression expression, ErrorCode errorCode) {
9732 EvaluationResultImpl result = expression.accept(new ConstantVisitor()); 10334 EvaluationResultImpl result = expression.accept(new ConstantVisitor());
9733 reportErrors(result, errorCode); 10335 reportErrors(result, errorCode);
9734 return result; 10336 return result;
9735 } 10337 }
9736 10338
9737 /** 10339 /**
9738 * Validate that if the passed instance creation is 'const' then all its argum ents are constant 10340 * Validate that if the passed instance creation is 'const' then all its argum ents are constant
9739 * expressions. 10341 * expressions.
10342 *
9740 * @param node the instance creation evaluate 10343 * @param node the instance creation evaluate
9741 */ 10344 */
9742 void validateConstantArguments(InstanceCreationExpression node) { 10345 void validateConstantArguments(InstanceCreationExpression node) {
9743 if (!node.isConst) { 10346 if (!node.isConst) {
9744 return; 10347 return;
9745 } 10348 }
9746 ArgumentList argumentList = node.argumentList; 10349 ArgumentList argumentList = node.argumentList;
9747 if (argumentList == null) { 10350 if (argumentList == null) {
9748 return; 10351 return;
9749 } 10352 }
9750 for (Expression argument in argumentList.arguments) { 10353 for (Expression argument in argumentList.arguments) {
9751 if (argument is NamedExpression) { 10354 if (argument is NamedExpression) {
9752 argument = ((argument as NamedExpression)).expression; 10355 argument = ((argument as NamedExpression)).expression;
9753 } 10356 }
9754 validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT); 10357 validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
9755 } 10358 }
9756 } 10359 }
9757 10360
9758 /** 10361 /**
9759 * Validate that the default value associated with each of the parameters in t he given list is a 10362 * Validate that the default value associated with each of the parameters in t he given list is a
9760 * compile time constant. 10363 * compile time constant.
10364 *
9761 * @param parameters the list of parameters to be validated 10365 * @param parameters the list of parameters to be validated
9762 */ 10366 */
9763 void validateDefaultValues(FormalParameterList parameters2) { 10367 void validateDefaultValues(FormalParameterList parameters2) {
9764 if (parameters2 == null) { 10368 if (parameters2 == null) {
9765 return; 10369 return;
9766 } 10370 }
9767 for (FormalParameter parameter in parameters2.parameters) { 10371 for (FormalParameter parameter in parameters2.parameters) {
9768 if (parameter is DefaultFormalParameter) { 10372 if (parameter is DefaultFormalParameter) {
9769 DefaultFormalParameter defaultParameter = parameter as DefaultFormalPara meter; 10373 DefaultFormalParameter defaultParameter = parameter as DefaultFormalPara meter;
9770 Expression defaultValue = defaultParameter.defaultValue; 10374 Expression defaultValue = defaultParameter.defaultValue;
9771 if (defaultValue != null) { 10375 if (defaultValue != null) {
9772 EvaluationResultImpl result = validate(defaultValue, CompileTimeErrorC ode.NON_CONSTANT_DEFAULT_VALUE); 10376 EvaluationResultImpl result = validate(defaultValue, CompileTimeErrorC ode.NON_CONSTANT_DEFAULT_VALUE);
9773 VariableElementImpl element = parameter.element as VariableElementImpl ; 10377 VariableElementImpl element = parameter.element as VariableElementImpl ;
9774 element.evaluationResult = result; 10378 element.evaluationResult = result;
9775 } 10379 }
9776 } 10380 }
9777 } 10381 }
9778 } 10382 }
9779 10383
9780 /** 10384 /**
9781 * Validates that the given expression is a compile time constant. 10385 * Validates that the given expression is a compile time constant.
10386 *
9782 * @param parameterElements the elements of parameters of constant constructor , they are 10387 * @param parameterElements the elements of parameters of constant constructor , they are
9783 * considered as a valid potentially constant expressions 10388 * considered as a valid potentially constant expressions
9784 * @param expression the expression to validate 10389 * @param expression the expression to validate
9785 */ 10390 */
9786 void validateInitializerExpression(List<ParameterElement> parameterElements, E xpression expression) { 10391 void validateInitializerExpression(List<ParameterElement> parameterElements, E xpression expression) {
9787 EvaluationResultImpl result = expression.accept(new ConstantVisitor_9(this, parameterElements)); 10392 EvaluationResultImpl result = expression.accept(new ConstantVisitor_10(this, parameterElements));
9788 reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER) ; 10393 reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER) ;
9789 } 10394 }
9790 10395
9791 /** 10396 /**
9792 * Validates that all of the arguments of a constructor initializer are compil e time constants. 10397 * Validates that all of the arguments of a constructor initializer are compil e time constants.
10398 *
9793 * @param parameterElements the elements of parameters of constant constructor , they are 10399 * @param parameterElements the elements of parameters of constant constructor , they are
9794 * considered as a valid potentially constant expressions 10400 * considered as a valid potentially constant expressions
9795 * @param argumentList the argument list to validate 10401 * @param argumentList the argument list to validate
9796 */ 10402 */
9797 void validateInitializerInvocationArguments(List<ParameterElement> parameterEl ements, ArgumentList argumentList) { 10403 void validateInitializerInvocationArguments(List<ParameterElement> parameterEl ements, ArgumentList argumentList) {
9798 if (argumentList == null) { 10404 if (argumentList == null) {
9799 return; 10405 return;
9800 } 10406 }
9801 for (Expression argument in argumentList.arguments) { 10407 for (Expression argument in argumentList.arguments) {
9802 validateInitializerExpression(parameterElements, argument); 10408 validateInitializerExpression(parameterElements, argument);
9803 } 10409 }
9804 } 10410 }
9805 10411
9806 /** 10412 /**
9807 * Validates that the expressions of the given initializers (of a constant con structor) are all 10413 * Validates that the expressions of the given initializers (of a constant con structor) are all
9808 * compile time constants. 10414 * compile time constants.
10415 *
9809 * @param constructor the constant constructor declaration to validate 10416 * @param constructor the constant constructor declaration to validate
9810 */ 10417 */
9811 void validateInitializers(ConstructorDeclaration constructor) { 10418 void validateInitializers(ConstructorDeclaration constructor) {
9812 List<ParameterElement> parameterElements = constructor.parameters.elements; 10419 List<ParameterElement> parameterElements = constructor.parameters.elements;
9813 NodeList<ConstructorInitializer> initializers = constructor.initializers; 10420 NodeList<ConstructorInitializer> initializers = constructor.initializers;
9814 for (ConstructorInitializer initializer in initializers) { 10421 for (ConstructorInitializer initializer in initializers) {
9815 if (initializer is ConstructorFieldInitializer) { 10422 if (initializer is ConstructorFieldInitializer) {
9816 ConstructorFieldInitializer fieldInitializer = initializer as Constructo rFieldInitializer; 10423 ConstructorFieldInitializer fieldInitializer = initializer as Constructo rFieldInitializer;
9817 validateInitializerExpression(parameterElements, fieldInitializer.expres sion); 10424 validateInitializerExpression(parameterElements, fieldInitializer.expres sion);
9818 } 10425 }
9819 if (initializer is RedirectingConstructorInvocation) { 10426 if (initializer is RedirectingConstructorInvocation) {
9820 RedirectingConstructorInvocation invocation = initializer as Redirecting ConstructorInvocation; 10427 RedirectingConstructorInvocation invocation = initializer as Redirecting ConstructorInvocation;
9821 validateInitializerInvocationArguments(parameterElements, invocation.arg umentList); 10428 validateInitializerInvocationArguments(parameterElements, invocation.arg umentList);
9822 } 10429 }
9823 if (initializer is SuperConstructorInvocation) { 10430 if (initializer is SuperConstructorInvocation) {
9824 SuperConstructorInvocation invocation = initializer as SuperConstructorI nvocation; 10431 SuperConstructorInvocation invocation = initializer as SuperConstructorI nvocation;
9825 validateInitializerInvocationArguments(parameterElements, invocation.arg umentList); 10432 validateInitializerInvocationArguments(parameterElements, invocation.arg umentList);
9826 } 10433 }
9827 } 10434 }
9828 } 10435 }
9829 } 10436 }
9830 class ConstantVisitor_9 extends ConstantVisitor { 10437 class ConstantVisitor_10 extends ConstantVisitor {
9831 final ConstantVerifier ConstantVerifier_this; 10438 final ConstantVerifier ConstantVerifier_this;
9832 List<ParameterElement> parameterElements; 10439 List<ParameterElement> parameterElements;
9833 ConstantVisitor_9(this.ConstantVerifier_this, this.parameterElements) : super( ); 10440 ConstantVisitor_10(this.ConstantVerifier_this, this.parameterElements) : super ();
9834 EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) { 10441 EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
9835 Element element = node.element; 10442 Element element = node.element;
9836 for (ParameterElement parameterElement in parameterElements) { 10443 for (ParameterElement parameterElement in parameterElements) {
9837 if (identical(parameterElement, element) && parameterElement != null) { 10444 if (identical(parameterElement, element) && parameterElement != null) {
9838 Type2 type = parameterElement.type; 10445 Type2 type = parameterElement.type;
9839 if (type != null) { 10446 if (type != null) {
9840 if (type.isDynamic) { 10447 if (type.isDynamic) {
9841 return ValidResult.RESULT_DYNAMIC; 10448 return ValidResult.RESULT_DYNAMIC;
9842 } 10449 }
9843 if (type.isSubtypeOf(ConstantVerifier_this._boolType)) { 10450 if (type.isSubtypeOf(ConstantVerifier_this._boolType)) {
(...skipping 11 matching lines...) Expand all
9855 } 10462 }
9856 return ValidResult.RESULT_OBJECT; 10463 return ValidResult.RESULT_OBJECT;
9857 } 10464 }
9858 } 10465 }
9859 return super.visitSimpleIdentifier(node); 10466 return super.visitSimpleIdentifier(node);
9860 } 10467 }
9861 } 10468 }
9862 /** 10469 /**
9863 * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional 10470 * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
9864 * errors and warnings not covered by the parser and resolver. 10471 * errors and warnings not covered by the parser and resolver.
10472 *
9865 * @coverage dart.engine.resolver 10473 * @coverage dart.engine.resolver
9866 */ 10474 */
9867 class ErrorVerifier extends RecursiveASTVisitor<Object> { 10475 class ErrorVerifier extends RecursiveASTVisitor<Object> {
9868 10476
9869 /** 10477 /**
9870 * Checks if the given expression is the reference to the type. 10478 * Checks if the given expression is the reference to the type.
10479 *
9871 * @param expr the expression to evaluate 10480 * @param expr the expression to evaluate
9872 * @return `true` if the given expression is the reference to the type 10481 * @return `true` if the given expression is the reference to the type
9873 */ 10482 */
9874 static bool isTypeReference(Expression expr) { 10483 static bool isTypeReference(Expression expr) {
9875 if (expr is Identifier) { 10484 if (expr is Identifier) {
9876 Identifier identifier = expr as Identifier; 10485 Identifier identifier = expr as Identifier;
9877 return identifier.element is ClassElement; 10486 return identifier.element is ClassElement;
9878 } 10487 }
9879 return false; 10488 return false;
9880 } 10489 }
(...skipping 23 matching lines...) Expand all
9904 */ 10513 */
9905 InheritanceManager _inheritanceManager; 10514 InheritanceManager _inheritanceManager;
9906 10515
9907 /** 10516 /**
9908 * A flag indicating whether we are running in strict mode. In strict mode, er ror reporting is 10517 * A flag indicating whether we are running in strict mode. In strict mode, er ror reporting is
9909 * based exclusively on the static type information. 10518 * based exclusively on the static type information.
9910 */ 10519 */
9911 bool _strictMode = false; 10520 bool _strictMode = false;
9912 10521
9913 /** 10522 /**
9914 * This is set to `true` iff the visitor is currently visiting children nodes of a[ConstructorDeclaration] and the constructor is 'const'. 10523 * This is set to `true` iff the visitor is currently visiting children nodes of a
10524 * [ConstructorDeclaration] and the constructor is 'const'.
10525 *
9915 * @see #visitConstructorDeclaration(ConstructorDeclaration) 10526 * @see #visitConstructorDeclaration(ConstructorDeclaration)
9916 */ 10527 */
9917 bool _isEnclosingConstructorConst = false; 10528 bool _isEnclosingConstructorConst = false;
9918 10529
9919 /** 10530 /**
9920 * This is set to `true` iff the visitor is currently visiting children nodes of a[CatchClause]. 10531 * This is set to `true` iff the visitor is currently visiting children nodes of a
10532 * [CatchClause].
10533 *
9921 * @see #visitCatchClause(CatchClause) 10534 * @see #visitCatchClause(CatchClause)
9922 */ 10535 */
9923 bool _isInCatchClause = false; 10536 bool _isInCatchClause = false;
9924 10537
9925 /** 10538 /**
9926 * This is set to `true` iff the visitor is currently visiting a[ConstructorIn itializer]. 10539 * This is set to `true` iff the visitor is currently visiting an instance var iable
10540 * declaration.
10541 */
10542 bool _isInInstanceVariableDeclaration = false;
10543
10544 /**
10545 * This is set to `true` iff the visitor is currently visiting an instance var iable
10546 * initializer.
10547 */
10548 bool _isInInstanceVariableInitializer = false;
10549
10550 /**
10551 * This is set to `true` iff the visitor is currently visiting a
10552 * [ConstructorInitializer].
9927 */ 10553 */
9928 bool _isInConstructorInitializer = false; 10554 bool _isInConstructorInitializer = false;
9929 10555
9930 /** 10556 /**
10557 * This is set to `true` iff the visitor is currently visiting a static method .
10558 */
10559 bool _isInStaticMethod = false;
10560
10561 /**
9931 * This is set to `true` iff the visitor is currently visiting code in the SDK . 10562 * This is set to `true` iff the visitor is currently visiting code in the SDK .
9932 */ 10563 */
9933 bool _isInSystemLibrary = false; 10564 bool _isInSystemLibrary = false;
9934 10565
9935 /** 10566 /**
9936 * The class containing the AST nodes being visited, or `null` if we are not i n the scope of 10567 * The class containing the AST nodes being visited, or `null` if we are not i n the scope of
9937 * a class. 10568 * a class.
9938 */ 10569 */
9939 ClassElement _enclosingClass; 10570 ClassElement _enclosingClass;
9940 10571
9941 /** 10572 /**
9942 * The method or function that we are currently visiting, or `null` if we are not inside a 10573 * The method or function that we are currently visiting, or `null` if we are not inside a
9943 * method or function. 10574 * method or function.
9944 */ 10575 */
9945 ExecutableElement _enclosingFunction; 10576 ExecutableElement _enclosingFunction;
9946 10577
9947 /** 10578 /**
9948 * This map is initialized when visiting the contents of a class declaration. If the visitor is 10579 * This map is initialized when visiting the contents of a class declaration. If the visitor is
9949 * not in an enclosing class declaration, then the map is set to `null`. 10580 * not in an enclosing class declaration, then the map is set to `null`.
9950 * 10581 *
9951 * When set the map maps the set of [FieldElement]s in the class to an[INIT_ST ATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*</code> 10582 * When set the map maps the set of [FieldElement]s in the class to an
10583 * [INIT_STATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*< /code>
9952 * methods, specifically [checkForAllFinalInitializedErrorCodes], 10584 * methods, specifically [checkForAllFinalInitializedErrorCodes],
9953 * can make a copy of the map to compute error code states. <code>checkFor*</c ode> methods should 10585 * can make a copy of the map to compute error code states. <code>checkFor*</c ode> methods should
9954 * only ever make a copy, or read from this map after it has been set in[visit ClassDeclaration]. 10586 * only ever make a copy, or read from this map after it has been set in
10587 * [visitClassDeclaration].
10588 *
9955 * @see #visitClassDeclaration(ClassDeclaration) 10589 * @see #visitClassDeclaration(ClassDeclaration)
9956 * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration) 10590 * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
9957 */ 10591 */
9958 Map<FieldElement, INIT_STATE> _initialFieldElementsMap; 10592 Map<FieldElement, INIT_STATE> _initialFieldElementsMap;
9959 10593
9960 /** 10594 /**
9961 * A table mapping name of the library to the export directive which export th is library. 10595 * A table mapping name of the library to the export directive which export th is library.
9962 */ 10596 */
9963 Map<String, LibraryElement> _nameToExportElement = new Map<String, LibraryElem ent>(); 10597 Map<String, LibraryElement> _nameToExportElement = new Map<String, LibraryElem ent>();
9964 10598
9965 /** 10599 /**
9966 * A table mapping name of the library to the import directive which import th is library. 10600 * A table mapping name of the library to the import directive which import th is library.
9967 */ 10601 */
9968 Map<String, LibraryElement> _nameToImportElement = new Map<String, LibraryElem ent>(); 10602 Map<String, LibraryElement> _nameToImportElement = new Map<String, LibraryElem ent>();
9969 10603
9970 /** 10604 /**
9971 * A table mapping names to the export elements exported them. 10605 * A table mapping names to the export elements exported them.
9972 */ 10606 */
9973 Map<String, ExportElement> _exportedNames = new Map<String, ExportElement>(); 10607 Map<String, ExportElement> _exportedNames = new Map<String, ExportElement>();
9974 10608
9975 /** 10609 /**
9976 * A set of the names of the variable initializers we are visiting now. 10610 * A set of the names of the variable initializers we are visiting now.
9977 */ 10611 */
9978 Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String >(); 10612 Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String >();
9979 10613
9980 /** 10614 /**
9981 * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and[CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes. 10615 * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
10616 * [CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
9982 */ 10617 */
9983 List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT; 10618 List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
9984 ErrorVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, Type Provider typeProvider, InheritanceManager inheritanceManager) { 10619 ErrorVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, Type Provider typeProvider, InheritanceManager inheritanceManager) {
9985 this._errorReporter = errorReporter; 10620 this._errorReporter = errorReporter;
9986 this._currentLibrary = currentLibrary; 10621 this._currentLibrary = currentLibrary;
9987 this._isInSystemLibrary = currentLibrary.source.isInSystemLibrary; 10622 this._isInSystemLibrary = currentLibrary.source.isInSystemLibrary;
9988 this._typeProvider = typeProvider; 10623 this._typeProvider = typeProvider;
9989 this._inheritanceManager = inheritanceManager; 10624 this._inheritanceManager = inheritanceManager;
9990 _strictMode = currentLibrary.context.analysisOptions.strictMode; 10625 _strictMode = currentLibrary.context.analysisOptions.strictMode;
9991 _isEnclosingConstructorConst = false; 10626 _isEnclosingConstructorConst = false;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
10051 if (classElement != null) { 10686 if (classElement != null) {
10052 List<FieldElement> fieldElements = classElement.fields; 10687 List<FieldElement> fieldElements = classElement.fields;
10053 _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>(); 10688 _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
10054 for (FieldElement fieldElement in fieldElements) { 10689 for (FieldElement fieldElement in fieldElements) {
10055 if (!fieldElement.isSynthetic) { 10690 if (!fieldElement.isSynthetic) {
10056 _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION; 10691 _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
10057 } 10692 }
10058 } 10693 }
10059 } 10694 }
10060 checkForFinalNotInitialized(node); 10695 checkForFinalNotInitialized(node);
10696 checkForDuplicateDefinitionInheritance();
10697 checkForConflictingGetterAndMethod();
10061 return super.visitClassDeclaration(node); 10698 return super.visitClassDeclaration(node);
10062 } finally { 10699 } finally {
10063 _initialFieldElementsMap = null; 10700 _initialFieldElementsMap = null;
10064 _enclosingClass = outerClass; 10701 _enclosingClass = outerClass;
10065 } 10702 }
10066 } 10703 }
10067 Object visitClassTypeAlias(ClassTypeAlias node) { 10704 Object visitClassTypeAlias(ClassTypeAlias node) {
10068 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDE NTIFIER_AS_TYPEDEF_NAME); 10705 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDE NTIFIER_AS_TYPEDEF_NAME);
10069 checkForAllMixinErrorCodes(node.withClause); 10706 checkForAllMixinErrorCodes(node.withClause);
10070 ClassElement outerClassElement = _enclosingClass; 10707 ClassElement outerClassElement = _enclosingClass;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
10130 checkForReturnOfInvalidType(node.expression, expectedReturnType); 10767 checkForReturnOfInvalidType(node.expression, expectedReturnType);
10131 return super.visitExpressionFunctionBody(node); 10768 return super.visitExpressionFunctionBody(node);
10132 } 10769 }
10133 Object visitFieldDeclaration(FieldDeclaration node) { 10770 Object visitFieldDeclaration(FieldDeclaration node) {
10134 if (!node.isStatic) { 10771 if (!node.isStatic) {
10135 VariableDeclarationList variables = node.fields; 10772 VariableDeclarationList variables = node.fields;
10136 if (variables.isConst) { 10773 if (variables.isConst) {
10137 _errorReporter.reportError4(CompileTimeErrorCode.CONST_INSTANCE_FIELD, v ariables.keyword, []); 10774 _errorReporter.reportError4(CompileTimeErrorCode.CONST_INSTANCE_FIELD, v ariables.keyword, []);
10138 } 10775 }
10139 } 10776 }
10140 return super.visitFieldDeclaration(node); 10777 _isInInstanceVariableDeclaration = !node.isStatic;
10778 try {
10779 return super.visitFieldDeclaration(node);
10780 } finally {
10781 _isInInstanceVariableDeclaration = false;
10782 }
10141 } 10783 }
10142 Object visitFieldFormalParameter(FieldFormalParameter node) { 10784 Object visitFieldFormalParameter(FieldFormalParameter node) {
10143 checkForConstFormalParameter(node); 10785 checkForConstFormalParameter(node);
10144 checkForFieldInitializingFormalRedirectingConstructor(node); 10786 checkForFieldInitializingFormalRedirectingConstructor(node);
10145 return super.visitFieldFormalParameter(node); 10787 return super.visitFieldFormalParameter(node);
10146 } 10788 }
10147 Object visitFunctionDeclaration(FunctionDeclaration node) { 10789 Object visitFunctionDeclaration(FunctionDeclaration node) {
10148 ExecutableElement outerFunction = _enclosingFunction; 10790 ExecutableElement outerFunction = _enclosingFunction;
10149 try { 10791 try {
10150 SimpleIdentifier identifier = node.name; 10792 SimpleIdentifier identifier = node.name;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
10207 if (type is InterfaceType) { 10849 if (type is InterfaceType) {
10208 InterfaceType interfaceType = type as InterfaceType; 10850 InterfaceType interfaceType = type as InterfaceType;
10209 checkForConstOrNewWithAbstractClass(node, typeName, interfaceType); 10851 checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
10210 if (node.isConst) { 10852 if (node.isConst) {
10211 checkForConstWithNonConst(node); 10853 checkForConstWithNonConst(node);
10212 checkForConstWithUndefinedConstructor(node); 10854 checkForConstWithUndefinedConstructor(node);
10213 checkForConstWithTypeParameters(node); 10855 checkForConstWithTypeParameters(node);
10214 } else { 10856 } else {
10215 checkForNewWithUndefinedConstructor(node); 10857 checkForNewWithUndefinedConstructor(node);
10216 } 10858 }
10217 checkForTypeArgumentNotMatchingBounds(node, constructorName.element, typeN ame);
10218 } 10859 }
10219 return super.visitInstanceCreationExpression(node); 10860 return super.visitInstanceCreationExpression(node);
10220 } 10861 }
10221 Object visitListLiteral(ListLiteral node) { 10862 Object visitListLiteral(ListLiteral node) {
10222 if (node.modifier != null) { 10863 if (node.modifier != null) {
10223 TypeArgumentList typeArguments = node.typeArguments; 10864 TypeArgumentList typeArguments = node.typeArguments;
10224 if (typeArguments != null) { 10865 if (typeArguments != null) {
10225 NodeList<TypeName> arguments = typeArguments.arguments; 10866 NodeList<TypeName> arguments = typeArguments.arguments;
10226 if (arguments.length != 0) { 10867 if (arguments.length != 0) {
10227 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST); 10868 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
(...skipping 12 matching lines...) Expand all
10240 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP); 10881 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
10241 } 10882 }
10242 } 10883 }
10243 } 10884 }
10244 checkForNonConstMapAsExpressionStatement(node); 10885 checkForNonConstMapAsExpressionStatement(node);
10245 return super.visitMapLiteral(node); 10886 return super.visitMapLiteral(node);
10246 } 10887 }
10247 Object visitMethodDeclaration(MethodDeclaration node) { 10888 Object visitMethodDeclaration(MethodDeclaration node) {
10248 ExecutableElement previousFunction = _enclosingFunction; 10889 ExecutableElement previousFunction = _enclosingFunction;
10249 try { 10890 try {
10891 _isInStaticMethod = node.isStatic;
10250 _enclosingFunction = node.element; 10892 _enclosingFunction = node.element;
10251 SimpleIdentifier identifier = node.name; 10893 SimpleIdentifier identifier = node.name;
10252 String methoName = ""; 10894 String methodName = "";
10253 if (identifier != null) { 10895 if (identifier != null) {
10254 methoName = identifier.name; 10896 methodName = identifier.name;
10255 } 10897 }
10256 if (node.isSetter || node.isGetter) { 10898 if (node.isSetter || node.isGetter) {
10257 checkForMismatchedAccessorTypes(node, methoName); 10899 checkForMismatchedAccessorTypes(node, methodName);
10258 checkForConflictingInstanceGetterAndSuperclassMember(node); 10900 checkForConflictingInstanceGetterAndSuperclassMember(node);
10259 } 10901 }
10260 if (node.isGetter) { 10902 if (node.isGetter) {
10261 checkForConflictingStaticGetterAndInstanceSetter(node); 10903 checkForConflictingStaticGetterAndInstanceSetter(node);
10262 } else if (node.isSetter) { 10904 } else if (node.isSetter) {
10263 checkForWrongNumberOfParametersForSetter(node.name, node.parameters); 10905 checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
10264 checkForNonVoidReturnTypeForSetter(node.returnType); 10906 checkForNonVoidReturnTypeForSetter(node.returnType);
10265 checkForConflictingStaticSetterAndInstanceMember(node); 10907 checkForConflictingStaticSetterAndInstanceMember(node);
10266 } else if (node.isOperator) { 10908 } else if (node.isOperator) {
10267 checkForOptionalParameterInOperator(node); 10909 checkForOptionalParameterInOperator(node);
10268 checkForWrongNumberOfParametersForOperator(node); 10910 checkForWrongNumberOfParametersForOperator(node);
10269 checkForNonVoidReturnTypeForOperator(node); 10911 checkForNonVoidReturnTypeForOperator(node);
10270 } 10912 }
10271 checkForConcreteClassWithAbstractMember(node); 10913 checkForConcreteClassWithAbstractMember(node);
10272 checkForAllInvalidOverrideErrorCodes(node); 10914 checkForAllInvalidOverrideErrorCodes(node);
10273 return super.visitMethodDeclaration(node); 10915 return super.visitMethodDeclaration(node);
10274 } finally { 10916 } finally {
10275 _enclosingFunction = previousFunction; 10917 _enclosingFunction = previousFunction;
10918 _isInStaticMethod = false;
10276 } 10919 }
10277 } 10920 }
10278 Object visitMethodInvocation(MethodInvocation node) { 10921 Object visitMethodInvocation(MethodInvocation node) {
10279 checkForStaticAccessToInstanceMember(node.target, node.methodName); 10922 checkForStaticAccessToInstanceMember(node.target, node.methodName);
10280 return super.visitMethodInvocation(node); 10923 return super.visitMethodInvocation(node);
10281 } 10924 }
10282 Object visitNativeFunctionBody(NativeFunctionBody node) { 10925 Object visitNativeFunctionBody(NativeFunctionBody node) {
10283 checkForNativeFunctionBodyInNonSDKCode(node); 10926 checkForNativeFunctionBodyInNonSDKCode(node);
10284 return super.visitNativeFunctionBody(node); 10927 return super.visitNativeFunctionBody(node);
10285 } 10928 }
10286 Object visitPostfixExpression(PostfixExpression node) { 10929 Object visitPostfixExpression(PostfixExpression node) {
10287 checkForAssignmentToFinal2(node.operand); 10930 checkForAssignmentToFinal2(node.operand);
10288 return super.visitPostfixExpression(node); 10931 return super.visitPostfixExpression(node);
10289 } 10932 }
10290 Object visitPrefixedIdentifier(PrefixedIdentifier node) { 10933 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
10291 checkForStaticAccessToInstanceMember(node.prefix, node.identifier); 10934 if (node.parent is! Annotation) {
10935 checkForStaticAccessToInstanceMember(node.prefix, node.identifier);
10936 }
10292 return super.visitPrefixedIdentifier(node); 10937 return super.visitPrefixedIdentifier(node);
10293 } 10938 }
10294 Object visitPrefixExpression(PrefixExpression node) { 10939 Object visitPrefixExpression(PrefixExpression node) {
10295 if (node.operator.type.isIncrementOperator) { 10940 if (node.operator.type.isIncrementOperator) {
10296 checkForAssignmentToFinal2(node.operand); 10941 checkForAssignmentToFinal2(node.operand);
10297 } 10942 }
10298 return super.visitPrefixExpression(node); 10943 return super.visitPrefixExpression(node);
10299 } 10944 }
10300 Object visitPropertyAccess(PropertyAccess node) { 10945 Object visitPropertyAccess(PropertyAccess node) {
10301 checkForStaticAccessToInstanceMember(node.target, node.propertyName); 10946 checkForStaticAccessToInstanceMember(node.target, node.propertyName);
(...skipping 26 matching lines...) Expand all
10328 } 10973 }
10329 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { 10974 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
10330 _isInConstructorInitializer = true; 10975 _isInConstructorInitializer = true;
10331 try { 10976 try {
10332 return super.visitSuperConstructorInvocation(node); 10977 return super.visitSuperConstructorInvocation(node);
10333 } finally { 10978 } finally {
10334 _isInConstructorInitializer = false; 10979 _isInConstructorInitializer = false;
10335 } 10980 }
10336 } 10981 }
10337 Object visitSwitchStatement(SwitchStatement node) { 10982 Object visitSwitchStatement(SwitchStatement node) {
10338 checkForCaseExpressionTypeImplementsEquals(node);
10339 checkForInconsistentCaseExpressionTypes(node); 10983 checkForInconsistentCaseExpressionTypes(node);
10340 checkForSwitchExpressionNotAssignable(node); 10984 checkForSwitchExpressionNotAssignable(node);
10341 checkForCaseBlocksNotTerminated(node); 10985 checkForCaseBlocksNotTerminated(node);
10342 return super.visitSwitchStatement(node); 10986 return super.visitSwitchStatement(node);
10343 } 10987 }
10344 Object visitThisExpression(ThisExpression node) { 10988 Object visitThisExpression(ThisExpression node) {
10345 checkForInvalidReferenceToThis(node); 10989 checkForInvalidReferenceToThis(node);
10346 return super.visitThisExpression(node); 10990 return super.visitThisExpression(node);
10347 } 10991 }
10348 Object visitThrowExpression(ThrowExpression node) { 10992 Object visitThrowExpression(ThrowExpression node) {
10349 checkForConstEvalThrowsException(node); 10993 checkForConstEvalThrowsException(node);
10350 return super.visitThrowExpression(node); 10994 return super.visitThrowExpression(node);
10351 } 10995 }
10352 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { 10996 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
10353 checkForFinalNotInitialized2(node.variables); 10997 checkForFinalNotInitialized2(node.variables);
10354 return super.visitTopLevelVariableDeclaration(node); 10998 return super.visitTopLevelVariableDeclaration(node);
10355 } 10999 }
11000 Object visitTypeName(TypeName node) {
11001 checkForTypeArgumentNotMatchingBounds(node);
11002 return super.visitTypeName(node);
11003 }
10356 Object visitTypeParameter(TypeParameter node) { 11004 Object visitTypeParameter(TypeParameter node) {
10357 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDE NTIFIER_AS_TYPE_VARIABLE_NAME); 11005 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDE NTIFIER_AS_TYPE_VARIABLE_NAME);
10358 return super.visitTypeParameter(node); 11006 return super.visitTypeParameter(node);
10359 } 11007 }
10360 Object visitVariableDeclaration(VariableDeclaration node) { 11008 Object visitVariableDeclaration(VariableDeclaration node) {
10361 SimpleIdentifier nameNode = node.name; 11009 SimpleIdentifier nameNode = node.name;
10362 Expression initializerNode = node.initializer; 11010 Expression initializerNode = node.initializer;
10363 checkForInvalidAssignment2(nameNode, initializerNode); 11011 checkForInvalidAssignment2(nameNode, initializerNode);
10364 nameNode.accept(this); 11012 nameNode.accept(this);
10365 String name = nameNode.name; 11013 String name = nameNode.name;
10366 javaSetAdd(_namesForReferenceToDeclaredVariableInInitializer, name); 11014 javaSetAdd(_namesForReferenceToDeclaredVariableInInitializer, name);
11015 _isInInstanceVariableInitializer = _isInInstanceVariableDeclaration;
10367 try { 11016 try {
10368 if (initializerNode != null) { 11017 if (initializerNode != null) {
10369 initializerNode.accept(this); 11018 initializerNode.accept(this);
10370 } 11019 }
10371 } finally { 11020 } finally {
11021 _isInInstanceVariableInitializer = false;
10372 _namesForReferenceToDeclaredVariableInInitializer.remove(name); 11022 _namesForReferenceToDeclaredVariableInInitializer.remove(name);
10373 } 11023 }
10374 return null; 11024 return null;
10375 } 11025 }
10376 Object visitVariableDeclarationList(VariableDeclarationList node) { 11026 Object visitVariableDeclarationList(VariableDeclarationList node) {
10377 checkForBuiltInIdentifierAsName2(node); 11027 checkForBuiltInIdentifierAsName2(node);
10378 return super.visitVariableDeclarationList(node); 11028 return super.visitVariableDeclarationList(node);
10379 } 11029 }
10380 Object visitVariableDeclarationStatement(VariableDeclarationStatement node) { 11030 Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
10381 checkForFinalNotInitialized2(node.variables); 11031 checkForFinalNotInitialized2(node.variables);
10382 return super.visitVariableDeclarationStatement(node); 11032 return super.visitVariableDeclarationStatement(node);
10383 } 11033 }
10384 Object visitWhileStatement(WhileStatement node) { 11034 Object visitWhileStatement(WhileStatement node) {
10385 checkForNonBoolCondition(node.condition); 11035 checkForNonBoolCondition(node.condition);
10386 return super.visitWhileStatement(node); 11036 return super.visitWhileStatement(node);
10387 } 11037 }
10388 11038
10389 /** 11039 /**
10390 * This verifies that the passed constructor declaration does not violate any of the error codes 11040 * This verifies that the passed constructor declaration does not violate any of the error codes
10391 * relating to the initialization of fields in the enclosing class. 11041 * relating to the initialization of fields in the enclosing class.
11042 *
10392 * @param node the [ConstructorDeclaration] to evaluate 11043 * @param node the [ConstructorDeclaration] to evaluate
10393 * @return `true` if and only if an error code is generated on the passed node 11044 * @return `true` if and only if an error code is generated on the passed node
10394 * @see #initialFieldElementsMap 11045 * @see #initialFieldElementsMap
10395 * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR 11046 * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
10396 * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES 11047 * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES
10397 */ 11048 */
10398 bool checkForAllFinalInitializedErrorCodes(ConstructorDeclaration node) { 11049 bool checkForAllFinalInitializedErrorCodes(ConstructorDeclaration node) {
10399 if (node.factoryKeyword != null || node.redirectedConstructor != null || nod e.externalKeyword != null) { 11050 if (node.factoryKeyword != null || node.redirectedConstructor != null || nod e.externalKeyword != null) {
10400 return false; 11051 return false;
10401 } 11052 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
10449 foundError = true; 11100 foundError = true;
10450 } 11101 }
10451 } 11102 }
10452 } 11103 }
10453 } 11104 }
10454 return foundError; 11105 return foundError;
10455 } 11106 }
10456 11107
10457 /** 11108 /**
10458 * This checks the passed method declaration against override-error codes. 11109 * This checks the passed method declaration against override-error codes.
11110 *
10459 * @param node the [MethodDeclaration] to evaluate 11111 * @param node the [MethodDeclaration] to evaluate
10460 * @return `true` if and only if an error code is generated on the passed node 11112 * @return `true` if and only if an error code is generated on the passed node
10461 * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC 11113 * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
10462 * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED 11114 * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED
10463 * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL 11115 * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL
10464 * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED 11116 * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED
10465 * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE 11117 * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE
10466 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE 11118 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE
10467 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE 11119 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
10468 * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE 11120 * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
10656 foundError = true; 11308 foundError = true;
10657 } 11309 }
10658 } 11310 }
10659 } 11311 }
10660 } 11312 }
10661 return foundError; 11313 return foundError;
10662 } 11314 }
10663 11315
10664 /** 11316 /**
10665 * This verifies that all classes of the passed 'with' clause are valid. 11317 * This verifies that all classes of the passed 'with' clause are valid.
11318 *
10666 * @param node the 'with' clause to evaluate 11319 * @param node the 'with' clause to evaluate
10667 * @return `true` if and only if an error code is generated on the passed node 11320 * @return `true` if and only if an error code is generated on the passed node
10668 * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR 11321 * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
10669 * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT 11322 * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
10670 * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER 11323 * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
10671 */ 11324 */
10672 bool checkForAllMixinErrorCodes(WithClause withClause) { 11325 bool checkForAllMixinErrorCodes(WithClause withClause) {
10673 if (withClause == null) { 11326 if (withClause == null) {
10674 return false; 11327 return false;
10675 } 11328 }
10676 bool problemReported = false; 11329 bool problemReported = false;
10677 for (TypeName mixinName in withClause.mixinTypes) { 11330 for (TypeName mixinName in withClause.mixinTypes) {
10678 Type2 mixinType = mixinName.type; 11331 Type2 mixinType = mixinName.type;
10679 if (mixinType is! InterfaceType) { 11332 if (mixinType is! InterfaceType) {
10680 continue; 11333 continue;
10681 } 11334 }
10682 ClassElement mixinElement = ((mixinType as InterfaceType)).element; 11335 ClassElement mixinElement = ((mixinType as InterfaceType)).element;
10683 problemReported = javaBooleanOr(problemReported, checkForMixinDeclaresCons tructor(mixinName, mixinElement)); 11336 problemReported = javaBooleanOr(problemReported, checkForMixinDeclaresCons tructor(mixinName, mixinElement));
10684 problemReported = javaBooleanOr(problemReported, checkForMixinInheritsNotF romObject(mixinName, mixinElement)); 11337 problemReported = javaBooleanOr(problemReported, checkForMixinInheritsNotF romObject(mixinName, mixinElement));
10685 problemReported = javaBooleanOr(problemReported, checkForMixinReferencesSu per(mixinName, mixinElement)); 11338 problemReported = javaBooleanOr(problemReported, checkForMixinReferencesSu per(mixinName, mixinElement));
10686 } 11339 }
10687 return problemReported; 11340 return problemReported;
10688 } 11341 }
10689 11342
10690 /** 11343 /**
10691 * This checks error related to the redirected constructors. 11344 * This checks error related to the redirected constructors.
11345 *
10692 * @param node the constructor declaration to evaluate 11346 * @param node the constructor declaration to evaluate
10693 * @return `true` if and only if an error code is generated on the passed node 11347 * @return `true` if and only if an error code is generated on the passed node
10694 * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE 11348 * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
10695 * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE 11349 * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
10696 * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR 11350 * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR
10697 */ 11351 */
10698 bool checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) { 11352 bool checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) {
10699 ConstructorName redirectedNode = node.redirectedConstructor; 11353 ConstructorName redirectedNode = node.redirectedConstructor;
10700 if (redirectedNode == null) { 11354 if (redirectedNode == null) {
10701 return false; 11355 return false;
(...skipping 30 matching lines...) Expand all
10732 /** 11386 /**
10733 * This checks that the return statement of the form <i>return e;</i> is not i n a generative 11387 * This checks that the return statement of the form <i>return e;</i> is not i n a generative
10734 * constructor. 11388 * constructor.
10735 * 11389 *
10736 * This checks that return statements without expressions are not in a generat ive constructor and 11390 * This checks that return statements without expressions are not in a generat ive constructor and
10737 * the return type is not assignable to `null`; that is, we don't have `return ;` if 11391 * the return type is not assignable to `null`; that is, we don't have `return ;` if
10738 * the enclosing method has a return type. 11392 * the enclosing method has a return type.
10739 * 11393 *
10740 * This checks that the return type matches the type of the declared return ty pe in the enclosing 11394 * This checks that the return type matches the type of the declared return ty pe in the enclosing
10741 * method or function. 11395 * method or function.
11396 *
10742 * @param node the return statement to evaluate 11397 * @param node the return statement to evaluate
10743 * @return `true` if and only if an error code is generated on the passed node 11398 * @return `true` if and only if an error code is generated on the passed node
10744 * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR 11399 * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
10745 * @see StaticWarningCode#RETURN_WITHOUT_VALUE 11400 * @see StaticWarningCode#RETURN_WITHOUT_VALUE
10746 * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE 11401 * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
10747 */ 11402 */
10748 bool checkForAllReturnStatementErrorCodes(ReturnStatement node) { 11403 bool checkForAllReturnStatementErrorCodes(ReturnStatement node) {
10749 FunctionType functionType = _enclosingFunction == null ? null : _enclosingFu nction.type; 11404 FunctionType functionType = _enclosingFunction == null ? null : _enclosingFu nction.type;
10750 Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType; 11405 Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
10751 Expression returnExpression = node.expression; 11406 Expression returnExpression = node.expression;
(...skipping 11 matching lines...) Expand all
10763 } 11418 }
10764 _errorReporter.reportError2(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []); 11419 _errorReporter.reportError2(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
10765 return true; 11420 return true;
10766 } 11421 }
10767 return checkForReturnOfInvalidType(returnExpression, expectedReturnType); 11422 return checkForReturnOfInvalidType(returnExpression, expectedReturnType);
10768 } 11423 }
10769 11424
10770 /** 11425 /**
10771 * This verifies that the export namespace of the passed export directive does not export any name 11426 * This verifies that the export namespace of the passed export directive does not export any name
10772 * already exported by other export directive. 11427 * already exported by other export directive.
11428 *
10773 * @param node the export directive node to report problem on 11429 * @param node the export directive node to report problem on
10774 * @return `true` if and only if an error code is generated on the passed node 11430 * @return `true` if and only if an error code is generated on the passed node
10775 * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT 11431 * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
10776 */ 11432 */
10777 bool checkForAmbiguousExport(ExportDirective node) { 11433 bool checkForAmbiguousExport(ExportDirective node) {
10778 if (node.element is! ExportElement) { 11434 if (node.element is! ExportElement) {
10779 return false; 11435 return false;
10780 } 11436 }
10781 ExportElement exportElement = node.element as ExportElement; 11437 ExportElement exportElement = node.element as ExportElement;
10782 LibraryElement exportedLibrary = exportElement.exportedLibrary; 11438 LibraryElement exportedLibrary = exportElement.exportedLibrary;
10783 if (exportedLibrary == null) { 11439 if (exportedLibrary == null) {
10784 return false; 11440 return false;
10785 } 11441 }
10786 Namespace namespace = new NamespaceBuilder().createExportNamespace(exportEle ment); 11442 Namespace namespace = new NamespaceBuilder().createExportNamespace(exportEle ment);
10787 Set<String> newNames = namespace.definedNames.keys.toSet(); 11443 Set<String> newNames = namespace.definedNames.keys.toSet();
10788 for (String name in newNames) { 11444 for (String name in newNames) {
10789 ExportElement prevElement = _exportedNames[name]; 11445 ExportElement prevElement = _exportedNames[name];
10790 if (prevElement != null && prevElement != exportElement) { 11446 if (prevElement != null && prevElement != exportElement) {
10791 _errorReporter.reportError2(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [name, prevElement.exportedLibrary.definingCompilationUnit.displayName, exporte dLibrary.definingCompilationUnit.displayName]); 11447 _errorReporter.reportError2(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [name, prevElement.exportedLibrary.definingCompilationUnit.displayName, exporte dLibrary.definingCompilationUnit.displayName]);
10792 return true; 11448 return true;
10793 } else { 11449 } else {
10794 _exportedNames[name] = exportElement; 11450 _exportedNames[name] = exportElement;
10795 } 11451 }
10796 } 11452 }
10797 return false; 11453 return false;
10798 } 11454 }
10799 11455
10800 /** 11456 /**
10801 * This verifies that the passed argument definition test identifier is a para meter. 11457 * This verifies that the passed argument definition test identifier is a para meter.
11458 *
10802 * @param node the [ArgumentDefinitionTest] to evaluate 11459 * @param node the [ArgumentDefinitionTest] to evaluate
10803 * @return `true` if and only if an error code is generated on the passed node 11460 * @return `true` if and only if an error code is generated on the passed node
10804 * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER 11461 * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER
10805 */ 11462 */
10806 bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) { 11463 bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) {
10807 SimpleIdentifier identifier = node.identifier; 11464 SimpleIdentifier identifier = node.identifier;
10808 Element element = identifier.element; 11465 Element element = identifier.element;
10809 if (element != null && element is! ParameterElement) { 11466 if (element != null && element is! ParameterElement) {
10810 _errorReporter.reportError2(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_ NON_PARAMETER, identifier, [identifier.name]); 11467 _errorReporter.reportError2(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_ NON_PARAMETER, identifier, [identifier.name]);
10811 return true; 11468 return true;
10812 } 11469 }
10813 return false; 11470 return false;
10814 } 11471 }
10815 11472
10816 /** 11473 /**
10817 * This verifies that the passed arguments can be assigned to their correspond ing parameters. 11474 * This verifies that the passed arguments can be assigned to their correspond ing parameters.
11475 *
10818 * @param node the arguments to evaluate 11476 * @param node the arguments to evaluate
10819 * @return `true` if and only if an error code is generated on the passed node 11477 * @return `true` if and only if an error code is generated on the passed node
10820 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE 11478 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
10821 */ 11479 */
10822 bool checkForArgumentTypeNotAssignable(ArgumentList argumentList) { 11480 bool checkForArgumentTypeNotAssignable(ArgumentList argumentList) {
10823 if (argumentList == null) { 11481 if (argumentList == null) {
10824 return false; 11482 return false;
10825 } 11483 }
10826 bool problemReported = false; 11484 bool problemReported = false;
10827 for (Expression argument in argumentList.arguments) { 11485 for (Expression argument in argumentList.arguments) {
10828 problemReported = javaBooleanOr(problemReported, checkForArgumentTypeNotAs signable2(argument)); 11486 problemReported = javaBooleanOr(problemReported, checkForArgumentTypeNotAs signable2(argument));
10829 } 11487 }
10830 return problemReported; 11488 return problemReported;
10831 } 11489 }
10832 11490
10833 /** 11491 /**
10834 * This verifies that the passed argument can be assigned to their correspondi ng parameters. 11492 * This verifies that the passed argument can be assigned to their correspondi ng parameters.
11493 *
10835 * @param node the argument to evaluate 11494 * @param node the argument to evaluate
10836 * @return `true` if and only if an error code is generated on the passed node 11495 * @return `true` if and only if an error code is generated on the passed node
10837 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE 11496 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
10838 */ 11497 */
10839 bool checkForArgumentTypeNotAssignable2(Expression argument) { 11498 bool checkForArgumentTypeNotAssignable2(Expression argument) {
10840 if (argument == null) { 11499 if (argument == null) {
10841 return false; 11500 return false;
10842 } 11501 }
10843 ParameterElement staticParameterElement = argument.staticParameterElement; 11502 ParameterElement staticParameterElement = argument.staticParameterElement;
10844 Type2 staticParameterType = staticParameterElement == null ? null : staticPa rameterElement.type; 11503 Type2 staticParameterType = staticParameterElement == null ? null : staticPa rameterElement.type;
(...skipping 20 matching lines...) Expand all
10865 } 11524 }
10866 if (staticArgumentType.isAssignableTo(staticParameterType) || staticArgument Type.isAssignableTo(propagatedParameterType) || propagatedArgumentType.isAssigna bleTo(staticParameterType) || propagatedArgumentType.isAssignableTo(propagatedPa rameterType)) { 11525 if (staticArgumentType.isAssignableTo(staticParameterType) || staticArgument Type.isAssignableTo(propagatedParameterType) || propagatedArgumentType.isAssigna bleTo(staticParameterType) || propagatedArgumentType.isAssignableTo(propagatedPa rameterType)) {
10867 return false; 11526 return false;
10868 } 11527 }
10869 _errorReporter.reportError2(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, argument, [(propagatedArgumentType == null ? staticArgumentType : propagatedArgu mentType).displayName, (propagatedParameterType == null ? staticParameterType : propagatedParameterType).displayName]); 11528 _errorReporter.reportError2(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, argument, [(propagatedArgumentType == null ? staticArgumentType : propagatedArgu mentType).displayName, (propagatedParameterType == null ? staticParameterType : propagatedParameterType).displayName]);
10870 return true; 11529 return true;
10871 } 11530 }
10872 11531
10873 /** 11532 /**
10874 * This verifies that left hand side of the passed assignment expression is no t final. 11533 * This verifies that left hand side of the passed assignment expression is no t final.
11534 *
10875 * @param node the assignment expression to evaluate 11535 * @param node the assignment expression to evaluate
10876 * @return `true` if and only if an error code is generated on the passed node 11536 * @return `true` if and only if an error code is generated on the passed node
10877 * @see StaticWarningCode#ASSIGNMENT_TO_FINAL 11537 * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
10878 */ 11538 */
10879 bool checkForAssignmentToFinal(AssignmentExpression node) { 11539 bool checkForAssignmentToFinal(AssignmentExpression node) {
10880 Expression leftExpression = node.leftHandSide; 11540 Expression leftExpression = node.leftHandSide;
10881 return checkForAssignmentToFinal2(leftExpression); 11541 return checkForAssignmentToFinal2(leftExpression);
10882 } 11542 }
10883 11543
10884 /** 11544 /**
10885 * This verifies that the passed expression is not final. 11545 * This verifies that the passed expression is not final.
11546 *
10886 * @param node the expression to evaluate 11547 * @param node the expression to evaluate
10887 * @return `true` if and only if an error code is generated on the passed node 11548 * @return `true` if and only if an error code is generated on the passed node
10888 * @see StaticWarningCode#ASSIGNMENT_TO_FINAL 11549 * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
10889 */ 11550 */
10890 bool checkForAssignmentToFinal2(Expression expression) { 11551 bool checkForAssignmentToFinal2(Expression expression) {
10891 Element element = null; 11552 Element element = null;
10892 if (expression is Identifier) { 11553 if (expression is Identifier) {
10893 element = ((expression as Identifier)).element; 11554 element = ((expression as Identifier)).element;
10894 } 11555 }
10895 if (expression is PropertyAccess) { 11556 if (expression is PropertyAccess) {
(...skipping 14 matching lines...) Expand all
10910 return true; 11571 return true;
10911 } 11572 }
10912 return false; 11573 return false;
10913 } 11574 }
10914 return false; 11575 return false;
10915 } 11576 }
10916 11577
10917 /** 11578 /**
10918 * This verifies that the passed identifier is not a keyword, and generates th e passed error code 11579 * This verifies that the passed identifier is not a keyword, and generates th e passed error code
10919 * on the identifier if it is a keyword. 11580 * on the identifier if it is a keyword.
11581 *
10920 * @param identifier the identifier to check to ensure that it is not a keywor d 11582 * @param identifier the identifier to check to ensure that it is not a keywor d
10921 * @param errorCode if the passed identifier is a keyword then this error code is created on the 11583 * @param errorCode if the passed identifier is a keyword then this error code is created on the
10922 * identifier, the error code will be one of[CompileTimeErrorCode#BUILT_IN_IDE NTIFIER_AS_TYPE_NAME],[CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE _NAME] or[CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME] 11584 * identifier, the error code will be one of
11585 * [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME],
11586 * [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME] o r
11587 * [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]
10923 * @return `true` if and only if an error code is generated on the passed node 11588 * @return `true` if and only if an error code is generated on the passed node
10924 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME 11589 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
10925 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME 11590 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME
10926 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME 11591 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
10927 */ 11592 */
10928 bool checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode er rorCode) { 11593 bool checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode er rorCode) {
10929 sc.Token token = identifier.token; 11594 sc.Token token = identifier.token;
10930 if (identical(token.type, sc.TokenType.KEYWORD)) { 11595 if (identical(token.type, sc.TokenType.KEYWORD)) {
10931 _errorReporter.reportError2(errorCode, identifier, [identifier.name]); 11596 _errorReporter.reportError2(errorCode, identifier, [identifier.name]);
10932 return true; 11597 return true;
10933 } 11598 }
10934 return false; 11599 return false;
10935 } 11600 }
10936 11601
10937 /** 11602 /**
10938 * This verifies that the passed variable declaration list does not have a bui lt-in identifier. 11603 * This verifies that the passed variable declaration list does not have a bui lt-in identifier.
11604 *
10939 * @param node the variable declaration list to check 11605 * @param node the variable declaration list to check
10940 * @return `true` if and only if an error code is generated on the passed node 11606 * @return `true` if and only if an error code is generated on the passed node
10941 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE 11607 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE
10942 */ 11608 */
10943 bool checkForBuiltInIdentifierAsName2(VariableDeclarationList node) { 11609 bool checkForBuiltInIdentifierAsName2(VariableDeclarationList node) {
10944 TypeName typeName = node.type; 11610 TypeName typeName = node.type;
10945 if (typeName != null) { 11611 if (typeName != null) {
10946 Identifier identifier = typeName.name; 11612 Identifier identifier = typeName.name;
10947 if (identifier is SimpleIdentifier) { 11613 if (identifier is SimpleIdentifier) {
10948 SimpleIdentifier simpleIdentifier = identifier as SimpleIdentifier; 11614 SimpleIdentifier simpleIdentifier = identifier as SimpleIdentifier;
10949 sc.Token token = simpleIdentifier.token; 11615 sc.Token token = simpleIdentifier.token;
10950 if (identical(token.type, sc.TokenType.KEYWORD)) { 11616 if (identical(token.type, sc.TokenType.KEYWORD)) {
10951 if (((token as sc.KeywordToken)).keyword != sc.Keyword.DYNAMIC) { 11617 if (((token as sc.KeywordToken)).keyword != sc.Keyword.DYNAMIC) {
10952 _errorReporter.reportError2(CompileTimeErrorCode.BUILT_IN_IDENTIFIER _AS_TYPE, identifier, [identifier.name]); 11618 _errorReporter.reportError2(CompileTimeErrorCode.BUILT_IN_IDENTIFIER _AS_TYPE, identifier, [identifier.name]);
10953 return true; 11619 return true;
10954 } 11620 }
10955 } 11621 }
10956 } 11622 }
10957 } 11623 }
10958 return false; 11624 return false;
10959 } 11625 }
10960 11626
10961 /** 11627 /**
10962 * This verifies that the given switch case is terminated with 'break', 'conti nue', 'return' or 11628 * This verifies that the given switch case is terminated with 'break', 'conti nue', 'return' or
10963 * 'throw'. 11629 * 'throw'.
11630 *
10964 * @param node the switch case to evaluate 11631 * @param node the switch case to evaluate
10965 * @return `true` if and only if an error code is generated on the passed node 11632 * @return `true` if and only if an error code is generated on the passed node
10966 * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED 11633 * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
10967 */ 11634 */
10968 bool checkForCaseBlockNotTerminated(SwitchCase node) { 11635 bool checkForCaseBlockNotTerminated(SwitchCase node) {
10969 NodeList<Statement> statements = node.statements; 11636 NodeList<Statement> statements = node.statements;
10970 if (statements.isEmpty) { 11637 if (statements.isEmpty) {
10971 ASTNode parent = node.parent; 11638 ASTNode parent = node.parent;
10972 if (parent is SwitchStatement) { 11639 if (parent is SwitchStatement) {
10973 SwitchStatement switchStatement = parent as SwitchStatement; 11640 SwitchStatement switchStatement = parent as SwitchStatement;
(...skipping 15 matching lines...) Expand all
10989 } 11656 }
10990 } 11657 }
10991 } 11658 }
10992 _errorReporter.reportError4(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, nod e.keyword, []); 11659 _errorReporter.reportError4(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, nod e.keyword, []);
10993 return true; 11660 return true;
10994 } 11661 }
10995 11662
10996 /** 11663 /**
10997 * This verifies that the switch cases in the given switch statement is termin ated with 'break', 11664 * This verifies that the switch cases in the given switch statement is termin ated with 'break',
10998 * 'continue', 'return' or 'throw'. 11665 * 'continue', 'return' or 'throw'.
11666 *
10999 * @param node the switch statement containing the cases to be checked 11667 * @param node the switch statement containing the cases to be checked
11000 * @return `true` if and only if an error code is generated on the passed node 11668 * @return `true` if and only if an error code is generated on the passed node
11001 * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED 11669 * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
11002 */ 11670 */
11003 bool checkForCaseBlocksNotTerminated(SwitchStatement node) { 11671 bool checkForCaseBlocksNotTerminated(SwitchStatement node) {
11004 bool foundError = false; 11672 bool foundError = false;
11005 NodeList<SwitchMember> members = node.members; 11673 NodeList<SwitchMember> members = node.members;
11006 int lastMember = members.length - 1; 11674 int lastMember = members.length - 1;
11007 for (int i = 0; i < lastMember; i++) { 11675 for (int i = 0; i < lastMember; i++) {
11008 SwitchMember member = members[i]; 11676 SwitchMember member = members[i];
11009 if (member is SwitchCase) { 11677 if (member is SwitchCase) {
11010 foundError = javaBooleanOr(foundError, checkForCaseBlockNotTerminated((m ember as SwitchCase))); 11678 foundError = javaBooleanOr(foundError, checkForCaseBlockNotTerminated((m ember as SwitchCase)));
11011 } 11679 }
11012 } 11680 }
11013 return foundError; 11681 return foundError;
11014 } 11682 }
11015 11683
11016 /** 11684 /**
11017 * This verifies that the passed switch statement does not have a case express ion with the 11685 * This verifies that the passed switch statement does not have a case express ion with the
11018 * operator '==' overridden. 11686 * operator '==' overridden.
11687 *
11019 * @param node the switch statement to evaluate 11688 * @param node the switch statement to evaluate
11689 * @param type the common type of all 'case' expressions
11020 * @return `true` if and only if an error code is generated on the passed node 11690 * @return `true` if and only if an error code is generated on the passed node
11021 * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS 11691 * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
11022 */ 11692 */
11023 bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node) { 11693 bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, Type2 ty pe2) {
11024 Expression expression = node.expression; 11694 if (type2 == null || type2 == _typeProvider.intType || type2 == _typeProvide r.stringType) {
11025 Type2 type = getStaticType(expression); 11695 return false;
11026 if (type != null && type != _typeProvider.intType && type != _typeProvider.s tringType) {
11027 Element element = type.element;
11028 if (element is ClassElement) {
11029 ClassElement classElement = element as ClassElement;
11030 MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
11031 if (method != null && method.enclosingElement.type != _typeProvider.obje ctType) {
11032 _errorReporter.reportError2(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_ IMPLEMENTS_EQUALS, expression, [element.displayName]);
11033 return true;
11034 }
11035 }
11036 } 11696 }
11037 return false; 11697 Element element = type2.element;
11698 if (element is! ClassElement) {
11699 return false;
11700 }
11701 ClassElement classElement = element as ClassElement;
11702 MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
11703 if (method == null || method.enclosingElement.type.isObject) {
11704 return false;
11705 }
11706 _errorReporter.reportError4(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEM ENTS_EQUALS, node.keyword, [element.displayName]);
11707 return true;
11038 } 11708 }
11039 11709
11040 /** 11710 /**
11041 * This verifies that the passed method declaration is abstract only if the en closing class is 11711 * This verifies that the passed method declaration is abstract only if the en closing class is
11042 * also abstract. 11712 * also abstract.
11713 *
11043 * @param node the method declaration to evaluate 11714 * @param node the method declaration to evaluate
11044 * @return `true` if and only if an error code is generated on the passed node 11715 * @return `true` if and only if an error code is generated on the passed node
11045 * @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER 11716 * @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
11046 */ 11717 */
11047 bool checkForConcreteClassWithAbstractMember(MethodDeclaration node) { 11718 bool checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
11048 if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstrac t) { 11719 if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstrac t) {
11049 SimpleIdentifier methodName = node.name; 11720 SimpleIdentifier methodName = node.name;
11050 _errorReporter.reportError2(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT _MEMBER, methodName, [methodName.name, _enclosingClass.displayName]); 11721 _errorReporter.reportError2(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT _MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
11051 return true; 11722 return true;
11052 } 11723 }
11053 return false; 11724 return false;
11054 } 11725 }
11055 11726
11056 /** 11727 /**
11057 * This verifies all possible conflicts of the constructor name with other con structors and 11728 * This verifies all possible conflicts of the constructor name with other con structors and
11058 * members of the same class. 11729 * members of the same class.
11730 *
11059 * @param node the constructor declaration to evaluate 11731 * @param node the constructor declaration to evaluate
11060 * @return `true` if and only if an error code is generated on the passed node 11732 * @return `true` if and only if an error code is generated on the passed node
11061 * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT 11733 * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
11062 * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME 11734 * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
11063 * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD 11735 * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
11064 * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD 11736 * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
11065 */ 11737 */
11066 bool checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) { 11738 bool checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
11067 ConstructorElement constructorElement = node.element; 11739 ConstructorElement constructorElement = node.element;
11068 SimpleIdentifier constructorName = node.name; 11740 SimpleIdentifier constructorName = node.name;
(...skipping 26 matching lines...) Expand all
11095 if (method.name == name) { 11767 if (method.name == name) {
11096 _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCT OR_NAME_AND_METHOD, node, [name]); 11768 _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCT OR_NAME_AND_METHOD, node, [name]);
11097 return true; 11769 return true;
11098 } 11770 }
11099 } 11771 }
11100 } 11772 }
11101 return false; 11773 return false;
11102 } 11774 }
11103 11775
11104 /** 11776 /**
11777 * This verifies that the [enclosingClass] does not have method and getter wit h the same
11778 * names.
11779 *
11780 * @return `true` if and only if an error code is generated on the passed node
11781 * @see CompileTimeErrorCode#CONFLICTING_GETTER_AND_METHOD
11782 * @see CompileTimeErrorCode#CONFLICTING_METHOD_AND_GETTER
11783 */
11784 bool checkForConflictingGetterAndMethod() {
11785 if (_enclosingClass == null) {
11786 return false;
11787 }
11788 bool hasProblem = false;
11789 for (MethodElement method in _enclosingClass.methods) {
11790 String name = method.name;
11791 ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclo singClass, name);
11792 if (inherited is! PropertyAccessorElement) {
11793 continue;
11794 }
11795 hasProblem = true;
11796 _errorReporter.reportError3(CompileTimeErrorCode.CONFLICTING_GETTER_AND_ME THOD, method.nameOffset, name.length, [_enclosingClass.displayName, inherited.en closingElement.displayName, name]);
11797 }
11798 for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
11799 if (!accessor.isGetter) {
11800 continue;
11801 }
11802 String name = accessor.name;
11803 ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclo singClass, name);
11804 if (inherited is! MethodElement) {
11805 continue;
11806 }
11807 hasProblem = true;
11808 _errorReporter.reportError3(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GE TTER, accessor.nameOffset, name.length, [_enclosingClass.displayName, inherited. enclosingElement.displayName, name]);
11809 }
11810 return hasProblem;
11811 }
11812
11813 /**
11105 * This verifies that the superclass of the enclosing class does not declare a ccessible static 11814 * This verifies that the superclass of the enclosing class does not declare a ccessible static
11106 * member with the same name as the passed instance getter/setter method decla ration. 11815 * member with the same name as the passed instance getter/setter method decla ration.
11816 *
11107 * @param node the method declaration to evaluate 11817 * @param node the method declaration to evaluate
11108 * @return `true` if and only if an error code is generated on the passed node 11818 * @return `true` if and only if an error code is generated on the passed node
11109 * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER 11819 * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
11110 * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER 11820 * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
11111 */ 11821 */
11112 bool checkForConflictingInstanceGetterAndSuperclassMember(MethodDeclaration no de) { 11822 bool checkForConflictingInstanceGetterAndSuperclassMember(MethodDeclaration no de) {
11113 if (node.isStatic) { 11823 if (node.isStatic) {
11114 return false; 11824 return false;
11115 } 11825 }
11116 SimpleIdentifier nameNode = node.name; 11826 SimpleIdentifier nameNode = node.name;
(...skipping 25 matching lines...) Expand all
11142 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_ AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]); 11852 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_ AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]);
11143 } else { 11853 } else {
11144 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_ AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]); 11854 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_ AND_SUPERCLASS_MEMBER, nameNode, [superElementType.displayName]);
11145 } 11855 }
11146 return true; 11856 return true;
11147 } 11857 }
11148 11858
11149 /** 11859 /**
11150 * This verifies that the enclosing class does not have an instance member wit h the same name as 11860 * This verifies that the enclosing class does not have an instance member wit h the same name as
11151 * the passed static getter method declaration. 11861 * the passed static getter method declaration.
11862 *
11152 * @param node the method declaration to evaluate 11863 * @param node the method declaration to evaluate
11153 * @return `true` if and only if an error code is generated on the passed node 11864 * @return `true` if and only if an error code is generated on the passed node
11154 * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER 11865 * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
11155 */ 11866 */
11156 bool checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) { 11867 bool checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
11157 if (!node.isStatic) { 11868 if (!node.isStatic) {
11158 return false; 11869 return false;
11159 } 11870 }
11160 SimpleIdentifier nameNode = node.name; 11871 SimpleIdentifier nameNode = node.name;
11161 if (nameNode == null) { 11872 if (nameNode == null) {
(...skipping 13 matching lines...) Expand all
11175 } 11886 }
11176 ClassElement setterClass = setter.enclosingElement as ClassElement; 11887 ClassElement setterClass = setter.enclosingElement as ClassElement;
11177 InterfaceType setterType = setterClass.type; 11888 InterfaceType setterType = setterClass.type;
11178 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_ INSTANCE_SETTER, nameNode, [setterType.displayName]); 11889 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_ INSTANCE_SETTER, nameNode, [setterType.displayName]);
11179 return true; 11890 return true;
11180 } 11891 }
11181 11892
11182 /** 11893 /**
11183 * This verifies that the enclosing class does not have an instance member wit h the same name as 11894 * This verifies that the enclosing class does not have an instance member wit h the same name as
11184 * the passed static getter method declaration. 11895 * the passed static getter method declaration.
11896 *
11185 * @param node the method declaration to evaluate 11897 * @param node the method declaration to evaluate
11186 * @return `true` if and only if an error code is generated on the passed node 11898 * @return `true` if and only if an error code is generated on the passed node
11187 * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER 11899 * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
11188 */ 11900 */
11189 bool checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) { 11901 bool checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
11190 if (!node.isStatic) { 11902 if (!node.isStatic) {
11191 return false; 11903 return false;
11192 } 11904 }
11193 SimpleIdentifier nameNode = node.name; 11905 SimpleIdentifier nameNode = node.name;
11194 if (nameNode == null) { 11906 if (nameNode == null) {
(...skipping 20 matching lines...) Expand all
11215 } 11927 }
11216 ClassElement memberClass = member.enclosingElement as ClassElement; 11928 ClassElement memberClass = member.enclosingElement as ClassElement;
11217 InterfaceType memberType = memberClass.type; 11929 InterfaceType memberType = memberClass.type;
11218 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_ INSTANCE_MEMBER, nameNode, [memberType.displayName]); 11930 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_ INSTANCE_MEMBER, nameNode, [memberType.displayName]);
11219 return true; 11931 return true;
11220 } 11932 }
11221 11933
11222 /** 11934 /**
11223 * This verifies that the passed constructor declaration is 'const' then there are no non-final 11935 * This verifies that the passed constructor declaration is 'const' then there are no non-final
11224 * instance variable. 11936 * instance variable.
11937 *
11225 * @param node the constructor declaration to evaluate 11938 * @param node the constructor declaration to evaluate
11226 * @return `true` if and only if an error code is generated on the passed node 11939 * @return `true` if and only if an error code is generated on the passed node
11227 * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD 11940 * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
11228 */ 11941 */
11229 bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) { 11942 bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
11230 if (!_isEnclosingConstructorConst) { 11943 if (!_isEnclosingConstructorConst) {
11231 return false; 11944 return false;
11232 } 11945 }
11233 ConstructorElement constructorElement = node.element; 11946 ConstructorElement constructorElement = node.element;
11234 ClassElement classElement = constructorElement.enclosingElement; 11947 ClassElement classElement = constructorElement.enclosingElement;
11235 if (!classElement.hasNonFinalField()) { 11948 if (!classElement.hasNonFinalField()) {
11236 return false; 11949 return false;
11237 } 11950 }
11238 _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_ FINAL_FIELD, node, []); 11951 _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_ FINAL_FIELD, node, []);
11239 return true; 11952 return true;
11240 } 11953 }
11241 11954
11242 /** 11955 /**
11243 * This verifies that the passed throw expression is not enclosed in a 'const' constructor 11956 * This verifies that the passed throw expression is not enclosed in a 'const' constructor
11244 * declaration. 11957 * declaration.
11958 *
11245 * @param node the throw expression expression to evaluate 11959 * @param node the throw expression expression to evaluate
11246 * @return `true` if and only if an error code is generated on the passed node 11960 * @return `true` if and only if an error code is generated on the passed node
11247 * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION 11961 * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
11248 */ 11962 */
11249 bool checkForConstEvalThrowsException(ThrowExpression node) { 11963 bool checkForConstEvalThrowsException(ThrowExpression node) {
11250 if (_isEnclosingConstructorConst) { 11964 if (_isEnclosingConstructorConst) {
11251 _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_ EXCEPTION, node, []); 11965 _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_ EXCEPTION, node, []);
11252 return true; 11966 return true;
11253 } 11967 }
11254 return false; 11968 return false;
11255 } 11969 }
11256 11970
11257 /** 11971 /**
11258 * This verifies that the passed normal formal parameter is not 'const'. 11972 * This verifies that the passed normal formal parameter is not 'const'.
11973 *
11259 * @param node the normal formal parameter to evaluate 11974 * @param node the normal formal parameter to evaluate
11260 * @return `true` if and only if an error code is generated on the passed node 11975 * @return `true` if and only if an error code is generated on the passed node
11261 * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER 11976 * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
11262 */ 11977 */
11263 bool checkForConstFormalParameter(NormalFormalParameter node) { 11978 bool checkForConstFormalParameter(NormalFormalParameter node) {
11264 if (node.isConst) { 11979 if (node.isConst) {
11265 _errorReporter.reportError2(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, n ode, []); 11980 _errorReporter.reportError2(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, n ode, []);
11266 return true; 11981 return true;
11267 } 11982 }
11268 return false; 11983 return false;
11269 } 11984 }
11270 11985
11271 /** 11986 /**
11272 * This verifies that the passed instance creation expression is not being inv oked on an abstract 11987 * This verifies that the passed instance creation expression is not being inv oked on an abstract
11273 * class. 11988 * class.
11989 *
11274 * @param node the instance creation expression to evaluate 11990 * @param node the instance creation expression to evaluate
11275 * @param typeName the [TypeName] of the [ConstructorName] from the[InstanceCr eationExpression], this is the AST node that the error is attached to 11991 * @param typeName the [TypeName] of the [ConstructorName] from the
11992 * [InstanceCreationExpression], this is the AST node that the error is attached to
11276 * @param type the type being constructed with this [InstanceCreationExpressio n] 11993 * @param type the type being constructed with this [InstanceCreationExpressio n]
11277 * @return `true` if and only if an error code is generated on the passed node 11994 * @return `true` if and only if an error code is generated on the passed node
11278 * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS 11995 * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
11279 * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS 11996 * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
11280 */ 11997 */
11281 bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, Type Name typeName, InterfaceType type) { 11998 bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, Type Name typeName, InterfaceType type) {
11282 if (type.element.isAbstract) { 11999 if (type.element.isAbstract) {
11283 ConstructorElement element = node.element; 12000 ConstructorElement element = node.element;
11284 if (element != null && !element.isFactory) { 12001 if (element != null && !element.isFactory) {
11285 if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CO NST)) { 12002 if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CO NST)) {
11286 _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLAS S, typeName, []); 12003 _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLAS S, typeName, []);
11287 } else { 12004 } else {
11288 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []); 12005 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
11289 } 12006 }
11290 return true; 12007 return true;
11291 } 12008 }
11292 } 12009 }
11293 return false; 12010 return false;
11294 } 12011 }
11295 12012
11296 /** 12013 /**
11297 * This verifies that the passed 'const' instance creation expression is not b eing invoked on a 12014 * This verifies that the passed 'const' instance creation expression is not b eing invoked on a
11298 * constructor that is not 'const'. 12015 * constructor that is not 'const'.
11299 * 12016 *
11300 * This method assumes that the instance creation was tested to be 'const' bef ore being called. 12017 * This method assumes that the instance creation was tested to be 'const' bef ore being called.
12018 *
11301 * @param node the instance creation expression to evaluate 12019 * @param node the instance creation expression to evaluate
11302 * @return `true` if and only if an error code is generated on the passed node 12020 * @return `true` if and only if an error code is generated on the passed node
11303 * @see CompileTimeErrorCode#CONST_WITH_NON_CONST 12021 * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
11304 */ 12022 */
11305 bool checkForConstWithNonConst(InstanceCreationExpression node) { 12023 bool checkForConstWithNonConst(InstanceCreationExpression node) {
11306 ConstructorElement constructorElement = node.element; 12024 ConstructorElement constructorElement = node.element;
11307 if (constructorElement != null && !constructorElement.isConst) { 12025 if (constructorElement != null && !constructorElement.isConst) {
11308 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_NON_CONST, nod e, []); 12026 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_NON_CONST, nod e, []);
11309 return true; 12027 return true;
11310 } 12028 }
11311 return false; 12029 return false;
11312 } 12030 }
11313 12031
11314 /** 12032 /**
11315 * This verifies that the passed 'const' instance creation expression does not reference any type 12033 * This verifies that the passed 'const' instance creation expression does not reference any type
11316 * parameters. 12034 * parameters.
11317 * 12035 *
11318 * This method assumes that the instance creation was tested to be 'const' bef ore being called. 12036 * This method assumes that the instance creation was tested to be 'const' bef ore being called.
12037 *
11319 * @param node the instance creation expression to evaluate 12038 * @param node the instance creation expression to evaluate
11320 * @return `true` if and only if an error code is generated on the passed node 12039 * @return `true` if and only if an error code is generated on the passed node
11321 * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS 12040 * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
11322 */ 12041 */
11323 bool checkForConstWithTypeParameters(InstanceCreationExpression node) { 12042 bool checkForConstWithTypeParameters(InstanceCreationExpression node) {
11324 ConstructorName constructorName = node.constructorName; 12043 ConstructorName constructorName = node.constructorName;
11325 if (constructorName == null) { 12044 if (constructorName == null) {
11326 return false; 12045 return false;
11327 } 12046 }
11328 TypeName typeName = constructorName.type; 12047 TypeName typeName = constructorName.type;
11329 return checkForConstWithTypeParameters2(typeName); 12048 return checkForConstWithTypeParameters2(typeName);
11330 } 12049 }
11331 12050
11332 /** 12051 /**
11333 * This verifies that the passed type name does not reference any type paramet ers. 12052 * This verifies that the passed type name does not reference any type paramet ers.
12053 *
11334 * @param typeName the type name to evaluate 12054 * @param typeName the type name to evaluate
11335 * @return `true` if and only if an error code is generated on the passed node 12055 * @return `true` if and only if an error code is generated on the passed node
11336 * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS 12056 * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
11337 */ 12057 */
11338 bool checkForConstWithTypeParameters2(TypeName typeName) { 12058 bool checkForConstWithTypeParameters2(TypeName typeName) {
11339 if (typeName == null) { 12059 if (typeName == null) {
11340 return false; 12060 return false;
11341 } 12061 }
11342 Identifier name = typeName.name; 12062 Identifier name = typeName.name;
11343 if (name == null) { 12063 if (name == null) {
(...skipping 11 matching lines...) Expand all
11355 return hasError; 12075 return hasError;
11356 } 12076 }
11357 return false; 12077 return false;
11358 } 12078 }
11359 12079
11360 /** 12080 /**
11361 * This verifies that if the passed 'const' instance creation expression is be ing invoked on the 12081 * This verifies that if the passed 'const' instance creation expression is be ing invoked on the
11362 * resolved constructor. 12082 * resolved constructor.
11363 * 12083 *
11364 * This method assumes that the instance creation was tested to be 'const' bef ore being called. 12084 * This method assumes that the instance creation was tested to be 'const' bef ore being called.
12085 *
11365 * @param node the instance creation expression to evaluate 12086 * @param node the instance creation expression to evaluate
11366 * @return `true` if and only if an error code is generated on the passed node 12087 * @return `true` if and only if an error code is generated on the passed node
11367 * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR 12088 * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
11368 * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT 12089 * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
11369 */ 12090 */
11370 bool checkForConstWithUndefinedConstructor(InstanceCreationExpression node) { 12091 bool checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
11371 if (node.element != null) { 12092 if (node.element != null) {
11372 return false; 12093 return false;
11373 } 12094 }
11374 ConstructorName constructorName = node.constructorName; 12095 ConstructorName constructorName = node.constructorName;
11375 if (constructorName == null) { 12096 if (constructorName == null) {
11376 return false; 12097 return false;
11377 } 12098 }
11378 TypeName type = constructorName.type; 12099 TypeName type = constructorName.type;
11379 if (type == null) { 12100 if (type == null) {
11380 return false; 12101 return false;
11381 } 12102 }
11382 Identifier className = type.name; 12103 Identifier className = type.name;
11383 SimpleIdentifier name = constructorName.name; 12104 SimpleIdentifier name = constructorName.name;
11384 if (name != null) { 12105 if (name != null) {
11385 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONS TRUCTOR, name, [className, name]); 12106 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONS TRUCTOR, name, [className, name]);
11386 } else { 12107 } else {
11387 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONS TRUCTOR_DEFAULT, constructorName, [className]); 12108 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONS TRUCTOR_DEFAULT, constructorName, [className]);
11388 } 12109 }
11389 return true; 12110 return true;
11390 } 12111 }
11391 12112
11392 /** 12113 /**
11393 * This verifies that there are no default parameters in the passed function t ype alias. 12114 * This verifies that there are no default parameters in the passed function t ype alias.
12115 *
11394 * @param node the function type alias to evaluate 12116 * @param node the function type alias to evaluate
11395 * @return `true` if and only if an error code is generated on the passed node 12117 * @return `true` if and only if an error code is generated on the passed node
11396 * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS 12118 * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
11397 */ 12119 */
11398 bool checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) { 12120 bool checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
11399 bool result = false; 12121 bool result = false;
11400 FormalParameterList formalParameterList = node.parameters; 12122 FormalParameterList formalParameterList = node.parameters;
11401 NodeList<FormalParameter> parameters = formalParameterList.parameters; 12123 NodeList<FormalParameter> parameters = formalParameterList.parameters;
11402 for (FormalParameter formalParameter in parameters) { 12124 for (FormalParameter formalParameter in parameters) {
11403 if (formalParameter is DefaultFormalParameter) { 12125 if (formalParameter is DefaultFormalParameter) {
11404 DefaultFormalParameter defaultFormalParameter = formalParameter as Defau ltFormalParameter; 12126 DefaultFormalParameter defaultFormalParameter = formalParameter as Defau ltFormalParameter;
11405 if (defaultFormalParameter.defaultValue != null) { 12127 if (defaultFormalParameter.defaultValue != null) {
11406 _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNC TION_TYPE_ALIAS, node, []); 12128 _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNC TION_TYPE_ALIAS, node, []);
11407 result = true; 12129 result = true;
11408 } 12130 }
11409 } 12131 }
11410 } 12132 }
11411 return result; 12133 return result;
11412 } 12134 }
11413 12135
11414 /** 12136 /**
12137 * This verifies that the enclosing class does not have an instance member wit h the given name of
12138 * the static member.
12139 *
12140 * @return `true` if and only if an error code is generated on the passed node
12141 * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
12142 */
12143 bool checkForDuplicateDefinitionInheritance() {
12144 if (_enclosingClass == null) {
12145 return false;
12146 }
12147 bool hasProblem = false;
12148 for (MethodElement method in _enclosingClass.methods) {
12149 if (!method.isStatic) {
12150 continue;
12151 }
12152 hasProblem = javaBooleanOr(hasProblem, checkForDuplicateDefinitionInherita nce2(method));
12153 }
12154 return hasProblem;
12155 }
12156
12157 /**
12158 * This verifies that the enclosing class does not have an instance member wit h the given name of
12159 * the static member.
12160 *
12161 * @param staticMember the static member to check conflict for
12162 * @return `true` if and only if an error code is generated on the passed node
12163 * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
12164 */
12165 bool checkForDuplicateDefinitionInheritance2(ExecutableElement staticMember) {
12166 String name = staticMember.name;
12167 if (name == null) {
12168 return false;
12169 }
12170 ExecutableElement inheritedMember = _inheritanceManager.lookupInheritance(_e nclosingClass, name);
12171 if (inheritedMember == null) {
12172 return false;
12173 }
12174 if (inheritedMember.isStatic) {
12175 return false;
12176 }
12177 _errorReporter.reportError3(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERI TANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingEle ment.displayName]);
12178 return true;
12179 }
12180
12181 /**
11415 * This verifies the passed import has unique name among other exported librar ies. 12182 * This verifies the passed import has unique name among other exported librar ies.
12183 *
11416 * @param node the export directive to evaluate 12184 * @param node the export directive to evaluate
11417 * @return `true` if and only if an error code is generated on the passed node 12185 * @return `true` if and only if an error code is generated on the passed node
11418 * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME 12186 * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
11419 */ 12187 */
11420 bool checkForExportDuplicateLibraryName(ExportDirective node) { 12188 bool checkForExportDuplicateLibraryName(ExportDirective node) {
11421 Element nodeElement = node.element; 12189 Element nodeElement = node.element;
11422 if (nodeElement is! ExportElement) { 12190 if (nodeElement is! ExportElement) {
11423 return false; 12191 return false;
11424 } 12192 }
11425 ExportElement nodeExportElement = nodeElement as ExportElement; 12193 ExportElement nodeExportElement = nodeElement as ExportElement;
(...skipping 10 matching lines...) Expand all
11436 } 12204 }
11437 } else { 12205 } else {
11438 _nameToExportElement[name] = nodeLibrary; 12206 _nameToExportElement[name] = nodeLibrary;
11439 } 12207 }
11440 return false; 12208 return false;
11441 } 12209 }
11442 12210
11443 /** 12211 /**
11444 * Check that if the visiting library is not system, then any passed library s hould not be SDK 12212 * Check that if the visiting library is not system, then any passed library s hould not be SDK
11445 * internal library. 12213 * internal library.
12214 *
11446 * @param node the export directive to evaluate 12215 * @param node the export directive to evaluate
11447 * @return `true` if and only if an error code is generated on the passed node 12216 * @return `true` if and only if an error code is generated on the passed node
11448 * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY 12217 * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
11449 */ 12218 */
11450 bool checkForExportInternalLibrary(ExportDirective node) { 12219 bool checkForExportInternalLibrary(ExportDirective node) {
11451 if (_isInSystemLibrary) { 12220 if (_isInSystemLibrary) {
11452 return false; 12221 return false;
11453 } 12222 }
11454 Element element = node.element; 12223 Element element = node.element;
11455 if (element is! ExportElement) { 12224 if (element is! ExportElement) {
11456 return false; 12225 return false;
11457 } 12226 }
11458 ExportElement exportElement = element as ExportElement; 12227 ExportElement exportElement = element as ExportElement;
11459 DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk; 12228 DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
11460 String uri = exportElement.uri; 12229 String uri = exportElement.uri;
11461 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri); 12230 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
11462 if (sdkLibrary == null) { 12231 if (sdkLibrary == null) {
11463 return false; 12232 return false;
11464 } 12233 }
11465 if (!sdkLibrary.isInternal) { 12234 if (!sdkLibrary.isInternal) {
11466 return false; 12235 return false;
11467 } 12236 }
11468 _errorReporter.reportError2(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, no de, [node.uri]); 12237 _errorReporter.reportError2(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, no de, [node.uri]);
11469 return true; 12238 return true;
11470 } 12239 }
11471 12240
11472 /** 12241 /**
11473 * This verifies that the passed extends clause does not extend classes such a s num or String. 12242 * This verifies that the passed extends clause does not extend classes such a s num or String.
12243 *
11474 * @param node the extends clause to test 12244 * @param node the extends clause to test
11475 * @return `true` if and only if an error code is generated on the passed node 12245 * @return `true` if and only if an error code is generated on the passed node
11476 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS 12246 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
11477 */ 12247 */
11478 bool checkForExtendsDisallowedClass(ExtendsClause extendsClause) { 12248 bool checkForExtendsDisallowedClass(ExtendsClause extendsClause) {
11479 if (extendsClause == null) { 12249 if (extendsClause == null) {
11480 return false; 12250 return false;
11481 } 12251 }
11482 return checkForExtendsOrImplementsDisallowedClass(extendsClause.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS); 12252 return checkForExtendsOrImplementsDisallowedClass(extendsClause.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
11483 } 12253 }
11484 12254
11485 /** 12255 /**
11486 * This verifies that the passed type name does not extend or implement classe s such as 'num' or 12256 * This verifies that the passed type name does not extend or implement classe s such as 'num' or
11487 * 'String'. 12257 * 'String'.
12258 *
11488 * @param node the type name to test 12259 * @param node the type name to test
11489 * @return `true` if and only if an error code is generated on the passed node 12260 * @return `true` if and only if an error code is generated on the passed node
11490 * @see #checkForExtendsDisallowedClass(ExtendsClause) 12261 * @see #checkForExtendsDisallowedClass(ExtendsClause)
11491 * @see #checkForImplementsDisallowedClass(ImplementsClause) 12262 * @see #checkForImplementsDisallowedClass(ImplementsClause)
11492 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS 12263 * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
11493 * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS 12264 * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
11494 */ 12265 */
11495 bool checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode e rrorCode) { 12266 bool checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode e rrorCode) {
11496 if (typeName.isSynthetic) { 12267 if (typeName.isSynthetic) {
11497 return false; 12268 return false;
(...skipping 14 matching lines...) Expand all
11512 _errorReporter.reportError2(errorCode, typeName, [disallowedType.display Name]); 12283 _errorReporter.reportError2(errorCode, typeName, [disallowedType.display Name]);
11513 return true; 12284 return true;
11514 } 12285 }
11515 } 12286 }
11516 return false; 12287 return false;
11517 } 12288 }
11518 12289
11519 /** 12290 /**
11520 * This verifies that the passed constructor field initializer has compatible field and 12291 * This verifies that the passed constructor field initializer has compatible field and
11521 * initializer expression types. 12292 * initializer expression types.
12293 *
11522 * @param node the constructor field initializer to test 12294 * @param node the constructor field initializer to test
11523 * @return `true` if and only if an error code is generated on the passed node 12295 * @return `true` if and only if an error code is generated on the passed node
11524 * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE 12296 * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
11525 * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE 12297 * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
11526 */ 12298 */
11527 bool checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) { 12299 bool checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
11528 Element fieldNameElement = node.fieldName.element; 12300 Element fieldNameElement = node.fieldName.element;
11529 if (fieldNameElement is! FieldElement) { 12301 if (fieldNameElement is! FieldElement) {
11530 return false; 12302 return false;
11531 } 12303 }
(...skipping 24 matching lines...) Expand all
11556 if (_isEnclosingConstructorConst) { 12328 if (_isEnclosingConstructorConst) {
11557 _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_N OT_ASSIGNABLE, expression, [(propagatedType == null ? staticType : propagatedTyp e).displayName, fieldType.displayName]); 12329 _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_N OT_ASSIGNABLE, expression, [(propagatedType == null ? staticType : propagatedTyp e).displayName, fieldType.displayName]);
11558 } else { 12330 } else {
11559 _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGN ABLE, expression, [(propagatedType == null ? staticType : propagatedType).displa yName, fieldType.displayName]); 12331 _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGN ABLE, expression, [(propagatedType == null ? staticType : propagatedType).displa yName, fieldType.displayName]);
11560 } 12332 }
11561 return true; 12333 return true;
11562 } 12334 }
11563 12335
11564 /** 12336 /**
11565 * This verifies that the passed field formal parameter is in a constructor de claration. 12337 * This verifies that the passed field formal parameter is in a constructor de claration.
12338 *
11566 * @param node the field formal parameter to test 12339 * @param node the field formal parameter to test
11567 * @return `true` if and only if an error code is generated on the passed node 12340 * @return `true` if and only if an error code is generated on the passed node
11568 * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR 12341 * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
11569 */ 12342 */
11570 bool checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParamete r node) { 12343 bool checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParamete r node) {
11571 ConstructorDeclaration constructor = node.getAncestor(ConstructorDeclaration ); 12344 ConstructorDeclaration constructor = node.getAncestor(ConstructorDeclaration );
11572 if (constructor == null) { 12345 if (constructor == null) {
11573 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE _CONSTRUCTOR, node, []); 12346 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE _CONSTRUCTOR, node, []);
11574 return true; 12347 return true;
11575 } 12348 }
11576 if (constructor.factoryKeyword != null) { 12349 if (constructor.factoryKeyword != null) {
11577 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY _CONSTRUCTOR, node, []); 12350 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY _CONSTRUCTOR, node, []);
11578 return true; 12351 return true;
11579 } 12352 }
11580 for (ConstructorInitializer initializer in constructor.initializers) { 12353 for (ConstructorInitializer initializer in constructor.initializers) {
11581 if (initializer is RedirectingConstructorInvocation) { 12354 if (initializer is RedirectingConstructorInvocation) {
11582 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_REDIR ECTING_CONSTRUCTOR, node, []); 12355 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_REDIR ECTING_CONSTRUCTOR, node, []);
11583 return true; 12356 return true;
11584 } 12357 }
11585 } 12358 }
11586 return false; 12359 return false;
11587 } 12360 }
11588 12361
11589 /** 12362 /**
11590 * This verifies that final fields that are declared, without any constructors in the enclosing 12363 * This verifies that final fields that are declared, without any constructors in the enclosing
11591 * class, are initialized. Cases in which there is at least one constructor ar e handled at the end 12364 * class, are initialized. Cases in which there is at least one constructor ar e handled at the end
11592 * of [checkForAllFinalInitializedErrorCodes]. 12365 * of [checkForAllFinalInitializedErrorCodes].
12366 *
11593 * @param node the class declaration to test 12367 * @param node the class declaration to test
11594 * @return `true` if and only if an error code is generated on the passed node 12368 * @return `true` if and only if an error code is generated on the passed node
11595 * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED 12369 * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED
11596 */ 12370 */
11597 bool checkForFinalNotInitialized(ClassDeclaration node) { 12371 bool checkForFinalNotInitialized(ClassDeclaration node) {
11598 NodeList<ClassMember> classMembers = node.members; 12372 NodeList<ClassMember> classMembers = node.members;
11599 for (ClassMember classMember in classMembers) { 12373 for (ClassMember classMember in classMembers) {
11600 if (classMember is ConstructorDeclaration) { 12374 if (classMember is ConstructorDeclaration) {
11601 return false; 12375 return false;
11602 } 12376 }
11603 } 12377 }
11604 bool foundError = false; 12378 bool foundError = false;
11605 for (ClassMember classMember in classMembers) { 12379 for (ClassMember classMember in classMembers) {
11606 if (classMember is FieldDeclaration) { 12380 if (classMember is FieldDeclaration) {
11607 FieldDeclaration field = classMember as FieldDeclaration; 12381 FieldDeclaration field = classMember as FieldDeclaration;
11608 foundError = javaBooleanOr(foundError, checkForFinalNotInitialized2(fiel d.fields)); 12382 foundError = javaBooleanOr(foundError, checkForFinalNotInitialized2(fiel d.fields));
11609 } 12383 }
11610 } 12384 }
11611 return foundError; 12385 return foundError;
11612 } 12386 }
11613 12387
11614 /** 12388 /**
11615 * This verifies that the passed variable declaration list has only initialize d variables if the 12389 * This verifies that the passed variable declaration list has only initialize d variables if the
11616 * list is final or const. This method is called by[checkForFinalNotInitialize d],[visitTopLevelVariableDeclaration] and[visitVariableDeclarationStatement]. 12390 * list is final or const. This method is called by
12391 * [checkForFinalNotInitialized],
12392 * [visitTopLevelVariableDeclaration] and
12393 * [visitVariableDeclarationStatement].
12394 *
11617 * @param node the class declaration to test 12395 * @param node the class declaration to test
11618 * @return `true` if and only if an error code is generated on the passed node 12396 * @return `true` if and only if an error code is generated on the passed node
11619 * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED 12397 * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED
11620 */ 12398 */
11621 bool checkForFinalNotInitialized2(VariableDeclarationList node) { 12399 bool checkForFinalNotInitialized2(VariableDeclarationList node) {
11622 bool foundError = false; 12400 bool foundError = false;
11623 if (!node.isSynthetic && (node.isConst || node.isFinal)) { 12401 if (!node.isSynthetic && (node.isConst || node.isFinal)) {
11624 NodeList<VariableDeclaration> variables = node.variables; 12402 NodeList<VariableDeclaration> variables = node.variables;
11625 for (VariableDeclaration variable in variables) { 12403 for (VariableDeclaration variable in variables) {
11626 if (variable.initializer == null) { 12404 if (variable.initializer == null) {
11627 _errorReporter.reportError2(StaticWarningCode.FINAL_NOT_INITIALIZED, v ariable, [variable.name.name]); 12405 _errorReporter.reportError2(StaticWarningCode.FINAL_NOT_INITIALIZED, v ariable, [variable.name.name]);
11628 foundError = true; 12406 foundError = true;
11629 } 12407 }
11630 } 12408 }
11631 } 12409 }
11632 return foundError; 12410 return foundError;
11633 } 12411 }
11634 12412
11635 /** 12413 /**
11636 * This verifies that the passed implements clause does not implement classes such as 'num' or 12414 * This verifies that the passed implements clause does not implement classes such as 'num' or
11637 * 'String'. 12415 * 'String'.
12416 *
11638 * @param node the implements clause to test 12417 * @param node the implements clause to test
11639 * @return `true` if and only if an error code is generated on the passed node 12418 * @return `true` if and only if an error code is generated on the passed node
11640 * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS 12419 * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
11641 */ 12420 */
11642 bool checkForImplementsDisallowedClass(ImplementsClause implementsClause) { 12421 bool checkForImplementsDisallowedClass(ImplementsClause implementsClause) {
11643 if (implementsClause == null) { 12422 if (implementsClause == null) {
11644 return false; 12423 return false;
11645 } 12424 }
11646 bool foundError = false; 12425 bool foundError = false;
11647 for (TypeName type in implementsClause.interfaces) { 12426 for (TypeName type in implementsClause.interfaces) {
11648 foundError = javaBooleanOr(foundError, checkForExtendsOrImplementsDisallow edClass(type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS)); 12427 foundError = javaBooleanOr(foundError, checkForExtendsOrImplementsDisallow edClass(type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS));
11649 } 12428 }
11650 return foundError; 12429 return foundError;
11651 } 12430 }
11652 12431
11653 /** 12432 /**
11654 * This verifies that if the passed identifier is part of constructor initiali zer, then it does 12433 * This verifies that if the passed identifier is part of constructor initiali zer, then it does
11655 * not reference implicitly 'this' expression. 12434 * not reference implicitly 'this' expression.
12435 *
11656 * @param node the simple identifier to test 12436 * @param node the simple identifier to test
11657 * @return `true` if and only if an error code is generated on the passed node 12437 * @return `true` if and only if an error code is generated on the passed node
11658 * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER 12438 * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
12439 * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
11659 */ 12440 */
11660 bool checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) { 12441 bool checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
11661 if (!_isInConstructorInitializer) { 12442 if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVari ableInitializer) {
11662 return false; 12443 return false;
11663 } 12444 }
11664 Element element = node.element; 12445 Element element = node.element;
11665 if (!(element is MethodElement || element is PropertyAccessorElement)) { 12446 if (!(element is MethodElement || element is PropertyAccessorElement)) {
11666 return false; 12447 return false;
11667 } 12448 }
11668 ExecutableElement executableElement = element as ExecutableElement; 12449 ExecutableElement executableElement = element as ExecutableElement;
11669 if (executableElement.isStatic) { 12450 if (executableElement.isStatic) {
11670 return false; 12451 return false;
11671 } 12452 }
11672 Element enclosingElement = element.enclosingElement; 12453 Element enclosingElement = element.enclosingElement;
11673 if (enclosingElement is! ClassElement) { 12454 if (enclosingElement is! ClassElement) {
11674 return false; 12455 return false;
11675 } 12456 }
11676 ASTNode parent = node.parent; 12457 ASTNode parent = node.parent;
12458 if (parent is CommentReference) {
12459 return false;
12460 }
11677 if (parent is MethodInvocation) { 12461 if (parent is MethodInvocation) {
11678 MethodInvocation invocation = parent as MethodInvocation; 12462 MethodInvocation invocation = parent as MethodInvocation;
11679 if (identical(invocation.methodName, node) && invocation.realTarget != nul l) { 12463 if (identical(invocation.methodName, node) && invocation.realTarget != nul l) {
11680 return false; 12464 return false;
11681 } 12465 }
11682 } 12466 }
11683 { 12467 {
11684 if (parent is PropertyAccess) { 12468 if (parent is PropertyAccess) {
11685 PropertyAccess access = parent as PropertyAccess; 12469 PropertyAccess access = parent as PropertyAccess;
11686 if (identical(access.propertyName, node) && access.realTarget != null) { 12470 if (identical(access.propertyName, node) && access.realTarget != null) {
11687 return false; 12471 return false;
11688 } 12472 }
11689 } 12473 }
11690 if (parent is PrefixedIdentifier) { 12474 if (parent is PrefixedIdentifier) {
11691 PrefixedIdentifier prefixed = parent as PrefixedIdentifier; 12475 PrefixedIdentifier prefixed = parent as PrefixedIdentifier;
11692 if (identical(prefixed.identifier, node)) { 12476 if (identical(prefixed.identifier, node)) {
11693 return false; 12477 return false;
11694 } 12478 }
11695 } 12479 }
11696 } 12480 }
11697 _errorReporter.reportError2(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_ INITIALIZER, node, []); 12481 if (_isInConstructorInitializer || _isInInstanceVariableInitializer) {
12482 _errorReporter.reportError2(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_I N_INITIALIZER, node, []);
12483 } else if (_isInStaticMethod) {
12484 _errorReporter.reportError2(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FR OM_STATIC, node, []);
12485 }
11698 return true; 12486 return true;
11699 } 12487 }
11700 12488
11701 /** 12489 /**
11702 * This verifies the passed import has unique name among other imported librar ies. 12490 * This verifies the passed import has unique name among other imported librar ies.
12491 *
11703 * @param node the import directive to evaluate 12492 * @param node the import directive to evaluate
11704 * @return `true` if and only if an error code is generated on the passed node 12493 * @return `true` if and only if an error code is generated on the passed node
11705 * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME 12494 * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
11706 */ 12495 */
11707 bool checkForImportDuplicateLibraryName(ImportDirective node) { 12496 bool checkForImportDuplicateLibraryName(ImportDirective node) {
11708 Element nodeElement = node.element; 12497 Element nodeElement = node.element;
11709 if (nodeElement is! ImportElement) { 12498 if (nodeElement is! ImportElement) {
11710 return false; 12499 return false;
11711 } 12500 }
11712 ImportElement nodeImportElement = nodeElement as ImportElement; 12501 ImportElement nodeImportElement = nodeElement as ImportElement;
(...skipping 10 matching lines...) Expand all
11723 } 12512 }
11724 } else { 12513 } else {
11725 _nameToImportElement[name] = nodeLibrary; 12514 _nameToImportElement[name] = nodeLibrary;
11726 } 12515 }
11727 return false; 12516 return false;
11728 } 12517 }
11729 12518
11730 /** 12519 /**
11731 * Check that if the visiting library is not system, then any passed library s hould not be SDK 12520 * Check that if the visiting library is not system, then any passed library s hould not be SDK
11732 * internal library. 12521 * internal library.
12522 *
11733 * @param node the import directive to evaluate 12523 * @param node the import directive to evaluate
11734 * @return `true` if and only if an error code is generated on the passed node 12524 * @return `true` if and only if an error code is generated on the passed node
11735 * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY 12525 * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
11736 */ 12526 */
11737 bool checkForImportInternalLibrary(ImportDirective node) { 12527 bool checkForImportInternalLibrary(ImportDirective node) {
11738 if (_isInSystemLibrary) { 12528 if (_isInSystemLibrary) {
11739 return false; 12529 return false;
11740 } 12530 }
11741 Element element = node.element; 12531 Element element = node.element;
11742 if (element is! ImportElement) { 12532 if (element is! ImportElement) {
11743 return false; 12533 return false;
11744 } 12534 }
11745 ImportElement importElement = element as ImportElement; 12535 ImportElement importElement = element as ImportElement;
11746 DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk; 12536 DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
11747 String uri = importElement.uri; 12537 String uri = importElement.uri;
11748 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri); 12538 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
11749 if (sdkLibrary == null) { 12539 if (sdkLibrary == null) {
11750 return false; 12540 return false;
11751 } 12541 }
11752 if (!sdkLibrary.isInternal) { 12542 if (!sdkLibrary.isInternal) {
11753 return false; 12543 return false;
11754 } 12544 }
11755 _errorReporter.reportError2(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, no de, [node.uri]); 12545 _errorReporter.reportError2(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, no de, [node.uri]);
11756 return true; 12546 return true;
11757 } 12547 }
11758 12548
11759 /** 12549 /**
11760 * This verifies that the passed switch statement case expressions all have th e same type. 12550 * This verifies that the passed switch statement case expressions all have th e same type.
12551 *
11761 * @param node the switch statement to evaluate 12552 * @param node the switch statement to evaluate
11762 * @return `true` if and only if an error code is generated on the passed node 12553 * @return `true` if and only if an error code is generated on the passed node
11763 * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES 12554 * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
11764 */ 12555 */
11765 bool checkForInconsistentCaseExpressionTypes(SwitchStatement node) { 12556 bool checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
11766 NodeList<SwitchMember> switchMembers = node.members; 12557 NodeList<SwitchMember> switchMembers = node.members;
11767 bool foundError = false; 12558 bool foundError = false;
11768 Type2 firstType = null; 12559 Type2 firstType = null;
11769 for (SwitchMember switchMember in switchMembers) { 12560 for (SwitchMember switchMember in switchMembers) {
11770 if (switchMember is SwitchCase) { 12561 if (switchMember is SwitchCase) {
11771 SwitchCase switchCase = switchMember as SwitchCase; 12562 SwitchCase switchCase = switchMember as SwitchCase;
11772 Expression expression = switchCase.expression; 12563 Expression expression = switchCase.expression;
11773 if (firstType == null) { 12564 if (firstType == null) {
11774 firstType = getBestType(expression); 12565 firstType = getBestType(expression);
11775 } else { 12566 } else {
11776 Type2 nType = getBestType(expression); 12567 Type2 nType = getBestType(expression);
11777 if (firstType != nType) { 12568 if (firstType != nType) {
11778 _errorReporter.reportError2(CompileTimeErrorCode.INCONSISTENT_CASE_E XPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]); 12569 _errorReporter.reportError2(CompileTimeErrorCode.INCONSISTENT_CASE_E XPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
11779 foundError = true; 12570 foundError = true;
11780 } 12571 }
11781 } 12572 }
11782 } 12573 }
11783 } 12574 }
12575 if (!foundError) {
12576 checkForCaseExpressionTypeImplementsEquals(node, firstType);
12577 }
11784 return foundError; 12578 return foundError;
11785 } 12579 }
11786 12580
11787 /** 12581 /**
11788 * For each class declaration, this method is called which verifies that all i nherited members are 12582 * For each class declaration, this method is called which verifies that all i nherited members are
11789 * inherited consistently. 12583 * inherited consistently.
12584 *
11790 * @return `true` if and only if an error code is generated on the passed node 12585 * @return `true` if and only if an error code is generated on the passed node
11791 * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE 12586 * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
11792 */ 12587 */
11793 bool checkForInconsistentMethodInheritance() { 12588 bool checkForInconsistentMethodInheritance() {
11794 _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass); 12589 _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
11795 Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass); 12590 Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
11796 if (errors == null || errors.isEmpty) { 12591 if (errors == null || errors.isEmpty) {
11797 return false; 12592 return false;
11798 } 12593 }
11799 for (AnalysisError error in errors) { 12594 for (AnalysisError error in errors) {
11800 _errorReporter.reportError(error); 12595 _errorReporter.reportError(error);
11801 } 12596 }
11802 return true; 12597 return true;
11803 } 12598 }
11804 12599
11805 /** 12600 /**
11806 * Given an assignment using a compound assignment operator, this verifies tha t the given 12601 * Given an assignment using a compound assignment operator, this verifies tha t the given
11807 * assignment is valid. 12602 * assignment is valid.
12603 *
11808 * @param node the assignment expression being tested 12604 * @param node the assignment expression being tested
11809 * @return `true` if and only if an error code is generated on the passed node 12605 * @return `true` if and only if an error code is generated on the passed node
11810 * @see StaticTypeWarningCode#INVALID_ASSIGNMENT 12606 * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
11811 */ 12607 */
11812 bool checkForInvalidAssignment(AssignmentExpression node) { 12608 bool checkForInvalidAssignment(AssignmentExpression node) {
11813 Expression lhs = node.leftHandSide; 12609 Expression lhs = node.leftHandSide;
11814 if (lhs == null) { 12610 if (lhs == null) {
11815 return false; 12611 return false;
11816 } 12612 }
11817 VariableElement leftElement = getVariableElement(lhs); 12613 VariableElement leftElement = getVariableElement(lhs);
11818 Type2 leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.ty pe; 12614 Type2 leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.ty pe;
11819 MethodElement invokedMethod = node.element; 12615 MethodElement invokedMethod = node.element;
11820 if (invokedMethod == null) { 12616 if (invokedMethod == null) {
11821 return false; 12617 return false;
11822 } 12618 }
11823 Type2 rightType = invokedMethod.type.returnType; 12619 Type2 rightType = invokedMethod.type.returnType;
11824 if (leftType == null || rightType == null) { 12620 if (leftType == null || rightType == null) {
11825 return false; 12621 return false;
11826 } 12622 }
11827 if (!rightType.isAssignableTo(leftType)) { 12623 if (!rightType.isAssignableTo(leftType)) {
11828 _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, node .rightHandSide, [rightType.displayName, leftType.displayName]); 12624 _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, node .rightHandSide, [rightType.displayName, leftType.displayName]);
11829 return true; 12625 return true;
11830 } 12626 }
11831 return false; 12627 return false;
11832 } 12628 }
11833 12629
11834 /** 12630 /**
11835 * This verifies that the passed left hand side and right hand side represent a valid assignment. 12631 * This verifies that the passed left hand side and right hand side represent a valid assignment.
12632 *
11836 * @param lhs the left hand side expression 12633 * @param lhs the left hand side expression
11837 * @param rhs the right hand side expression 12634 * @param rhs the right hand side expression
11838 * @return `true` if and only if an error code is generated on the passed node 12635 * @return `true` if and only if an error code is generated on the passed node
11839 * @see StaticTypeWarningCode#INVALID_ASSIGNMENT 12636 * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
11840 */ 12637 */
11841 bool checkForInvalidAssignment2(Expression lhs, Expression rhs) { 12638 bool checkForInvalidAssignment2(Expression lhs, Expression rhs) {
11842 if (lhs == null || rhs == null) { 12639 if (lhs == null || rhs == null) {
11843 return false; 12640 return false;
11844 } 12641 }
11845 VariableElement leftElement = getVariableElement(lhs); 12642 VariableElement leftElement = getVariableElement(lhs);
(...skipping 11 matching lines...) Expand all
11857 if (!isStaticAssignable && !isPropagatedAssignable) { 12654 if (!isStaticAssignable && !isPropagatedAssignable) {
11858 _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, rh s, [staticRightType.displayName, leftType.displayName]); 12655 _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, rh s, [staticRightType.displayName, leftType.displayName]);
11859 return true; 12656 return true;
11860 } 12657 }
11861 } 12658 }
11862 return false; 12659 return false;
11863 } 12660 }
11864 12661
11865 /** 12662 /**
11866 * This verifies that the usage of the passed 'this' is valid. 12663 * This verifies that the usage of the passed 'this' is valid.
12664 *
11867 * @param node the 'this' expression to evaluate 12665 * @param node the 'this' expression to evaluate
11868 * @return `true` if and only if an error code is generated on the passed node 12666 * @return `true` if and only if an error code is generated on the passed node
11869 * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS 12667 * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
11870 */ 12668 */
11871 bool checkForInvalidReferenceToThis(ThisExpression node) { 12669 bool checkForInvalidReferenceToThis(ThisExpression node) {
11872 if (!isThisInValidContext(node)) { 12670 if (!isThisInValidContext(node)) {
11873 _errorReporter.reportError2(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS , node, []); 12671 _errorReporter.reportError2(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS , node, []);
11874 return true; 12672 return true;
11875 } 12673 }
11876 return false; 12674 return false;
11877 } 12675 }
11878 12676
11879 /** 12677 /**
11880 * Checks to ensure that first type argument to a map literal must be the 'Str ing' type. 12678 * Checks to ensure that first type argument to a map literal must be the 'Str ing' type.
11881 * @param arguments a non-`null`, non-empty [TypeName] node list from the resp ective[MapLiteral] 12679 *
12680 * @param arguments a non-`null`, non-empty [TypeName] node list from the resp ective
12681 * [MapLiteral]
11882 * @return `true` if and only if an error code is generated on the passed node 12682 * @return `true` if and only if an error code is generated on the passed node
11883 * @see CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_FOR_KEY 12683 * @see CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_FOR_KEY
11884 */ 12684 */
11885 bool checkForInvalidTypeArgumentForKey(NodeList<TypeName> arguments) { 12685 bool checkForInvalidTypeArgumentForKey(NodeList<TypeName> arguments) {
11886 TypeName firstArgument = arguments[0]; 12686 TypeName firstArgument = arguments[0];
11887 Type2 firstArgumentType = firstArgument.type; 12687 Type2 firstArgumentType = firstArgument.type;
11888 if (firstArgumentType != null && firstArgumentType != _typeProvider.stringTy pe) { 12688 if (firstArgumentType != null && firstArgumentType != _typeProvider.stringTy pe) {
11889 _errorReporter.reportError2(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_FOR _KEY, firstArgument, []); 12689 _errorReporter.reportError2(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_FOR _KEY, firstArgument, []);
11890 return true; 12690 return true;
11891 } 12691 }
11892 return false; 12692 return false;
11893 } 12693 }
11894 12694
11895 /** 12695 /**
11896 * Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not hav e a type 12696 * Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not hav e a type
11897 * parameter as a type argument. 12697 * parameter as a type argument.
11898 * @param arguments a non-`null`, non-empty [TypeName] node list from the resp ective[ListLiteral] or [MapLiteral] 12698 *
11899 * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONS T_LIST] or[CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP] 12699 * @param arguments a non-`null`, non-empty [TypeName] node list from the resp ective
12700 * [ListLiteral] or [MapLiteral]
12701 * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONS T_LIST] or
12702 * [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
11900 * @return `true` if and only if an error code is generated on the passed node 12703 * @return `true` if and only if an error code is generated on the passed node
11901 */ 12704 */
11902 bool checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> argumen ts, ErrorCode errorCode) { 12705 bool checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> argumen ts, ErrorCode errorCode) {
11903 bool foundError = false; 12706 bool foundError = false;
11904 for (TypeName typeName in arguments) { 12707 for (TypeName typeName in arguments) {
11905 if (typeName.type is TypeVariableType) { 12708 if (typeName.type is TypeVariableType) {
11906 _errorReporter.reportError2(errorCode, typeName, [typeName.name]); 12709 _errorReporter.reportError2(errorCode, typeName, [typeName.name]);
11907 foundError = true; 12710 foundError = true;
11908 } 12711 }
11909 } 12712 }
11910 return foundError; 12713 return foundError;
11911 } 12714 }
11912 12715
11913 /** 12716 /**
11914 * This verifies that the [enclosingClass] does not define members with the sa me name as 12717 * This verifies that the [enclosingClass] does not define members with the sa me name as
11915 * the enclosing class. 12718 * the enclosing class.
12719 *
11916 * @return `true` if and only if an error code is generated on the passed node 12720 * @return `true` if and only if an error code is generated on the passed node
11917 * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME 12721 * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
11918 */ 12722 */
11919 bool checkForMemberWithClassName() { 12723 bool checkForMemberWithClassName() {
11920 if (_enclosingClass == null) { 12724 if (_enclosingClass == null) {
11921 return false; 12725 return false;
11922 } 12726 }
11923 String className = _enclosingClass.name; 12727 String className = _enclosingClass.name;
11924 if (className == null) { 12728 if (className == null) {
11925 return false; 12729 return false;
11926 } 12730 }
11927 bool problemReported = false; 12731 bool problemReported = false;
11928 for (PropertyAccessorElement accessor in _enclosingClass.accessors) { 12732 for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
11929 if (className == accessor.name) { 12733 if (className == accessor.name) {
11930 _errorReporter.reportError3(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []); 12734 _errorReporter.reportError3(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
11931 problemReported = true; 12735 problemReported = true;
11932 } 12736 }
11933 } 12737 }
11934 return problemReported; 12738 return problemReported;
11935 } 12739 }
11936 12740
11937 /** 12741 /**
11938 * Check to make sure that all similarly typed accessors are of the same type (including inherited 12742 * Check to make sure that all similarly typed accessors are of the same type (including inherited
11939 * accessors). 12743 * accessors).
12744 *
11940 * @param node The accessor currently being visited. 12745 * @param node The accessor currently being visited.
11941 */ 12746 */
11942 void checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String a ccessorTextName) { 12747 void checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String a ccessorTextName) {
11943 PropertyAccessorElement counterpartAccessor = null; 12748 PropertyAccessorElement counterpartAccessor = null;
11944 ExecutableElement accessorElement = accessorDeclaration.element as Executabl eElement; 12749 ExecutableElement accessorElement = accessorDeclaration.element as Executabl eElement;
11945 if (accessorElement is! PropertyAccessorElement) { 12750 if (accessorElement is! PropertyAccessorElement) {
11946 return; 12751 return;
11947 } 12752 }
11948 PropertyAccessorElement propertyAccessorElement = accessorElement as Propert yAccessorElement; 12753 PropertyAccessorElement propertyAccessorElement = accessorElement as Propert yAccessorElement;
11949 counterpartAccessor = propertyAccessorElement.correspondingSetter; 12754 counterpartAccessor = propertyAccessorElement.correspondingSetter;
(...skipping 10 matching lines...) Expand all
11960 counterpartAccessor = propertyAccessorElement.correspondingGetter; 12765 counterpartAccessor = propertyAccessorElement.correspondingGetter;
11961 getterType = getGetterType(counterpartAccessor); 12766 getterType = getGetterType(counterpartAccessor);
11962 } 12767 }
11963 if (setterType != null && getterType != null && !getterType.isAssignableTo(s etterType)) { 12768 if (setterType != null && getterType != null && !getterType.isAssignableTo(s etterType)) {
11964 _errorReporter.reportError2(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER _TYPES, accessorDeclaration, [accessorTextName, setterType.displayName, getterTy pe.displayName]); 12769 _errorReporter.reportError2(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER _TYPES, accessorDeclaration, [accessorTextName, setterType.displayName, getterTy pe.displayName]);
11965 } 12770 }
11966 } 12771 }
11967 12772
11968 /** 12773 /**
11969 * This verifies that the passed mixin does not have an explicitly declared co nstructor. 12774 * This verifies that the passed mixin does not have an explicitly declared co nstructor.
12775 *
11970 * @param mixinName the node to report problem on 12776 * @param mixinName the node to report problem on
11971 * @param mixinElement the mixing to evaluate 12777 * @param mixinElement the mixing to evaluate
11972 * @return `true` if and only if an error code is generated on the passed node 12778 * @return `true` if and only if an error code is generated on the passed node
11973 * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR 12779 * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
11974 */ 12780 */
11975 bool checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinEl ement) { 12781 bool checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinEl ement) {
11976 for (ConstructorElement constructor in mixinElement.constructors) { 12782 for (ConstructorElement constructor in mixinElement.constructors) {
11977 if (!constructor.isSynthetic && !constructor.isFactory) { 12783 if (!constructor.isSynthetic && !constructor.isFactory) {
11978 _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUC TOR, mixinName, [mixinElement.name]); 12784 _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUC TOR, mixinName, [mixinElement.name]);
11979 return true; 12785 return true;
11980 } 12786 }
11981 } 12787 }
11982 return false; 12788 return false;
11983 } 12789 }
11984 12790
11985 /** 12791 /**
11986 * This verifies that the passed mixin has the 'Object' superclass. 12792 * This verifies that the passed mixin has the 'Object' superclass.
12793 *
11987 * @param mixinName the node to report problem on 12794 * @param mixinName the node to report problem on
11988 * @param mixinElement the mixing to evaluate 12795 * @param mixinElement the mixing to evaluate
11989 * @return `true` if and only if an error code is generated on the passed node 12796 * @return `true` if and only if an error code is generated on the passed node
11990 * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT 12797 * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
11991 */ 12798 */
11992 bool checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixin Element) { 12799 bool checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixin Element) {
11993 InterfaceType mixinSupertype = mixinElement.supertype; 12800 InterfaceType mixinSupertype = mixinElement.supertype;
11994 if (mixinSupertype != null) { 12801 if (mixinSupertype != null) {
11995 if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mi xins.length != 0) { 12802 if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mi xins.length != 0) {
11996 _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT _OBJECT, mixinName, [mixinElement.name]); 12803 _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT _OBJECT, mixinName, [mixinElement.name]);
11997 return true; 12804 return true;
11998 } 12805 }
11999 } 12806 }
12000 return false; 12807 return false;
12001 } 12808 }
12002 12809
12003 /** 12810 /**
12004 * This verifies that the passed mixin does not reference 'super'. 12811 * This verifies that the passed mixin does not reference 'super'.
12812 *
12005 * @param mixinName the node to report problem on 12813 * @param mixinName the node to report problem on
12006 * @param mixinElement the mixing to evaluate 12814 * @param mixinElement the mixing to evaluate
12007 * @return `true` if and only if an error code is generated on the passed node 12815 * @return `true` if and only if an error code is generated on the passed node
12008 * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER 12816 * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
12009 */ 12817 */
12010 bool checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElemen t) { 12818 bool checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElemen t) {
12011 if (mixinElement.hasReferenceToSuper()) { 12819 if (mixinElement.hasReferenceToSuper()) {
12012 _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, m ixinName, [mixinElement.name]); 12820 _errorReporter.reportError2(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, m ixinName, [mixinElement.name]);
12013 } 12821 }
12014 return false; 12822 return false;
12015 } 12823 }
12016 12824
12017 /** 12825 /**
12018 * This verifies that the passed constructor has at most one 'super' initializ er. 12826 * This verifies that the passed constructor has at most one 'super' initializ er.
12827 *
12019 * @param node the constructor declaration to evaluate 12828 * @param node the constructor declaration to evaluate
12020 * @return `true` if and only if an error code is generated on the passed node 12829 * @return `true` if and only if an error code is generated on the passed node
12021 * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS 12830 * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
12022 */ 12831 */
12023 bool checkForMultipleSuperInitializers(ConstructorDeclaration node) { 12832 bool checkForMultipleSuperInitializers(ConstructorDeclaration node) {
12024 int numSuperInitializers = 0; 12833 int numSuperInitializers = 0;
12025 for (ConstructorInitializer initializer in node.initializers) { 12834 for (ConstructorInitializer initializer in node.initializers) {
12026 if (initializer is SuperConstructorInvocation) { 12835 if (initializer is SuperConstructorInvocation) {
12027 numSuperInitializers++; 12836 numSuperInitializers++;
12028 if (numSuperInitializers > 1) { 12837 if (numSuperInitializers > 1) {
12029 _errorReporter.reportError2(CompileTimeErrorCode.MULTIPLE_SUPER_INITIA LIZERS, initializer, []); 12838 _errorReporter.reportError2(CompileTimeErrorCode.MULTIPLE_SUPER_INITIA LIZERS, initializer, []);
12030 } 12839 }
12031 } 12840 }
12032 } 12841 }
12033 return numSuperInitializers > 0; 12842 return numSuperInitializers > 0;
12034 } 12843 }
12035 12844
12036 /** 12845 /**
12037 * Checks to ensure that native function bodies can only in SDK code. 12846 * Checks to ensure that native function bodies can only in SDK code.
12847 *
12038 * @param node the native function body to test 12848 * @param node the native function body to test
12039 * @return `true` if and only if an error code is generated on the passed node 12849 * @return `true` if and only if an error code is generated on the passed node
12040 * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE 12850 * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
12041 */ 12851 */
12042 bool checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) { 12852 bool checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
12043 if (!_isInSystemLibrary) { 12853 if (!_isInSystemLibrary) {
12044 _errorReporter.reportError2(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SD K_CODE, node, []); 12854 _errorReporter.reportError2(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SD K_CODE, node, []);
12045 return true; 12855 return true;
12046 } 12856 }
12047 return false; 12857 return false;
12048 } 12858 }
12049 12859
12050 /** 12860 /**
12051 * This verifies that the passed 'new' instance creation expression invokes ex isting constructor. 12861 * This verifies that the passed 'new' instance creation expression invokes ex isting constructor.
12052 * 12862 *
12053 * This method assumes that the instance creation was tested to be 'new' befor e being called. 12863 * This method assumes that the instance creation was tested to be 'new' befor e being called.
12864 *
12054 * @param node the instance creation expression to evaluate 12865 * @param node the instance creation expression to evaluate
12055 * @return `true` if and only if an error code is generated on the passed node 12866 * @return `true` if and only if an error code is generated on the passed node
12056 * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR 12867 * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
12057 */ 12868 */
12058 bool checkForNewWithUndefinedConstructor(InstanceCreationExpression node) { 12869 bool checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
12059 if (node.element != null) { 12870 if (node.element != null) {
12060 return false; 12871 return false;
12061 } 12872 }
12062 ConstructorName constructorName = node.constructorName; 12873 ConstructorName constructorName = node.constructorName;
12063 if (constructorName == null) { 12874 if (constructorName == null) {
12064 return false; 12875 return false;
12065 } 12876 }
12066 TypeName type = constructorName.type; 12877 TypeName type = constructorName.type;
12067 if (type == null) { 12878 if (type == null) {
12068 return false; 12879 return false;
12069 } 12880 }
12070 Identifier className = type.name; 12881 Identifier className = type.name;
12071 SimpleIdentifier name = constructorName.name; 12882 SimpleIdentifier name = constructorName.name;
12072 if (name != null) { 12883 if (name != null) {
12073 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCT OR, name, [className, name]); 12884 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCT OR, name, [className, name]);
12074 } else { 12885 } else {
12075 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCT OR_DEFAULT, constructorName, [className]); 12886 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCT OR_DEFAULT, constructorName, [className]);
12076 } 12887 }
12077 return true; 12888 return true;
12078 } 12889 }
12079 12890
12080 /** 12891 /**
12081 * This checks that passed if the passed class declaration implicitly calls de fault constructor of 12892 * This checks that if the passed class declaration implicitly calls default c onstructor of its
12082 * its superclass, there should be such default constructor - implicit or expl icit. 12893 * superclass, there should be such default constructor - implicit or explicit .
12894 *
12083 * @param node the [ClassDeclaration] to evaluate 12895 * @param node the [ClassDeclaration] to evaluate
12084 * @return `true` if and only if an error code is generated on the passed node 12896 * @return `true` if and only if an error code is generated on the passed node
12085 * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT 12897 * @see CompileTimeErrorCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
12086 */ 12898 */
12087 bool checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) { 12899 bool checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
12088 List<ConstructorElement> constructors = _enclosingClass.constructors; 12900 List<ConstructorElement> constructors = _enclosingClass.constructors;
12089 if (!constructors[0].isSynthetic) { 12901 if (!constructors[0].isSynthetic) {
12090 return false; 12902 return false;
12091 } 12903 }
12092 InterfaceType superType = _enclosingClass.supertype; 12904 InterfaceType superType = _enclosingClass.supertype;
12093 if (superType == null) { 12905 if (superType == null) {
12094 return false; 12906 return false;
12095 } 12907 }
12096 ClassElement superClass = superType.element; 12908 ClassElement superElement = superType.element;
12097 if (superClass.hasDefaultConstructor()) { 12909 ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor ;
12098 return false; 12910 if (superUnnamedConstructor != null) {
12911 if (superUnnamedConstructor.isFactory) {
12912 _errorReporter.reportError2(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUC TOR, node.name, [superUnnamedConstructor]);
12913 return true;
12914 }
12915 if (superUnnamedConstructor.isDefaultConstructor) {
12916 return true;
12917 }
12099 } 12918 }
12100 _errorReporter.reportError2(StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_I MPLICIT, node.name, [superType.displayName]); 12919 _errorReporter.reportError2(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTO R_IMPLICIT, node.name, [superType.displayName]);
12101 return true; 12920 return true;
12102 } 12921 }
12103 12922
12104 /** 12923 /**
12105 * This checks that passed class declaration overrides all members required by its superclasses 12924 * This checks that passed class declaration overrides all members required by its superclasses
12106 * and interfaces. 12925 * and interfaces.
12926 *
12107 * @param node the [ClassDeclaration] to evaluate 12927 * @param node the [ClassDeclaration] to evaluate
12108 * @return `true` if and only if an error code is generated on the passed node 12928 * @return `true` if and only if an error code is generated on the passed node
12109 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE 12929 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
12110 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO 12930 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO
12111 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE 12931 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE
12112 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR 12932 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR
12113 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLU S 12933 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLU S
12114 */ 12934 */
12115 bool checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration node) { 12935 bool checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration node) {
12116 if (_enclosingClass.isAbstract) { 12936 if (_enclosingClass.isAbstract) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
12169 if (!accessorsInEnclosingClass.contains(accessorName)) { 12989 if (!accessorsInEnclosingClass.contains(accessorName)) {
12170 javaSetAdd(missingOverrides, executableElt); 12990 javaSetAdd(missingOverrides, executableElt);
12171 } 12991 }
12172 } 12992 }
12173 } 12993 }
12174 int missingOverridesSize = missingOverrides.length; 12994 int missingOverridesSize = missingOverrides.length;
12175 if (missingOverridesSize == 0) { 12995 if (missingOverridesSize == 0) {
12176 return false; 12996 return false;
12177 } 12997 }
12178 List<ExecutableElement> missingOverridesArray = new List.from(missingOverrid es); 12998 List<ExecutableElement> missingOverridesArray = new List.from(missingOverrid es);
12179 List<String> stringTypeArray = new List<String>(Math.min(missingOverridesSiz e, 4)); 12999 List<String> stringMembersArrayListSet = new List<String>();
12180 String GET = "get "; 13000 for (int i = 0; i < missingOverridesArray.length; i++) {
12181 String SET = "set "; 13001 String newStrMember = "${missingOverridesArray[i].enclosingElement.display Name}.${missingOverridesArray[i].displayName}";
12182 for (int i = 0; i < stringTypeArray.length; i++) { 13002 if (!stringMembersArrayListSet.contains(newStrMember)) {
12183 stringTypeArray[i] = StringUtilities.EMPTY; 13003 stringMembersArrayListSet.add(newStrMember);
12184 if (missingOverridesArray[i] is PropertyAccessorElement) {
12185 stringTypeArray[i] = ((missingOverridesArray[i] as PropertyAccessorEleme nt)).isGetter ? GET : SET;
12186 } 13004 }
12187 } 13005 }
13006 List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
12188 AnalysisErrorWithProperties analysisError; 13007 AnalysisErrorWithProperties analysisError;
12189 if (missingOverridesSize == 1) { 13008 if (stringMembersArray.length == 1) {
12190 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [stringTypeArray[0], m issingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].d isplayName]); 13009 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [stringMembersArray[0] ]);
12191 } else if (missingOverridesSize == 2) { 13010 } else if (stringMembersArray.length == 2) {
12192 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [stringTypeArray[0], m issingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].d isplayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displa yName, missingOverridesArray[1].displayName]); 13011 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [stringMembersArray[0] , stringMembersArray[1]]);
12193 } else if (missingOverridesSize == 3) { 13012 } else if (stringMembersArray.length == 3) {
12194 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0] .displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.disp layName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverri desArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName]) ; 13013 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [stringMembersArray[ 0], stringMembersArray[1], stringMembersArray[2]]);
12195 } else if (missingOverridesSize == 4) { 13014 } else if (stringMembersArray.length == 4) {
12196 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0]. displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displ ayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverrid esArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, s tringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missin gOverridesArray[3].displayName]); 13015 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [stringMembersArray[0 ], stringMembersArray[1], stringMembersArray[2], stringMembersArray[3]]);
12197 } else { 13016 } else {
12198 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [stringTypeArray [0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArra y[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement. displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOv erridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayNa me, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, m issingOverridesArray[3].displayName, missingOverridesArray.length - 4]); 13017 analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NO N_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [stringMembersAr ray[0], stringMembersArray[1], stringMembersArray[2], stringMembersArray[3], str ingMembersArray.length - 4]);
12199 } 13018 }
12200 analysisError.setProperty(ErrorProperty.UNIMPLEMENTED_METHODS, missingOverri desArray); 13019 analysisError.setProperty(ErrorProperty.UNIMPLEMENTED_METHODS, missingOverri desArray);
12201 _errorReporter.reportError(analysisError); 13020 _errorReporter.reportError(analysisError);
12202 return true; 13021 return true;
12203 } 13022 }
12204 13023
12205 /** 13024 /**
12206 * Checks to ensure that the expressions that need to be of type bool, are. Ot herwise an error is 13025 * Checks to ensure that the expressions that need to be of type bool, are. Ot herwise an error is
12207 * reported on the expression. 13026 * reported on the expression.
13027 *
12208 * @param condition the conditional expression to test 13028 * @param condition the conditional expression to test
12209 * @return `true` if and only if an error code is generated on the passed node 13029 * @return `true` if and only if an error code is generated on the passed node
12210 * @see StaticTypeWarningCode#NON_BOOL_CONDITION 13030 * @see StaticTypeWarningCode#NON_BOOL_CONDITION
12211 */ 13031 */
12212 bool checkForNonBoolCondition(Expression condition) { 13032 bool checkForNonBoolCondition(Expression condition) {
12213 Type2 conditionType = getStaticType(condition); 13033 Type2 conditionType = getStaticType(condition);
12214 if (conditionType != null && !conditionType.isAssignableTo(_typeProvider.boo lType)) { 13034 if (conditionType != null && !conditionType.isAssignableTo(_typeProvider.boo lType)) {
12215 _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_CONDITION, cond ition, []); 13035 _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_CONDITION, cond ition, []);
12216 return true; 13036 return true;
12217 } 13037 }
12218 return false; 13038 return false;
12219 } 13039 }
12220 13040
12221 /** 13041 /**
12222 * This verifies that the passed assert statement has either a 'bool' or '() - > bool' input. 13042 * This verifies that the passed assert statement has either a 'bool' or '() - > bool' input.
13043 *
12223 * @param node the assert statement to evaluate 13044 * @param node the assert statement to evaluate
12224 * @return `true` if and only if an error code is generated on the passed node 13045 * @return `true` if and only if an error code is generated on the passed node
12225 * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION 13046 * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
12226 */ 13047 */
12227 bool checkForNonBoolExpression(AssertStatement node) { 13048 bool checkForNonBoolExpression(AssertStatement node) {
12228 Expression expression = node.condition; 13049 Expression expression = node.condition;
12229 Type2 type = getStaticType(expression); 13050 Type2 type = getStaticType(expression);
12230 if (type is InterfaceType) { 13051 if (type is InterfaceType) {
12231 if (!type.isAssignableTo(_typeProvider.boolType)) { 13052 if (!type.isAssignableTo(_typeProvider.boolType)) {
12232 _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_EXPRESSION, e xpression, []); 13053 _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_EXPRESSION, e xpression, []);
12233 return true; 13054 return true;
12234 } 13055 }
12235 } else if (type is FunctionType) { 13056 } else if (type is FunctionType) {
12236 FunctionType functionType = type as FunctionType; 13057 FunctionType functionType = type as FunctionType;
12237 if (functionType.typeArguments.length == 0 && !functionType.returnType.isA ssignableTo(_typeProvider.boolType)) { 13058 if (functionType.typeArguments.length == 0 && !functionType.returnType.isA ssignableTo(_typeProvider.boolType)) {
12238 _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_EXPRESSION, e xpression, []); 13059 _errorReporter.reportError2(StaticTypeWarningCode.NON_BOOL_EXPRESSION, e xpression, []);
12239 return true; 13060 return true;
12240 } 13061 }
12241 } 13062 }
12242 return false; 13063 return false;
12243 } 13064 }
12244 13065
12245 /** 13066 /**
12246 * This verifies the passed map literal either: 13067 * This verifies the passed map literal either:
12247 * 13068 *
12248 * * has `const modifier` 13069 * * has `const modifier`
12249 * * has explicit type arguments 13070 * * has explicit type arguments
12250 * * is not start of the statement 13071 * * is not start of the statement
12251 * 13072 *
13073 *
12252 * @param node the map literal to evaluate 13074 * @param node the map literal to evaluate
12253 * @return `true` if and only if an error code is generated on the passed node 13075 * @return `true` if and only if an error code is generated on the passed node
12254 * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT 13076 * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
12255 */ 13077 */
12256 bool checkForNonConstMapAsExpressionStatement(MapLiteral node) { 13078 bool checkForNonConstMapAsExpressionStatement(MapLiteral node) {
12257 if (node.modifier != null) { 13079 if (node.modifier != null) {
12258 return false; 13080 return false;
12259 } 13081 }
12260 if (node.typeArguments != null) { 13082 if (node.typeArguments != null) {
12261 return false; 13083 return false;
12262 } 13084 }
12263 Statement statement = node.getAncestor(ExpressionStatement); 13085 Statement statement = node.getAncestor(ExpressionStatement);
12264 if (statement == null) { 13086 if (statement == null) {
12265 return false; 13087 return false;
12266 } 13088 }
12267 if (statement.beginToken != node.beginToken) { 13089 if (statement.beginToken != node.beginToken) {
12268 return false; 13090 return false;
12269 } 13091 }
12270 _errorReporter.reportError2(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION _STATEMENT, node, []); 13092 _errorReporter.reportError2(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION _STATEMENT, node, []);
12271 return true; 13093 return true;
12272 } 13094 }
12273 13095
12274 /** 13096 /**
12275 * This verifies the passed method declaration of operator `\[\]=`, has `void` return 13097 * This verifies the passed method declaration of operator `[]=`, has `void` r eturn
12276 * type. 13098 * type.
13099 *
12277 * @param node the method declaration to evaluate 13100 * @param node the method declaration to evaluate
12278 * @return `true` if and only if an error code is generated on the passed node 13101 * @return `true` if and only if an error code is generated on the passed node
12279 * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR 13102 * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
12280 */ 13103 */
12281 bool checkForNonVoidReturnTypeForOperator(MethodDeclaration node) { 13104 bool checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
12282 SimpleIdentifier name = node.name; 13105 SimpleIdentifier name = node.name;
12283 if (name.name != "[]=") { 13106 if (name.name != "[]=") {
12284 return false; 13107 return false;
12285 } 13108 }
12286 TypeName typeName = node.returnType; 13109 TypeName typeName = node.returnType;
12287 if (typeName != null) { 13110 if (typeName != null) {
12288 Type2 type = typeName.type; 13111 Type2 type = typeName.type;
12289 if (type != null && !type.isVoid) { 13112 if (type != null && !type.isVoid) {
12290 _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_OPERAT OR, typeName, []); 13113 _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_OPERAT OR, typeName, []);
12291 } 13114 }
12292 } 13115 }
12293 return false; 13116 return false;
12294 } 13117 }
12295 13118
12296 /** 13119 /**
12297 * This verifies the passed setter has no return type or the `void` return typ e. 13120 * This verifies the passed setter has no return type or the `void` return typ e.
13121 *
12298 * @param typeName the type name to evaluate 13122 * @param typeName the type name to evaluate
12299 * @return `true` if and only if an error code is generated on the passed node 13123 * @return `true` if and only if an error code is generated on the passed node
12300 * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER 13124 * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
12301 */ 13125 */
12302 bool checkForNonVoidReturnTypeForSetter(TypeName typeName) { 13126 bool checkForNonVoidReturnTypeForSetter(TypeName typeName) {
12303 if (typeName != null) { 13127 if (typeName != null) {
12304 Type2 type = typeName.type; 13128 Type2 type = typeName.type;
12305 if (type != null && !type.isVoid) { 13129 if (type != null && !type.isVoid) {
12306 _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER , typeName, []); 13130 _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER , typeName, []);
12307 } 13131 }
12308 } 13132 }
12309 return false; 13133 return false;
12310 } 13134 }
12311 13135
12312 /** 13136 /**
12313 * This verifies the passed operator-method declaration, does not have an opti onal parameter. 13137 * This verifies the passed operator-method declaration, does not have an opti onal parameter.
12314 * 13138 *
12315 * This method assumes that the method declaration was tested to be an operato r declaration before 13139 * This method assumes that the method declaration was tested to be an operato r declaration before
12316 * being called. 13140 * being called.
13141 *
12317 * @param node the method declaration to evaluate 13142 * @param node the method declaration to evaluate
12318 * @return `true` if and only if an error code is generated on the passed node 13143 * @return `true` if and only if an error code is generated on the passed node
12319 * @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR 13144 * @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR
12320 */ 13145 */
12321 bool checkForOptionalParameterInOperator(MethodDeclaration node) { 13146 bool checkForOptionalParameterInOperator(MethodDeclaration node) {
12322 FormalParameterList parameterList = node.parameters; 13147 FormalParameterList parameterList = node.parameters;
12323 if (parameterList == null) { 13148 if (parameterList == null) {
12324 return false; 13149 return false;
12325 } 13150 }
12326 bool foundError = false; 13151 bool foundError = false;
12327 NodeList<FormalParameter> formalParameters = parameterList.parameters; 13152 NodeList<FormalParameter> formalParameters = parameterList.parameters;
12328 for (FormalParameter formalParameter in formalParameters) { 13153 for (FormalParameter formalParameter in formalParameters) {
12329 if (formalParameter.kind.isOptional) { 13154 if (formalParameter.kind.isOptional) {
12330 _errorReporter.reportError2(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_O PERATOR, formalParameter, []); 13155 _errorReporter.reportError2(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_O PERATOR, formalParameter, []);
12331 foundError = true; 13156 foundError = true;
12332 } 13157 }
12333 } 13158 }
12334 return foundError; 13159 return foundError;
12335 } 13160 }
12336 13161
12337 /** 13162 /**
12338 * This checks for named optional parameters that begin with '_'. 13163 * This checks for named optional parameters that begin with '_'.
13164 *
12339 * @param node the default formal parameter to evaluate 13165 * @param node the default formal parameter to evaluate
12340 * @return `true` if and only if an error code is generated on the passed node 13166 * @return `true` if and only if an error code is generated on the passed node
12341 * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER 13167 * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER
12342 */ 13168 */
12343 bool checkForPrivateOptionalParameter(DefaultFormalParameter node) { 13169 bool checkForPrivateOptionalParameter(DefaultFormalParameter node) {
12344 sc.Token separator = node.separator; 13170 sc.Token separator = node.separator;
12345 if (separator != null && separator.lexeme == ":") { 13171 if (separator != null && separator.lexeme == ":") {
12346 NormalFormalParameter parameter = node.parameter; 13172 NormalFormalParameter parameter = node.parameter;
12347 SimpleIdentifier name = parameter.identifier; 13173 SimpleIdentifier name = parameter.identifier;
12348 if (!name.isSynthetic && name.name.startsWith("_")) { 13174 if (!name.isSynthetic && name.name.startsWith("_")) {
12349 _errorReporter.reportError2(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAME TER, node, []); 13175 _errorReporter.reportError2(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAME TER, node, []);
12350 return true; 13176 return true;
12351 } 13177 }
12352 } 13178 }
12353 return false; 13179 return false;
12354 } 13180 }
12355 13181
12356 /** 13182 /**
12357 * This checks if the passed constructor declaration is the redirecting genera tive constructor and 13183 * This checks if the passed constructor declaration is the redirecting genera tive constructor and
12358 * references itself directly or indirectly. 13184 * references itself directly or indirectly.
13185 *
12359 * @param node the constructor declaration to evaluate 13186 * @param node the constructor declaration to evaluate
12360 * @return `true` if and only if an error code is generated on the passed node 13187 * @return `true` if and only if an error code is generated on the passed node
12361 * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT 13188 * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
12362 */ 13189 */
12363 bool checkForRecursiveConstructorRedirect(ConstructorDeclaration node) { 13190 bool checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
12364 if (node.factoryKeyword != null) { 13191 if (node.factoryKeyword != null) {
12365 return false; 13192 return false;
12366 } 13193 }
12367 for (ConstructorInitializer initializer in node.initializers) { 13194 for (ConstructorInitializer initializer in node.initializers) {
12368 if (initializer is RedirectingConstructorInvocation) { 13195 if (initializer is RedirectingConstructorInvocation) {
12369 ConstructorElement element = node.element; 13196 ConstructorElement element = node.element;
12370 if (!hasRedirectingFactoryConstructorCycle(element)) { 13197 if (!hasRedirectingFactoryConstructorCycle(element)) {
12371 return false; 13198 return false;
12372 } 13199 }
12373 _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_R EDIRECT, initializer, []); 13200 _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_R EDIRECT, initializer, []);
12374 return true; 13201 return true;
12375 } 13202 }
12376 } 13203 }
12377 return false; 13204 return false;
12378 } 13205 }
12379 13206
12380 /** 13207 /**
12381 * This checks if the passed constructor declaration has redirected constructo r and references 13208 * This checks if the passed constructor declaration has redirected constructo r and references
12382 * itself directly or indirectly. 13209 * itself directly or indirectly.
13210 *
12383 * @param node the constructor declaration to evaluate 13211 * @param node the constructor declaration to evaluate
12384 * @return `true` if and only if an error code is generated on the passed node 13212 * @return `true` if and only if an error code is generated on the passed node
12385 * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT 13213 * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
12386 */ 13214 */
12387 bool checkForRecursiveFactoryRedirect(ConstructorDeclaration node) { 13215 bool checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
12388 ConstructorName redirectedConstructorNode = node.redirectedConstructor; 13216 ConstructorName redirectedConstructorNode = node.redirectedConstructor;
12389 if (redirectedConstructorNode == null) { 13217 if (redirectedConstructorNode == null) {
12390 return false; 13218 return false;
12391 } 13219 }
12392 ConstructorElement element = node.element; 13220 ConstructorElement element = node.element;
12393 if (!hasRedirectingFactoryConstructorCycle(element)) { 13221 if (!hasRedirectingFactoryConstructorCycle(element)) {
12394 return false; 13222 return false;
12395 } 13223 }
12396 _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []); 13224 _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []);
12397 return true; 13225 return true;
12398 } 13226 }
12399 13227
12400 /** 13228 /**
12401 * This checks the class declaration is not a superinterface to itself. 13229 * This checks the class declaration is not a superinterface to itself.
13230 *
12402 * @param classElt the class element to test 13231 * @param classElt the class element to test
12403 * @param list a list containing the potentially cyclic implements path 13232 * @param list a list containing the potentially cyclic implements path
12404 * @return `true` if and only if an error code is generated on the passed elem ent 13233 * @return `true` if and only if an error code is generated on the passed elem ent
12405 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE 13234 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
12406 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS 13235 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
12407 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEME NTS 13236 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEME NTS
12408 */ 13237 */
12409 bool checkForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassEl ement> list) { 13238 bool checkForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassEl ement> list) {
12410 if (classElt == null) { 13239 if (classElt == null) {
12411 return false; 13240 return false;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
12457 return true; 13286 return true;
12458 } 13287 }
12459 } 13288 }
12460 list.removeAt(list.length - 1); 13289 list.removeAt(list.length - 1);
12461 return false; 13290 return false;
12462 } 13291 }
12463 13292
12464 /** 13293 /**
12465 * This checks the passed constructor declaration has a valid combination of r edirected 13294 * This checks the passed constructor declaration has a valid combination of r edirected
12466 * constructor invocation(s), super constructor invocations and field initiali zers. 13295 * constructor invocation(s), super constructor invocations and field initiali zers.
13296 *
12467 * @param node the constructor declaration to evaluate 13297 * @param node the constructor declaration to evaluate
12468 * @return `true` if and only if an error code is generated on the passed node 13298 * @return `true` if and only if an error code is generated on the passed node
12469 * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS 13299 * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
12470 * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR 13300 * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
12471 * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR 13301 * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
12472 */ 13302 */
12473 bool checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) { 13303 bool checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
12474 int numProblems = 0; 13304 int numProblems = 0;
12475 int numRedirections = 0; 13305 int numRedirections = 0;
12476 for (ConstructorInitializer initializer in node.initializers) { 13306 for (ConstructorInitializer initializer in node.initializers) {
(...skipping 15 matching lines...) Expand all
12492 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_RED IRECTING_CONSTRUCTOR, initializer, []); 13322 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZER_RED IRECTING_CONSTRUCTOR, initializer, []);
12493 numProblems++; 13323 numProblems++;
12494 } 13324 }
12495 } 13325 }
12496 } 13326 }
12497 return numProblems != 0; 13327 return numProblems != 0;
12498 } 13328 }
12499 13329
12500 /** 13330 /**
12501 * This checks if the passed constructor declaration has redirected constructo r and references 13331 * This checks if the passed constructor declaration has redirected constructo r and references
12502 * itself directly or indirectly. TODO(scheglov) 13332 * itself directly or indirectly.
13333 *
12503 * @param node the constructor declaration to evaluate 13334 * @param node the constructor declaration to evaluate
12504 * @return `true` if and only if an error code is generated on the passed node 13335 * @return `true` if and only if an error code is generated on the passed node
12505 * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR 13336 * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
12506 */ 13337 */
12507 bool checkForRedirectToNonConstConstructor(ConstructorDeclaration node) { 13338 bool checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
12508 ConstructorName redirectedConstructorNode = node.redirectedConstructor; 13339 ConstructorName redirectedConstructorNode = node.redirectedConstructor;
12509 if (redirectedConstructorNode == null) { 13340 if (redirectedConstructorNode == null) {
12510 return false; 13341 return false;
12511 } 13342 }
12512 ConstructorElement element = node.element; 13343 ConstructorElement element = node.element;
(...skipping 10 matching lines...) Expand all
12523 if (redirectedConstructor.isConst) { 13354 if (redirectedConstructor.isConst) {
12524 return false; 13355 return false;
12525 } 13356 }
12526 _errorReporter.reportError2(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONST RUCTOR, redirectedConstructorNode, []); 13357 _errorReporter.reportError2(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONST RUCTOR, redirectedConstructorNode, []);
12527 return true; 13358 return true;
12528 } 13359 }
12529 13360
12530 /** 13361 /**
12531 * This checks if the passed identifier is banned because it is part of the va riable declaration 13362 * This checks if the passed identifier is banned because it is part of the va riable declaration
12532 * with the same name. 13363 * with the same name.
13364 *
12533 * @param node the identifier to evaluate 13365 * @param node the identifier to evaluate
12534 * @return `true` if and only if an error code is generated on the passed node 13366 * @return `true` if and only if an error code is generated on the passed node
12535 * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER 13367 * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER
12536 */ 13368 */
12537 bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) { 13369 bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) {
12538 ASTNode parent = node.parent; 13370 ASTNode parent = node.parent;
12539 if (parent is PrefixedIdentifier) { 13371 if (parent is PrefixedIdentifier) {
12540 PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier; 13372 PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier;
12541 if (identical(prefixedIdentifier.identifier, node)) { 13373 if (identical(prefixedIdentifier.identifier, node)) {
12542 return false; 13374 return false;
(...skipping 26 matching lines...) Expand all
12569 String name = node.name; 13401 String name = node.name;
12570 if (!_namesForReferenceToDeclaredVariableInInitializer.contains(name)) { 13402 if (!_namesForReferenceToDeclaredVariableInInitializer.contains(name)) {
12571 return false; 13403 return false;
12572 } 13404 }
12573 _errorReporter.reportError2(CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIA BLE_IN_INITIALIZER, node, [name]); 13405 _errorReporter.reportError2(CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIA BLE_IN_INITIALIZER, node, [name]);
12574 return true; 13406 return true;
12575 } 13407 }
12576 13408
12577 /** 13409 /**
12578 * This checks that the rethrow is inside of a catch clause. 13410 * This checks that the rethrow is inside of a catch clause.
13411 *
12579 * @param node the rethrow expression to evaluate 13412 * @param node the rethrow expression to evaluate
12580 * @return `true` if and only if an error code is generated on the passed node 13413 * @return `true` if and only if an error code is generated on the passed node
12581 * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH 13414 * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
12582 */ 13415 */
12583 bool checkForRethrowOutsideCatch(RethrowExpression node) { 13416 bool checkForRethrowOutsideCatch(RethrowExpression node) {
12584 if (!_isInCatchClause) { 13417 if (!_isInCatchClause) {
12585 _errorReporter.reportError2(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, no de, []); 13418 _errorReporter.reportError2(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, no de, []);
12586 return true; 13419 return true;
12587 } 13420 }
12588 return false; 13421 return false;
12589 } 13422 }
12590 13423
12591 /** 13424 /**
12592 * This checks that a type mis-match between the return type and the expressed return type by the 13425 * This checks that a type mis-match between the return type and the expressed return type by the
12593 * enclosing method or function. 13426 * enclosing method or function.
12594 * 13427 *
12595 * This method is called both by [checkForAllReturnStatementErrorCodes]and [vi sitExpressionFunctionBody]. 13428 * This method is called both by [checkForAllReturnStatementErrorCodes]
13429 * and [visitExpressionFunctionBody].
13430 *
12596 * @param returnExpression the returned expression to evaluate 13431 * @param returnExpression the returned expression to evaluate
12597 * @param expectedReturnType the expressed return type by the enclosing method or function 13432 * @param expectedReturnType the expressed return type by the enclosing method or function
12598 * @return `true` if and only if an error code is generated on the passed node 13433 * @return `true` if and only if an error code is generated on the passed node
12599 * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE 13434 * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
12600 */ 13435 */
12601 bool checkForReturnOfInvalidType(Expression returnExpression, Type2 expectedRe turnType) { 13436 bool checkForReturnOfInvalidType(Expression returnExpression, Type2 expectedRe turnType) {
12602 Type2 staticReturnType = getStaticType(returnExpression); 13437 Type2 staticReturnType = getStaticType(returnExpression);
12603 if (expectedReturnType.isVoid) { 13438 if (expectedReturnType.isVoid) {
12604 if (staticReturnType.isVoid || staticReturnType.isDynamic || identical(sta ticReturnType, BottomTypeImpl.instance)) { 13439 if (staticReturnType.isVoid || staticReturnType.isDynamic || identical(sta ticReturnType, BottomTypeImpl.instance)) {
12605 return false; 13440 return false;
(...skipping 15 matching lines...) Expand all
12621 return false; 13456 return false;
12622 } 13457 }
12623 _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]); 13458 _errorReporter.reportError2(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [staticReturnType.displayName, expectedReturnType.displayName, _enclosingFunction.displayName]);
12624 return true; 13459 return true;
12625 } 13460 }
12626 } 13461 }
12627 13462
12628 /** 13463 /**
12629 * This checks that if the given "target" is the type reference then the "name " is not the 13464 * This checks that if the given "target" is the type reference then the "name " is not the
12630 * reference to a instance member. 13465 * reference to a instance member.
13466 *
12631 * @param target the target of the name access to evaluate 13467 * @param target the target of the name access to evaluate
12632 * @param name the accessed name to evaluate 13468 * @param name the accessed name to evaluate
12633 * @return `true` if and only if an error code is generated on the passed node 13469 * @return `true` if and only if an error code is generated on the passed node
12634 * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER 13470 * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
12635 */ 13471 */
12636 bool checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name2) { 13472 bool checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name2) {
12637 Element element = name2.element; 13473 Element element = name2.element;
12638 if (element is! ExecutableElement) { 13474 if (element is! ExecutableElement) {
12639 return false; 13475 return false;
12640 } 13476 }
12641 ExecutableElement memberElement = element as ExecutableElement; 13477 ExecutableElement memberElement = element as ExecutableElement;
12642 if (memberElement.isStatic) { 13478 if (memberElement.isStatic) {
12643 return false; 13479 return false;
12644 } 13480 }
12645 if (!isTypeReference(target)) { 13481 if (!isTypeReference(target)) {
12646 return false; 13482 return false;
12647 } 13483 }
12648 _errorReporter.reportError2(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMB ER, name2, [name2.name]); 13484 _errorReporter.reportError2(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMB ER, name2, [name2.name]);
12649 return true; 13485 return true;
12650 } 13486 }
12651 13487
12652 /** 13488 /**
12653 * This checks that the type of the passed 'switch' expression is assignable t o the type of the 13489 * This checks that the type of the passed 'switch' expression is assignable t o the type of the
12654 * 'case' members. 13490 * 'case' members.
13491 *
12655 * @param node the 'switch' statement to evaluate 13492 * @param node the 'switch' statement to evaluate
12656 * @return `true` if and only if an error code is generated on the passed node 13493 * @return `true` if and only if an error code is generated on the passed node
12657 * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE 13494 * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
12658 */ 13495 */
12659 bool checkForSwitchExpressionNotAssignable(SwitchStatement node) { 13496 bool checkForSwitchExpressionNotAssignable(SwitchStatement node) {
12660 Expression expression = node.expression; 13497 Expression expression = node.expression;
12661 Type2 expressionType = getStaticType(expression); 13498 Type2 expressionType = getStaticType(expression);
12662 if (expressionType == null) { 13499 if (expressionType == null) {
12663 return false; 13500 return false;
12664 } 13501 }
12665 NodeList<SwitchMember> members = node.members; 13502 NodeList<SwitchMember> members = node.members;
12666 for (SwitchMember switchMember in members) { 13503 for (SwitchMember switchMember in members) {
12667 if (switchMember is! SwitchCase) { 13504 if (switchMember is! SwitchCase) {
12668 continue; 13505 continue;
12669 } 13506 }
12670 SwitchCase switchCase = switchMember as SwitchCase; 13507 SwitchCase switchCase = switchMember as SwitchCase;
12671 Expression caseExpression = switchCase.expression; 13508 Expression caseExpression = switchCase.expression;
12672 Type2 caseType = getStaticType(caseExpression); 13509 Type2 caseType = getStaticType(caseExpression);
12673 if (expressionType.isAssignableTo(caseType)) { 13510 if (expressionType.isAssignableTo(caseType)) {
12674 return false; 13511 return false;
12675 } 13512 }
12676 _errorReporter.reportError2(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGN ABLE, expression, [expressionType, caseType]); 13513 _errorReporter.reportError2(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGN ABLE, expression, [expressionType, caseType]);
12677 return true; 13514 return true;
12678 } 13515 }
12679 return false; 13516 return false;
12680 } 13517 }
12681 13518
12682 /** 13519 /**
12683 * This verifies that the type arguments in the passed instance creation expre ssion are all within 13520 * This verifies that the type arguments in the passed type name are all withi n their bounds.
12684 * their bounds as specified by the class element where the constructor \[that is being invoked\] is 13521 *
12685 * declared. 13522 * @param node the [TypeName] to evaluate
12686 * @param node the instance creation expression to evaluate
12687 * @param typeName the [TypeName] of the [ConstructorName] from the[InstanceCr eationExpression], this is the AST node that the error is attached to
12688 * @param constructorElement the [ConstructorElement] from the instance creati on expression
12689 * @return `true` if and only if an error code is generated on the passed node 13523 * @return `true` if and only if an error code is generated on the passed node
12690 * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS 13524 * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
12691 */ 13525 */
12692 bool checkForTypeArgumentNotMatchingBounds(InstanceCreationExpression node, Co nstructorElement constructorElement, TypeName typeName) { 13526 bool checkForTypeArgumentNotMatchingBounds(TypeName node) {
12693 if (typeName.typeArguments != null && constructorElement != null) { 13527 if (node.typeArguments == null) {
12694 NodeList<TypeName> typeNameArgList = typeName.typeArguments.arguments; 13528 return false;
12695 List<TypeVariableElement> boundingElts = constructorElement.enclosingEleme nt.typeVariables; 13529 }
12696 int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.lengt h); 13530 List<TypeVariableElement> boundingElts = null;
12697 for (int i = 0; i < loopThroughIndex; i++) { 13531 Type2 type = node.type;
12698 TypeName argTypeName = typeNameArgList[i]; 13532 if (type == null) {
12699 Type2 argType = argTypeName.type; 13533 return false;
12700 Type2 boundType = boundingElts[i].bound; 13534 }
12701 if (argType != null && boundType != null) { 13535 Element element = type.element;
12702 if (!argType.isSubtypeOf(boundType)) { 13536 if (element is ClassElement) {
12703 _errorReporter.reportError2(StaticTypeWarningCode.TYPE_ARGUMENT_NOT_ MATCHING_BOUNDS, argTypeName, [argTypeName.name, boundingElts[i].displayName]); 13537 boundingElts = ((element as ClassElement)).typeVariables;
12704 return true; 13538 } else {
12705 } 13539 return false;
13540 }
13541 NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
13542 int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.length) ;
13543 bool foundError = false;
13544 for (int i = 0; i < loopThroughIndex; i++) {
13545 TypeName argTypeName = typeNameArgList[i];
13546 Type2 argType = argTypeName.type;
13547 Type2 boundType = boundingElts[i].bound;
13548 if (argType != null && boundType != null) {
13549 if (!argType.isSubtypeOf(boundType)) {
13550 _errorReporter.reportError2(StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MA TCHING_BOUNDS, argTypeName, [argTypeName.name, boundingElts[i].bound.displayName ]);
13551 foundError = true;
12706 } 13552 }
12707 } 13553 }
12708 } 13554 }
12709 return false; 13555 return foundError;
12710 } 13556 }
12711 13557
12712 /** 13558 /**
12713 * This checks that if the passed generative constructor has neither an explic it super constructor 13559 * This checks that if the passed generative constructor has neither an explic it super constructor
12714 * invocation nor a redirecting constructor invocation, that the superclass ha s a default 13560 * invocation nor a redirecting constructor invocation, that the superclass ha s a default
12715 * generative constructor. 13561 * generative constructor.
13562 *
12716 * @param node the constructor declaration to evaluate 13563 * @param node the constructor declaration to evaluate
12717 * @return `true` if and only if an error code is generated on the passed node 13564 * @return `true` if and only if an error code is generated on the passed node
12718 * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT 13565 * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
12719 * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR 13566 * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR
12720 * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT 13567 * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT
12721 */ 13568 */
12722 bool checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) { 13569 bool checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
12723 if (node.factoryKeyword != null) { 13570 if (node.factoryKeyword != null) {
12724 return false; 13571 return false;
12725 } 13572 }
(...skipping 18 matching lines...) Expand all
12744 } 13591 }
12745 if (!superUnnamedConstructor.isDefaultConstructor) { 13592 if (!superUnnamedConstructor.isDefaultConstructor) {
12746 int offset; 13593 int offset;
12747 int length; 13594 int length;
12748 { 13595 {
12749 Identifier returnType = node.returnType; 13596 Identifier returnType = node.returnType;
12750 SimpleIdentifier name = node.name; 13597 SimpleIdentifier name = node.name;
12751 offset = returnType.offset; 13598 offset = returnType.offset;
12752 length = (name != null ? name.end : returnType.end) - offset; 13599 length = (name != null ? name.end : returnType.end) - offset;
12753 } 13600 }
12754 _errorReporter.reportError3(StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCT OR_EXPLICIT, offset, length, [superType.displayName]); 13601 _errorReporter.reportError3(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTR UCTOR_EXPLICIT, offset, length, [superType.displayName]);
12755 } 13602 }
12756 return false; 13603 return false;
12757 } 13604 }
12758 _errorReporter.reportError2(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_IN ITIALIZER_DEFAULT, node.returnType, [superElement.name]); 13605 _errorReporter.reportError2(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_IN ITIALIZER_DEFAULT, node.returnType, [superElement.name]);
12759 return true; 13606 return true;
12760 } 13607 }
12761 13608
12762 /** 13609 /**
12763 * This verifies the passed operator-method declaration, has correct number of parameters. 13610 * This verifies the passed operator-method declaration, has correct number of parameters.
12764 * 13611 *
12765 * This method assumes that the method declaration was tested to be an operato r declaration before 13612 * This method assumes that the method declaration was tested to be an operato r declaration before
12766 * being called. 13613 * being called.
13614 *
12767 * @param node the method declaration to evaluate 13615 * @param node the method declaration to evaluate
12768 * @return `true` if and only if an error code is generated on the passed node 13616 * @return `true` if and only if an error code is generated on the passed node
12769 * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR 13617 * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
12770 */ 13618 */
12771 bool checkForWrongNumberOfParametersForOperator(MethodDeclaration node) { 13619 bool checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
12772 FormalParameterList parameterList = node.parameters; 13620 FormalParameterList parameterList = node.parameters;
12773 if (parameterList == null) { 13621 if (parameterList == null) {
12774 return false; 13622 return false;
12775 } 13623 }
12776 int numParameters = parameterList.parameters.length; 13624 int numParameters = parameterList.parameters.length;
(...skipping 15 matching lines...) Expand all
12792 return true; 13640 return true;
12793 } 13641 }
12794 if ("-" == name && numParameters > 1) { 13642 if ("-" == name && numParameters > 1) {
12795 _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETER S_FOR_OPERATOR_MINUS, nameNode, [numParameters]); 13643 _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETER S_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
12796 return true; 13644 return true;
12797 } 13645 }
12798 return false; 13646 return false;
12799 } 13647 }
12800 13648
12801 /** 13649 /**
12802 * This verifies if the passed setter parameter list have only one parameter. 13650 * This verifies if the passed setter parameter list have only one required pa rameter.
12803 * 13651 *
12804 * This method assumes that the method declaration was tested to be a setter b efore being called. 13652 * This method assumes that the method declaration was tested to be a setter b efore being called.
13653 *
12805 * @param setterName the name of the setter to report problems on 13654 * @param setterName the name of the setter to report problems on
12806 * @param parameterList the parameter list to evaluate 13655 * @param parameterList the parameter list to evaluate
12807 * @return `true` if and only if an error code is generated on the passed node 13656 * @return `true` if and only if an error code is generated on the passed node
12808 * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER 13657 * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
12809 */ 13658 */
12810 bool checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, For malParameterList parameterList) { 13659 bool checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, For malParameterList parameterList) {
12811 if (setterName == null) { 13660 if (setterName == null) {
12812 return false; 13661 return false;
12813 } 13662 }
12814 if (parameterList == null) { 13663 if (parameterList == null) {
12815 return false; 13664 return false;
12816 } 13665 }
12817 int numberOfParameters = parameterList.parameters.length; 13666 NodeList<FormalParameter> parameters = parameterList.parameters;
12818 if (numberOfParameters != 1) { 13667 if (parameters.length != 1 || parameters[0].kind != ParameterKind.REQUIRED) {
12819 _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETER S_FOR_SETTER, setterName, [numberOfParameters]); 13668 _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETER S_FOR_SETTER, setterName, []);
12820 return true; 13669 return true;
12821 } 13670 }
12822 return false; 13671 return false;
12823 } 13672 }
12824 13673
12825 /** 13674 /**
12826 * Return the propagated type of the given expression, or the static type if t here is no 13675 * Return the propagated type of the given expression, or the static type if t here is no
12827 * propagated type information. 13676 * propagated type information.
13677 *
12828 * @param expression the expression whose type is to be returned 13678 * @param expression the expression whose type is to be returned
12829 * @return the propagated or static type of the given expression, whichever is best 13679 * @return the propagated or static type of the given expression, whichever is best
12830 */ 13680 */
12831 Type2 getBestType(Expression expression) { 13681 Type2 getBestType(Expression expression) {
12832 Type2 type = getPropagatedType(expression); 13682 Type2 type = getPropagatedType(expression);
12833 if (type == null) { 13683 if (type == null) {
12834 type = getStaticType(expression); 13684 type = getStaticType(expression);
12835 } 13685 }
12836 return type; 13686 return type;
12837 } 13687 }
12838 13688
12839 /** 13689 /**
12840 * Returns the Type (return type) for a given getter. 13690 * Returns the Type (return type) for a given getter.
13691 *
12841 * @param propertyAccessorElement 13692 * @param propertyAccessorElement
12842 * @return The type of the given getter. 13693 * @return The type of the given getter.
12843 */ 13694 */
12844 Type2 getGetterType(PropertyAccessorElement propertyAccessorElement) { 13695 Type2 getGetterType(PropertyAccessorElement propertyAccessorElement) {
12845 FunctionType functionType = propertyAccessorElement.type; 13696 FunctionType functionType = propertyAccessorElement.type;
12846 if (functionType != null) { 13697 if (functionType != null) {
12847 return functionType.returnType; 13698 return functionType.returnType;
12848 } else { 13699 } else {
12849 return null; 13700 return null;
12850 } 13701 }
12851 } 13702 }
12852 13703
12853 /** 13704 /**
12854 * Return the propagated type of the given expression that is to be used for t ype analysis. 13705 * Return the propagated type of the given expression that is to be used for t ype analysis.
13706 *
12855 * @param expression the expression whose type is to be returned 13707 * @param expression the expression whose type is to be returned
12856 * @return the propagated type of the given expression 13708 * @return the propagated type of the given expression
12857 */ 13709 */
12858 Type2 getPropagatedType(Expression expression) => expression.propagatedType; 13710 Type2 getPropagatedType(Expression expression) => expression.propagatedType;
12859 13711
12860 /** 13712 /**
12861 * Returns the Type (first and only parameter) for a given setter. 13713 * Returns the Type (first and only parameter) for a given setter.
13714 *
12862 * @param propertyAccessorElement 13715 * @param propertyAccessorElement
12863 * @return The type of the given setter. 13716 * @return The type of the given setter.
12864 */ 13717 */
12865 Type2 getSetterType(PropertyAccessorElement propertyAccessorElement) { 13718 Type2 getSetterType(PropertyAccessorElement propertyAccessorElement) {
12866 List<ParameterElement> setterParameters = propertyAccessorElement.parameters ; 13719 List<ParameterElement> setterParameters = propertyAccessorElement.parameters ;
12867 if (setterParameters.length == 0) { 13720 if (setterParameters.length == 0) {
12868 return null; 13721 return null;
12869 } 13722 }
12870 return setterParameters[0].type; 13723 return setterParameters[0].type;
12871 } 13724 }
12872 13725
12873 /** 13726 /**
12874 * Return the static type of the given expression that is to be used for type analysis. 13727 * Return the static type of the given expression that is to be used for type analysis.
13728 *
12875 * @param expression the expression whose type is to be returned 13729 * @param expression the expression whose type is to be returned
12876 * @return the static type of the given expression 13730 * @return the static type of the given expression
12877 */ 13731 */
12878 Type2 getStaticType(Expression expression) { 13732 Type2 getStaticType(Expression expression) {
12879 Type2 type = expression.staticType; 13733 Type2 type = expression.staticType;
12880 if (type == null) { 13734 if (type == null) {
12881 return _dynamicType; 13735 return _dynamicType;
12882 } 13736 }
12883 return type; 13737 return type;
12884 } 13738 }
12885 13739
12886 /** 13740 /**
12887 * Return the variable element represented by the given expression, or `null` if there is no 13741 * Return the variable element represented by the given expression, or `null` if there is no
12888 * such element. 13742 * such element.
13743 *
12889 * @param expression the expression whose element is to be returned 13744 * @param expression the expression whose element is to be returned
12890 * @return the variable element represented by the expression 13745 * @return the variable element represented by the expression
12891 */ 13746 */
12892 VariableElement getVariableElement(Expression expression) { 13747 VariableElement getVariableElement(Expression expression) {
12893 if (expression is Identifier) { 13748 if (expression is Identifier) {
12894 Element element = ((expression as Identifier)).element; 13749 Element element = ((expression as Identifier)).element;
12895 if (element is VariableElement) { 13750 if (element is VariableElement) {
12896 return element as VariableElement; 13751 return element as VariableElement;
12897 } 13752 }
12898 } 13753 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
12987 this._errorReporter = errorReporter; 13842 this._errorReporter = errorReporter;
12988 } 13843 }
12989 Object visitImportDirective(ImportDirective directive) { 13844 Object visitImportDirective(ImportDirective directive) {
12990 return null; 13845 return null;
12991 } 13846 }
12992 13847
12993 /** 13848 /**
12994 * This verifies that the passed file import directive is not contained in a s ource inside a 13849 * This verifies that the passed file import directive is not contained in a s ource inside a
12995 * package "lib" directory hierarchy referencing a source outside that package "lib" directory 13850 * package "lib" directory hierarchy referencing a source outside that package "lib" directory
12996 * hierarchy. 13851 * hierarchy.
13852 *
12997 * @param uriLiteral the import URL (not `null`) 13853 * @param uriLiteral the import URL (not `null`)
12998 * @param path the file path being verified (not `null`) 13854 * @param path the file path being verified (not `null`)
12999 * @return `true` if and only if an error code is generated on the passed node 13855 * @return `true` if and only if an error code is generated on the passed node
13000 * @see PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE 13856 * @see PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE
13001 */ 13857 */
13002 bool checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral , String path) { 13858 bool checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral , String path) {
13003 Source source = getSource(uriLiteral); 13859 Source source = getSource(uriLiteral);
13004 String fullName = getSourceFullName(source); 13860 String fullName = getSourceFullName(source);
13005 if (fullName != null) { 13861 if (fullName != null) {
13006 int pathIndex = 0; 13862 int pathIndex = 0;
(...skipping 14 matching lines...) Expand all
13021 pathIndex += 3; 13877 pathIndex += 3;
13022 } 13878 }
13023 } 13879 }
13024 return false; 13880 return false;
13025 } 13881 }
13026 13882
13027 /** 13883 /**
13028 * This verifies that the passed file import directive is not contained in a s ource outside a 13884 * This verifies that the passed file import directive is not contained in a s ource outside a
13029 * package "lib" directory hierarchy referencing a source inside that package "lib" directory 13885 * package "lib" directory hierarchy referencing a source inside that package "lib" directory
13030 * hierarchy. 13886 * hierarchy.
13887 *
13031 * @param uriLiteral the import URL (not `null`) 13888 * @param uriLiteral the import URL (not `null`)
13032 * @param path the file path being verified (not `null`) 13889 * @param path the file path being verified (not `null`)
13033 * @return `true` if and only if an error code is generated on the passed node 13890 * @return `true` if and only if an error code is generated on the passed node
13034 * @see PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE 13891 * @see PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE
13035 */ 13892 */
13036 bool checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral , String path) { 13893 bool checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral , String path) {
13037 if (path.startsWith("lib/")) { 13894 if (path.startsWith("lib/")) {
13038 if (checkForFileImportOutsideLibReferencesFileInside2(uriLiteral, path, 0) ) { 13895 if (checkForFileImportOutsideLibReferencesFileInside2(uriLiteral, path, 0) ) {
13039 return true; 13896 return true;
13040 } 13897 }
(...skipping 19 matching lines...) Expand all
13060 if (!fullName.contains("/lib/")) { 13917 if (!fullName.contains("/lib/")) {
13061 _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_RE FERENCES_FILE_INSIDE, uriLiteral, []); 13918 _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_RE FERENCES_FILE_INSIDE, uriLiteral, []);
13062 return true; 13919 return true;
13063 } 13920 }
13064 } 13921 }
13065 return false; 13922 return false;
13066 } 13923 }
13067 13924
13068 /** 13925 /**
13069 * This verifies that the passed package import directive does not contain ".. " 13926 * This verifies that the passed package import directive does not contain ".. "
13927 *
13070 * @param uriLiteral the import URL (not `null`) 13928 * @param uriLiteral the import URL (not `null`)
13071 * @param path the path to be validated (not `null`) 13929 * @param path the path to be validated (not `null`)
13072 * @return `true` if and only if an error code is generated on the passed node 13930 * @return `true` if and only if an error code is generated on the passed node
13073 * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT 13931 * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
13074 */ 13932 */
13075 bool checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path ) { 13933 bool checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path ) {
13076 if (path.startsWith("../") || path.contains("/../")) { 13934 if (path.startsWith("../") || path.contains("/../")) {
13077 _errorReporter.reportError2(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_ DOT, uriLiteral, []); 13935 _errorReporter.reportError2(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_ DOT, uriLiteral, []);
13078 return true; 13936 return true;
13079 } 13937 }
13080 return false; 13938 return false;
13081 } 13939 }
13082 13940
13083 /** 13941 /**
13084 * Answer the source associated with the compilation unit containing the given AST node. 13942 * Answer the source associated with the compilation unit containing the given AST node.
13943 *
13085 * @param node the node (not `null`) 13944 * @param node the node (not `null`)
13086 * @return the source or `null` if it could not be determined 13945 * @return the source or `null` if it could not be determined
13087 */ 13946 */
13088 Source getSource(ASTNode node) { 13947 Source getSource(ASTNode node) {
13089 Source source = null; 13948 Source source = null;
13090 CompilationUnit unit = node.getAncestor(CompilationUnit); 13949 CompilationUnit unit = node.getAncestor(CompilationUnit);
13091 if (unit != null) { 13950 if (unit != null) {
13092 CompilationUnitElement element = unit.element; 13951 CompilationUnitElement element = unit.element;
13093 if (element != null) { 13952 if (element != null) {
13094 source = element.source; 13953 source = element.source;
13095 } 13954 }
13096 } 13955 }
13097 return source; 13956 return source;
13098 } 13957 }
13099 13958
13100 /** 13959 /**
13101 * Answer the full name of the given source. The returned value will have all[ File#separatorChar] replace by '/'. 13960 * Answer the full name of the given source. The returned value will have all
13961 * [File#separatorChar] replace by '/'.
13962 *
13102 * @param source the source 13963 * @param source the source
13103 * @return the full name or `null` if it could not be determined 13964 * @return the full name or `null` if it could not be determined
13104 */ 13965 */
13105 String getSourceFullName(Source source) { 13966 String getSourceFullName(Source source) {
13106 if (source != null) { 13967 if (source != null) {
13107 String fullName = source.fullName; 13968 String fullName = source.fullName;
13108 if (fullName != null) { 13969 if (fullName != null) {
13109 return fullName.replaceAll(r'\', '/'); 13970 return fullName.replaceAll(r'\', '/');
13110 } 13971 }
13111 } 13972 }
13112 return null; 13973 return null;
13113 } 13974 }
13114 } 13975 }
13115 /** 13976 /**
13116 * The enumeration `ResolverErrorCode` defines the error codes used for errors d etected by the 13977 * The enumeration `ResolverErrorCode` defines the error codes used for errors d etected by the
13117 * resolver. The convention for this class is for the name of the error code to indicate the problem 13978 * resolver. The convention for this class is for the name of the error code to indicate the problem
13118 * that caused the error to be generated and for the error message to explain wh at is wrong and, 13979 * that caused the error to be generated and for the error message to explain wh at is wrong and,
13119 * when appropriate, how the problem can be corrected. 13980 * when appropriate, how the problem can be corrected.
13981 *
13120 * @coverage dart.engine.resolver 13982 * @coverage dart.engine.resolver
13121 */ 13983 */
13122 class ResolverErrorCode implements Comparable<ResolverErrorCode>, ErrorCode { 13984 class ResolverErrorCode implements Comparable<ResolverErrorCode>, ErrorCode {
13123 static final ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = new ResolverErro rCode('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break la bel resolves to case or default statement"); 13985 static final ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = new ResolverErro rCode('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break la bel resolves to case or default statement");
13124 static final ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = new ResolverErrorCod e('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member"); 13986 static final ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = new ResolverErrorCod e('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
13125 static final ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = new Resol verErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ER ROR, "Libraries that have parts must have a library directive"); 13987 static final ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = new Resol verErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ER ROR, "Libraries that have parts must have a library directive");
13126 static final List<ResolverErrorCode> values = [BREAK_LABEL_ON_SWITCH_MEMBER, C ONTINUE_LABEL_ON_SWITCH, MISSING_LIBRARY_DIRECTIVE_WITH_PART]; 13988 static final List<ResolverErrorCode> values = [BREAK_LABEL_ON_SWITCH_MEMBER, C ONTINUE_LABEL_ON_SWITCH, MISSING_LIBRARY_DIRECTIVE_WITH_PART];
13127 13989
13128 /// The name of this enum constant, as declared in the enum declaration. 13990 /// The name of this enum constant, as declared in the enum declaration.
13129 final String name; 13991 final String name;
13130 13992
13131 /// The position in the enum declaration. 13993 /// The position in the enum declaration.
13132 final int ordinal; 13994 final int ordinal;
13133 13995
13134 /** 13996 /**
13135 * The type of this error. 13997 * The type of this error.
13136 */ 13998 */
13137 ErrorType _type; 13999 ErrorType _type;
13138 14000
13139 /** 14001 /**
13140 * The message template used to create the message to be displayed for this er ror. 14002 * The message template used to create the message to be displayed for this er ror.
13141 */ 14003 */
13142 String _message; 14004 String _message;
13143 14005
13144 /** 14006 /**
13145 * Initialize a newly created error code to have the given type and message. 14007 * Initialize a newly created error code to have the given type and message.
14008 *
13146 * @param type the type of this error 14009 * @param type the type of this error
13147 * @param message the message template used to create the message to be displa yed for the error 14010 * @param message the message template used to create the message to be displa yed for the error
13148 */ 14011 */
13149 ResolverErrorCode(this.name, this.ordinal, ErrorType type, String message) { 14012 ResolverErrorCode(this.name, this.ordinal, ErrorType type, String message) {
13150 this._type = type; 14013 this._type = type;
13151 this._message = message; 14014 this._message = message;
13152 } 14015 }
13153 ErrorSeverity get errorSeverity => _type.severity; 14016 ErrorSeverity get errorSeverity => _type.severity;
13154 String get message => _message; 14017 String get message => _message;
13155 ErrorType get type => _type; 14018 ErrorType get type => _type;
13156 int compareTo(ResolverErrorCode other) => ordinal - other.ordinal; 14019 int compareTo(ResolverErrorCode other) => ordinal - other.ordinal;
13157 int get hashCode => ordinal; 14020 int get hashCode => ordinal;
13158 String toString() => name; 14021 String toString() => name;
13159 } 14022 }
OLDNEW
« no previous file with comments | « pkg/analyzer_experimental/lib/src/generated/parser.dart ('k') | pkg/analyzer_experimental/lib/src/generated/scanner.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698