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

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

Issue 16611004: Improve java2dart code style - relax 'don't reference variable name in its initializer'. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 6 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;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 bool wasInField = _inFieldContext; 87 bool wasInField = _inFieldContext;
88 _inFieldContext = false; 88 _inFieldContext = false;
89 try { 89 try {
90 node.visitChildren(this); 90 node.visitChildren(this);
91 } finally { 91 } finally {
92 _inFieldContext = wasInField; 92 _inFieldContext = wasInField;
93 } 93 }
94 return null; 94 return null;
95 } 95 }
96 Object visitCatchClause(CatchClause node) { 96 Object visitCatchClause(CatchClause node) {
97 SimpleIdentifier exceptionParameter2 = node.exceptionParameter; 97 SimpleIdentifier exceptionParameter = node.exceptionParameter;
98 if (exceptionParameter2 != null) { 98 if (exceptionParameter != null) {
99 LocalVariableElementImpl exception = new LocalVariableElementImpl(exceptio nParameter2); 99 LocalVariableElementImpl exception = new LocalVariableElementImpl(exceptio nParameter);
100 _currentHolder.addLocalVariable(exception); 100 _currentHolder.addLocalVariable(exception);
101 exceptionParameter2.element = exception; 101 exceptionParameter.element = exception;
102 SimpleIdentifier stackTraceParameter2 = node.stackTraceParameter; 102 SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
103 if (stackTraceParameter2 != null) { 103 if (stackTraceParameter != null) {
104 LocalVariableElementImpl stackTrace = new LocalVariableElementImpl(stack TraceParameter2); 104 LocalVariableElementImpl stackTrace = new LocalVariableElementImpl(stack TraceParameter);
105 _currentHolder.addLocalVariable(stackTrace); 105 _currentHolder.addLocalVariable(stackTrace);
106 stackTraceParameter2.element = stackTrace; 106 stackTraceParameter.element = stackTrace;
107 } 107 }
108 } 108 }
109 return super.visitCatchClause(node); 109 return super.visitCatchClause(node);
110 } 110 }
111 Object visitClassDeclaration(ClassDeclaration node) { 111 Object visitClassDeclaration(ClassDeclaration node) {
112 ElementHolder holder = new ElementHolder(); 112 ElementHolder holder = new ElementHolder();
113 _isValidMixin = true; 113 _isValidMixin = true;
114 visitChildren(holder, node); 114 visitChildren(holder, node);
115 SimpleIdentifier className = node.name; 115 SimpleIdentifier className = node.name;
116 ClassElementImpl element = new ClassElementImpl(className); 116 ClassElementImpl element = new ClassElementImpl(className);
117 List<TypeVariableElement> typeVariables2 = holder.typeVariables; 117 List<TypeVariableElement> typeVariables = holder.typeVariables;
118 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element); 118 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element);
119 interfaceType.typeArguments = createTypeVariableTypes(typeVariables2); 119 interfaceType.typeArguments = createTypeVariableTypes(typeVariables);
120 element.type = interfaceType; 120 element.type = interfaceType;
121 List<ConstructorElement> constructors2 = holder.constructors; 121 List<ConstructorElement> constructors = holder.constructors;
122 if (constructors2.length == 0) { 122 if (constructors.length == 0) {
123 constructors2 = createDefaultConstructors(interfaceType); 123 constructors = createDefaultConstructors(interfaceType);
124 } 124 }
125 element.abstract = node.abstractKeyword != null; 125 element.abstract = node.abstractKeyword != null;
126 element.accessors = holder.accessors; 126 element.accessors = holder.accessors;
127 element.constructors = constructors2; 127 element.constructors = constructors;
128 element.fields = holder.fields; 128 element.fields = holder.fields;
129 element.methods = holder.methods; 129 element.methods = holder.methods;
130 element.typeVariables = typeVariables2; 130 element.typeVariables = typeVariables;
131 element.validMixin = _isValidMixin; 131 element.validMixin = _isValidMixin;
132 _currentHolder.addType(element); 132 _currentHolder.addType(element);
133 className.element = element; 133 className.element = element;
134 return null; 134 return null;
135 } 135 }
136 Object visitClassTypeAlias(ClassTypeAlias node) { 136 Object visitClassTypeAlias(ClassTypeAlias node) {
137 ElementHolder holder = new ElementHolder(); 137 ElementHolder holder = new ElementHolder();
138 visitChildren(holder, node); 138 visitChildren(holder, node);
139 SimpleIdentifier className = node.name; 139 SimpleIdentifier className = node.name;
140 ClassElementImpl element = new ClassElementImpl(className); 140 ClassElementImpl element = new ClassElementImpl(className);
141 element.abstract = node.abstractKeyword != null; 141 element.abstract = node.abstractKeyword != null;
142 element.typedef = true; 142 element.typedef = true;
143 List<TypeVariableElement> typeVariables2 = holder.typeVariables; 143 List<TypeVariableElement> typeVariables = holder.typeVariables;
144 element.typeVariables = typeVariables2; 144 element.typeVariables = typeVariables;
145 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element); 145 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element);
146 interfaceType.typeArguments = createTypeVariableTypes(typeVariables2); 146 interfaceType.typeArguments = createTypeVariableTypes(typeVariables);
147 element.type = interfaceType; 147 element.type = interfaceType;
148 element.constructors = createDefaultConstructors(interfaceType); 148 element.constructors = createDefaultConstructors(interfaceType);
149 _currentHolder.addType(element); 149 _currentHolder.addType(element);
150 className.element = element; 150 className.element = element;
151 return null; 151 return null;
152 } 152 }
153 Object visitConstructorDeclaration(ConstructorDeclaration node) { 153 Object visitConstructorDeclaration(ConstructorDeclaration node) {
154 _isValidMixin = false; 154 _isValidMixin = false;
155 ElementHolder holder = new ElementHolder(); 155 ElementHolder holder = new ElementHolder();
156 bool wasInFunction = _inFunction; 156 bool wasInFunction = _inFunction;
157 _inFunction = true; 157 _inFunction = true;
158 try { 158 try {
159 visitChildren(holder, node); 159 visitChildren(holder, node);
160 } finally { 160 } finally {
161 _inFunction = wasInFunction; 161 _inFunction = wasInFunction;
162 } 162 }
163 SimpleIdentifier constructorName = node.name; 163 SimpleIdentifier constructorName = node.name;
164 ConstructorElementImpl element = new ConstructorElementImpl(constructorName) ; 164 ConstructorElementImpl element = new ConstructorElementImpl(constructorName) ;
165 if (node.factoryKeyword != null) { 165 if (node.factoryKeyword != null) {
166 element.factory = true; 166 element.factory = true;
167 } 167 }
168 element.functions = holder.functions; 168 element.functions = holder.functions;
169 element.labels = holder.labels; 169 element.labels = holder.labels;
170 element.localVariables = holder.localVariables; 170 element.localVariables = holder.localVariables;
171 element.parameters = holder.parameters; 171 element.parameters = holder.parameters;
172 element.const2 = node.constKeyword != null; 172 element.const2 = node.constKeyword != null;
173 _currentHolder.addConstructor(element); 173 _currentHolder.addConstructor(element);
174 node.element = element; 174 node.element = element;
175 if (constructorName == null) { 175 if (constructorName == null) {
176 Identifier returnType2 = node.returnType; 176 Identifier returnType = node.returnType;
177 if (returnType2 != null) { 177 if (returnType != null) {
178 element.nameOffset = returnType2.offset; 178 element.nameOffset = returnType.offset;
179 } 179 }
180 } else { 180 } else {
181 constructorName.element = element; 181 constructorName.element = element;
182 } 182 }
183 return null; 183 return null;
184 } 184 }
185 Object visitDeclaredIdentifier(DeclaredIdentifier node) { 185 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
186 SimpleIdentifier variableName = node.identifier; 186 SimpleIdentifier variableName = node.identifier;
187 sc.Token keyword2 = node.keyword; 187 sc.Token keyword = node.keyword;
188 LocalVariableElementImpl element = new LocalVariableElementImpl(variableName ); 188 LocalVariableElementImpl element = new LocalVariableElementImpl(variableName );
189 ForEachStatement statement = node.parent as ForEachStatement; 189 ForEachStatement statement = node.parent as ForEachStatement;
190 int declarationEnd = node.offset + node.length; 190 int declarationEnd = node.offset + node.length;
191 int statementEnd = statement.offset + statement.length; 191 int statementEnd = statement.offset + statement.length;
192 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1); 192 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1);
193 element.const3 = matches(keyword2, sc.Keyword.CONST); 193 element.const3 = matches(keyword, sc.Keyword.CONST);
194 element.final2 = matches(keyword2, sc.Keyword.FINAL); 194 element.final2 = matches(keyword, sc.Keyword.FINAL);
195 _currentHolder.addLocalVariable(element); 195 _currentHolder.addLocalVariable(element);
196 variableName.element = element; 196 variableName.element = element;
197 return super.visitDeclaredIdentifier(node); 197 return super.visitDeclaredIdentifier(node);
198 } 198 }
199 Object visitDefaultFormalParameter(DefaultFormalParameter node) { 199 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
200 ElementHolder holder = new ElementHolder(); 200 ElementHolder holder = new ElementHolder();
201 visit(holder, node.defaultValue); 201 visit(holder, node.defaultValue);
202 FunctionElementImpl initializer = new FunctionElementImpl(); 202 FunctionElementImpl initializer = new FunctionElementImpl();
203 initializer.functions = holder.functions; 203 initializer.functions = holder.functions;
204 initializer.labels = holder.labels; 204 initializer.labels = holder.labels;
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 FunctionTypeImpl type = new FunctionTypeImpl.con1(element); 339 FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
340 element.type = type; 340 element.type = type;
341 _currentHolder.addFunction(element); 341 _currentHolder.addFunction(element);
342 node.element = element; 342 node.element = element;
343 return null; 343 return null;
344 } 344 }
345 Object visitFunctionTypeAlias(FunctionTypeAlias node) { 345 Object visitFunctionTypeAlias(FunctionTypeAlias node) {
346 ElementHolder holder = new ElementHolder(); 346 ElementHolder holder = new ElementHolder();
347 visitChildren(holder, node); 347 visitChildren(holder, node);
348 SimpleIdentifier aliasName = node.name; 348 SimpleIdentifier aliasName = node.name;
349 List<ParameterElement> parameters2 = holder.parameters; 349 List<ParameterElement> parameters = holder.parameters;
350 List<TypeVariableElement> typeVariables2 = holder.typeVariables; 350 List<TypeVariableElement> typeVariables = holder.typeVariables;
351 FunctionTypeAliasElementImpl element = new FunctionTypeAliasElementImpl(alia sName); 351 FunctionTypeAliasElementImpl element = new FunctionTypeAliasElementImpl(alia sName);
352 element.parameters = parameters2; 352 element.parameters = parameters;
353 element.typeVariables = typeVariables2; 353 element.typeVariables = typeVariables;
354 FunctionTypeImpl type = new FunctionTypeImpl.con2(element); 354 FunctionTypeImpl type = new FunctionTypeImpl.con2(element);
355 type.typeArguments = createTypeVariableTypes(typeVariables2); 355 type.typeArguments = createTypeVariableTypes(typeVariables);
356 element.type = type; 356 element.type = type;
357 _currentHolder.addTypeAlias(element); 357 _currentHolder.addTypeAlias(element);
358 aliasName.element = element; 358 aliasName.element = element;
359 return null; 359 return null;
360 } 360 }
361 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { 361 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
362 if (node.parent is! DefaultFormalParameter) { 362 if (node.parent is! DefaultFormalParameter) {
363 SimpleIdentifier parameterName = node.identifier; 363 SimpleIdentifier parameterName = node.identifier;
364 ParameterElementImpl parameter = new ParameterElementImpl(parameterName); 364 ParameterElementImpl parameter = new ParameterElementImpl(parameterName);
365 parameter.parameterKind = node.kind; 365 parameter.parameterKind = node.kind;
(...skipping 17 matching lines...) Expand all
383 } 383 }
384 Object visitMethodDeclaration(MethodDeclaration node) { 384 Object visitMethodDeclaration(MethodDeclaration node) {
385 ElementHolder holder = new ElementHolder(); 385 ElementHolder holder = new ElementHolder();
386 bool wasInFunction = _inFunction; 386 bool wasInFunction = _inFunction;
387 _inFunction = true; 387 _inFunction = true;
388 try { 388 try {
389 visitChildren(holder, node); 389 visitChildren(holder, node);
390 } finally { 390 } finally {
391 _inFunction = wasInFunction; 391 _inFunction = wasInFunction;
392 } 392 }
393 bool isStatic2 = node.isStatic(); 393 bool isStatic = node.isStatic();
394 sc.Token property = node.propertyKeyword; 394 sc.Token property = node.propertyKeyword;
395 if (property == null) { 395 if (property == null) {
396 SimpleIdentifier methodName = node.name; 396 SimpleIdentifier methodName = node.name;
397 String nameOfMethod = methodName.name; 397 String nameOfMethod = methodName.name;
398 if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameter s.length == 0) { 398 if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameter s.length == 0) {
399 nameOfMethod = "unary-"; 399 nameOfMethod = "unary-";
400 } 400 }
401 MethodElementImpl element = new MethodElementImpl.con2(nameOfMethod, metho dName.offset); 401 MethodElementImpl element = new MethodElementImpl.con2(nameOfMethod, metho dName.offset);
402 element.abstract = node.isAbstract(); 402 element.abstract = node.isAbstract();
403 element.functions = holder.functions; 403 element.functions = holder.functions;
404 element.labels = holder.labels; 404 element.labels = holder.labels;
405 element.localVariables = holder.localVariables; 405 element.localVariables = holder.localVariables;
406 element.parameters = holder.parameters; 406 element.parameters = holder.parameters;
407 element.static = isStatic2; 407 element.static = isStatic;
408 _currentHolder.addMethod(element); 408 _currentHolder.addMethod(element);
409 methodName.element = element; 409 methodName.element = element;
410 } else { 410 } else {
411 SimpleIdentifier propertyNameNode = node.name; 411 SimpleIdentifier propertyNameNode = node.name;
412 String propertyName = propertyNameNode.name; 412 String propertyName = propertyNameNode.name;
413 FieldElementImpl field = _currentHolder.getField(propertyName) as FieldEle mentImpl; 413 FieldElementImpl field = _currentHolder.getField(propertyName) as FieldEle mentImpl;
414 if (field == null) { 414 if (field == null) {
415 field = new FieldElementImpl.con2(node.name.name); 415 field = new FieldElementImpl.con2(node.name.name);
416 field.final2 = true; 416 field.final2 = true;
417 field.static = isStatic2; 417 field.static = isStatic;
418 _currentHolder.addField(field); 418 _currentHolder.addField(field);
419 } 419 }
420 if (matches(property, sc.Keyword.GET)) { 420 if (matches(property, sc.Keyword.GET)) {
421 PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con 1(propertyNameNode); 421 PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con 1(propertyNameNode);
422 getter.functions = holder.functions; 422 getter.functions = holder.functions;
423 getter.labels = holder.labels; 423 getter.labels = holder.labels;
424 getter.localVariables = holder.localVariables; 424 getter.localVariables = holder.localVariables;
425 getter.variable = field; 425 getter.variable = field;
426 getter.abstract = node.body is EmptyFunctionBody && node.externalKeyword == null; 426 getter.abstract = node.body is EmptyFunctionBody && node.externalKeyword == null;
427 getter.getter = true; 427 getter.getter = true;
428 getter.static = isStatic2; 428 getter.static = isStatic;
429 field.getter = getter; 429 field.getter = getter;
430 _currentHolder.addAccessor(getter); 430 _currentHolder.addAccessor(getter);
431 propertyNameNode.element = getter; 431 propertyNameNode.element = getter;
432 } else { 432 } else {
433 PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con 1(propertyNameNode); 433 PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con 1(propertyNameNode);
434 setter.functions = holder.functions; 434 setter.functions = holder.functions;
435 setter.labels = holder.labels; 435 setter.labels = holder.labels;
436 setter.localVariables = holder.localVariables; 436 setter.localVariables = holder.localVariables;
437 setter.parameters = holder.parameters; 437 setter.parameters = holder.parameters;
438 setter.variable = field; 438 setter.variable = field;
439 setter.abstract = node.body is EmptyFunctionBody && !matches(node.extern alKeyword, sc.Keyword.EXTERNAL); 439 setter.abstract = node.body is EmptyFunctionBody && !matches(node.extern alKeyword, sc.Keyword.EXTERNAL);
440 setter.setter = true; 440 setter.setter = true;
441 setter.static = isStatic2; 441 setter.static = isStatic;
442 field.setter = setter; 442 field.setter = setter;
443 field.final2 = false; 443 field.final2 = false;
444 _currentHolder.addAccessor(setter); 444 _currentHolder.addAccessor(setter);
445 propertyNameNode.element = setter; 445 propertyNameNode.element = setter;
446 } 446 }
447 } 447 }
448 return null; 448 return null;
449 } 449 }
450 Object visitSimpleFormalParameter(SimpleFormalParameter node) { 450 Object visitSimpleFormalParameter(SimpleFormalParameter node) {
451 if (node.parent is! DefaultFormalParameter) { 451 if (node.parent is! DefaultFormalParameter) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 Object visitTypeParameter(TypeParameter node) { 484 Object visitTypeParameter(TypeParameter node) {
485 SimpleIdentifier parameterName = node.name; 485 SimpleIdentifier parameterName = node.name;
486 TypeVariableElementImpl element = new TypeVariableElementImpl(parameterName) ; 486 TypeVariableElementImpl element = new TypeVariableElementImpl(parameterName) ;
487 TypeVariableTypeImpl type = new TypeVariableTypeImpl(element); 487 TypeVariableTypeImpl type = new TypeVariableTypeImpl(element);
488 element.type = type; 488 element.type = type;
489 _currentHolder.addTypeVariable(element); 489 _currentHolder.addTypeVariable(element);
490 parameterName.element = element; 490 parameterName.element = element;
491 return super.visitTypeParameter(node); 491 return super.visitTypeParameter(node);
492 } 492 }
493 Object visitVariableDeclaration(VariableDeclaration node) { 493 Object visitVariableDeclaration(VariableDeclaration node) {
494 sc.Token keyword2 = ((node.parent as VariableDeclarationList)).keyword; 494 sc.Token keyword = ((node.parent as VariableDeclarationList)).keyword;
495 bool isConst = matches(keyword2, sc.Keyword.CONST); 495 bool isConst = matches(keyword, sc.Keyword.CONST);
496 bool isFinal = matches(keyword2, sc.Keyword.FINAL); 496 bool isFinal = matches(keyword, sc.Keyword.FINAL);
497 bool hasInitializer = node.initializer != null; 497 bool hasInitializer = node.initializer != null;
498 VariableElementImpl element; 498 VariableElementImpl element;
499 if (_inFieldContext) { 499 if (_inFieldContext) {
500 SimpleIdentifier fieldName = node.name; 500 SimpleIdentifier fieldName = node.name;
501 FieldElementImpl field; 501 FieldElementImpl field;
502 if (isConst && hasInitializer) { 502 if (isConst && hasInitializer) {
503 field = new ConstFieldElementImpl(fieldName); 503 field = new ConstFieldElementImpl(fieldName);
504 } else { 504 } else {
505 field = new FieldElementImpl.con1(fieldName); 505 field = new FieldElementImpl.con1(fieldName);
506 } 506 }
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 return typeArguments; 598 return typeArguments;
599 } 599 }
600 600
601 /** 601 /**
602 * Return the body of the function that contains the given parameter, or {@cod e null} if no 602 * Return the body of the function that contains the given parameter, or {@cod e null} if no
603 * function body could be found. 603 * function body could be found.
604 * @param node the parameter contained in the function whose body is to be ret urned 604 * @param node the parameter contained in the function whose body is to be ret urned
605 * @return the body of the function that contains the given parameter 605 * @return the body of the function that contains the given parameter
606 */ 606 */
607 FunctionBody getFunctionBody(FormalParameter node) { 607 FunctionBody getFunctionBody(FormalParameter node) {
608 ASTNode parent2 = node.parent; 608 ASTNode parent = node.parent;
609 while (parent2 != null) { 609 while (parent != null) {
610 if (parent2 is FunctionExpression) { 610 if (parent is FunctionExpression) {
611 return ((parent2 as FunctionExpression)).body; 611 return ((parent as FunctionExpression)).body;
612 } else if (parent2 is MethodDeclaration) { 612 } else if (parent is MethodDeclaration) {
613 return ((parent2 as MethodDeclaration)).body; 613 return ((parent as MethodDeclaration)).body;
614 } 614 }
615 parent2 = parent2.parent; 615 parent = parent.parent;
616 } 616 }
617 return null; 617 return null;
618 } 618 }
619 619
620 /** 620 /**
621 * Return {@code true} if the given token is a token for the given keyword. 621 * Return {@code true} if the given token is a token for the given keyword.
622 * @param token the token being tested 622 * @param token the token being tested
623 * @param keyword the keyword being tested for 623 * @param keyword the keyword being tested for
624 * @return {@code true} if the given token is a token for the given keyword 624 * @return {@code true} if the given token is a token for the given keyword
625 */ 625 */
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 } 922 }
923 _parentNodes.add(node); 923 _parentNodes.add(node);
924 try { 924 try {
925 if (isScriptNode(node)) { 925 if (isScriptNode(node)) {
926 Source htmlSource = _htmlElement.source; 926 Source htmlSource = _htmlElement.source;
927 ht.XmlAttributeNode scriptAttribute = getScriptSourcePath(node); 927 ht.XmlAttributeNode scriptAttribute = getScriptSourcePath(node);
928 String scriptSourcePath = scriptAttribute == null ? null : scriptAttribu te.text; 928 String scriptSourcePath = scriptAttribute == null ? null : scriptAttribu te.text;
929 if (identical(node.attributeEnd.type, ht.TokenType.GT) && scriptSourcePa th == null) { 929 if (identical(node.attributeEnd.type, ht.TokenType.GT) && scriptSourcePa th == null) {
930 EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementIm pl(node); 930 EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementIm pl(node);
931 String contents = node.content; 931 String contents = node.content;
932 int attributeEnd2 = node.attributeEnd.end; 932 int attributeEnd = node.attributeEnd.end;
933 LineInfo_Location location = _lineInfo.getLocation(attributeEnd2); 933 LineInfo_Location location = _lineInfo.getLocation(attributeEnd);
934 sc.StringScanner scanner = new sc.StringScanner(htmlSource, contents, _errorListener); 934 sc.StringScanner scanner = new sc.StringScanner(htmlSource, contents, _errorListener);
935 scanner.setSourceStart(location.lineNumber, location.columnNumber, att ributeEnd2); 935 scanner.setSourceStart(location.lineNumber, location.columnNumber, att ributeEnd);
936 sc.Token firstToken = scanner.tokenize(); 936 sc.Token firstToken = scanner.tokenize();
937 List<int> lineStarts2 = scanner.lineStarts; 937 List<int> lineStarts = scanner.lineStarts;
938 Parser parser = new Parser(htmlSource, _errorListener); 938 Parser parser = new Parser(htmlSource, _errorListener);
939 CompilationUnit unit = parser.parseCompilationUnit(firstToken); 939 CompilationUnit unit = parser.parseCompilationUnit(firstToken);
940 unit.lineInfo = new LineInfo(lineStarts2); 940 unit.lineInfo = new LineInfo(lineStarts);
941 try { 941 try {
942 LibraryResolver resolver = new LibraryResolver(_context); 942 LibraryResolver resolver = new LibraryResolver(_context);
943 LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSou rce, unit, true) as LibraryElementImpl; 943 LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSou rce, unit, true) as LibraryElementImpl;
944 script.scriptLibrary = library; 944 script.scriptLibrary = library;
945 _resolvedLibraries.addAll(resolver.resolvedLibraries); 945 _resolvedLibraries.addAll(resolver.resolvedLibraries);
946 _errorListener.addAll(resolver.errorListener); 946 _errorListener.addAll(resolver.errorListener);
947 } on AnalysisException catch (exception) { 947 } on AnalysisException catch (exception) {
948 AnalysisEngine.instance.logger.logError3(exception); 948 AnalysisEngine.instance.logger.logError3(exception);
949 } 949 }
950 _scripts.add(script); 950 _scripts.add(script);
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 * element. 1062 * element.
1063 * @param unit the compilation unit to be resolved 1063 * @param unit the compilation unit to be resolved
1064 * @param element the root of the element model used to resolve the AST nodes 1064 * @param element the root of the element model used to resolve the AST nodes
1065 */ 1065 */
1066 void resolve(CompilationUnit unit, CompilationUnitElement element2) { 1066 void resolve(CompilationUnit unit, CompilationUnitElement element2) {
1067 _enclosingUnit = element2; 1067 _enclosingUnit = element2;
1068 unit.element = element2; 1068 unit.element = element2;
1069 unit.accept(this); 1069 unit.accept(this);
1070 } 1070 }
1071 Object visitCatchClause(CatchClause node) { 1071 Object visitCatchClause(CatchClause node) {
1072 SimpleIdentifier exceptionParameter2 = node.exceptionParameter; 1072 SimpleIdentifier exceptionParameter = node.exceptionParameter;
1073 if (exceptionParameter2 != null) { 1073 if (exceptionParameter != null) {
1074 List<LocalVariableElement> localVariables2 = _enclosingExecutable.localVar iables; 1074 List<LocalVariableElement> localVariables = _enclosingExecutable.localVari ables;
1075 find3(localVariables2, exceptionParameter2); 1075 find3(localVariables, exceptionParameter);
1076 SimpleIdentifier stackTraceParameter2 = node.stackTraceParameter; 1076 SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
1077 if (stackTraceParameter2 != null) { 1077 if (stackTraceParameter != null) {
1078 find3(localVariables2, stackTraceParameter2); 1078 find3(localVariables, stackTraceParameter);
1079 } 1079 }
1080 } 1080 }
1081 return super.visitCatchClause(node); 1081 return super.visitCatchClause(node);
1082 } 1082 }
1083 Object visitClassDeclaration(ClassDeclaration node) { 1083 Object visitClassDeclaration(ClassDeclaration node) {
1084 ClassElement outerClass = _enclosingClass; 1084 ClassElement outerClass = _enclosingClass;
1085 try { 1085 try {
1086 SimpleIdentifier className = node.name; 1086 SimpleIdentifier className = node.name;
1087 _enclosingClass = find3(_enclosingUnit.types, className); 1087 _enclosingClass = find3(_enclosingUnit.types, className);
1088 return super.visitClassDeclaration(node); 1088 return super.visitClassDeclaration(node);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 Object visitDefaultFormalParameter(DefaultFormalParameter node) { 1124 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
1125 SimpleIdentifier parameterName = node.parameter.identifier; 1125 SimpleIdentifier parameterName = node.parameter.identifier;
1126 ParameterElement element = null; 1126 ParameterElement element = null;
1127 if (_enclosingExecutable != null) { 1127 if (_enclosingExecutable != null) {
1128 element = find3(_enclosingExecutable.parameters, parameterName); 1128 element = find3(_enclosingExecutable.parameters, parameterName);
1129 } else { 1129 } else {
1130 PrintStringWriter writer = new PrintStringWriter(); 1130 PrintStringWriter writer = new PrintStringWriter();
1131 writer.println("Invalid state found in the Analysis Engine:"); 1131 writer.println("Invalid state found in the Analysis Engine:");
1132 writer.println("DeclarationResolver.visitDefaultFormalParameter() is visit ing a parameter that does not appear to be in a method or function."); 1132 writer.println("DeclarationResolver.visitDefaultFormalParameter() is visit ing a parameter that does not appear to be in a method or function.");
1133 writer.println("Ancestors:"); 1133 writer.println("Ancestors:");
1134 ASTNode parent2 = node.parent; 1134 ASTNode parent = node.parent;
1135 while (parent2 != null) { 1135 while (parent != null) {
1136 writer.println(parent2.runtimeType.toString()); 1136 writer.println(parent.runtimeType.toString());
1137 writer.println("---------"); 1137 writer.println("---------");
1138 parent2 = parent2.parent; 1138 parent = parent.parent;
1139 } 1139 }
1140 AnalysisEngine.instance.logger.logError2(writer.toString(), new AnalysisEx ception()); 1140 AnalysisEngine.instance.logger.logError2(writer.toString(), new AnalysisEx ception());
1141 } 1141 }
1142 Expression defaultValue2 = node.defaultValue; 1142 Expression defaultValue = node.defaultValue;
1143 if (defaultValue2 != null) { 1143 if (defaultValue != null) {
1144 ExecutableElement outerExecutable = _enclosingExecutable; 1144 ExecutableElement outerExecutable = _enclosingExecutable;
1145 try { 1145 try {
1146 if (element == null) { 1146 if (element == null) {
1147 } else { 1147 } else {
1148 _enclosingExecutable = element.initializer; 1148 _enclosingExecutable = element.initializer;
1149 } 1149 }
1150 defaultValue2.accept(this); 1150 defaultValue.accept(this);
1151 } finally { 1151 } finally {
1152 _enclosingExecutable = outerExecutable; 1152 _enclosingExecutable = outerExecutable;
1153 } 1153 }
1154 } 1154 }
1155 ParameterElement outerParameter = _enclosingParameter; 1155 ParameterElement outerParameter = _enclosingParameter;
1156 try { 1156 try {
1157 _enclosingParameter = element; 1157 _enclosingParameter = element;
1158 return super.visitDefaultFormalParameter(node); 1158 return super.visitDefaultFormalParameter(node);
1159 } finally { 1159 } finally {
1160 _enclosingParameter = outerParameter; 1160 _enclosingParameter = outerParameter;
1161 } 1161 }
1162 } 1162 }
1163 Object visitExportDirective(ExportDirective node) { 1163 Object visitExportDirective(ExportDirective node) {
1164 String uri2 = getStringValue(node.uri); 1164 String uri = getStringValue(node.uri);
1165 if (uri2 != null) { 1165 if (uri != null) {
1166 LibraryElement library2 = _enclosingUnit.library; 1166 LibraryElement library = _enclosingUnit.library;
1167 ExportElement exportElement = find5(library2.exports, _enclosingUnit.conte xt.sourceFactory.resolveUri(_enclosingUnit.source, uri2)); 1167 ExportElement exportElement = find5(library.exports, _enclosingUnit.contex t.sourceFactory.resolveUri(_enclosingUnit.source, uri));
1168 node.element = exportElement; 1168 node.element = exportElement;
1169 } 1169 }
1170 return super.visitExportDirective(node); 1170 return super.visitExportDirective(node);
1171 } 1171 }
1172 Object visitFieldFormalParameter(FieldFormalParameter node) { 1172 Object visitFieldFormalParameter(FieldFormalParameter node) {
1173 if (node.parent is! DefaultFormalParameter) { 1173 if (node.parent is! DefaultFormalParameter) {
1174 SimpleIdentifier parameterName = node.identifier; 1174 SimpleIdentifier parameterName = node.identifier;
1175 ParameterElement element = find3(_enclosingExecutable.parameters, paramete rName); 1175 ParameterElement element = find3(_enclosingExecutable.parameters, paramete rName);
1176 ParameterElement outerParameter = _enclosingParameter; 1176 ParameterElement outerParameter = _enclosingParameter;
1177 try { 1177 try {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1241 _enclosingParameter = element; 1241 _enclosingParameter = element;
1242 return super.visitFunctionTypedFormalParameter(node); 1242 return super.visitFunctionTypedFormalParameter(node);
1243 } finally { 1243 } finally {
1244 _enclosingParameter = outerParameter; 1244 _enclosingParameter = outerParameter;
1245 } 1245 }
1246 } else { 1246 } else {
1247 return super.visitFunctionTypedFormalParameter(node); 1247 return super.visitFunctionTypedFormalParameter(node);
1248 } 1248 }
1249 } 1249 }
1250 Object visitImportDirective(ImportDirective node) { 1250 Object visitImportDirective(ImportDirective node) {
1251 String uri2 = getStringValue(node.uri); 1251 String uri = getStringValue(node.uri);
1252 if (uri2 != null) { 1252 if (uri != null) {
1253 LibraryElement library2 = _enclosingUnit.library; 1253 LibraryElement library = _enclosingUnit.library;
1254 ImportElement importElement = find6(library2.imports, _enclosingUnit.conte xt.sourceFactory.resolveUri(_enclosingUnit.source, uri2), node.prefix); 1254 ImportElement importElement = find6(library.imports, _enclosingUnit.contex t.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
1255 node.element = importElement; 1255 node.element = importElement;
1256 } 1256 }
1257 return super.visitImportDirective(node); 1257 return super.visitImportDirective(node);
1258 } 1258 }
1259 Object visitLabeledStatement(LabeledStatement node) { 1259 Object visitLabeledStatement(LabeledStatement node) {
1260 for (Label label in node.labels) { 1260 for (Label label in node.labels) {
1261 SimpleIdentifier labelName = label.label; 1261 SimpleIdentifier labelName = label.label;
1262 find3(_enclosingExecutable.labels, labelName); 1262 find3(_enclosingExecutable.labels, labelName);
1263 } 1263 }
1264 return super.visitLabeledStatement(node); 1264 return super.visitLabeledStatement(node);
(...skipping 21 matching lines...) Expand all
1286 methodName.element = accessor; 1286 methodName.element = accessor;
1287 } 1287 }
1288 _enclosingExecutable = accessor; 1288 _enclosingExecutable = accessor;
1289 } 1289 }
1290 return super.visitMethodDeclaration(node); 1290 return super.visitMethodDeclaration(node);
1291 } finally { 1291 } finally {
1292 _enclosingExecutable = outerExecutable; 1292 _enclosingExecutable = outerExecutable;
1293 } 1293 }
1294 } 1294 }
1295 Object visitPartDirective(PartDirective node) { 1295 Object visitPartDirective(PartDirective node) {
1296 String uri2 = getStringValue(node.uri); 1296 String uri = getStringValue(node.uri);
1297 if (uri2 != null) { 1297 if (uri != null) {
1298 Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclo singUnit.source, uri2); 1298 Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclo singUnit.source, uri);
1299 node.element = find(_enclosingUnit.library.parts, partSource); 1299 node.element = find(_enclosingUnit.library.parts, partSource);
1300 } 1300 }
1301 return super.visitPartDirective(node); 1301 return super.visitPartDirective(node);
1302 } 1302 }
1303 Object visitPartOfDirective(PartOfDirective node) { 1303 Object visitPartOfDirective(PartOfDirective node) {
1304 node.element = _enclosingUnit.library; 1304 node.element = _enclosingUnit.library;
1305 return super.visitPartOfDirective(node); 1305 return super.visitPartOfDirective(node);
1306 } 1306 }
1307 Object visitSimpleFormalParameter(SimpleFormalParameter node) { 1307 Object visitSimpleFormalParameter(SimpleFormalParameter node) {
1308 if (node.parent is! DefaultFormalParameter) { 1308 if (node.parent is! DefaultFormalParameter) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1355 SimpleIdentifier variableName = node.name; 1355 SimpleIdentifier variableName = node.name;
1356 if (_enclosingExecutable != null) { 1356 if (_enclosingExecutable != null) {
1357 element = find3(_enclosingExecutable.localVariables, variableName); 1357 element = find3(_enclosingExecutable.localVariables, variableName);
1358 } 1358 }
1359 if (element == null && _enclosingClass != null) { 1359 if (element == null && _enclosingClass != null) {
1360 element = find3(_enclosingClass.fields, variableName); 1360 element = find3(_enclosingClass.fields, variableName);
1361 } 1361 }
1362 if (element == null && _enclosingUnit != null) { 1362 if (element == null && _enclosingUnit != null) {
1363 element = find3(_enclosingUnit.topLevelVariables, variableName); 1363 element = find3(_enclosingUnit.topLevelVariables, variableName);
1364 } 1364 }
1365 Expression initializer2 = node.initializer; 1365 Expression initializer = node.initializer;
1366 if (initializer2 != null) { 1366 if (initializer != null) {
1367 ExecutableElement outerExecutable = _enclosingExecutable; 1367 ExecutableElement outerExecutable = _enclosingExecutable;
1368 try { 1368 try {
1369 if (element == null) { 1369 if (element == null) {
1370 } else { 1370 } else {
1371 _enclosingExecutable = element.initializer; 1371 _enclosingExecutable = element.initializer;
1372 } 1372 }
1373 return super.visitVariableDeclaration(node); 1373 return super.visitVariableDeclaration(node);
1374 } finally { 1374 } finally {
1375 _enclosingExecutable = outerExecutable; 1375 _enclosingExecutable = outerExecutable;
1376 } 1376 }
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 * names in hide and show combinators that are not defined in the imported libra ry (which is not an 1560 * names in hide and show combinators that are not defined in the imported libra ry (which is not an
1561 * error). 1561 * error).
1562 * @coverage dart.engine.resolver 1562 * @coverage dart.engine.resolver
1563 */ 1563 */
1564 class ElementResolver extends SimpleASTVisitor<Object> { 1564 class ElementResolver extends SimpleASTVisitor<Object> {
1565 1565
1566 /** 1566 /**
1567 * @return {@code true} if the given identifier is the return type of a constr uctor declaration. 1567 * @return {@code true} if the given identifier is the return type of a constr uctor declaration.
1568 */ 1568 */
1569 static bool isConstructorReturnType(SimpleIdentifier node) { 1569 static bool isConstructorReturnType(SimpleIdentifier node) {
1570 ASTNode parent2 = node.parent; 1570 ASTNode parent = node.parent;
1571 if (parent2 is ConstructorDeclaration) { 1571 if (parent is ConstructorDeclaration) {
1572 ConstructorDeclaration constructor = parent2 as ConstructorDeclaration; 1572 ConstructorDeclaration constructor = parent as ConstructorDeclaration;
1573 return identical(constructor.returnType, node); 1573 return identical(constructor.returnType, node);
1574 } 1574 }
1575 return false; 1575 return false;
1576 } 1576 }
1577 1577
1578 /** 1578 /**
1579 * @return {@code true} if the given identifier is the return type of a factor y constructor 1579 * @return {@code true} if the given identifier is the return type of a factor y constructor
1580 * declaration. 1580 * declaration.
1581 */ 1581 */
1582 static bool isFactoryConstructorReturnType(SimpleIdentifier node) { 1582 static bool isFactoryConstructorReturnType(SimpleIdentifier node) {
1583 ASTNode parent2 = node.parent; 1583 ASTNode parent = node.parent;
1584 if (parent2 is ConstructorDeclaration) { 1584 if (parent is ConstructorDeclaration) {
1585 ConstructorDeclaration constructor = parent2 as ConstructorDeclaration; 1585 ConstructorDeclaration constructor = parent as ConstructorDeclaration;
1586 return identical(constructor.returnType, node) && constructor.factoryKeywo rd != null; 1586 return identical(constructor.returnType, node) && constructor.factoryKeywo rd != null;
1587 } 1587 }
1588 return false; 1588 return false;
1589 } 1589 }
1590 1590
1591 /** 1591 /**
1592 * Checks if the given 'super' expression is used in the valid context. 1592 * Checks if the given 'super' expression is used in the valid context.
1593 * @param node the 'super' expression to analyze 1593 * @param node the 'super' expression to analyze
1594 * @return {@code true} if the given 'super' expression is in the valid contex t 1594 * @return {@code true} if the given 'super' expression is in the valid contex t
1595 */ 1595 */
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 1638
1639 /** 1639 /**
1640 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 1640 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
1641 * @param resolver the resolver driving this participant 1641 * @param resolver the resolver driving this participant
1642 */ 1642 */
1643 ElementResolver(ResolverVisitor resolver) { 1643 ElementResolver(ResolverVisitor resolver) {
1644 this._resolver = resolver; 1644 this._resolver = resolver;
1645 _strictMode = resolver.definingLibrary.context.analysisOptions.strictMode; 1645 _strictMode = resolver.definingLibrary.context.analysisOptions.strictMode;
1646 } 1646 }
1647 Object visitAssignmentExpression(AssignmentExpression node) { 1647 Object visitAssignmentExpression(AssignmentExpression node) {
1648 sc.Token operator2 = node.operator; 1648 sc.Token operator = node.operator;
1649 sc.TokenType operatorType = operator2.type; 1649 sc.TokenType operatorType = operator.type;
1650 if (operatorType != sc.TokenType.EQ) { 1650 if (operatorType != sc.TokenType.EQ) {
1651 operatorType = operatorFromCompoundAssignment(operatorType); 1651 operatorType = operatorFromCompoundAssignment(operatorType);
1652 Expression leftHandSide2 = node.leftHandSide; 1652 Expression leftHandSide = node.leftHandSide;
1653 if (leftHandSide2 != null) { 1653 if (leftHandSide != null) {
1654 String methodName = operatorType.lexeme; 1654 String methodName = operatorType.lexeme;
1655 Type2 staticType = getStaticType(leftHandSide2); 1655 Type2 staticType = getStaticType(leftHandSide);
1656 MethodElement staticMethod = lookUpMethod(leftHandSide2, staticType, met hodName); 1656 MethodElement staticMethod = lookUpMethod(leftHandSide, staticType, meth odName);
1657 node.staticElement = staticMethod; 1657 node.staticElement = staticMethod;
1658 Type2 propagatedType = getPropagatedType(leftHandSide2); 1658 Type2 propagatedType = getPropagatedType(leftHandSide);
1659 MethodElement propagatedMethod = lookUpMethod(leftHandSide2, propagatedT ype, methodName); 1659 MethodElement propagatedMethod = lookUpMethod(leftHandSide, propagatedTy pe, methodName);
1660 node.element = select3(staticMethod, propagatedMethod); 1660 node.element = select3(staticMethod, propagatedMethod);
1661 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagate dMethod))) { 1661 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagate dMethod))) {
1662 _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_METHOD, operato r2, [methodName, staticType.displayName]); 1662 _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_METHOD, operato r, [methodName, staticType.displayName]);
1663 } 1663 }
1664 } 1664 }
1665 } 1665 }
1666 return null; 1666 return null;
1667 } 1667 }
1668 Object visitBinaryExpression(BinaryExpression node) { 1668 Object visitBinaryExpression(BinaryExpression node) {
1669 sc.Token operator2 = node.operator; 1669 sc.Token operator = node.operator;
1670 if (operator2.isUserDefinableOperator()) { 1670 if (operator.isUserDefinableOperator()) {
1671 Expression leftOperand2 = node.leftOperand; 1671 Expression leftOperand = node.leftOperand;
1672 if (leftOperand2 != null) { 1672 if (leftOperand != null) {
1673 String methodName = operator2.lexeme; 1673 String methodName = operator.lexeme;
1674 Type2 staticType = getStaticType(leftOperand2); 1674 Type2 staticType = getStaticType(leftOperand);
1675 MethodElement staticMethod = lookUpMethod(leftOperand2, staticType, meth odName); 1675 MethodElement staticMethod = lookUpMethod(leftOperand, staticType, metho dName);
1676 node.staticElement = staticMethod; 1676 node.staticElement = staticMethod;
1677 Type2 propagatedType = getPropagatedType(leftOperand2); 1677 Type2 propagatedType = getPropagatedType(leftOperand);
1678 MethodElement propagatedMethod = lookUpMethod(leftOperand2, propagatedTy pe, methodName); 1678 MethodElement propagatedMethod = lookUpMethod(leftOperand, propagatedTyp e, methodName);
1679 node.element = select3(staticMethod, propagatedMethod); 1679 node.element = select3(staticMethod, propagatedMethod);
1680 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagate dMethod))) { 1680 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagate dMethod))) {
1681 _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, opera tor2, [methodName, staticType.displayName]); 1681 _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, opera tor, [methodName, staticType.displayName]);
1682 } 1682 }
1683 } 1683 }
1684 } 1684 }
1685 return null; 1685 return null;
1686 } 1686 }
1687 Object visitBreakStatement(BreakStatement node) { 1687 Object visitBreakStatement(BreakStatement node) {
1688 SimpleIdentifier labelNode = node.label; 1688 SimpleIdentifier labelNode = node.label;
1689 LabelElementImpl labelElement = lookupLabel(node, labelNode); 1689 LabelElementImpl labelElement = lookupLabel(node, labelNode);
1690 if (labelElement != null && labelElement.isOnSwitchMember()) { 1690 if (labelElement != null && labelElement.isOnSwitchMember()) {
1691 _resolver.reportError(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labe lNode, []); 1691 _resolver.reportError(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labe lNode, []);
1692 } 1692 }
1693 return null; 1693 return null;
1694 } 1694 }
1695 Object visitClassDeclaration(ClassDeclaration node) { 1695 Object visitClassDeclaration(ClassDeclaration node) {
1696 setMetadata(node.element, node); 1696 setMetadata(node.element, node);
1697 return null; 1697 return null;
1698 } 1698 }
1699 Object visitClassTypeAlias(ClassTypeAlias node) { 1699 Object visitClassTypeAlias(ClassTypeAlias node) {
1700 setMetadata(node.element, node); 1700 setMetadata(node.element, node);
1701 return null; 1701 return null;
1702 } 1702 }
1703 Object visitCommentReference(CommentReference node) { 1703 Object visitCommentReference(CommentReference node) {
1704 Identifier identifier2 = node.identifier; 1704 Identifier identifier = node.identifier;
1705 if (identifier2 is SimpleIdentifier) { 1705 if (identifier is SimpleIdentifier) {
1706 SimpleIdentifier simpleIdentifier = identifier2 as SimpleIdentifier; 1706 SimpleIdentifier simpleIdentifier = identifier as SimpleIdentifier;
1707 Element element = resolveSimpleIdentifier(simpleIdentifier); 1707 Element element = resolveSimpleIdentifier(simpleIdentifier);
1708 if (element == null) { 1708 if (element == null) {
1709 element = findImportWithoutPrefix(simpleIdentifier); 1709 element = findImportWithoutPrefix(simpleIdentifier);
1710 if (element is MultiplyDefinedElement) { 1710 if (element is MultiplyDefinedElement) {
1711 element = null; 1711 element = null;
1712 } 1712 }
1713 } 1713 }
1714 if (element == null) { 1714 if (element == null) {
1715 } else { 1715 } else {
1716 if (element.library != _resolver.definingLibrary) { 1716 if (element.library != _resolver.definingLibrary) {
1717 } 1717 }
1718 recordResolution(simpleIdentifier, element); 1718 recordResolution(simpleIdentifier, element);
1719 if (node.newKeyword != null) { 1719 if (node.newKeyword != null) {
1720 if (element is ClassElement) { 1720 if (element is ClassElement) {
1721 ConstructorElement constructor = ((element as ClassElement)).unnamed Constructor; 1721 ConstructorElement constructor = ((element as ClassElement)).unnamed Constructor;
1722 if (constructor == null) { 1722 if (constructor == null) {
1723 } else { 1723 } else {
1724 recordResolution(simpleIdentifier, constructor); 1724 recordResolution(simpleIdentifier, constructor);
1725 } 1725 }
1726 } else { 1726 } else {
1727 } 1727 }
1728 } 1728 }
1729 } 1729 }
1730 } else if (identifier2 is PrefixedIdentifier) { 1730 } else if (identifier is PrefixedIdentifier) {
1731 PrefixedIdentifier prefixedIdentifier = identifier2 as PrefixedIdentifier; 1731 PrefixedIdentifier prefixedIdentifier = identifier as PrefixedIdentifier;
1732 SimpleIdentifier prefix2 = prefixedIdentifier.prefix; 1732 SimpleIdentifier prefix = prefixedIdentifier.prefix;
1733 SimpleIdentifier name = prefixedIdentifier.identifier; 1733 SimpleIdentifier name = prefixedIdentifier.identifier;
1734 Element element = resolveSimpleIdentifier(prefix2); 1734 Element element = resolveSimpleIdentifier(prefix);
1735 if (element == null) { 1735 if (element == null) {
1736 } else { 1736 } else {
1737 if (element is PrefixElement) { 1737 if (element is PrefixElement) {
1738 recordResolution(prefix2, element); 1738 recordResolution(prefix, element);
1739 element = _resolver.nameScope.lookup(identifier2, _resolver.definingLi brary); 1739 element = _resolver.nameScope.lookup(identifier, _resolver.definingLib rary);
1740 recordResolution(name, element); 1740 recordResolution(name, element);
1741 return null; 1741 return null;
1742 } 1742 }
1743 LibraryElement library2 = element.library; 1743 LibraryElement library = element.library;
1744 if (library2 == null) { 1744 if (library == null) {
1745 AnalysisEngine.instance.logger.logError("Found element with null libra ry: ${element.name}"); 1745 AnalysisEngine.instance.logger.logError("Found element with null libra ry: ${element.name}");
1746 } else if (library2 != _resolver.definingLibrary) { 1746 } else if (library != _resolver.definingLibrary) {
1747 } 1747 }
1748 recordResolution(name, element); 1748 recordResolution(name, element);
1749 if (node.newKeyword == null) { 1749 if (node.newKeyword == null) {
1750 if (element is ClassElement) { 1750 if (element is ClassElement) {
1751 Element memberElement = lookupGetterOrMethod(((element as ClassEleme nt)).type, name.name); 1751 Element memberElement = lookupGetterOrMethod(((element as ClassEleme nt)).type, name.name);
1752 if (memberElement == null) { 1752 if (memberElement == null) {
1753 memberElement = ((element as ClassElement)).getNamedConstructor(na me.name); 1753 memberElement = ((element as ClassElement)).getNamedConstructor(na me.name);
1754 if (memberElement == null) { 1754 if (memberElement == null) {
1755 memberElement = lookUpSetter(prefix2, ((element as ClassElement) ).type, name.name); 1755 memberElement = lookUpSetter(prefix, ((element as ClassElement)) .type, name.name);
1756 } 1756 }
1757 } 1757 }
1758 if (memberElement == null) { 1758 if (memberElement == null) {
1759 } else { 1759 } else {
1760 recordResolution(name, memberElement); 1760 recordResolution(name, memberElement);
1761 } 1761 }
1762 } else { 1762 } else {
1763 } 1763 }
1764 } else { 1764 } else {
1765 if (element is ClassElement) { 1765 if (element is ClassElement) {
1766 ConstructorElement constructor = ((element as ClassElement)).getName dConstructor(name.name); 1766 ConstructorElement constructor = ((element as ClassElement)).getName dConstructor(name.name);
1767 if (constructor == null) { 1767 if (constructor == null) {
1768 } else { 1768 } else {
1769 recordResolution(name, constructor); 1769 recordResolution(name, constructor);
1770 } 1770 }
1771 } else { 1771 } else {
1772 } 1772 }
1773 } 1773 }
1774 } 1774 }
1775 } 1775 }
1776 return null; 1776 return null;
1777 } 1777 }
1778 Object visitConstructorDeclaration(ConstructorDeclaration node) { 1778 Object visitConstructorDeclaration(ConstructorDeclaration node) {
1779 super.visitConstructorDeclaration(node); 1779 super.visitConstructorDeclaration(node);
1780 ConstructorElement element2 = node.element; 1780 ConstructorElement element = node.element;
1781 if (element2 is ConstructorElementImpl) { 1781 if (element is ConstructorElementImpl) {
1782 ConstructorElementImpl constructorElement = element2 as ConstructorElement Impl; 1782 ConstructorElementImpl constructorElement = element as ConstructorElementI mpl;
1783 ConstructorName redirectedNode = node.redirectedConstructor; 1783 ConstructorName redirectedNode = node.redirectedConstructor;
1784 if (redirectedNode != null) { 1784 if (redirectedNode != null) {
1785 ConstructorElement redirectedElement = redirectedNode.element; 1785 ConstructorElement redirectedElement = redirectedNode.element;
1786 constructorElement.redirectedConstructor = redirectedElement; 1786 constructorElement.redirectedConstructor = redirectedElement;
1787 } 1787 }
1788 for (ConstructorInitializer initializer in node.initializers) { 1788 for (ConstructorInitializer initializer in node.initializers) {
1789 if (initializer is RedirectingConstructorInvocation) { 1789 if (initializer is RedirectingConstructorInvocation) {
1790 ConstructorElement redirectedElement = ((initializer as RedirectingCon structorInvocation)).element; 1790 ConstructorElement redirectedElement = ((initializer as RedirectingCon structorInvocation)).element;
1791 constructorElement.redirectedConstructor = redirectedElement; 1791 constructorElement.redirectedConstructor = redirectedElement;
1792 } 1792 }
1793 } 1793 }
1794 setMetadata(constructorElement, node); 1794 setMetadata(constructorElement, node);
1795 } 1795 }
1796 return null; 1796 return null;
1797 } 1797 }
1798 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) { 1798 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
1799 SimpleIdentifier fieldName2 = node.fieldName; 1799 SimpleIdentifier fieldName = node.fieldName;
1800 ClassElement enclosingClass2 = _resolver.enclosingClass; 1800 ClassElement enclosingClass = _resolver.enclosingClass;
1801 FieldElement fieldElement = ((enclosingClass2 as ClassElementImpl)).getField (fieldName2.name); 1801 FieldElement fieldElement = ((enclosingClass as ClassElementImpl)).getField( fieldName.name);
1802 recordResolution(fieldName2, fieldElement); 1802 recordResolution(fieldName, fieldElement);
1803 if (fieldElement == null || fieldElement.isSynthetic()) { 1803 if (fieldElement == null || fieldElement.isSynthetic()) {
1804 _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FI ELD, node, [fieldName2]); 1804 _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FI ELD, node, [fieldName]);
1805 } else if (fieldElement.isStatic()) { 1805 } else if (fieldElement.isStatic()) {
1806 _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, n ode, [fieldName2]); 1806 _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, n ode, [fieldName]);
1807 } 1807 }
1808 return null; 1808 return null;
1809 } 1809 }
1810 Object visitConstructorName(ConstructorName node) { 1810 Object visitConstructorName(ConstructorName node) {
1811 Type2 type2 = node.type.type; 1811 Type2 type = node.type.type;
1812 if (type2 != null && type2.isDynamic()) { 1812 if (type != null && type.isDynamic()) {
1813 return null; 1813 return null;
1814 } else if (type2 is! InterfaceType) { 1814 } else if (type is! InterfaceType) {
1815 ASTNode parent2 = node.parent; 1815 ASTNode parent = node.parent;
1816 if (parent2 is InstanceCreationExpression) { 1816 if (parent is InstanceCreationExpression) {
1817 if (((parent2 as InstanceCreationExpression)).isConst()) { 1817 if (((parent as InstanceCreationExpression)).isConst()) {
1818 } else { 1818 } else {
1819 } 1819 }
1820 } else { 1820 } else {
1821 } 1821 }
1822 return null; 1822 return null;
1823 } 1823 }
1824 ConstructorElement constructor; 1824 ConstructorElement constructor;
1825 SimpleIdentifier name2 = node.name; 1825 SimpleIdentifier name = node.name;
1826 InterfaceType interfaceType = type2 as InterfaceType; 1826 InterfaceType interfaceType = type as InterfaceType;
1827 LibraryElement definingLibrary2 = _resolver.definingLibrary; 1827 LibraryElement definingLibrary = _resolver.definingLibrary;
1828 if (name2 == null) { 1828 if (name == null) {
1829 constructor = interfaceType.lookUpConstructor(null, definingLibrary2); 1829 constructor = interfaceType.lookUpConstructor(null, definingLibrary);
1830 } else { 1830 } else {
1831 constructor = interfaceType.lookUpConstructor(name2.name, definingLibrary2 ); 1831 constructor = interfaceType.lookUpConstructor(name.name, definingLibrary);
1832 name2.staticElement = constructor; 1832 name.staticElement = constructor;
1833 name2.element = constructor; 1833 name.element = constructor;
1834 } 1834 }
1835 node.staticElement = constructor; 1835 node.staticElement = constructor;
1836 node.element = constructor; 1836 node.element = constructor;
1837 return null; 1837 return null;
1838 } 1838 }
1839 Object visitContinueStatement(ContinueStatement node) { 1839 Object visitContinueStatement(ContinueStatement node) {
1840 SimpleIdentifier labelNode = node.label; 1840 SimpleIdentifier labelNode = node.label;
1841 LabelElementImpl labelElement = lookupLabel(node, labelNode); 1841 LabelElementImpl labelElement = lookupLabel(node, labelNode);
1842 if (labelElement != null && labelElement.isOnSwitchStatement()) { 1842 if (labelElement != null && labelElement.isOnSwitchStatement()) {
1843 _resolver.reportError(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNod e, []); 1843 _resolver.reportError(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNod e, []);
1844 } 1844 }
1845 return null; 1845 return null;
1846 } 1846 }
1847 Object visitDeclaredIdentifier(DeclaredIdentifier node) { 1847 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
1848 setMetadata(node.element, node); 1848 setMetadata(node.element, node);
1849 return null; 1849 return null;
1850 } 1850 }
1851 Object visitExportDirective(ExportDirective node) { 1851 Object visitExportDirective(ExportDirective node) {
1852 Element element2 = node.element; 1852 Element element = node.element;
1853 if (element2 is ExportElement) { 1853 if (element is ExportElement) {
1854 resolveCombinators(((element2 as ExportElement)).exportedLibrary, node.com binators); 1854 resolveCombinators(((element as ExportElement)).exportedLibrary, node.comb inators);
1855 setMetadata(element2, node); 1855 setMetadata(element, node);
1856 } 1856 }
1857 return null; 1857 return null;
1858 } 1858 }
1859 Object visitFieldFormalParameter(FieldFormalParameter node) { 1859 Object visitFieldFormalParameter(FieldFormalParameter node) {
1860 String fieldName = node.identifier.name; 1860 String fieldName = node.identifier.name;
1861 ClassElement classElement = _resolver.enclosingClass; 1861 ClassElement classElement = _resolver.enclosingClass;
1862 if (classElement != null) { 1862 if (classElement != null) {
1863 FieldElement fieldElement = ((classElement as ClassElementImpl)).getField( fieldName); 1863 FieldElement fieldElement = ((classElement as ClassElementImpl)).getField( fieldName);
1864 if (fieldElement == null) { 1864 if (fieldElement == null) {
1865 _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_E XISTANT_FIELD, node, [fieldName]); 1865 _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_E XISTANT_FIELD, node, [fieldName]);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1904 SimpleIdentifier prefixNode = node.prefix; 1904 SimpleIdentifier prefixNode = node.prefix;
1905 if (prefixNode != null) { 1905 if (prefixNode != null) {
1906 String prefixName = prefixNode.name; 1906 String prefixName = prefixNode.name;
1907 for (PrefixElement prefixElement in _resolver.definingLibrary.prefixes) { 1907 for (PrefixElement prefixElement in _resolver.definingLibrary.prefixes) {
1908 if (prefixElement.displayName == prefixName) { 1908 if (prefixElement.displayName == prefixName) {
1909 recordResolution(prefixNode, prefixElement); 1909 recordResolution(prefixNode, prefixElement);
1910 break; 1910 break;
1911 } 1911 }
1912 } 1912 }
1913 } 1913 }
1914 Element element2 = node.element; 1914 Element element = node.element;
1915 if (element2 is ImportElement) { 1915 if (element is ImportElement) {
1916 ImportElement importElement = element2 as ImportElement; 1916 ImportElement importElement = element as ImportElement;
1917 LibraryElement library = importElement.importedLibrary; 1917 LibraryElement library = importElement.importedLibrary;
1918 if (library != null) { 1918 if (library != null) {
1919 resolveCombinators(library, node.combinators); 1919 resolveCombinators(library, node.combinators);
1920 } 1920 }
1921 setMetadata(element2, node); 1921 setMetadata(element, node);
1922 } 1922 }
1923 return null; 1923 return null;
1924 } 1924 }
1925 Object visitIndexExpression(IndexExpression node) { 1925 Object visitIndexExpression(IndexExpression node) {
1926 Expression target = node.realTarget; 1926 Expression target = node.realTarget;
1927 Type2 staticType = getStaticType(target); 1927 Type2 staticType = getStaticType(target);
1928 Type2 propagatedType = getPropagatedType(target); 1928 Type2 propagatedType = getPropagatedType(target);
1929 if (node.inGetterContext()) { 1929 if (node.inGetterContext()) {
1930 String methodName = sc.TokenType.INDEX.lexeme; 1930 String methodName = sc.TokenType.INDEX.lexeme;
1931 bool error = lookUpCheckIndexOperator(node, target, methodName, staticType , propagatedType); 1931 bool error = lookUpCheckIndexOperator(node, target, methodName, staticType , propagatedType);
1932 if (error) { 1932 if (error) {
1933 return null; 1933 return null;
1934 } 1934 }
1935 } 1935 }
1936 if (node.inSetterContext()) { 1936 if (node.inSetterContext()) {
1937 String methodName = sc.TokenType.INDEX_EQ.lexeme; 1937 String methodName = sc.TokenType.INDEX_EQ.lexeme;
1938 lookUpCheckIndexOperator(node, target, methodName, staticType, propagatedT ype); 1938 lookUpCheckIndexOperator(node, target, methodName, staticType, propagatedT ype);
1939 } 1939 }
1940 return null; 1940 return null;
1941 } 1941 }
1942 Object visitInstanceCreationExpression(InstanceCreationExpression node) { 1942 Object visitInstanceCreationExpression(InstanceCreationExpression node) {
1943 ConstructorElement invokedConstructor = node.constructorName.element; 1943 ConstructorElement invokedConstructor = node.constructorName.element;
1944 node.staticElement = invokedConstructor; 1944 node.staticElement = invokedConstructor;
1945 node.element = invokedConstructor; 1945 node.element = invokedConstructor;
1946 ArgumentList argumentList2 = node.argumentList; 1946 ArgumentList argumentList = node.argumentList;
1947 List<ParameterElement> parameters = resolveArgumentsToParameters(node.isCons t(), argumentList2, invokedConstructor); 1947 List<ParameterElement> parameters = resolveArgumentsToParameters(node.isCons t(), argumentList, invokedConstructor);
1948 if (parameters != null) { 1948 if (parameters != null) {
1949 argumentList2.correspondingStaticParameters = parameters; 1949 argumentList.correspondingStaticParameters = parameters;
1950 } 1950 }
1951 return null; 1951 return null;
1952 } 1952 }
1953 Object visitLibraryDirective(LibraryDirective node) { 1953 Object visitLibraryDirective(LibraryDirective node) {
1954 setMetadata(node.element, node); 1954 setMetadata(node.element, node);
1955 return null; 1955 return null;
1956 } 1956 }
1957 Object visitMethodDeclaration(MethodDeclaration node) { 1957 Object visitMethodDeclaration(MethodDeclaration node) {
1958 setMetadata(node.element, node); 1958 setMetadata(node.element, node);
1959 return null; 1959 return null;
1960 } 1960 }
1961 Object visitMethodInvocation(MethodInvocation node) { 1961 Object visitMethodInvocation(MethodInvocation node) {
1962 SimpleIdentifier methodName2 = node.methodName; 1962 SimpleIdentifier methodName = node.methodName;
1963 Expression target = node.realTarget; 1963 Expression target = node.realTarget;
1964 Element staticElement; 1964 Element staticElement;
1965 Element propagatedElement; 1965 Element propagatedElement;
1966 if (target is SuperExpression && !isSuperInValidContext((target as SuperExpr ession))) { 1966 if (target is SuperExpression && !isSuperInValidContext((target as SuperExpr ession))) {
1967 return null; 1967 return null;
1968 } 1968 }
1969 if (target == null) { 1969 if (target == null) {
1970 staticElement = resolveInvokedElement2(methodName2); 1970 staticElement = resolveInvokedElement2(methodName);
1971 propagatedElement = null; 1971 propagatedElement = null;
1972 } else { 1972 } else {
1973 Type2 targetType = getStaticType(target); 1973 Type2 targetType = getStaticType(target);
1974 staticElement = resolveInvokedElement(target, targetType, methodName2); 1974 staticElement = resolveInvokedElement(target, targetType, methodName);
1975 propagatedElement = resolveInvokedElement(target, getPropagatedType(target ), methodName2); 1975 propagatedElement = resolveInvokedElement(target, getPropagatedType(target ), methodName);
1976 } 1976 }
1977 staticElement = convertSetterToGetter(staticElement); 1977 staticElement = convertSetterToGetter(staticElement);
1978 propagatedElement = convertSetterToGetter(propagatedElement); 1978 propagatedElement = convertSetterToGetter(propagatedElement);
1979 recordResolution2(methodName2, staticElement, propagatedElement); 1979 recordResolution2(methodName, staticElement, propagatedElement);
1980 ArgumentList argumentList2 = node.argumentList; 1980 ArgumentList argumentList = node.argumentList;
1981 if (staticElement != null) { 1981 if (staticElement != null) {
1982 List<ParameterElement> parameters = computePropagatedParameters(argumentLi st2, staticElement); 1982 List<ParameterElement> parameters = computePropagatedParameters(argumentLi st, staticElement);
1983 if (parameters != null) { 1983 if (parameters != null) {
1984 argumentList2.correspondingStaticParameters = parameters; 1984 argumentList.correspondingStaticParameters = parameters;
1985 } 1985 }
1986 } 1986 }
1987 if (propagatedElement != null) { 1987 if (propagatedElement != null) {
1988 List<ParameterElement> parameters = computePropagatedParameters(argumentLi st2, propagatedElement); 1988 List<ParameterElement> parameters = computePropagatedParameters(argumentLi st, propagatedElement);
1989 if (parameters != null) { 1989 if (parameters != null) {
1990 argumentList2.correspondingParameters = parameters; 1990 argumentList.correspondingParameters = parameters;
1991 } 1991 }
1992 } 1992 }
1993 ErrorCode errorCode; 1993 ErrorCode errorCode;
1994 if (staticElement == null) { 1994 if (staticElement == null) {
1995 if (propagatedElement == null) { 1995 if (propagatedElement == null) {
1996 errorCode = checkForInvocationError(target, staticElement); 1996 errorCode = checkForInvocationError(target, staticElement);
1997 } else { 1997 } else {
1998 errorCode = checkForInvocationError(target, propagatedElement); 1998 errorCode = checkForInvocationError(target, propagatedElement);
1999 } 1999 }
2000 } else { 2000 } else {
2001 errorCode = checkForInvocationError(target, staticElement); 2001 errorCode = checkForInvocationError(target, staticElement);
2002 if (propagatedElement != null) { 2002 if (propagatedElement != null) {
2003 ErrorCode propagatedError = checkForInvocationError(target, propagatedEl ement); 2003 ErrorCode propagatedError = checkForInvocationError(target, propagatedEl ement);
2004 errorCode = select(errorCode, propagatedError); 2004 errorCode = select(errorCode, propagatedError);
2005 } 2005 }
2006 } 2006 }
2007 if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) { 2007 if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
2008 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, me thodName2, [methodName2.name]); 2008 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, me thodName, [methodName.name]);
2009 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) { 2009 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
2010 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName 2, [methodName2.name]); 2010 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName , [methodName.name]);
2011 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) { 2011 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
2012 String targetTypeName; 2012 String targetTypeName;
2013 if (target == null) { 2013 if (target == null) {
2014 ClassElement enclosingClass2 = _resolver.enclosingClass; 2014 ClassElement enclosingClass = _resolver.enclosingClass;
2015 targetTypeName = enclosingClass2.displayName; 2015 targetTypeName = enclosingClass.displayName;
2016 } else { 2016 } else {
2017 Type2 targetType = getPropagatedType(target); 2017 Type2 targetType = getPropagatedType(target);
2018 if (targetType == null) { 2018 if (targetType == null) {
2019 targetType = getStaticType(target); 2019 targetType = getStaticType(target);
2020 } 2020 }
2021 targetTypeName = targetType == null ? null : targetType.displayName; 2021 targetTypeName = targetType == null ? null : targetType.displayName;
2022 } 2022 }
2023 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_METHOD, methodName2, [methodName2.name, targetTypeName]); 2023 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_METHOD, methodName, [methodName.name, targetTypeName]);
2024 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD )) { 2024 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD )) {
2025 Type2 targetType = getPropagatedType(target); 2025 Type2 targetType = getPropagatedType(target);
2026 if (targetType == null) { 2026 if (targetType == null) {
2027 targetType = getStaticType(target); 2027 targetType = getStaticType(target);
2028 } 2028 }
2029 String targetTypeName = targetType == null ? null : targetType.name; 2029 String targetTypeName = targetType == null ? null : targetType.name;
2030 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, method Name2, [methodName2.name, targetTypeName]); 2030 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, method Name, [methodName.name, targetTypeName]);
2031 } 2031 }
2032 return null; 2032 return null;
2033 } 2033 }
2034 Object visitPartDirective(PartDirective node) { 2034 Object visitPartDirective(PartDirective node) {
2035 setMetadata(node.element, node); 2035 setMetadata(node.element, node);
2036 return null; 2036 return null;
2037 } 2037 }
2038 Object visitPartOfDirective(PartOfDirective node) { 2038 Object visitPartOfDirective(PartOfDirective node) {
2039 setMetadata(node.element, node); 2039 setMetadata(node.element, node);
2040 return null; 2040 return null;
2041 } 2041 }
2042 Object visitPostfixExpression(PostfixExpression node) { 2042 Object visitPostfixExpression(PostfixExpression node) {
2043 Expression operand2 = node.operand; 2043 Expression operand = node.operand;
2044 String methodName = getPostfixOperator(node); 2044 String methodName = getPostfixOperator(node);
2045 Type2 staticType = getStaticType(operand2); 2045 Type2 staticType = getStaticType(operand);
2046 MethodElement staticMethod = lookUpMethod(operand2, staticType, methodName); 2046 MethodElement staticMethod = lookUpMethod(operand, staticType, methodName);
2047 node.staticElement = staticMethod; 2047 node.staticElement = staticMethod;
2048 Type2 propagatedType = getPropagatedType(operand2); 2048 Type2 propagatedType = getPropagatedType(operand);
2049 MethodElement propagatedMethod = lookUpMethod(operand2, propagatedType, meth odName); 2049 MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, metho dName);
2050 node.element = select3(staticMethod, propagatedMethod); 2050 node.element = select3(staticMethod, propagatedMethod);
2051 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || p ropagatedType == null || shouldReportMissingMember(propagatedType, propagatedMet hod))) { 2051 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || p ropagatedType == null || shouldReportMissingMember(propagatedType, propagatedMet hod))) {
2052 _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, node.oper ator, [methodName, staticType.displayName]); 2052 _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, node.oper ator, [methodName, staticType.displayName]);
2053 } 2053 }
2054 return null; 2054 return null;
2055 } 2055 }
2056 Object visitPrefixedIdentifier(PrefixedIdentifier node) { 2056 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
2057 SimpleIdentifier prefix2 = node.prefix; 2057 SimpleIdentifier prefix = node.prefix;
2058 SimpleIdentifier identifier2 = node.identifier; 2058 SimpleIdentifier identifier = node.identifier;
2059 Element prefixElement = prefix2.element; 2059 Element prefixElement = prefix.element;
2060 if (prefixElement is PrefixElement) { 2060 if (prefixElement is PrefixElement) {
2061 Element element = _resolver.nameScope.lookup(node, _resolver.definingLibra ry); 2061 Element element = _resolver.nameScope.lookup(node, _resolver.definingLibra ry);
2062 if (element == null) { 2062 if (element == null) {
2063 return null; 2063 return null;
2064 } 2064 }
2065 if (element is PropertyAccessorElement && identifier2.inSetterContext()) { 2065 if (element is PropertyAccessorElement && identifier.inSetterContext()) {
2066 PropertyInducingElement variable2 = ((element as PropertyAccessorElement )).variable; 2066 PropertyInducingElement variable = ((element as PropertyAccessorElement) ).variable;
2067 if (variable2 != null) { 2067 if (variable != null) {
2068 PropertyAccessorElement setter2 = variable2.setter; 2068 PropertyAccessorElement setter = variable.setter;
2069 if (setter2 != null) { 2069 if (setter != null) {
2070 element = setter2; 2070 element = setter;
2071 } 2071 }
2072 } 2072 }
2073 } 2073 }
2074 recordResolution(identifier2, element); 2074 recordResolution(identifier, element);
2075 return null; 2075 return null;
2076 } 2076 }
2077 resolvePropertyAccess(prefix2, identifier2); 2077 resolvePropertyAccess(prefix, identifier);
2078 return null; 2078 return null;
2079 } 2079 }
2080 Object visitPrefixExpression(PrefixExpression node) { 2080 Object visitPrefixExpression(PrefixExpression node) {
2081 sc.Token operator2 = node.operator; 2081 sc.Token operator = node.operator;
2082 sc.TokenType operatorType = operator2.type; 2082 sc.TokenType operatorType = operator.type;
2083 if (operatorType.isUserDefinableOperator() || identical(operatorType, sc.Tok enType.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) { 2083 if (operatorType.isUserDefinableOperator() || identical(operatorType, sc.Tok enType.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) {
2084 Expression operand2 = node.operand; 2084 Expression operand = node.operand;
2085 String methodName = getPrefixOperator(node); 2085 String methodName = getPrefixOperator(node);
2086 Type2 staticType = getStaticType(operand2); 2086 Type2 staticType = getStaticType(operand);
2087 MethodElement staticMethod = lookUpMethod(operand2, staticType, methodName ); 2087 MethodElement staticMethod = lookUpMethod(operand, staticType, methodName) ;
2088 node.staticElement = staticMethod; 2088 node.staticElement = staticMethod;
2089 Type2 propagatedType = getPropagatedType(operand2); 2089 Type2 propagatedType = getPropagatedType(operand);
2090 MethodElement propagatedMethod = lookUpMethod(operand2, propagatedType, me thodName); 2090 MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, met hodName);
2091 node.element = select3(staticMethod, propagatedMethod); 2091 node.element = select3(staticMethod, propagatedMethod);
2092 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedM ethod))) { 2092 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedM ethod))) {
2093 _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operato r2, [methodName, staticType.displayName]); 2093 _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operato r, [methodName, staticType.displayName]);
2094 } 2094 }
2095 } 2095 }
2096 return null; 2096 return null;
2097 } 2097 }
2098 Object visitPropertyAccess(PropertyAccess node) { 2098 Object visitPropertyAccess(PropertyAccess node) {
2099 Expression target = node.realTarget; 2099 Expression target = node.realTarget;
2100 if (target is SuperExpression && !isSuperInValidContext((target as SuperExpr ession))) { 2100 if (target is SuperExpression && !isSuperInValidContext((target as SuperExpr ession))) {
2101 return null; 2101 return null;
2102 } 2102 }
2103 SimpleIdentifier propertyName2 = node.propertyName; 2103 SimpleIdentifier propertyName = node.propertyName;
2104 resolvePropertyAccess(target, propertyName2); 2104 resolvePropertyAccess(target, propertyName);
2105 return null; 2105 return null;
2106 } 2106 }
2107 Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) { 2107 Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
2108 ClassElement enclosingClass2 = _resolver.enclosingClass; 2108 ClassElement enclosingClass = _resolver.enclosingClass;
2109 if (enclosingClass2 == null) { 2109 if (enclosingClass == null) {
2110 return null; 2110 return null;
2111 } 2111 }
2112 SimpleIdentifier name = node.constructorName; 2112 SimpleIdentifier name = node.constructorName;
2113 ConstructorElement element; 2113 ConstructorElement element;
2114 if (name == null) { 2114 if (name == null) {
2115 element = enclosingClass2.unnamedConstructor; 2115 element = enclosingClass.unnamedConstructor;
2116 } else { 2116 } else {
2117 element = enclosingClass2.getNamedConstructor(name.name); 2117 element = enclosingClass.getNamedConstructor(name.name);
2118 } 2118 }
2119 if (element == null) { 2119 if (element == null) {
2120 return null; 2120 return null;
2121 } 2121 }
2122 if (name != null) { 2122 if (name != null) {
2123 recordResolution(name, element); 2123 recordResolution(name, element);
2124 } 2124 }
2125 node.staticElement = element; 2125 node.staticElement = element;
2126 node.element = element; 2126 node.element = element;
2127 ArgumentList argumentList2 = node.argumentList; 2127 ArgumentList argumentList = node.argumentList;
2128 List<ParameterElement> parameters = resolveArgumentsToParameters(false, argu mentList2, element); 2128 List<ParameterElement> parameters = resolveArgumentsToParameters(false, argu mentList, element);
2129 if (parameters != null) { 2129 if (parameters != null) {
2130 argumentList2.correspondingStaticParameters = parameters; 2130 argumentList.correspondingStaticParameters = parameters;
2131 } 2131 }
2132 return null; 2132 return null;
2133 } 2133 }
2134 Object visitSimpleIdentifier(SimpleIdentifier node) { 2134 Object visitSimpleIdentifier(SimpleIdentifier node) {
2135 if (node.element != null) { 2135 if (node.element != null) {
2136 return null; 2136 return null;
2137 } 2137 }
2138 Element element = resolveSimpleIdentifier(node); 2138 Element element = resolveSimpleIdentifier(node);
2139 if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingCl ass) { 2139 if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingCl ass) {
2140 _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLAS S, node, []); 2140 _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLAS S, node, []);
2141 } else if (element == null) { 2141 } else if (element == null) {
2142 if (isConstructorReturnType(node)) { 2142 if (isConstructorReturnType(node)) {
2143 _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, nod e, []); 2143 _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, nod e, []);
2144 } else if (!classDeclaresNoSuchMethod(_resolver.enclosingClass)) { 2144 } else if (!classDeclaresNoSuchMethod(_resolver.enclosingClass)) {
2145 _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [nod e.name]); 2145 _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [nod e.name]);
2146 } 2146 }
2147 } 2147 }
2148 recordResolution(node, element); 2148 recordResolution(node, element);
2149 return null; 2149 return null;
2150 } 2150 }
2151 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { 2151 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
2152 ClassElement enclosingClass2 = _resolver.enclosingClass; 2152 ClassElement enclosingClass = _resolver.enclosingClass;
2153 if (enclosingClass2 == null) { 2153 if (enclosingClass == null) {
2154 return null; 2154 return null;
2155 } 2155 }
2156 ClassElement superclass = getSuperclass(enclosingClass2); 2156 ClassElement superclass = getSuperclass(enclosingClass);
2157 if (superclass == null) { 2157 if (superclass == null) {
2158 return null; 2158 return null;
2159 } 2159 }
2160 SimpleIdentifier name = node.constructorName; 2160 SimpleIdentifier name = node.constructorName;
2161 ConstructorElement element; 2161 ConstructorElement element;
2162 if (name == null) { 2162 if (name == null) {
2163 element = superclass.unnamedConstructor; 2163 element = superclass.unnamedConstructor;
2164 } else { 2164 } else {
2165 element = superclass.getNamedConstructor(name.name); 2165 element = superclass.getNamedConstructor(name.name);
2166 } 2166 }
2167 if (element == null) { 2167 if (element == null) {
2168 if (name != null) { 2168 if (name != null) {
2169 _resolver.reportError(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INIT IALIZER, node, [superclass.name, name]); 2169 _resolver.reportError(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INIT IALIZER, node, [superclass.name, name]);
2170 } else { 2170 } else {
2171 _resolver.reportError(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INIT IALIZER_DEFAULT, node, [superclass.name]); 2171 _resolver.reportError(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INIT IALIZER_DEFAULT, node, [superclass.name]);
2172 } 2172 }
2173 return null; 2173 return null;
2174 } else { 2174 } else {
2175 if (element.isFactory()) { 2175 if (element.isFactory()) {
2176 _resolver.reportError(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, n ode, [element]); 2176 _resolver.reportError(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, n ode, [element]);
2177 } 2177 }
2178 } 2178 }
2179 if (name != null) { 2179 if (name != null) {
2180 recordResolution(name, element); 2180 recordResolution(name, element);
2181 } 2181 }
2182 node.staticElement = element; 2182 node.staticElement = element;
2183 node.element = element; 2183 node.element = element;
2184 ArgumentList argumentList2 = node.argumentList; 2184 ArgumentList argumentList = node.argumentList;
2185 List<ParameterElement> parameters = resolveArgumentsToParameters(false, argu mentList2, element); 2185 List<ParameterElement> parameters = resolveArgumentsToParameters(false, argu mentList, element);
2186 if (parameters != null) { 2186 if (parameters != null) {
2187 argumentList2.correspondingStaticParameters = parameters; 2187 argumentList.correspondingStaticParameters = parameters;
2188 } 2188 }
2189 return null; 2189 return null;
2190 } 2190 }
2191 Object visitSuperExpression(SuperExpression node) { 2191 Object visitSuperExpression(SuperExpression node) {
2192 if (!isSuperInValidContext(node)) { 2192 if (!isSuperInValidContext(node)) {
2193 _resolver.reportError(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []); 2193 _resolver.reportError(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
2194 } 2194 }
2195 return super.visitSuperExpression(node); 2195 return super.visitSuperExpression(node);
2196 } 2196 }
2197 Object visitTypeParameter(TypeParameter node) { 2197 Object visitTypeParameter(TypeParameter node) {
2198 TypeName bound2 = node.bound; 2198 TypeName bound = node.bound;
2199 if (bound2 != null) { 2199 if (bound != null) {
2200 TypeVariableElementImpl variable = node.name.element as TypeVariableElemen tImpl; 2200 TypeVariableElementImpl variable = node.name.element as TypeVariableElemen tImpl;
2201 if (variable != null) { 2201 if (variable != null) {
2202 variable.bound = bound2.type; 2202 variable.bound = bound.type;
2203 } 2203 }
2204 } 2204 }
2205 setMetadata(node.element, node); 2205 setMetadata(node.element, node);
2206 return null; 2206 return null;
2207 } 2207 }
2208 Object visitVariableDeclaration(VariableDeclaration node) { 2208 Object visitVariableDeclaration(VariableDeclaration node) {
2209 setMetadata(node.element, node); 2209 setMetadata(node.element, node);
2210 return null; 2210 return null;
2211 } 2211 }
2212 2212
(...skipping 16 matching lines...) Expand all
2229 * Given that we have found code to invoke the given element, return the error code that should be 2229 * Given that we have found code to invoke the given element, return the error code that should be
2230 * reported, or {@code null} if no error should be reported. 2230 * reported, or {@code null} if no error should be reported.
2231 * @param target the target of the invocation, or {@code null} if there was no target 2231 * @param target the target of the invocation, or {@code null} if there was no target
2232 * @param element the element to be invoked 2232 * @param element the element to be invoked
2233 * @return the error code that should be reported 2233 * @return the error code that should be reported
2234 */ 2234 */
2235 ErrorCode checkForInvocationError(Expression target, Element element2) { 2235 ErrorCode checkForInvocationError(Expression target, Element element2) {
2236 if (element2 is PropertyAccessorElement) { 2236 if (element2 is PropertyAccessorElement) {
2237 FunctionType getterType = ((element2 as PropertyAccessorElement)).type; 2237 FunctionType getterType = ((element2 as PropertyAccessorElement)).type;
2238 if (getterType != null) { 2238 if (getterType != null) {
2239 Type2 returnType2 = getterType.returnType; 2239 Type2 returnType = getterType.returnType;
2240 if (!isExecutableType(returnType2)) { 2240 if (!isExecutableType(returnType)) {
2241 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; 2241 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
2242 } 2242 }
2243 } 2243 }
2244 } else if (element2 is ExecutableElement) { 2244 } else if (element2 is ExecutableElement) {
2245 return null; 2245 return null;
2246 } else if (element2 == null && target is SuperExpression) { 2246 } else if (element2 == null && target is SuperExpression) {
2247 return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD; 2247 return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
2248 } else { 2248 } else {
2249 if (element2 is PropertyInducingElement) { 2249 if (element2 is PropertyInducingElement) {
2250 PropertyAccessorElement getter2 = ((element2 as PropertyInducingElement) ).getter; 2250 PropertyAccessorElement getter = ((element2 as PropertyInducingElement)) .getter;
2251 FunctionType getterType = getter2.type; 2251 FunctionType getterType = getter.type;
2252 if (getterType != null) { 2252 if (getterType != null) {
2253 Type2 returnType3 = getterType.returnType; 2253 Type2 returnType = getterType.returnType;
2254 if (!isExecutableType(returnType3)) { 2254 if (!isExecutableType(returnType)) {
2255 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; 2255 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
2256 } 2256 }
2257 } 2257 }
2258 } else if (element2 is VariableElement) { 2258 } else if (element2 is VariableElement) {
2259 Type2 variableType = _resolver.overrideManager.getType(element2); 2259 Type2 variableType = _resolver.overrideManager.getType(element2);
2260 if (variableType == null) { 2260 if (variableType == null) {
2261 variableType = ((element2 as VariableElement)).type; 2261 variableType = ((element2 as VariableElement)).type;
2262 } 2262 }
2263 if (!isExecutableType(variableType)) { 2263 if (!isExecutableType(variableType)) {
2264 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; 2264 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
2265 } 2265 }
2266 } else { 2266 } else {
2267 if (target == null) { 2267 if (target == null) {
2268 ClassElement enclosingClass2 = _resolver.enclosingClass; 2268 ClassElement enclosingClass = _resolver.enclosingClass;
2269 if (enclosingClass2 == null) { 2269 if (enclosingClass == null) {
2270 return StaticTypeWarningCode.UNDEFINED_FUNCTION; 2270 return StaticTypeWarningCode.UNDEFINED_FUNCTION;
2271 } else if (element2 == null) { 2271 } else if (element2 == null) {
2272 if (!classDeclaresNoSuchMethod(enclosingClass2)) { 2272 if (!classDeclaresNoSuchMethod(enclosingClass)) {
2273 return StaticTypeWarningCode.UNDEFINED_METHOD; 2273 return StaticTypeWarningCode.UNDEFINED_METHOD;
2274 } 2274 }
2275 } else { 2275 } else {
2276 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; 2276 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
2277 } 2277 }
2278 } else { 2278 } else {
2279 Type2 targetType = getStaticType(target); 2279 Type2 targetType = getStaticType(target);
2280 if (targetType == null) { 2280 if (targetType == null) {
2281 return StaticTypeWarningCode.UNDEFINED_FUNCTION; 2281 return StaticTypeWarningCode.UNDEFINED_FUNCTION;
2282 } else if (!targetType.isDynamic() && !classDeclaresNoSuchMethod2(targ etType.element)) { 2282 } else if (!targetType.isDynamic() && !classDeclaresNoSuchMethod2(targ etType.element)) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2338 Element functionElement = ((getterReturnType as FunctionType)).element ; 2338 Element functionElement = ((getterReturnType as FunctionType)).element ;
2339 if (functionElement is ExecutableElement) { 2339 if (functionElement is ExecutableElement) {
2340 return resolveArgumentsToParameters(false, argumentList, (functionEl ement as ExecutableElement)); 2340 return resolveArgumentsToParameters(false, argumentList, (functionEl ement as ExecutableElement));
2341 } 2341 }
2342 } 2342 }
2343 } 2343 }
2344 } else if (element2 is ExecutableElement) { 2344 } else if (element2 is ExecutableElement) {
2345 return resolveArgumentsToParameters(false, argumentList, (element2 as Exec utableElement)); 2345 return resolveArgumentsToParameters(false, argumentList, (element2 as Exec utableElement));
2346 } else if (element2 is VariableElement) { 2346 } else if (element2 is VariableElement) {
2347 VariableElement variable = element2 as VariableElement; 2347 VariableElement variable = element2 as VariableElement;
2348 Type2 type2 = variable.type; 2348 Type2 type = variable.type;
2349 if (type2 is FunctionType) { 2349 if (type is FunctionType) {
2350 FunctionType functionType = type2 as FunctionType; 2350 FunctionType functionType = type as FunctionType;
2351 List<ParameterElement> parameters2 = functionType.parameters; 2351 List<ParameterElement> parameters = functionType.parameters;
2352 return resolveArgumentsToParameters2(false, argumentList, parameters2); 2352 return resolveArgumentsToParameters2(false, argumentList, parameters);
2353 } else if (type2 is InterfaceType) { 2353 } else if (type is InterfaceType) {
2354 MethodElement callMethod = ((type2 as InterfaceType)).lookUpMethod(CALL_ METHOD_NAME, _resolver.definingLibrary); 2354 MethodElement callMethod = ((type as InterfaceType)).lookUpMethod(CALL_M ETHOD_NAME, _resolver.definingLibrary);
2355 if (callMethod != null) { 2355 if (callMethod != null) {
2356 List<ParameterElement> parameters3 = callMethod.parameters; 2356 List<ParameterElement> parameters = callMethod.parameters;
2357 return resolveArgumentsToParameters2(false, argumentList, parameters3) ; 2357 return resolveArgumentsToParameters2(false, argumentList, parameters);
2358 } 2358 }
2359 } 2359 }
2360 } 2360 }
2361 return null; 2361 return null;
2362 } 2362 }
2363 2363
2364 /** 2364 /**
2365 * If the given element is a setter, return the getter associated with it. Oth erwise, return the 2365 * If the given element is a setter, return the getter associated with it. Oth erwise, return the
2366 * element unchanged. 2366 * element unchanged.
2367 * @param element the element to be normalized 2367 * @param element the element to be normalized
2368 * @return a non-setter element derived from the given element 2368 * @return a non-setter element derived from the given element
2369 */ 2369 */
2370 Element convertSetterToGetter(Element element) { 2370 Element convertSetterToGetter(Element element) {
2371 if (element is PropertyAccessorElement) { 2371 if (element is PropertyAccessorElement) {
2372 return ((element as PropertyAccessorElement)).variable.getter; 2372 return ((element as PropertyAccessorElement)).variable.getter;
2373 } 2373 }
2374 return element; 2374 return element;
2375 } 2375 }
2376 2376
2377 /** 2377 /**
2378 * Look for any declarations of the given identifier that are imported using a prefix. Return the 2378 * Look for any declarations of the given identifier that are imported using a prefix. Return the
2379 * element that was found, or {@code null} if the name is not imported using a prefix. 2379 * element that was found, or {@code null} if the name is not imported using a prefix.
2380 * @param identifier the identifier that might have been imported using a pref ix 2380 * @param identifier the identifier that might have been imported using a pref ix
2381 * @return the element that was found 2381 * @return the element that was found
2382 */ 2382 */
2383 Element findImportWithoutPrefix(SimpleIdentifier identifier) { 2383 Element findImportWithoutPrefix(SimpleIdentifier identifier) {
2384 Element element = null; 2384 Element element = null;
2385 Scope nameScope2 = _resolver.nameScope; 2385 Scope nameScope = _resolver.nameScope;
2386 LibraryElement definingLibrary2 = _resolver.definingLibrary; 2386 LibraryElement definingLibrary = _resolver.definingLibrary;
2387 for (ImportElement importElement in definingLibrary2.imports) { 2387 for (ImportElement importElement in definingLibrary.imports) {
2388 PrefixElement prefixElement = importElement.prefix; 2388 PrefixElement prefixElement = importElement.prefix;
2389 if (prefixElement != null) { 2389 if (prefixElement != null) {
2390 Identifier prefixedIdentifier = new ElementResolver_SyntheticIdentifier( "${prefixElement.name}.${identifier.name}"); 2390 Identifier prefixedIdentifier = new ElementResolver_SyntheticIdentifier( "${prefixElement.name}.${identifier.name}");
2391 Element importedElement = nameScope2.lookup(prefixedIdentifier, defining Library2); 2391 Element importedElement = nameScope.lookup(prefixedIdentifier, definingL ibrary);
2392 if (importedElement != null) { 2392 if (importedElement != null) {
2393 if (element == null) { 2393 if (element == null) {
2394 element = importedElement; 2394 element = importedElement;
2395 } else { 2395 } else {
2396 element = new MultiplyDefinedElementImpl(definingLibrary2.context, e lement, importedElement); 2396 element = new MultiplyDefinedElementImpl(definingLibrary.context, el ement, importedElement);
2397 } 2397 }
2398 } 2398 }
2399 } 2399 }
2400 } 2400 }
2401 return element; 2401 return element;
2402 } 2402 }
2403 2403
2404 /** 2404 /**
2405 * Return the name of the method invoked by the given postfix expression. 2405 * Return the name of the method invoked by the given postfix expression.
2406 * @param node the postfix expression being invoked 2406 * @param node the postfix expression being invoked
2407 * @return the name of the method invoked by the expression 2407 * @return the name of the method invoked by the expression
2408 */ 2408 */
2409 String getPostfixOperator(PostfixExpression node) => (identical(node.operator. type, sc.TokenType.PLUS_PLUS)) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.l exeme; 2409 String getPostfixOperator(PostfixExpression node) => (identical(node.operator. type, sc.TokenType.PLUS_PLUS)) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.l exeme;
2410 2410
2411 /** 2411 /**
2412 * Return the name of the method invoked by the given postfix expression. 2412 * Return the name of the method invoked by the given postfix expression.
2413 * @param node the postfix expression being invoked 2413 * @param node the postfix expression being invoked
2414 * @return the name of the method invoked by the expression 2414 * @return the name of the method invoked by the expression
2415 */ 2415 */
2416 String getPrefixOperator(PrefixExpression node) { 2416 String getPrefixOperator(PrefixExpression node) {
2417 sc.Token operator2 = node.operator; 2417 sc.Token operator = node.operator;
2418 sc.TokenType operatorType = operator2.type; 2418 sc.TokenType operatorType = operator.type;
2419 if (identical(operatorType, sc.TokenType.PLUS_PLUS)) { 2419 if (identical(operatorType, sc.TokenType.PLUS_PLUS)) {
2420 return sc.TokenType.PLUS.lexeme; 2420 return sc.TokenType.PLUS.lexeme;
2421 } else if (identical(operatorType, sc.TokenType.MINUS_MINUS)) { 2421 } else if (identical(operatorType, sc.TokenType.MINUS_MINUS)) {
2422 return sc.TokenType.MINUS.lexeme; 2422 return sc.TokenType.MINUS.lexeme;
2423 } else if (identical(operatorType, sc.TokenType.MINUS)) { 2423 } else if (identical(operatorType, sc.TokenType.MINUS)) {
2424 return "unary-"; 2424 return "unary-";
2425 } else { 2425 } else {
2426 return operator2.lexeme; 2426 return operator.lexeme;
2427 } 2427 }
2428 } 2428 }
2429 2429
2430 /** 2430 /**
2431 * Return the propagated type of the given expression that is to be used for t ype analysis. 2431 * Return the propagated type of the given expression that is to be used for t ype analysis.
2432 * @param expression the expression whose type is to be returned 2432 * @param expression the expression whose type is to be returned
2433 * @return the type of the given expression 2433 * @return the type of the given expression
2434 */ 2434 */
2435 Type2 getPropagatedType(Expression expression) { 2435 Type2 getPropagatedType(Expression expression) {
2436 Type2 propagatedType2 = resolveTypeVariable(expression.propagatedType); 2436 Type2 propagatedType = resolveTypeVariable(expression.propagatedType);
2437 if (propagatedType2 is FunctionType) { 2437 if (propagatedType is FunctionType) {
2438 propagatedType2 = _resolver.typeProvider.functionType; 2438 propagatedType = _resolver.typeProvider.functionType;
2439 } 2439 }
2440 return propagatedType2; 2440 return propagatedType;
2441 } 2441 }
2442 2442
2443 /** 2443 /**
2444 * Return the static type of the given expression that is to be used for type analysis. 2444 * Return the static type of the given expression that is to be used for type analysis.
2445 * @param expression the expression whose type is to be returned 2445 * @param expression the expression whose type is to be returned
2446 * @return the type of the given expression 2446 * @return the type of the given expression
2447 */ 2447 */
2448 Type2 getStaticType(Expression expression) { 2448 Type2 getStaticType(Expression expression) {
2449 if (expression is NullLiteral) { 2449 if (expression is NullLiteral) {
2450 return _resolver.typeProvider.objectType; 2450 return _resolver.typeProvider.objectType;
2451 } 2451 }
2452 Type2 staticType2 = resolveTypeVariable(expression.staticType); 2452 Type2 staticType = resolveTypeVariable(expression.staticType);
2453 if (staticType2 is FunctionType) { 2453 if (staticType is FunctionType) {
2454 staticType2 = _resolver.typeProvider.functionType; 2454 staticType = _resolver.typeProvider.functionType;
2455 } 2455 }
2456 return staticType2; 2456 return staticType;
2457 } 2457 }
2458 2458
2459 /** 2459 /**
2460 * Return the element representing the superclass of the given class. 2460 * Return the element representing the superclass of the given class.
2461 * @param targetClass the class whose superclass is to be returned 2461 * @param targetClass the class whose superclass is to be returned
2462 * @return the element representing the superclass of the given class 2462 * @return the element representing the superclass of the given class
2463 */ 2463 */
2464 ClassElement getSuperclass(ClassElement targetClass) { 2464 ClassElement getSuperclass(ClassElement targetClass) {
2465 InterfaceType superType = targetClass.supertype; 2465 InterfaceType superType = targetClass.supertype;
2466 if (superType == null) { 2466 if (superType == null) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2507 * @param methodName the name of the operator associated with the context of u sing of the given 2507 * @param methodName the name of the operator associated with the context of u sing of the given
2508 * index expression 2508 * index expression
2509 * @return {@code true} if and only if an error code is generated on the passe d node 2509 * @return {@code true} if and only if an error code is generated on the passe d node
2510 */ 2510 */
2511 bool lookUpCheckIndexOperator(IndexExpression node, Expression target, String methodName, Type2 staticType, Type2 propagatedType) { 2511 bool lookUpCheckIndexOperator(IndexExpression node, Expression target, String methodName, Type2 staticType, Type2 propagatedType) {
2512 MethodElement staticMethod = lookUpMethod(target, staticType, methodName); 2512 MethodElement staticMethod = lookUpMethod(target, staticType, methodName);
2513 MethodElement propagatedMethod = lookUpMethod(target, propagatedType, method Name); 2513 MethodElement propagatedMethod = lookUpMethod(target, propagatedType, method Name);
2514 node.staticElement = staticMethod; 2514 node.staticElement = staticMethod;
2515 node.element = select3(staticMethod, propagatedMethod); 2515 node.element = select3(staticMethod, propagatedMethod);
2516 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || p ropagatedType == null || shouldReportMissingMember(propagatedType, propagatedMet hod))) { 2516 if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || p ropagatedType == null || shouldReportMissingMember(propagatedType, propagatedMet hod))) {
2517 sc.Token leftBracket2 = node.leftBracket; 2517 sc.Token leftBracket = node.leftBracket;
2518 sc.Token rightBracket2 = node.rightBracket; 2518 sc.Token rightBracket = node.rightBracket;
2519 if (leftBracket2 == null || rightBracket2 == null) { 2519 if (leftBracket == null || rightBracket == null) {
2520 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_OPERATOR, node, [m ethodName, staticType.displayName]); 2520 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_OPERATOR, node, [m ethodName, staticType.displayName]);
2521 return true; 2521 return true;
2522 } else { 2522 } else {
2523 int offset2 = leftBracket2.offset; 2523 int offset = leftBracket.offset;
2524 int length = rightBracket2.offset - offset2 + 1; 2524 int length = rightBracket.offset - offset + 1;
2525 _resolver.reportError5(StaticTypeWarningCode.UNDEFINED_OPERATOR, offset2 , length, [methodName, staticType.displayName]); 2525 _resolver.reportError5(StaticTypeWarningCode.UNDEFINED_OPERATOR, offset, length, [methodName, staticType.displayName]);
2526 return true; 2526 return true;
2527 } 2527 }
2528 } 2528 }
2529 return false; 2529 return false;
2530 } 2530 }
2531 2531
2532 /** 2532 /**
2533 * Look up the getter with the given name in the given type. Return the elemen t representing the 2533 * Look up the getter with the given name in the given type. Return the elemen t representing the
2534 * getter that was found, or {@code null} if there is no getter with the given name. 2534 * getter that was found, or {@code null} if there is no getter with the given name.
2535 * @param target the target of the invocation, or {@code null} if there is no target 2535 * @param target the target of the invocation, or {@code null} if there is no target
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2582 if (getter != null) { 2582 if (getter != null) {
2583 return getter; 2583 return getter;
2584 } 2584 }
2585 } 2585 }
2586 for (InterfaceType mixinType in targetType.mixins) { 2586 for (InterfaceType mixinType in targetType.mixins) {
2587 PropertyAccessorElement getter = lookUpGetterInInterfaces(mixinType, true, getterName, visitedInterfaces); 2587 PropertyAccessorElement getter = lookUpGetterInInterfaces(mixinType, true, getterName, visitedInterfaces);
2588 if (getter != null) { 2588 if (getter != null) {
2589 return getter; 2589 return getter;
2590 } 2590 }
2591 } 2591 }
2592 InterfaceType superclass2 = targetType.superclass; 2592 InterfaceType superclass = targetType.superclass;
2593 if (superclass2 == null) { 2593 if (superclass == null) {
2594 return null; 2594 return null;
2595 } 2595 }
2596 return lookUpGetterInInterfaces(superclass2, true, getterName, visitedInterf aces); 2596 return lookUpGetterInInterfaces(superclass, true, getterName, visitedInterfa ces);
2597 } 2597 }
2598 2598
2599 /** 2599 /**
2600 * Look up the method or getter with the given name in the given type. Return the element 2600 * Look up the method or getter with the given name in the given type. Return the element
2601 * representing the method or getter that was found, or {@code null} if there is no method or 2601 * representing the method or getter that was found, or {@code null} if there is no method or
2602 * getter with the given name. 2602 * getter with the given name.
2603 * @param type the type in which the method or getter is defined 2603 * @param type the type in which the method or getter is defined
2604 * @param memberName the name of the method or getter being looked up 2604 * @param memberName the name of the method or getter being looked up
2605 * @return the element representing the method or getter that was found 2605 * @return the element representing the method or getter that was found
2606 */ 2606 */
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2653 if (member != null) { 2653 if (member != null) {
2654 return member; 2654 return member;
2655 } 2655 }
2656 } 2656 }
2657 for (InterfaceType mixinType in targetType.mixins) { 2657 for (InterfaceType mixinType in targetType.mixins) {
2658 ExecutableElement member = lookUpGetterOrMethodInInterfaces(mixinType, tru e, memberName, visitedInterfaces); 2658 ExecutableElement member = lookUpGetterOrMethodInInterfaces(mixinType, tru e, memberName, visitedInterfaces);
2659 if (member != null) { 2659 if (member != null) {
2660 return member; 2660 return member;
2661 } 2661 }
2662 } 2662 }
2663 InterfaceType superclass2 = targetType.superclass; 2663 InterfaceType superclass = targetType.superclass;
2664 if (superclass2 == null) { 2664 if (superclass == null) {
2665 return null; 2665 return null;
2666 } 2666 }
2667 return lookUpGetterOrMethodInInterfaces(superclass2, true, memberName, visit edInterfaces); 2667 return lookUpGetterOrMethodInInterfaces(superclass, true, memberName, visite dInterfaces);
2668 } 2668 }
2669 2669
2670 /** 2670 /**
2671 * Find the element corresponding to the given label node in the current label scope. 2671 * Find the element corresponding to the given label node in the current label scope.
2672 * @param parentNode the node containing the given label 2672 * @param parentNode the node containing the given label
2673 * @param labelNode the node representing the label being looked up 2673 * @param labelNode the node representing the label being looked up
2674 * @return the element corresponding to the given label node in the current sc ope 2674 * @return the element corresponding to the given label node in the current sc ope
2675 */ 2675 */
2676 LabelElementImpl lookupLabel(ASTNode parentNode, SimpleIdentifier labelNode) { 2676 LabelElementImpl lookupLabel(ASTNode parentNode, SimpleIdentifier labelNode) {
2677 LabelScope labelScope2 = _resolver.labelScope; 2677 LabelScope labelScope = _resolver.labelScope;
2678 LabelElementImpl labelElement = null; 2678 LabelElementImpl labelElement = null;
2679 if (labelNode == null) { 2679 if (labelNode == null) {
2680 if (labelScope2 == null) { 2680 if (labelScope == null) {
2681 } else { 2681 } else {
2682 labelElement = labelScope2.lookup2(LabelScope.EMPTY_LABEL) as LabelEleme ntImpl; 2682 labelElement = labelScope.lookup2(LabelScope.EMPTY_LABEL) as LabelElemen tImpl;
2683 if (labelElement == null) { 2683 if (labelElement == null) {
2684 } 2684 }
2685 labelElement = null; 2685 labelElement = null;
2686 } 2686 }
2687 } else { 2687 } else {
2688 if (labelScope2 == null) { 2688 if (labelScope == null) {
2689 _resolver.reportError(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [ labelNode.name]); 2689 _resolver.reportError(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [ labelNode.name]);
2690 } else { 2690 } else {
2691 labelElement = labelScope2.lookup(labelNode) as LabelElementImpl; 2691 labelElement = labelScope.lookup(labelNode) as LabelElementImpl;
2692 if (labelElement == null) { 2692 if (labelElement == null) {
2693 _resolver.reportError(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]); 2693 _resolver.reportError(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
2694 } else { 2694 } else {
2695 recordResolution(labelNode, labelElement); 2695 recordResolution(labelNode, labelElement);
2696 } 2696 }
2697 } 2697 }
2698 } 2698 }
2699 if (labelElement != null) { 2699 if (labelElement != null) {
2700 ExecutableElement labelContainer = labelElement.getAncestor(ExecutableElem ent); 2700 ExecutableElement labelContainer = labelElement.getAncestor(ExecutableElem ent);
2701 if (labelContainer != _resolver.enclosingFunction) { 2701 if (labelContainer != _resolver.enclosingFunction) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2759 if (method != null) { 2759 if (method != null) {
2760 return method; 2760 return method;
2761 } 2761 }
2762 } 2762 }
2763 for (InterfaceType mixinType in targetType.mixins) { 2763 for (InterfaceType mixinType in targetType.mixins) {
2764 MethodElement method = lookUpMethodInInterfaces(mixinType, true, methodNam e, visitedInterfaces); 2764 MethodElement method = lookUpMethodInInterfaces(mixinType, true, methodNam e, visitedInterfaces);
2765 if (method != null) { 2765 if (method != null) {
2766 return method; 2766 return method;
2767 } 2767 }
2768 } 2768 }
2769 InterfaceType superclass2 = targetType.superclass; 2769 InterfaceType superclass = targetType.superclass;
2770 if (superclass2 == null) { 2770 if (superclass == null) {
2771 return null; 2771 return null;
2772 } 2772 }
2773 return lookUpMethodInInterfaces(superclass2, true, methodName, visitedInterf aces); 2773 return lookUpMethodInInterfaces(superclass, true, methodName, visitedInterfa ces);
2774 } 2774 }
2775 2775
2776 /** 2776 /**
2777 * Look up the setter with the given name in the given type. Return the elemen t representing the 2777 * Look up the setter with the given name in the given type. Return the elemen t representing the
2778 * setter that was found, or {@code null} if there is no setter with the given name. 2778 * setter that was found, or {@code null} if there is no setter with the given name.
2779 * @param target the target of the invocation, or {@code null} if there is no target 2779 * @param target the target of the invocation, or {@code null} if there is no target
2780 * @param type the type in which the setter is defined 2780 * @param type the type in which the setter is defined
2781 * @param setterName the name of the setter being looked up 2781 * @param setterName the name of the setter being looked up
2782 * @return the element representing the setter that was found 2782 * @return the element representing the setter that was found
2783 */ 2783 */
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2826 if (setter != null) { 2826 if (setter != null) {
2827 return setter; 2827 return setter;
2828 } 2828 }
2829 } 2829 }
2830 for (InterfaceType mixinType in targetType.mixins) { 2830 for (InterfaceType mixinType in targetType.mixins) {
2831 PropertyAccessorElement setter = lookUpSetterInInterfaces(mixinType, true, setterName, visitedInterfaces); 2831 PropertyAccessorElement setter = lookUpSetterInInterfaces(mixinType, true, setterName, visitedInterfaces);
2832 if (setter != null) { 2832 if (setter != null) {
2833 return setter; 2833 return setter;
2834 } 2834 }
2835 } 2835 }
2836 InterfaceType superclass2 = targetType.superclass; 2836 InterfaceType superclass = targetType.superclass;
2837 if (superclass2 == null) { 2837 if (superclass == null) {
2838 return null; 2838 return null;
2839 } 2839 }
2840 return lookUpSetterInInterfaces(superclass2, true, setterName, visitedInterf aces); 2840 return lookUpSetterInInterfaces(superclass, true, setterName, visitedInterfa ces);
2841 } 2841 }
2842 2842
2843 /** 2843 /**
2844 * Return the binary operator that is invoked by the given compound assignment operator. 2844 * Return the binary operator that is invoked by the given compound assignment operator.
2845 * @param operator the assignment operator being mapped 2845 * @param operator the assignment operator being mapped
2846 * @return the binary operator that invoked by the given assignment operator 2846 * @return the binary operator that invoked by the given assignment operator
2847 */ 2847 */
2848 sc.TokenType operatorFromCompoundAssignment(sc.TokenType operator) { 2848 sc.TokenType operatorFromCompoundAssignment(sc.TokenType operator) {
2849 while (true) { 2849 while (true) {
2850 if (operator == sc.TokenType.AMPERSAND_EQ) { 2850 if (operator == sc.TokenType.AMPERSAND_EQ) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2906 * correspond to the arguments, or {@code null} if no correspondence could be computed. 2906 * correspond to the arguments, or {@code null} if no correspondence could be computed.
2907 * @param reportError if {@code true} then compile-time error should be report ed; if {@code false}then compile-time warning 2907 * @param reportError if {@code true} then compile-time error should be report ed; if {@code false}then compile-time warning
2908 * @param argumentList the list of arguments being passed to the element 2908 * @param argumentList the list of arguments being passed to the element
2909 * @param executableElement the element that will be invoked with the argument s 2909 * @param executableElement the element that will be invoked with the argument s
2910 * @return the parameters that correspond to the arguments 2910 * @return the parameters that correspond to the arguments
2911 */ 2911 */
2912 List<ParameterElement> resolveArgumentsToParameters(bool reportError, Argument List argumentList, ExecutableElement executableElement) { 2912 List<ParameterElement> resolveArgumentsToParameters(bool reportError, Argument List argumentList, ExecutableElement executableElement) {
2913 if (executableElement == null) { 2913 if (executableElement == null) {
2914 return null; 2914 return null;
2915 } 2915 }
2916 List<ParameterElement> parameters2 = executableElement.parameters; 2916 List<ParameterElement> parameters = executableElement.parameters;
2917 return resolveArgumentsToParameters2(reportError, argumentList, parameters2) ; 2917 return resolveArgumentsToParameters2(reportError, argumentList, parameters);
2918 } 2918 }
2919 2919
2920 /** 2920 /**
2921 * Given a list of arguments and the parameters related to the element that wi ll be invoked using 2921 * Given a list of arguments and the parameters related to the element that wi ll be invoked using
2922 * those argument, compute the list of parameters that correspond to the list of arguments. Return 2922 * those argument, compute the list of parameters that correspond to the list of arguments. Return
2923 * the parameters that correspond to the arguments. 2923 * the parameters that correspond to the arguments.
2924 * @param reportError if {@code true} then compile-time error should be report ed; if {@code false}then compile-time warning 2924 * @param reportError if {@code true} then compile-time error should be report ed; if {@code false}then compile-time warning
2925 * @param argumentList the list of arguments being passed to the element 2925 * @param argumentList the list of arguments being passed to the element
2926 * @param parameters the of the function that will be invoked with the argumen ts 2926 * @param parameters the of the function that will be invoked with the argumen ts
2927 * @return the parameters that correspond to the arguments 2927 * @return the parameters that correspond to the arguments
2928 */ 2928 */
2929 List<ParameterElement> resolveArgumentsToParameters2(bool reportError2, Argume ntList argumentList, List<ParameterElement> parameters) { 2929 List<ParameterElement> resolveArgumentsToParameters2(bool reportError2, Argume ntList argumentList, List<ParameterElement> parameters) {
2930 List<ParameterElement> requiredParameters = new List<ParameterElement>(); 2930 List<ParameterElement> requiredParameters = new List<ParameterElement>();
2931 List<ParameterElement> positionalParameters = new List<ParameterElement>(); 2931 List<ParameterElement> positionalParameters = new List<ParameterElement>();
2932 Map<String, ParameterElement> namedParameters = new Map<String, ParameterEle ment>(); 2932 Map<String, ParameterElement> namedParameters = new Map<String, ParameterEle ment>();
2933 for (ParameterElement parameter in parameters) { 2933 for (ParameterElement parameter in parameters) {
2934 ParameterKind kind = parameter.parameterKind; 2934 ParameterKind kind = parameter.parameterKind;
2935 if (identical(kind, ParameterKind.REQUIRED)) { 2935 if (identical(kind, ParameterKind.REQUIRED)) {
2936 requiredParameters.add(parameter); 2936 requiredParameters.add(parameter);
2937 } else if (identical(kind, ParameterKind.POSITIONAL)) { 2937 } else if (identical(kind, ParameterKind.POSITIONAL)) {
2938 positionalParameters.add(parameter); 2938 positionalParameters.add(parameter);
2939 } else { 2939 } else {
2940 namedParameters[parameter.name] = parameter; 2940 namedParameters[parameter.name] = parameter;
2941 } 2941 }
2942 } 2942 }
2943 List<ParameterElement> unnamedParameters = new List<ParameterElement>.from(r equiredParameters); 2943 List<ParameterElement> unnamedParameters = new List<ParameterElement>.from(r equiredParameters);
2944 unnamedParameters.addAll(positionalParameters); 2944 unnamedParameters.addAll(positionalParameters);
2945 int unnamedParameterCount = unnamedParameters.length; 2945 int unnamedParameterCount = unnamedParameters.length;
2946 int unnamedIndex = 0; 2946 int unnamedIndex = 0;
2947 NodeList<Expression> arguments2 = argumentList.arguments; 2947 NodeList<Expression> arguments = argumentList.arguments;
2948 int argumentCount = arguments2.length; 2948 int argumentCount = arguments.length;
2949 List<ParameterElement> resolvedParameters = new List<ParameterElement>(argum entCount); 2949 List<ParameterElement> resolvedParameters = new List<ParameterElement>(argum entCount);
2950 int positionalArgumentCount = 0; 2950 int positionalArgumentCount = 0;
2951 Set<String> usedNames = new Set<String>(); 2951 Set<String> usedNames = new Set<String>();
2952 for (int i = 0; i < argumentCount; i++) { 2952 for (int i = 0; i < argumentCount; i++) {
2953 Expression argument = arguments2[i]; 2953 Expression argument = arguments[i];
2954 if (argument is NamedExpression) { 2954 if (argument is NamedExpression) {
2955 SimpleIdentifier nameNode = ((argument as NamedExpression)).name.label; 2955 SimpleIdentifier nameNode = ((argument as NamedExpression)).name.label;
2956 String name2 = nameNode.name; 2956 String name = nameNode.name;
2957 ParameterElement element = namedParameters[name2]; 2957 ParameterElement element = namedParameters[name];
2958 if (element == null) { 2958 if (element == null) {
2959 ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.UNDEFINED_NA MED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER; 2959 ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.UNDEFINED_NA MED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER;
2960 _resolver.reportError(errorCode, nameNode, [name2]); 2960 _resolver.reportError(errorCode, nameNode, [name]);
2961 } else { 2961 } else {
2962 resolvedParameters[i] = element; 2962 resolvedParameters[i] = element;
2963 recordResolution(nameNode, element); 2963 recordResolution(nameNode, element);
2964 } 2964 }
2965 if (!javaSetAdd(usedNames, name2)) { 2965 if (!javaSetAdd(usedNames, name)) {
2966 _resolver.reportError(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, n ameNode, [name2]); 2966 _resolver.reportError(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, n ameNode, [name]);
2967 } 2967 }
2968 } else { 2968 } else {
2969 positionalArgumentCount++; 2969 positionalArgumentCount++;
2970 if (unnamedIndex < unnamedParameterCount) { 2970 if (unnamedIndex < unnamedParameterCount) {
2971 resolvedParameters[i] = unnamedParameters[unnamedIndex++]; 2971 resolvedParameters[i] = unnamedParameters[unnamedIndex++];
2972 } 2972 }
2973 } 2973 }
2974 } 2974 }
2975 if (positionalArgumentCount < requiredParameters.length) { 2975 if (positionalArgumentCount < requiredParameters.length) {
2976 ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.NOT_ENOUGH_REQUI RED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS; 2976 ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.NOT_ENOUGH_REQUI RED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3022 if (targetType is InterfaceType) { 3022 if (targetType is InterfaceType) {
3023 InterfaceType classType = targetType as InterfaceType; 3023 InterfaceType classType = targetType as InterfaceType;
3024 Element element = lookUpMethod(target, classType, methodName.name); 3024 Element element = lookUpMethod(target, classType, methodName.name);
3025 if (element == null) { 3025 if (element == null) {
3026 element = classType.getGetter(methodName.name); 3026 element = classType.getGetter(methodName.name);
3027 } 3027 }
3028 return element; 3028 return element;
3029 } else if (target is SimpleIdentifier) { 3029 } else if (target is SimpleIdentifier) {
3030 Element targetElement = ((target as SimpleIdentifier)).element; 3030 Element targetElement = ((target as SimpleIdentifier)).element;
3031 if (targetElement is PrefixElement) { 3031 if (targetElement is PrefixElement) {
3032 String name2 = "${((target as SimpleIdentifier)).name}.${methodName}"; 3032 String name = "${((target as SimpleIdentifier)).name}.${methodName}";
3033 Identifier functionName = new ElementResolver_SyntheticIdentifier(name2) ; 3033 Identifier functionName = new ElementResolver_SyntheticIdentifier(name);
3034 Element element = _resolver.nameScope.lookup(functionName, _resolver.def iningLibrary); 3034 Element element = _resolver.nameScope.lookup(functionName, _resolver.def iningLibrary);
3035 if (element != null) { 3035 if (element != null) {
3036 return element; 3036 return element;
3037 } 3037 }
3038 } 3038 }
3039 } 3039 }
3040 return null; 3040 return null;
3041 } 3041 }
3042 3042
3043 /** 3043 /**
3044 * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the elemen t being invoked. If 3044 * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the elemen t being invoked. If
3045 * the returned element is a method, then the method will be invoked. If the r eturned element is a 3045 * the returned element is a method, then the method will be invoked. If the r eturned element is a
3046 * getter, the getter will be invoked without arguments and the result of that invocation will 3046 * getter, the getter will be invoked without arguments and the result of that invocation will
3047 * then be invoked with the arguments. 3047 * then be invoked with the arguments.
3048 * @param methodName the name of the method being invoked ('m') 3048 * @param methodName the name of the method being invoked ('m')
3049 * @return the element being invoked 3049 * @return the element being invoked
3050 */ 3050 */
3051 Element resolveInvokedElement2(SimpleIdentifier methodName) { 3051 Element resolveInvokedElement2(SimpleIdentifier methodName) {
3052 Element element = _resolver.nameScope.lookup(methodName, _resolver.definingL ibrary); 3052 Element element = _resolver.nameScope.lookup(methodName, _resolver.definingL ibrary);
3053 if (element == null) { 3053 if (element == null) {
3054 ClassElement enclosingClass2 = _resolver.enclosingClass; 3054 ClassElement enclosingClass = _resolver.enclosingClass;
3055 if (enclosingClass2 != null) { 3055 if (enclosingClass != null) {
3056 InterfaceType enclosingType = enclosingClass2.type; 3056 InterfaceType enclosingType = enclosingClass.type;
3057 element = lookUpMethod(null, enclosingType, methodName.name); 3057 element = lookUpMethod(null, enclosingType, methodName.name);
3058 if (element == null) { 3058 if (element == null) {
3059 element = lookUpGetter(null, enclosingType, methodName.name); 3059 element = lookUpGetter(null, enclosingType, methodName.name);
3060 } 3060 }
3061 } 3061 }
3062 } 3062 }
3063 return element; 3063 return element;
3064 } 3064 }
3065 3065
3066 /** 3066 /**
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3119 /** 3119 /**
3120 * Resolve the given simple identifier if possible. Return the element to whic h it could be 3120 * Resolve the given simple identifier if possible. Return the element to whic h it could be
3121 * resolved, or {@code null} if it could not be resolved. This does not record the results of the 3121 * resolved, or {@code null} if it could not be resolved. This does not record the results of the
3122 * resolution. 3122 * resolution.
3123 * @param node the identifier to be resolved 3123 * @param node the identifier to be resolved
3124 * @return the element to which the identifier could be resolved 3124 * @return the element to which the identifier could be resolved
3125 */ 3125 */
3126 Element resolveSimpleIdentifier(SimpleIdentifier node) { 3126 Element resolveSimpleIdentifier(SimpleIdentifier node) {
3127 Element element = _resolver.nameScope.lookup(node, _resolver.definingLibrary ); 3127 Element element = _resolver.nameScope.lookup(node, _resolver.definingLibrary );
3128 if (element is PropertyAccessorElement && node.inSetterContext()) { 3128 if (element is PropertyAccessorElement && node.inSetterContext()) {
3129 PropertyInducingElement variable2 = ((element as PropertyAccessorElement)) .variable; 3129 PropertyInducingElement variable = ((element as PropertyAccessorElement)). variable;
3130 if (variable2 != null) { 3130 if (variable != null) {
3131 PropertyAccessorElement setter2 = variable2.setter; 3131 PropertyAccessorElement setter = variable.setter;
3132 if (setter2 == null) { 3132 if (setter == null) {
3133 ClassElement enclosingClass2 = _resolver.enclosingClass; 3133 ClassElement enclosingClass = _resolver.enclosingClass;
3134 if (enclosingClass2 != null) { 3134 if (enclosingClass != null) {
3135 setter2 = lookUpSetter(null, enclosingClass2.type, node.name); 3135 setter = lookUpSetter(null, enclosingClass.type, node.name);
3136 } 3136 }
3137 } 3137 }
3138 if (setter2 != null) { 3138 if (setter != null) {
3139 element = setter2; 3139 element = setter;
3140 } 3140 }
3141 } 3141 }
3142 } else if (element == null && node.inSetterContext()) { 3142 } else if (element == null && node.inSetterContext()) {
3143 element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifi er("${node.name}="), _resolver.definingLibrary); 3143 element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifi er("${node.name}="), _resolver.definingLibrary);
3144 } 3144 }
3145 ClassElement enclosingClass3 = _resolver.enclosingClass; 3145 ClassElement enclosingClass = _resolver.enclosingClass;
3146 if (element == null && enclosingClass3 != null) { 3146 if (element == null && enclosingClass != null) {
3147 InterfaceType enclosingType = enclosingClass3.type; 3147 InterfaceType enclosingType = enclosingClass.type;
3148 if (element == null && node.inSetterContext()) { 3148 if (element == null && node.inSetterContext()) {
3149 element = lookUpSetter(null, enclosingType, node.name); 3149 element = lookUpSetter(null, enclosingType, node.name);
3150 } 3150 }
3151 if (element == null && node.inGetterContext()) { 3151 if (element == null && node.inGetterContext()) {
3152 element = lookUpGetter(null, enclosingType, node.name); 3152 element = lookUpGetter(null, enclosingType, node.name);
3153 } 3153 }
3154 if (element == null) { 3154 if (element == null) {
3155 element = lookUpMethod(null, enclosingType, node.name); 3155 element = lookUpMethod(null, enclosingType, node.name);
3156 } 3156 }
3157 } 3157 }
3158 return element; 3158 return element;
3159 } 3159 }
3160 3160
3161 /** 3161 /**
3162 * If the given type is a type variable, resolve it to the type that should be used when looking 3162 * If the given type is a type variable, resolve it to the type that should be used when looking
3163 * up members. Otherwise, return the original type. 3163 * up members. Otherwise, return the original type.
3164 * @param type the type that is to be resolved if it is a type variable 3164 * @param type the type that is to be resolved if it is a type variable
3165 * @return the type that should be used in place of the argument if it is a ty pe variable, or the 3165 * @return the type that should be used in place of the argument if it is a ty pe variable, or the
3166 * original argument if it isn't a type variable 3166 * original argument if it isn't a type variable
3167 */ 3167 */
3168 Type2 resolveTypeVariable(Type2 type) { 3168 Type2 resolveTypeVariable(Type2 type) {
3169 if (type is TypeVariableType) { 3169 if (type is TypeVariableType) {
3170 Type2 bound2 = ((type as TypeVariableType)).element.bound; 3170 Type2 bound = ((type as TypeVariableType)).element.bound;
3171 if (bound2 == null) { 3171 if (bound == null) {
3172 return _resolver.typeProvider.objectType; 3172 return _resolver.typeProvider.objectType;
3173 } 3173 }
3174 return bound2; 3174 return bound;
3175 } 3175 }
3176 return type; 3176 return type;
3177 } 3177 }
3178 3178
3179 /** 3179 /**
3180 * Given two possible error codes for the same piece of code, one computed usi ng static type 3180 * Given two possible error codes for the same piece of code, one computed usi ng static type
3181 * information and the other using propagated type information, return the err or code that should 3181 * information and the other using propagated type information, return the err or code that should
3182 * be reported, or {@code null} if no error should be reported. 3182 * be reported, or {@code null} if no error should be reported.
3183 * @param staticError the error code computed using static type information 3183 * @param staticError the error code computed using static type information
3184 * @param propagatedError the error code computed using propagated type inform ation 3184 * @param propagatedError the error code computed using propagated type inform ation
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
3427 * @return a mapping between the set of all string names of the members inheri ted from the passed{@link ClassElement} superclass hierarchy, and the associated {@link ExecutableElement} 3427 * @return a mapping between the set of all string names of the members inheri ted from the passed{@link ClassElement} superclass hierarchy, and the associated {@link ExecutableElement}
3428 */ 3428 */
3429 Map<String, ExecutableElement> computeClassChainLookupMap(ClassElement classEl t, Set<ClassElement> visitedClasses) { 3429 Map<String, ExecutableElement> computeClassChainLookupMap(ClassElement classEl t, Set<ClassElement> visitedClasses) {
3430 Map<String, ExecutableElement> resultMap = _classLookup[classElt]; 3430 Map<String, ExecutableElement> resultMap = _classLookup[classElt];
3431 if (resultMap != null) { 3431 if (resultMap != null) {
3432 return resultMap; 3432 return resultMap;
3433 } else { 3433 } else {
3434 resultMap = new Map<String, ExecutableElement>(); 3434 resultMap = new Map<String, ExecutableElement>();
3435 } 3435 }
3436 ClassElement superclassElt = null; 3436 ClassElement superclassElt = null;
3437 InterfaceType supertype2 = classElt.supertype; 3437 InterfaceType supertype = classElt.supertype;
3438 if (supertype2 != null) { 3438 if (supertype != null) {
3439 superclassElt = supertype2.element; 3439 superclassElt = supertype.element;
3440 } else { 3440 } else {
3441 _classLookup[classElt] = resultMap; 3441 _classLookup[classElt] = resultMap;
3442 return resultMap; 3442 return resultMap;
3443 } 3443 }
3444 if (superclassElt != null) { 3444 if (superclassElt != null) {
3445 if (!visitedClasses.contains(superclassElt)) { 3445 if (!visitedClasses.contains(superclassElt)) {
3446 javaSetAdd(visitedClasses, classElt); 3446 javaSetAdd(visitedClasses, classElt);
3447 resultMap = new Map<String, ExecutableElement>.from(computeClassChainLoo kupMap(superclassElt, visitedClasses)); 3447 resultMap = new Map<String, ExecutableElement>.from(computeClassChainLoo kupMap(superclassElt, visitedClasses));
3448 } else { 3448 } else {
3449 _classLookup[superclassElt] = resultMap; 3449 _classLookup[superclassElt] = resultMap;
3450 return resultMap; 3450 return resultMap;
3451 } 3451 }
3452 recordMapWithClassMembers(resultMap, superclassElt); 3452 recordMapWithClassMembers(resultMap, superclassElt);
3453 } 3453 }
3454 List<InterfaceType> mixins2 = classElt.mixins; 3454 List<InterfaceType> mixins = classElt.mixins;
3455 for (int i = mixins2.length - 1; i >= 0; i--) { 3455 for (int i = mixins.length - 1; i >= 0; i--) {
3456 ClassElement mixinElement = mixins2[i].element; 3456 ClassElement mixinElement = mixins[i].element;
3457 if (mixinElement != null) { 3457 if (mixinElement != null) {
3458 recordMapWithClassMembers(resultMap, mixinElement); 3458 recordMapWithClassMembers(resultMap, mixinElement);
3459 } 3459 }
3460 } 3460 }
3461 _classLookup[classElt] = resultMap; 3461 _classLookup[classElt] = resultMap;
3462 return resultMap; 3462 return resultMap;
3463 } 3463 }
3464 3464
3465 /** 3465 /**
3466 * Compute and return the inheritance path given the context of a type and a m ember that is 3466 * Compute and return the inheritance path given the context of a type and a m ember that is
3467 * overridden in the inheritance path (for which the type is in the path). 3467 * overridden in the inheritance path (for which the type is in the path).
3468 * @param chain the inheritance path that is built up as this method calls its elf recursively, 3468 * @param chain the inheritance path that is built up as this method calls its elf recursively,
3469 * when this method is called an empty {@link LinkedList} should be provided 3469 * when this method is called an empty {@link LinkedList} should be provided
3470 * @param currentType the current type in the inheritance path 3470 * @param currentType the current type in the inheritance path
3471 * @param memberName the name of the member that is being looked up the inheri tance path 3471 * @param memberName the name of the member that is being looked up the inheri tance path
3472 */ 3472 */
3473 void computeInheritancePath(Queue<InterfaceType> chain, InterfaceType currentT ype, String memberName) { 3473 void computeInheritancePath(Queue<InterfaceType> chain, InterfaceType currentT ype, String memberName) {
3474 chain.add(currentType); 3474 chain.add(currentType);
3475 ClassElement classElt = currentType.element; 3475 ClassElement classElt = currentType.element;
3476 InterfaceType supertype2 = classElt.supertype; 3476 InterfaceType supertype = classElt.supertype;
3477 if (supertype2 == null) { 3477 if (supertype == null) {
3478 return; 3478 return;
3479 } 3479 }
3480 if (chain.length != 1) { 3480 if (chain.length != 1) {
3481 if (lookupMemberInClass(classElt, memberName) != null) { 3481 if (lookupMemberInClass(classElt, memberName) != null) {
3482 return; 3482 return;
3483 } 3483 }
3484 } 3484 }
3485 List<InterfaceType> mixins2 = classElt.mixins; 3485 List<InterfaceType> mixins = classElt.mixins;
3486 for (int i = mixins2.length - 1; i >= 0; i--) { 3486 for (int i = mixins.length - 1; i >= 0; i--) {
3487 ClassElement mixinElement = mixins2[i].element; 3487 ClassElement mixinElement = mixins[i].element;
3488 if (mixinElement != null) { 3488 if (mixinElement != null) {
3489 ExecutableElement elt = lookupMemberInClass(mixinElement, memberName); 3489 ExecutableElement elt = lookupMemberInClass(mixinElement, memberName);
3490 if (elt != null) { 3490 if (elt != null) {
3491 chain.add(mixins2[i]); 3491 chain.add(mixins[i]);
3492 return; 3492 return;
3493 } 3493 }
3494 } 3494 }
3495 } 3495 }
3496 ClassElement superclassElt = supertype2.element; 3496 ClassElement superclassElt = supertype.element;
3497 if (lookupMember(superclassElt, memberName) != null) { 3497 if (lookupMember(superclassElt, memberName) != null) {
3498 computeInheritancePath(chain, supertype2, memberName); 3498 computeInheritancePath(chain, supertype, memberName);
3499 return; 3499 return;
3500 } 3500 }
3501 List<InterfaceType> interfaces2 = classElt.interfaces; 3501 List<InterfaceType> interfaces = classElt.interfaces;
3502 for (InterfaceType interfaceType in interfaces2) { 3502 for (InterfaceType interfaceType in interfaces) {
3503 ClassElement interfaceElement = interfaceType.element; 3503 ClassElement interfaceElement = interfaceType.element;
3504 if (interfaceElement != null && lookupMember(interfaceElement, memberName) != null) { 3504 if (interfaceElement != null && lookupMember(interfaceElement, memberName) != null) {
3505 computeInheritancePath(chain, interfaceType, memberName); 3505 computeInheritancePath(chain, interfaceType, memberName);
3506 return; 3506 return;
3507 } 3507 }
3508 } 3508 }
3509 } 3509 }
3510 3510
3511 /** 3511 /**
3512 * Compute and return a mapping between the set of all string names of the mem bers inherited from 3512 * Compute and return a mapping between the set of all string names of the mem bers inherited from
3513 * the passed {@link ClassElement} interface hierarchy, and the associated{@li nk ExecutableElement}. 3513 * the passed {@link ClassElement} interface hierarchy, and the associated{@li nk ExecutableElement}.
3514 * @param classElt the class element to query 3514 * @param classElt the class element to query
3515 * @param visitedInterfaces a set of visited classes passed back into this met hod when it calls 3515 * @param visitedInterfaces a set of visited classes passed back into this met hod when it calls
3516 * itself recursively 3516 * itself recursively
3517 * @return a mapping between the set of all string names of the members inheri ted from the passed{@link ClassElement} interface hierarchy, and the associated {@link ExecutableElement} 3517 * @return a mapping between the set of all string names of the members inheri ted from the passed{@link ClassElement} interface hierarchy, and the associated {@link ExecutableElement}
3518 */ 3518 */
3519 Map<String, ExecutableElement> computeInterfaceLookupMap(ClassElement classElt , Set<ClassElement> visitedInterfaces) { 3519 Map<String, ExecutableElement> computeInterfaceLookupMap(ClassElement classElt , Set<ClassElement> visitedInterfaces) {
3520 Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt]; 3520 Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt];
3521 if (resultMap != null) { 3521 if (resultMap != null) {
3522 return resultMap; 3522 return resultMap;
3523 } else { 3523 } else {
3524 resultMap = new Map<String, ExecutableElement>(); 3524 resultMap = new Map<String, ExecutableElement>();
3525 } 3525 }
3526 InterfaceType supertype2 = classElt.supertype; 3526 InterfaceType supertype = classElt.supertype;
3527 ClassElement superclassElement = supertype2 != null ? supertype2.element : n ull; 3527 ClassElement superclassElement = supertype != null ? supertype.element : nul l;
3528 List<InterfaceType> interfaces2 = classElt.interfaces; 3528 List<InterfaceType> interfaces = classElt.interfaces;
3529 if (superclassElement == null || interfaces2.length == 0) { 3529 if (superclassElement == null || interfaces.length == 0) {
3530 _interfaceLookup[classElt] = resultMap; 3530 _interfaceLookup[classElt] = resultMap;
3531 return resultMap; 3531 return resultMap;
3532 } 3532 }
3533 List<Map<String, ExecutableElement>> lookupMaps = new List<Map<String, Execu tableElement>>(); 3533 List<Map<String, ExecutableElement>> lookupMaps = new List<Map<String, Execu tableElement>>();
3534 if (superclassElement != null) { 3534 if (superclassElement != null) {
3535 if (!visitedInterfaces.contains(superclassElement)) { 3535 if (!visitedInterfaces.contains(superclassElement)) {
3536 try { 3536 try {
3537 javaSetAdd(visitedInterfaces, superclassElement); 3537 javaSetAdd(visitedInterfaces, superclassElement);
3538 lookupMaps.add(computeInterfaceLookupMap(superclassElement, visitedInt erfaces)); 3538 lookupMaps.add(computeInterfaceLookupMap(superclassElement, visitedInt erfaces));
3539 } finally { 3539 } finally {
3540 visitedInterfaces.remove(superclassElement); 3540 visitedInterfaces.remove(superclassElement);
3541 } 3541 }
3542 } else { 3542 } else {
3543 Map<String, ExecutableElement> map = _interfaceLookup[classElt]; 3543 Map<String, ExecutableElement> map = _interfaceLookup[classElt];
3544 if (map != null) { 3544 if (map != null) {
3545 lookupMaps.add(map); 3545 lookupMaps.add(map);
3546 } else { 3546 } else {
3547 _interfaceLookup[superclassElement] = resultMap; 3547 _interfaceLookup[superclassElement] = resultMap;
3548 return resultMap; 3548 return resultMap;
3549 } 3549 }
3550 } 3550 }
3551 } 3551 }
3552 for (InterfaceType interfaceType in interfaces2) { 3552 for (InterfaceType interfaceType in interfaces) {
3553 ClassElement interfaceElement = interfaceType.element; 3553 ClassElement interfaceElement = interfaceType.element;
3554 if (interfaceElement != null) { 3554 if (interfaceElement != null) {
3555 if (!visitedInterfaces.contains(interfaceElement)) { 3555 if (!visitedInterfaces.contains(interfaceElement)) {
3556 try { 3556 try {
3557 javaSetAdd(visitedInterfaces, interfaceElement); 3557 javaSetAdd(visitedInterfaces, interfaceElement);
3558 lookupMaps.add(computeInterfaceLookupMap(interfaceElement, visitedIn terfaces)); 3558 lookupMaps.add(computeInterfaceLookupMap(interfaceElement, visitedIn terfaces));
3559 } finally { 3559 } finally {
3560 visitedInterfaces.remove(interfaceElement); 3560 visitedInterfaces.remove(interfaceElement);
3561 } 3561 }
3562 } else { 3562 } else {
(...skipping 18 matching lines...) Expand all
3581 if (!unionMap.containsKey(key)) { 3581 if (!unionMap.containsKey(key)) {
3582 Set<ExecutableElement> set = new Set<ExecutableElement>(); 3582 Set<ExecutableElement> set = new Set<ExecutableElement>();
3583 javaSetAdd(set, entry.getValue()); 3583 javaSetAdd(set, entry.getValue());
3584 unionMap[key] = set; 3584 unionMap[key] = set;
3585 } else { 3585 } else {
3586 javaSetAdd(unionMap[key], entry.getValue()); 3586 javaSetAdd(unionMap[key], entry.getValue());
3587 } 3587 }
3588 } 3588 }
3589 } 3589 }
3590 if (superclassElement != null) { 3590 if (superclassElement != null) {
3591 List<MethodElement> methods2 = superclassElement.methods; 3591 List<MethodElement> methods = superclassElement.methods;
3592 for (MethodElement method in methods2) { 3592 for (MethodElement method in methods) {
3593 if (method.isAccessibleIn(_library) && !method.isStatic()) { 3593 if (method.isAccessibleIn(_library) && !method.isStatic()) {
3594 String key = method.name; 3594 String key = method.name;
3595 if (!unionMap.containsKey(key)) { 3595 if (!unionMap.containsKey(key)) {
3596 Set<ExecutableElement> set = new Set<ExecutableElement>(); 3596 Set<ExecutableElement> set = new Set<ExecutableElement>();
3597 javaSetAdd(set, method); 3597 javaSetAdd(set, method);
3598 unionMap[key] = set; 3598 unionMap[key] = set;
3599 } else { 3599 } else {
3600 javaSetAdd(unionMap[key], method); 3600 javaSetAdd(unionMap[key], method);
3601 } 3601 }
3602 } 3602 }
3603 } 3603 }
3604 List<PropertyAccessorElement> accessors2 = superclassElement.accessors; 3604 List<PropertyAccessorElement> accessors = superclassElement.accessors;
3605 for (PropertyAccessorElement accessor in accessors2) { 3605 for (PropertyAccessorElement accessor in accessors) {
3606 if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) { 3606 if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
3607 String key = accessor.name; 3607 String key = accessor.name;
3608 if (!unionMap.containsKey(key)) { 3608 if (!unionMap.containsKey(key)) {
3609 Set<ExecutableElement> set = new Set<ExecutableElement>(); 3609 Set<ExecutableElement> set = new Set<ExecutableElement>();
3610 javaSetAdd(set, accessor); 3610 javaSetAdd(set, accessor);
3611 unionMap[key] = set; 3611 unionMap[key] = set;
3612 } else { 3612 } else {
3613 javaSetAdd(unionMap[key], accessor); 3613 javaSetAdd(unionMap[key], accessor);
3614 } 3614 }
3615 } 3615 }
3616 } 3616 }
3617 } 3617 }
3618 for (InterfaceType interfaceType in interfaces2) { 3618 for (InterfaceType interfaceType in interfaces) {
3619 ClassElement interfaceElement = interfaceType.element; 3619 ClassElement interfaceElement = interfaceType.element;
3620 if (interfaceElement != null) { 3620 if (interfaceElement != null) {
3621 List<MethodElement> methods3 = interfaceElement.methods; 3621 List<MethodElement> methods = interfaceElement.methods;
3622 for (MethodElement method in methods3) { 3622 for (MethodElement method in methods) {
3623 if (method.isAccessibleIn(_library) && !method.isStatic()) { 3623 if (method.isAccessibleIn(_library) && !method.isStatic()) {
3624 String key = method.name; 3624 String key = method.name;
3625 if (!unionMap.containsKey(key)) { 3625 if (!unionMap.containsKey(key)) {
3626 Set<ExecutableElement> set = new Set<ExecutableElement>(); 3626 Set<ExecutableElement> set = new Set<ExecutableElement>();
3627 javaSetAdd(set, method); 3627 javaSetAdd(set, method);
3628 unionMap[key] = set; 3628 unionMap[key] = set;
3629 } else { 3629 } else {
3630 javaSetAdd(unionMap[key], method); 3630 javaSetAdd(unionMap[key], method);
3631 } 3631 }
3632 } 3632 }
3633 } 3633 }
3634 List<PropertyAccessorElement> accessors3 = interfaceElement.accessors; 3634 List<PropertyAccessorElement> accessors = interfaceElement.accessors;
3635 for (PropertyAccessorElement accessor in accessors3) { 3635 for (PropertyAccessorElement accessor in accessors) {
3636 if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) { 3636 if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
3637 String key = accessor.name; 3637 String key = accessor.name;
3638 if (!unionMap.containsKey(key)) { 3638 if (!unionMap.containsKey(key)) {
3639 Set<ExecutableElement> set = new Set<ExecutableElement>(); 3639 Set<ExecutableElement> set = new Set<ExecutableElement>();
3640 javaSetAdd(set, accessor); 3640 javaSetAdd(set, accessor);
3641 unionMap[key] = set; 3641 unionMap[key] = set;
3642 } else { 3642 } else {
3643 javaSetAdd(unionMap[key], accessor); 3643 javaSetAdd(unionMap[key], accessor);
3644 } 3644 }
3645 } 3645 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
3713 3713
3714 /** 3714 /**
3715 * Given some {@link ClassElement}, this method finds and returns the {@link E xecutableElement} of 3715 * Given some {@link ClassElement}, this method finds and returns the {@link E xecutableElement} of
3716 * the passed name in the class element. Static members, members in super type s and members not 3716 * the passed name in the class element. Static members, members in super type s and members not
3717 * accessible from the current library are not considered. 3717 * accessible from the current library are not considered.
3718 * @param classElt the class element to query 3718 * @param classElt the class element to query
3719 * @param memberName the name of the member to lookup in the class 3719 * @param memberName the name of the member to lookup in the class
3720 * @return the found {@link ExecutableElement}, or {@code null} if no such mem ber was found 3720 * @return the found {@link ExecutableElement}, or {@code null} if no such mem ber was found
3721 */ 3721 */
3722 ExecutableElement lookupMemberInClass(ClassElement classElt, String memberName ) { 3722 ExecutableElement lookupMemberInClass(ClassElement classElt, String memberName ) {
3723 List<MethodElement> methods2 = classElt.methods; 3723 List<MethodElement> methods = classElt.methods;
3724 for (MethodElement method in methods2) { 3724 for (MethodElement method in methods) {
3725 if (memberName == method.name && method.isAccessibleIn(_library) && !metho d.isStatic()) { 3725 if (memberName == method.name && method.isAccessibleIn(_library) && !metho d.isStatic()) {
3726 return method; 3726 return method;
3727 } 3727 }
3728 } 3728 }
3729 List<PropertyAccessorElement> accessors2 = classElt.accessors; 3729 List<PropertyAccessorElement> accessors = classElt.accessors;
3730 for (PropertyAccessorElement accessor in accessors2) { 3730 for (PropertyAccessorElement accessor in accessors) {
3731 if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !a ccessor.isStatic()) { 3731 if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !a ccessor.isStatic()) {
3732 return accessor; 3732 return accessor;
3733 } 3733 }
3734 } 3734 }
3735 return null; 3735 return null;
3736 } 3736 }
3737 3737
3738 /** 3738 /**
3739 * Record the passed map with the set of all members (methods, getters and set ters) in the class 3739 * Record the passed map with the set of all members (methods, getters and set ters) in the class
3740 * into the passed map. 3740 * into the passed map.
3741 * @param map some non-{@code null} 3741 * @param map some non-{@code null}
3742 * @param classElt the class element that will be recorded into the passed map 3742 * @param classElt the class element that will be recorded into the passed map
3743 */ 3743 */
3744 void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElemen t classElt) { 3744 void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElemen t classElt) {
3745 List<MethodElement> methods2 = classElt.methods; 3745 List<MethodElement> methods = classElt.methods;
3746 for (MethodElement method in methods2) { 3746 for (MethodElement method in methods) {
3747 if (method.isAccessibleIn(_library) && !method.isStatic()) { 3747 if (method.isAccessibleIn(_library) && !method.isStatic()) {
3748 map[method.name] = method; 3748 map[method.name] = method;
3749 } 3749 }
3750 } 3750 }
3751 List<PropertyAccessorElement> accessors2 = classElt.accessors; 3751 List<PropertyAccessorElement> accessors = classElt.accessors;
3752 for (PropertyAccessorElement accessor in accessors2) { 3752 for (PropertyAccessorElement accessor in accessors) {
3753 if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) { 3753 if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
3754 map[accessor.name] = accessor; 3754 map[accessor.name] = accessor;
3755 } 3755 }
3756 } 3756 }
3757 } 3757 }
3758 3758
3759 /** 3759 /**
3760 * This method is used to report errors on when they are found computing inher itance information. 3760 * This method is used to report errors on when they are found computing inher itance information.
3761 * See {@link ErrorVerifier#checkForInconsistentMethodInheritance()} to see wh ere these generated 3761 * See {@link ErrorVerifier#checkForInconsistentMethodInheritance()} to see wh ere these generated
3762 * error codes are reported back into the analysis engine. 3762 * error codes are reported back into the analysis engine.
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
4098 } 4098 }
4099 4099
4100 /** 4100 /**
4101 * Build the library element for the given library. 4101 * Build the library element for the given library.
4102 * @param library the library for which an element model is to be built 4102 * @param library the library for which an element model is to be built
4103 * @return the library element that was built 4103 * @return the library element that was built
4104 * @throws AnalysisException if the analysis could not be performed 4104 * @throws AnalysisException if the analysis could not be performed
4105 */ 4105 */
4106 LibraryElementImpl buildLibrary(Library library) { 4106 LibraryElementImpl buildLibrary(Library library) {
4107 CompilationUnitBuilder builder = new CompilationUnitBuilder(); 4107 CompilationUnitBuilder builder = new CompilationUnitBuilder();
4108 Source librarySource2 = library.librarySource; 4108 Source librarySource = library.librarySource;
4109 CompilationUnit definingCompilationUnit2 = library.definingCompilationUnit; 4109 CompilationUnit definingCompilationUnit = library.definingCompilationUnit;
4110 CompilationUnitElementImpl definingCompilationUnitElement = builder.buildCom pilationUnit(librarySource2, definingCompilationUnit2); 4110 CompilationUnitElementImpl definingCompilationUnitElement = builder.buildCom pilationUnit(librarySource, definingCompilationUnit);
4111 NodeList<Directive> directives2 = definingCompilationUnit2.directives; 4111 NodeList<Directive> directives = definingCompilationUnit.directives;
4112 LibraryIdentifier libraryNameNode = null; 4112 LibraryIdentifier libraryNameNode = null;
4113 bool hasPartDirective = false; 4113 bool hasPartDirective = false;
4114 FunctionElement entryPoint = findEntryPoint(definingCompilationUnitElement); 4114 FunctionElement entryPoint = findEntryPoint(definingCompilationUnitElement);
4115 List<Directive> directivesToResolve = new List<Directive>(); 4115 List<Directive> directivesToResolve = new List<Directive>();
4116 List<CompilationUnitElementImpl> sourcedCompilationUnits = new List<Compilat ionUnitElementImpl>(); 4116 List<CompilationUnitElementImpl> sourcedCompilationUnits = new List<Compilat ionUnitElementImpl>();
4117 for (Directive directive in directives2) { 4117 for (Directive directive in directives) {
4118 if (directive is LibraryDirective) { 4118 if (directive is LibraryDirective) {
4119 if (libraryNameNode == null) { 4119 if (libraryNameNode == null) {
4120 libraryNameNode = ((directive as LibraryDirective)).name; 4120 libraryNameNode = ((directive as LibraryDirective)).name;
4121 directivesToResolve.add(directive); 4121 directivesToResolve.add(directive);
4122 } 4122 }
4123 } else if (directive is PartDirective) { 4123 } else if (directive is PartDirective) {
4124 PartDirective partDirective = directive as PartDirective; 4124 PartDirective partDirective = directive as PartDirective;
4125 StringLiteral partUri = partDirective.uri; 4125 StringLiteral partUri = partDirective.uri;
4126 Source partSource = library.getSource(partDirective); 4126 Source partSource = library.getSource(partDirective);
4127 if (partSource != null && partSource.exists()) { 4127 if (partSource != null && partSource.exists()) {
4128 hasPartDirective = true; 4128 hasPartDirective = true;
4129 CompilationUnitElementImpl part = builder.buildCompilationUnit(partSou rce, library.getAST(partSource)); 4129 CompilationUnitElementImpl part = builder.buildCompilationUnit(partSou rce, library.getAST(partSource));
4130 part.uri = library.getUri(partDirective); 4130 part.uri = library.getUri(partDirective);
4131 String partLibraryName = getPartLibraryName(library, partSource, direc tivesToResolve); 4131 String partLibraryName = getPartLibraryName(library, partSource, direc tivesToResolve);
4132 if (partLibraryName == null) { 4132 if (partLibraryName == null) {
4133 _errorListener.onError(new AnalysisError.con2(librarySource2, partUr i.offset, partUri.length, CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSour ce()])); 4133 _errorListener.onError(new AnalysisError.con2(librarySource, partUri .offset, partUri.length, CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSourc e()]));
4134 } else if (libraryNameNode == null) { 4134 } else if (libraryNameNode == null) {
4135 } else if (libraryNameNode.name != partLibraryName) { 4135 } else if (libraryNameNode.name != partLibraryName) {
4136 _errorListener.onError(new AnalysisError.con2(librarySource2, partUr i.offset, partUri.length, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [libraryN ameNode.name, partLibraryName])); 4136 _errorListener.onError(new AnalysisError.con2(librarySource, partUri .offset, partUri.length, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [libraryNa meNode.name, partLibraryName]));
4137 } 4137 }
4138 if (entryPoint == null) { 4138 if (entryPoint == null) {
4139 entryPoint = findEntryPoint(part); 4139 entryPoint = findEntryPoint(part);
4140 } 4140 }
4141 directive.element = part; 4141 directive.element = part;
4142 sourcedCompilationUnits.add(part); 4142 sourcedCompilationUnits.add(part);
4143 } 4143 }
4144 } 4144 }
4145 } 4145 }
4146 if (hasPartDirective && libraryNameNode == null) { 4146 if (hasPartDirective && libraryNameNode == null) {
4147 _errorListener.onError(new AnalysisError.con1(librarySource2, ResolverErro rCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART, [])); 4147 _errorListener.onError(new AnalysisError.con1(librarySource, ResolverError Code.MISSING_LIBRARY_DIRECTIVE_WITH_PART, []));
4148 } 4148 }
4149 LibraryElementImpl libraryElement = new LibraryElementImpl(_analysisContext, libraryNameNode); 4149 LibraryElementImpl libraryElement = new LibraryElementImpl(_analysisContext, libraryNameNode);
4150 libraryElement.definingCompilationUnit = definingCompilationUnitElement; 4150 libraryElement.definingCompilationUnit = definingCompilationUnitElement;
4151 if (entryPoint != null) { 4151 if (entryPoint != null) {
4152 libraryElement.entryPoint = entryPoint; 4152 libraryElement.entryPoint = entryPoint;
4153 } 4153 }
4154 int sourcedUnitCount = sourcedCompilationUnits.length; 4154 int sourcedUnitCount = sourcedCompilationUnits.length;
4155 libraryElement.parts = new List.from(sourcedCompilationUnits); 4155 libraryElement.parts = new List.from(sourcedCompilationUnits);
4156 for (Directive directive in directivesToResolve) { 4156 for (Directive directive in directivesToResolve) {
4157 directive.element = libraryElement; 4157 directive.element = libraryElement;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4206 * @param directivesToResolve a list of directives that should be resolved to the library being 4206 * @param directivesToResolve a list of directives that should be resolved to the library being
4207 * built 4207 * built
4208 * @return the name of the library that the given part is declared to be a par t of 4208 * @return the name of the library that the given part is declared to be a par t of
4209 */ 4209 */
4210 String getPartLibraryName(Library library, Source partSource, List<Directive> directivesToResolve) { 4210 String getPartLibraryName(Library library, Source partSource, List<Directive> directivesToResolve) {
4211 try { 4211 try {
4212 CompilationUnit partUnit = library.getAST(partSource); 4212 CompilationUnit partUnit = library.getAST(partSource);
4213 for (Directive directive in partUnit.directives) { 4213 for (Directive directive in partUnit.directives) {
4214 if (directive is PartOfDirective) { 4214 if (directive is PartOfDirective) {
4215 directivesToResolve.add(directive); 4215 directivesToResolve.add(directive);
4216 LibraryIdentifier libraryName2 = ((directive as PartOfDirective)).libr aryName; 4216 LibraryIdentifier libraryName = ((directive as PartOfDirective)).libra ryName;
4217 if (libraryName2 != null) { 4217 if (libraryName != null) {
4218 return libraryName2.name; 4218 return libraryName.name;
4219 } 4219 }
4220 } 4220 }
4221 } 4221 }
4222 } on AnalysisException catch (exception) { 4222 } on AnalysisException catch (exception) {
4223 } 4223 }
4224 return null; 4224 return null;
4225 } 4225 }
4226 4226
4227 /** 4227 /**
4228 * Look through all of the compilation units defined for the given library, lo oking for getters 4228 * Look through all of the compilation units defined for the given library, lo oking for getters
4229 * and setters that are defined in different compilation units but that have t he same names. If 4229 * and setters that are defined in different compilation units but that have t he same names. If
4230 * any are found, make sure that they have the same variable element. 4230 * any are found, make sure that they have the same variable element.
4231 * @param libraryElement the library defining the compilation units to be proc essed 4231 * @param libraryElement the library defining the compilation units to be proc essed
4232 */ 4232 */
4233 void patchTopLevelAccessors(LibraryElementImpl libraryElement) { 4233 void patchTopLevelAccessors(LibraryElementImpl libraryElement) {
4234 Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAcces sorElement>(); 4234 Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAcces sorElement>();
4235 List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>(); 4235 List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>();
4236 collectAccessors(getters, setters, libraryElement.definingCompilationUnit); 4236 collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
4237 for (CompilationUnitElement unit in libraryElement.parts) { 4237 for (CompilationUnitElement unit in libraryElement.parts) {
4238 collectAccessors(getters, setters, unit); 4238 collectAccessors(getters, setters, unit);
4239 } 4239 }
4240 for (PropertyAccessorElement setter in setters) { 4240 for (PropertyAccessorElement setter in setters) {
4241 PropertyAccessorElement getter = getters[setter.displayName]; 4241 PropertyAccessorElement getter = getters[setter.displayName];
4242 if (getter != null) { 4242 if (getter != null) {
4243 PropertyInducingElementImpl variable2 = getter.variable as PropertyInduc ingElementImpl; 4243 PropertyInducingElementImpl variable = getter.variable as PropertyInduci ngElementImpl;
4244 variable2.setter = setter; 4244 variable.setter = setter;
4245 ((setter as PropertyAccessorElementImpl)).variable = variable2; 4245 ((setter as PropertyAccessorElementImpl)).variable = variable;
4246 } 4246 }
4247 } 4247 }
4248 } 4248 }
4249 } 4249 }
4250 /** 4250 /**
4251 * Instances of the class {@code LibraryResolver} are used to resolve one or mor e mutually dependent 4251 * Instances of the class {@code LibraryResolver} are used to resolve one or mor e mutually dependent
4252 * libraries within a single context. 4252 * libraries within a single context.
4253 * @coverage dart.engine.resolver 4253 * @coverage dart.engine.resolver
4254 */ 4254 */
4255 class LibraryResolver { 4255 class LibraryResolver {
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
4541 if (exportedLibrary != null) { 4541 if (exportedLibrary != null) {
4542 LibraryElement exportedLibraryElement = exportedLibrary.libraryEleme nt; 4542 LibraryElement exportedLibraryElement = exportedLibrary.libraryEleme nt;
4543 if (exportedLibraryElement != null) { 4543 if (exportedLibraryElement != null) {
4544 exportElement.exportedLibrary = exportedLibraryElement; 4544 exportElement.exportedLibrary = exportedLibraryElement;
4545 } 4545 }
4546 directive.element = exportElement; 4546 directive.element = exportElement;
4547 exports.add(exportElement); 4547 exports.add(exportElement);
4548 } 4548 }
4549 } 4549 }
4550 } 4550 }
4551 Source librarySource2 = library.librarySource; 4551 Source librarySource = library.librarySource;
4552 if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource2 ) { 4552 if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource) {
4553 ImportElementImpl importElement = new ImportElementImpl(); 4553 ImportElementImpl importElement = new ImportElementImpl();
4554 importElement.importedLibrary = _coreLibrary.libraryElement; 4554 importElement.importedLibrary = _coreLibrary.libraryElement;
4555 importElement.synthetic = true; 4555 importElement.synthetic = true;
4556 imports.add(importElement); 4556 imports.add(importElement);
4557 } 4557 }
4558 LibraryElementImpl libraryElement2 = library.libraryElement; 4558 LibraryElementImpl libraryElement = library.libraryElement;
4559 libraryElement2.imports = new List.from(imports); 4559 libraryElement.imports = new List.from(imports);
4560 libraryElement2.exports = new List.from(exports); 4560 libraryElement.exports = new List.from(exports);
4561 } 4561 }
4562 } 4562 }
4563 4563
4564 /** 4564 /**
4565 * Build element models for all of the libraries in the current cycle. 4565 * Build element models for all of the libraries in the current cycle.
4566 * @throws AnalysisException if any of the element models cannot be built 4566 * @throws AnalysisException if any of the element models cannot be built
4567 */ 4567 */
4568 void buildElementModels() { 4568 void buildElementModels() {
4569 for (Library library in _librariesInCycles) { 4569 for (Library library in _librariesInCycles) {
4570 LibraryElementBuilder builder = new LibraryElementBuilder(this); 4570 LibraryElementBuilder builder = new LibraryElementBuilder(this);
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
4730 _libraryMap[librarySource] = library; 4730 _libraryMap[librarySource] = library;
4731 return library; 4731 return library;
4732 } 4732 }
4733 4733
4734 /** 4734 /**
4735 * Return {@code true} if and only if the passed {@link CompilationUnit} has a part-of directive. 4735 * Return {@code true} if and only if the passed {@link CompilationUnit} has a part-of directive.
4736 * @param node the {@link CompilationUnit} to test 4736 * @param node the {@link CompilationUnit} to test
4737 * @return {@code true} if and only if the passed {@link CompilationUnit} has a part-of directive 4737 * @return {@code true} if and only if the passed {@link CompilationUnit} has a part-of directive
4738 */ 4738 */
4739 bool doesCompilationUnitHavePartOfDirective(CompilationUnit node) { 4739 bool doesCompilationUnitHavePartOfDirective(CompilationUnit node) {
4740 NodeList<Directive> directives2 = node.directives; 4740 NodeList<Directive> directives = node.directives;
4741 for (Directive directive in directives2) { 4741 for (Directive directive in directives) {
4742 if (directive is PartOfDirective) { 4742 if (directive is PartOfDirective) {
4743 return true; 4743 return true;
4744 } 4744 }
4745 } 4745 }
4746 return false; 4746 return false;
4747 } 4747 }
4748 4748
4749 /** 4749 /**
4750 * Return an array containing the lexical identifiers associated with the node s in the given list. 4750 * Return an array containing the lexical identifiers associated with the node s in the given list.
4751 * @param names the AST nodes representing the identifiers 4751 * @param names the AST nodes representing the identifiers
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
4911 } 4911 }
4912 return null; 4912 return null;
4913 } 4913 }
4914 Object visitAssertStatement(AssertStatement node) { 4914 Object visitAssertStatement(AssertStatement node) {
4915 super.visitAssertStatement(node); 4915 super.visitAssertStatement(node);
4916 propagateTrueState(node.condition); 4916 propagateTrueState(node.condition);
4917 return null; 4917 return null;
4918 } 4918 }
4919 Object visitBinaryExpression(BinaryExpression node) { 4919 Object visitBinaryExpression(BinaryExpression node) {
4920 sc.TokenType operatorType = node.operator.type; 4920 sc.TokenType operatorType = node.operator.type;
4921 Expression leftOperand2 = node.leftOperand; 4921 Expression leftOperand = node.leftOperand;
4922 Expression rightOperand2 = node.rightOperand; 4922 Expression rightOperand = node.rightOperand;
4923 if (identical(operatorType, sc.TokenType.AMPERSAND_AMPERSAND)) { 4923 if (identical(operatorType, sc.TokenType.AMPERSAND_AMPERSAND)) {
4924 safelyVisit(leftOperand2); 4924 safelyVisit(leftOperand);
4925 if (rightOperand2 != null) { 4925 if (rightOperand != null) {
4926 try { 4926 try {
4927 _overrideManager.enterScope(); 4927 _overrideManager.enterScope();
4928 propagateTrueState(leftOperand2); 4928 propagateTrueState(leftOperand);
4929 rightOperand2.accept(this); 4929 rightOperand.accept(this);
4930 } finally { 4930 } finally {
4931 _overrideManager.exitScope(); 4931 _overrideManager.exitScope();
4932 } 4932 }
4933 } 4933 }
4934 } else if (identical(operatorType, sc.TokenType.BAR_BAR)) { 4934 } else if (identical(operatorType, sc.TokenType.BAR_BAR)) {
4935 safelyVisit(leftOperand2); 4935 safelyVisit(leftOperand);
4936 if (rightOperand2 != null) { 4936 if (rightOperand != null) {
4937 try { 4937 try {
4938 _overrideManager.enterScope(); 4938 _overrideManager.enterScope();
4939 propagateFalseState(leftOperand2); 4939 propagateFalseState(leftOperand);
4940 rightOperand2.accept(this); 4940 rightOperand.accept(this);
4941 } finally { 4941 } finally {
4942 _overrideManager.exitScope(); 4942 _overrideManager.exitScope();
4943 } 4943 }
4944 } 4944 }
4945 } else { 4945 } else {
4946 safelyVisit(leftOperand2); 4946 safelyVisit(leftOperand);
4947 safelyVisit(rightOperand2); 4947 safelyVisit(rightOperand);
4948 } 4948 }
4949 node.accept(_elementResolver); 4949 node.accept(_elementResolver);
4950 node.accept(_typeAnalyzer); 4950 node.accept(_typeAnalyzer);
4951 return null; 4951 return null;
4952 } 4952 }
4953 Object visitBreakStatement(BreakStatement node) { 4953 Object visitBreakStatement(BreakStatement node) {
4954 node.accept(_elementResolver); 4954 node.accept(_elementResolver);
4955 node.accept(_typeAnalyzer); 4955 node.accept(_typeAnalyzer);
4956 return null; 4956 return null;
4957 } 4957 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4990 declaration.accept(this); 4990 declaration.accept(this);
4991 } 4991 }
4992 } finally { 4992 } finally {
4993 _overrideManager.exitScope(); 4993 _overrideManager.exitScope();
4994 } 4994 }
4995 node.accept(_elementResolver); 4995 node.accept(_elementResolver);
4996 node.accept(_typeAnalyzer); 4996 node.accept(_typeAnalyzer);
4997 return null; 4997 return null;
4998 } 4998 }
4999 Object visitConditionalExpression(ConditionalExpression node) { 4999 Object visitConditionalExpression(ConditionalExpression node) {
5000 Expression condition2 = node.condition; 5000 Expression condition = node.condition;
5001 safelyVisit(condition2); 5001 safelyVisit(condition);
5002 Expression thenExpression2 = node.thenExpression; 5002 Expression thenExpression = node.thenExpression;
5003 if (thenExpression2 != null) { 5003 if (thenExpression != null) {
5004 try { 5004 try {
5005 _overrideManager.enterScope(); 5005 _overrideManager.enterScope();
5006 propagateTrueState(condition2); 5006 propagateTrueState(condition);
5007 thenExpression2.accept(this); 5007 thenExpression.accept(this);
5008 } finally { 5008 } finally {
5009 _overrideManager.exitScope(); 5009 _overrideManager.exitScope();
5010 } 5010 }
5011 } 5011 }
5012 Expression elseExpression2 = node.elseExpression; 5012 Expression elseExpression = node.elseExpression;
5013 if (elseExpression2 != null) { 5013 if (elseExpression != null) {
5014 try { 5014 try {
5015 _overrideManager.enterScope(); 5015 _overrideManager.enterScope();
5016 propagateFalseState(condition2); 5016 propagateFalseState(condition);
5017 elseExpression2.accept(this); 5017 elseExpression.accept(this);
5018 } finally { 5018 } finally {
5019 _overrideManager.exitScope(); 5019 _overrideManager.exitScope();
5020 } 5020 }
5021 } 5021 }
5022 node.accept(_elementResolver); 5022 node.accept(_elementResolver);
5023 node.accept(_typeAnalyzer); 5023 node.accept(_typeAnalyzer);
5024 bool thenIsAbrupt = isAbruptTermination(thenExpression2); 5024 bool thenIsAbrupt = isAbruptTermination(thenExpression);
5025 bool elseIsAbrupt = isAbruptTermination(elseExpression2); 5025 bool elseIsAbrupt = isAbruptTermination(elseExpression);
5026 if (elseIsAbrupt && !thenIsAbrupt) { 5026 if (elseIsAbrupt && !thenIsAbrupt) {
5027 propagateTrueState(condition2); 5027 propagateTrueState(condition);
5028 propagateState(thenExpression2); 5028 propagateState(thenExpression);
5029 } else if (thenIsAbrupt && !elseIsAbrupt) { 5029 } else if (thenIsAbrupt && !elseIsAbrupt) {
5030 propagateFalseState(condition2); 5030 propagateFalseState(condition);
5031 propagateState(elseExpression2); 5031 propagateState(elseExpression);
5032 } 5032 }
5033 return null; 5033 return null;
5034 } 5034 }
5035 Object visitConstructorDeclaration(ConstructorDeclaration node) { 5035 Object visitConstructorDeclaration(ConstructorDeclaration node) {
5036 ExecutableElement outerFunction = _enclosingFunction; 5036 ExecutableElement outerFunction = _enclosingFunction;
5037 try { 5037 try {
5038 _enclosingFunction = node.element; 5038 _enclosingFunction = node.element;
5039 super.visitConstructorDeclaration(node); 5039 super.visitConstructorDeclaration(node);
5040 } finally { 5040 } finally {
5041 _enclosingFunction = outerFunction; 5041 _enclosingFunction = outerFunction;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
5123 _overrideManager.enterScope(); 5123 _overrideManager.enterScope();
5124 super.visitFunctionExpression(node); 5124 super.visitFunctionExpression(node);
5125 } finally { 5125 } finally {
5126 _overrideManager.exitScope(); 5126 _overrideManager.exitScope();
5127 _enclosingFunction = outerFunction; 5127 _enclosingFunction = outerFunction;
5128 } 5128 }
5129 return null; 5129 return null;
5130 } 5130 }
5131 Object visitHideCombinator(HideCombinator node) => null; 5131 Object visitHideCombinator(HideCombinator node) => null;
5132 Object visitIfStatement(IfStatement node) { 5132 Object visitIfStatement(IfStatement node) {
5133 Expression condition2 = node.condition; 5133 Expression condition = node.condition;
5134 safelyVisit(condition2); 5134 safelyVisit(condition);
5135 Map<Element, Type2> thenOverrides = null; 5135 Map<Element, Type2> thenOverrides = null;
5136 Statement thenStatement2 = node.thenStatement; 5136 Statement thenStatement = node.thenStatement;
5137 if (thenStatement2 != null) { 5137 if (thenStatement != null) {
5138 try { 5138 try {
5139 _overrideManager.enterScope(); 5139 _overrideManager.enterScope();
5140 propagateTrueState(condition2); 5140 propagateTrueState(condition);
5141 thenStatement2.accept(this); 5141 thenStatement.accept(this);
5142 } finally { 5142 } finally {
5143 thenOverrides = _overrideManager.captureLocalOverrides(); 5143 thenOverrides = _overrideManager.captureLocalOverrides();
5144 _overrideManager.exitScope(); 5144 _overrideManager.exitScope();
5145 } 5145 }
5146 } 5146 }
5147 Map<Element, Type2> elseOverrides = null; 5147 Map<Element, Type2> elseOverrides = null;
5148 Statement elseStatement2 = node.elseStatement; 5148 Statement elseStatement = node.elseStatement;
5149 if (elseStatement2 != null) { 5149 if (elseStatement != null) {
5150 try { 5150 try {
5151 _overrideManager.enterScope(); 5151 _overrideManager.enterScope();
5152 propagateFalseState(condition2); 5152 propagateFalseState(condition);
5153 elseStatement2.accept(this); 5153 elseStatement.accept(this);
5154 } finally { 5154 } finally {
5155 elseOverrides = _overrideManager.captureLocalOverrides(); 5155 elseOverrides = _overrideManager.captureLocalOverrides();
5156 _overrideManager.exitScope(); 5156 _overrideManager.exitScope();
5157 } 5157 }
5158 } 5158 }
5159 node.accept(_elementResolver); 5159 node.accept(_elementResolver);
5160 node.accept(_typeAnalyzer); 5160 node.accept(_typeAnalyzer);
5161 bool thenIsAbrupt = isAbruptTermination2(thenStatement2); 5161 bool thenIsAbrupt = isAbruptTermination2(thenStatement);
5162 bool elseIsAbrupt = isAbruptTermination2(elseStatement2); 5162 bool elseIsAbrupt = isAbruptTermination2(elseStatement);
5163 if (elseIsAbrupt && !thenIsAbrupt) { 5163 if (elseIsAbrupt && !thenIsAbrupt) {
5164 propagateTrueState(condition2); 5164 propagateTrueState(condition);
5165 if (thenOverrides != null) { 5165 if (thenOverrides != null) {
5166 _overrideManager.applyOverrides(thenOverrides); 5166 _overrideManager.applyOverrides(thenOverrides);
5167 } 5167 }
5168 } else if (thenIsAbrupt && !elseIsAbrupt) { 5168 } else if (thenIsAbrupt && !elseIsAbrupt) {
5169 propagateFalseState(condition2); 5169 propagateFalseState(condition);
5170 if (elseOverrides != null) { 5170 if (elseOverrides != null) {
5171 _overrideManager.applyOverrides(elseOverrides); 5171 _overrideManager.applyOverrides(elseOverrides);
5172 } 5172 }
5173 } 5173 }
5174 return null; 5174 return null;
5175 } 5175 }
5176 Object visitLabel(Label node) => null; 5176 Object visitLabel(Label node) => null;
5177 Object visitLibraryIdentifier(LibraryIdentifier node) => null; 5177 Object visitLibraryIdentifier(LibraryIdentifier node) => null;
5178 Object visitMethodDeclaration(MethodDeclaration node) { 5178 Object visitMethodDeclaration(MethodDeclaration node) {
5179 ExecutableElement outerFunction = _enclosingFunction; 5179 ExecutableElement outerFunction = _enclosingFunction;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
5247 super.visitTopLevelVariableDeclaration(node); 5247 super.visitTopLevelVariableDeclaration(node);
5248 } finally { 5248 } finally {
5249 Map<Element, Type2> overrides = _overrideManager.captureOverrides(node.var iables); 5249 Map<Element, Type2> overrides = _overrideManager.captureOverrides(node.var iables);
5250 _overrideManager.exitScope(); 5250 _overrideManager.exitScope();
5251 _overrideManager.applyOverrides(overrides); 5251 _overrideManager.applyOverrides(overrides);
5252 } 5252 }
5253 return null; 5253 return null;
5254 } 5254 }
5255 Object visitTypeName(TypeName node) => null; 5255 Object visitTypeName(TypeName node) => null;
5256 Object visitWhileStatement(WhileStatement node) { 5256 Object visitWhileStatement(WhileStatement node) {
5257 Expression condition2 = node.condition; 5257 Expression condition = node.condition;
5258 safelyVisit(condition2); 5258 safelyVisit(condition);
5259 Statement body2 = node.body; 5259 Statement body = node.body;
5260 if (body2 != null) { 5260 if (body != null) {
5261 try { 5261 try {
5262 _overrideManager.enterScope(); 5262 _overrideManager.enterScope();
5263 propagateTrueState(condition2); 5263 propagateTrueState(condition);
5264 body2.accept(this); 5264 body.accept(this);
5265 } finally { 5265 } finally {
5266 _overrideManager.exitScope(); 5266 _overrideManager.exitScope();
5267 } 5267 }
5268 } 5268 }
5269 node.accept(_elementResolver); 5269 node.accept(_elementResolver);
5270 node.accept(_typeAnalyzer); 5270 node.accept(_typeAnalyzer);
5271 return null; 5271 return null;
5272 } 5272 }
5273 5273
5274 /** 5274 /**
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5321 if (!variable.isConst() && !variable.isFinal()) { 5321 if (!variable.isConst() && !variable.isFinal()) {
5322 return; 5322 return;
5323 } 5323 }
5324 } 5324 }
5325 Type2 currentType = getBestType(element); 5325 Type2 currentType = getBestType(element);
5326 if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) { 5326 if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) {
5327 _overrideManager.setType(element, potentialType); 5327 _overrideManager.setType(element, potentialType);
5328 } 5328 }
5329 } 5329 }
5330 void visitForEachStatementInScope(ForEachStatement node) { 5330 void visitForEachStatementInScope(ForEachStatement node) {
5331 Expression iterator2 = node.iterator; 5331 Expression iterator = node.iterator;
5332 safelyVisit(iterator2); 5332 safelyVisit(iterator);
5333 DeclaredIdentifier loopVariable2 = node.loopVariable; 5333 DeclaredIdentifier loopVariable = node.loopVariable;
5334 safelyVisit(loopVariable2); 5334 safelyVisit(loopVariable);
5335 Statement body2 = node.body; 5335 Statement body = node.body;
5336 if (body2 != null) { 5336 if (body != null) {
5337 try { 5337 try {
5338 _overrideManager.enterScope(); 5338 _overrideManager.enterScope();
5339 if (loopVariable2 != null && iterator2 != null) { 5339 if (loopVariable != null && iterator != null) {
5340 LocalVariableElement loopElement = loopVariable2.element; 5340 LocalVariableElement loopElement = loopVariable.element;
5341 if (loopElement != null) { 5341 if (loopElement != null) {
5342 override(loopElement, getIteratorElementType(iterator2)); 5342 override(loopElement, getIteratorElementType(iterator));
5343 } 5343 }
5344 } 5344 }
5345 body2.accept(this); 5345 body.accept(this);
5346 } finally { 5346 } finally {
5347 _overrideManager.exitScope(); 5347 _overrideManager.exitScope();
5348 } 5348 }
5349 } 5349 }
5350 node.accept(_elementResolver); 5350 node.accept(_elementResolver);
5351 node.accept(_typeAnalyzer); 5351 node.accept(_typeAnalyzer);
5352 } 5352 }
5353 void visitForStatementInScope(ForStatement node) { 5353 void visitForStatementInScope(ForStatement node) {
5354 safelyVisit(node.variables); 5354 safelyVisit(node.variables);
5355 safelyVisit(node.initialization); 5355 safelyVisit(node.initialization);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
5426 * following the given statement will not be reached). 5426 * following the given statement will not be reached).
5427 * @param statement the statement being tested 5427 * @param statement the statement being tested
5428 * @return {@code true} if the given statement terminates abruptly 5428 * @return {@code true} if the given statement terminates abruptly
5429 */ 5429 */
5430 bool isAbruptTermination2(Statement statement) { 5430 bool isAbruptTermination2(Statement statement) {
5431 if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) { 5431 if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) {
5432 return true; 5432 return true;
5433 } else if (statement is ExpressionStatement) { 5433 } else if (statement is ExpressionStatement) {
5434 return isAbruptTermination(((statement as ExpressionStatement)).expression ); 5434 return isAbruptTermination(((statement as ExpressionStatement)).expression );
5435 } else if (statement is Block) { 5435 } else if (statement is Block) {
5436 NodeList<Statement> statements2 = ((statement as Block)).statements; 5436 NodeList<Statement> statements = ((statement as Block)).statements;
5437 int size2 = statements2.length; 5437 int size = statements.length;
5438 if (size2 == 0) { 5438 if (size == 0) {
5439 return false; 5439 return false;
5440 } 5440 }
5441 return isAbruptTermination2(statements2[size2 - 1]); 5441 return isAbruptTermination2(statements[size - 1]);
5442 } 5442 }
5443 return false; 5443 return false;
5444 } 5444 }
5445 5445
5446 /** 5446 /**
5447 * Propagate any type information that results from knowing that the given con dition will have 5447 * Propagate any type information that results from knowing that the given con dition will have
5448 * been evaluated to 'false'. 5448 * been evaluated to 'false'.
5449 * @param condition the condition that will have evaluated to 'false' 5449 * @param condition the condition that will have evaluated to 'false'
5450 */ 5450 */
5451 void propagateFalseState(Expression condition) { 5451 void propagateFalseState(Expression condition) {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
5563 * @param library the library containing the compilation unit being resolved 5563 * @param library the library containing the compilation unit being resolved
5564 * @param source the source representing the compilation unit being visited 5564 * @param source the source representing the compilation unit being visited
5565 * @param typeProvider the object used to access the types from the core libra ry 5565 * @param typeProvider the object used to access the types from the core libra ry
5566 */ 5566 */
5567 ScopedVisitor.con1(Library library, Source source2, TypeProvider typeProvider2 ) { 5567 ScopedVisitor.con1(Library library, Source source2, TypeProvider typeProvider2 ) {
5568 _jtd_constructor_275_impl(library, source2, typeProvider2); 5568 _jtd_constructor_275_impl(library, source2, typeProvider2);
5569 } 5569 }
5570 _jtd_constructor_275_impl(Library library, Source source2, TypeProvider typePr ovider2) { 5570 _jtd_constructor_275_impl(Library library, Source source2, TypeProvider typePr ovider2) {
5571 this._definingLibrary = library.libraryElement; 5571 this._definingLibrary = library.libraryElement;
5572 this._source = source2; 5572 this._source = source2;
5573 LibraryScope libraryScope2 = library.libraryScope; 5573 LibraryScope libraryScope = library.libraryScope;
5574 this._errorListener = libraryScope2.errorListener; 5574 this._errorListener = libraryScope.errorListener;
5575 this._nameScope = libraryScope2; 5575 this._nameScope = libraryScope;
5576 this._typeProvider = typeProvider2; 5576 this._typeProvider = typeProvider2;
5577 } 5577 }
5578 5578
5579 /** 5579 /**
5580 * Initialize a newly created visitor to resolve the nodes in a compilation un it. 5580 * Initialize a newly created visitor to resolve the nodes in a compilation un it.
5581 * @param definingLibrary the element for the library containing the compilati on unit being 5581 * @param definingLibrary the element for the library containing the compilati on unit being
5582 * visited 5582 * visited
5583 * @param source the source representing the compilation unit being visited 5583 * @param source the source representing the compilation unit being visited
5584 * @param typeProvider the object used to access the types from the core libra ry 5584 * @param typeProvider the object used to access the types from the core libra ry
5585 * @param errorListener the error listener that will be informed of any errors that are found 5585 * @param errorListener the error listener that will be informed of any errors that are found
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
5659 Scope outerScope = _nameScope; 5659 Scope outerScope = _nameScope;
5660 try { 5660 try {
5661 _nameScope = new FunctionScope(_nameScope, node.element); 5661 _nameScope = new FunctionScope(_nameScope, node.element);
5662 super.visitConstructorDeclaration(node); 5662 super.visitConstructorDeclaration(node);
5663 } finally { 5663 } finally {
5664 _nameScope = outerScope; 5664 _nameScope = outerScope;
5665 } 5665 }
5666 return null; 5666 return null;
5667 } 5667 }
5668 Object visitDeclaredIdentifier(DeclaredIdentifier node) { 5668 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
5669 VariableElement element2 = node.element; 5669 VariableElement element = node.element;
5670 if (element2 != null) { 5670 if (element != null) {
5671 _nameScope.define(element2); 5671 _nameScope.define(element);
5672 } 5672 }
5673 super.visitDeclaredIdentifier(node); 5673 super.visitDeclaredIdentifier(node);
5674 return null; 5674 return null;
5675 } 5675 }
5676 Object visitDoStatement(DoStatement node) { 5676 Object visitDoStatement(DoStatement node) {
5677 LabelScope outerScope = _labelScope; 5677 LabelScope outerScope = _labelScope;
5678 _labelScope = new LabelScope.con1(outerScope, false, false); 5678 _labelScope = new LabelScope.con1(outerScope, false, false);
5679 try { 5679 try {
5680 super.visitDoStatement(node); 5680 super.visitDoStatement(node);
5681 } finally { 5681 } finally {
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
5803 } 5803 }
5804 try { 5804 try {
5805 super.visitSwitchStatement(node); 5805 super.visitSwitchStatement(node);
5806 } finally { 5806 } finally {
5807 _labelScope = outerScope; 5807 _labelScope = outerScope;
5808 } 5808 }
5809 return null; 5809 return null;
5810 } 5810 }
5811 Object visitVariableDeclaration(VariableDeclaration node) { 5811 Object visitVariableDeclaration(VariableDeclaration node) {
5812 if (node.parent.parent is! TopLevelVariableDeclaration && node.parent.parent is! FieldDeclaration) { 5812 if (node.parent.parent is! TopLevelVariableDeclaration && node.parent.parent is! FieldDeclaration) {
5813 VariableElement element2 = node.element; 5813 VariableElement element = node.element;
5814 if (element2 != null) { 5814 if (element != null) {
5815 _nameScope.define(element2); 5815 _nameScope.define(element);
5816 } 5816 }
5817 } 5817 }
5818 super.visitVariableDeclaration(node); 5818 super.visitVariableDeclaration(node);
5819 return null; 5819 return null;
5820 } 5820 }
5821 Object visitWhileStatement(WhileStatement node) { 5821 Object visitWhileStatement(WhileStatement node) {
5822 LabelScope outerScope = _labelScope; 5822 LabelScope outerScope = _labelScope;
5823 _labelScope = new LabelScope.con1(outerScope, false, false); 5823 _labelScope = new LabelScope.con1(outerScope, false, false);
5824 try { 5824 try {
5825 super.visitWhileStatement(node); 5825 super.visitWhileStatement(node);
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
6114 * A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound 6114 * A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound
6115 * assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e< /i>. A compound 6115 * assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e< /i>. A compound
6116 * assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivale nt to <i>((x) => x.v 6116 * assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivale nt to <i>((x) => x.v
6117 * = 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 6117 * = 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
6118 * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>\[e <sub>2</sub>\] op= 6118 * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>\[e <sub>2</sub>\] op=
6119 * e<sub>3</sub></i> is equivalent to <i>((a, i) => a\[i\] = a\[i\] op e<sub>3 </sub>)(e<sub>1</sub>, 6119 * e<sub>3</sub></i> is equivalent to <i>((a, i) => a\[i\] = a\[i\] op e<sub>3 </sub>)(e<sub>1</sub>,
6120 * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in 6120 * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in
6121 * <i>e<sub>3</sub></i>.</blockquote> 6121 * <i>e<sub>3</sub></i>.</blockquote>
6122 */ 6122 */
6123 Object visitAssignmentExpression(AssignmentExpression node) { 6123 Object visitAssignmentExpression(AssignmentExpression node) {
6124 sc.TokenType operator2 = node.operator.type; 6124 sc.TokenType operator = node.operator.type;
6125 if (identical(operator2, sc.TokenType.EQ)) { 6125 if (identical(operator, sc.TokenType.EQ)) {
6126 Expression rightHandSide2 = node.rightHandSide; 6126 Expression rightHandSide = node.rightHandSide;
6127 Type2 staticType = getStaticType(rightHandSide2); 6127 Type2 staticType = getStaticType(rightHandSide);
6128 recordStaticType(node, staticType); 6128 recordStaticType(node, staticType);
6129 Type2 overrideType = staticType; 6129 Type2 overrideType = staticType;
6130 Type2 propagatedType = getPropagatedType(rightHandSide2); 6130 Type2 propagatedType = getPropagatedType(rightHandSide);
6131 if (propagatedType != null) { 6131 if (propagatedType != null) {
6132 if (propagatedType.isMoreSpecificThan(staticType)) { 6132 if (propagatedType.isMoreSpecificThan(staticType)) {
6133 recordPropagatedType(node, propagatedType); 6133 recordPropagatedType(node, propagatedType);
6134 } 6134 }
6135 overrideType = propagatedType; 6135 overrideType = propagatedType;
6136 } 6136 }
6137 VariableElement element = _resolver.getOverridableElement(node.leftHandSid e); 6137 VariableElement element = _resolver.getOverridableElement(node.leftHandSid e);
6138 if (element != null) { 6138 if (element != null) {
6139 _resolver.override(element, overrideType); 6139 _resolver.override(element, overrideType);
6140 } 6140 }
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
6383 * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of 6383 * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of
6384 * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new 6384 * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new
6385 * T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>.</blockquote> 6385 * T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>.</blockquote>
6386 * <p> 6386 * <p>
6387 * The Dart Language Specification, 12.11.2: <blockquote>The static type of a constant object 6387 * The Dart Language Specification, 12.11.2: <blockquote>The static type of a constant object
6388 * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub> n</sub>)</i> or the 6388 * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub> n</sub>)</i> or the
6389 * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </ blockquote> 6389 * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </ blockquote>
6390 */ 6390 */
6391 Object visitInstanceCreationExpression(InstanceCreationExpression node) { 6391 Object visitInstanceCreationExpression(InstanceCreationExpression node) {
6392 recordStaticType(node, node.constructorName.type.type); 6392 recordStaticType(node, node.constructorName.type.type);
6393 ConstructorElement element2 = node.element; 6393 ConstructorElement element = node.element;
6394 if (element2 != null && "Element" == element2.enclosingElement.name && "tag" == element2.name) { 6394 if (element != null && "Element" == element.enclosingElement.name && "tag" = = element.name) {
6395 LibraryElement library2 = element2.library; 6395 LibraryElement library = element.library;
6396 if (isHtmlLibrary(library2)) { 6396 if (isHtmlLibrary(library)) {
6397 Type2 returnType = getFirstArgumentAsType2(library2, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP); 6397 Type2 returnType = getFirstArgumentAsType2(library, node.argumentList, _ HTML_ELEMENT_TO_CLASS_MAP);
6398 if (returnType != null) { 6398 if (returnType != null) {
6399 recordPropagatedType(node, returnType); 6399 recordPropagatedType(node, returnType);
6400 } 6400 }
6401 } 6401 }
6402 } 6402 }
6403 return null; 6403 return null;
6404 } 6404 }
6405 6405
6406 /** 6406 /**
6407 * The Dart Language Specification, 12.3: <blockquote>The static type of an in teger literal is{@code int}.</blockquote> 6407 * The Dart Language Specification, 12.3: <blockquote>The static type of an in teger literal is{@code int}.</blockquote>
(...skipping 16 matching lines...) Expand all
6424 6424
6425 /** 6425 /**
6426 * The Dart Language Specification, 12.6: <blockquote>The static type of a lis t literal of the 6426 * The Dart Language Specification, 12.6: <blockquote>The static type of a lis t literal of the
6427 * form <i><b>const</b> &lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i > or the form 6427 * form <i><b>const</b> &lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i > or the form
6428 * <i>&lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is {@code List&l t;E&gt;}. The static 6428 * <i>&lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is {@code List&l t;E&gt;}. The static
6429 * type a list literal of the form <i><b>const</b> \[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> or 6429 * type a list literal of the form <i><b>const</b> \[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> or
6430 * the form <i>\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is {@code List&l t;dynamic&gt;}.</blockquote> 6430 * the form <i>\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is {@code List&l t;dynamic&gt;}.</blockquote>
6431 */ 6431 */
6432 Object visitListLiteral(ListLiteral node) { 6432 Object visitListLiteral(ListLiteral node) {
6433 Type2 staticType = _dynamicType; 6433 Type2 staticType = _dynamicType;
6434 TypeArgumentList typeArguments2 = node.typeArguments; 6434 TypeArgumentList typeArguments = node.typeArguments;
6435 if (typeArguments2 != null) { 6435 if (typeArguments != null) {
6436 NodeList<TypeName> arguments2 = typeArguments2.arguments; 6436 NodeList<TypeName> arguments = typeArguments.arguments;
6437 if (arguments2 != null && arguments2.length == 1) { 6437 if (arguments != null && arguments.length == 1) {
6438 TypeName argumentTypeName = arguments2[0]; 6438 TypeName argumentTypeName = arguments[0];
6439 Type2 argumentType = getType2(argumentTypeName); 6439 Type2 argumentType = getType2(argumentTypeName);
6440 if (argumentType != null) { 6440 if (argumentType != null) {
6441 staticType = argumentType; 6441 staticType = argumentType;
6442 } 6442 }
6443 } 6443 }
6444 } 6444 }
6445 recordStaticType(node, _typeProvider.listType.substitute5(<Type2> [staticTyp e])); 6445 recordStaticType(node, _typeProvider.listType.substitute5(<Type2> [staticTyp e]));
6446 NodeList<Expression> elements2 = node.elements; 6446 NodeList<Expression> elements = node.elements;
6447 int count = elements2.length; 6447 int count = elements.length;
6448 if (count > 0) { 6448 if (count > 0) {
6449 Type2 propagatedType = getBestType(elements2[0]); 6449 Type2 propagatedType = getBestType(elements[0]);
6450 for (int i = 1; i < count; i++) { 6450 for (int i = 1; i < count; i++) {
6451 Type2 elementType = getBestType(elements2[i]); 6451 Type2 elementType = getBestType(elements[i]);
6452 if (propagatedType != elementType) { 6452 if (propagatedType != elementType) {
6453 propagatedType = _dynamicType; 6453 propagatedType = _dynamicType;
6454 } else { 6454 } else {
6455 propagatedType = propagatedType.getLeastUpperBound(elementType); 6455 propagatedType = propagatedType.getLeastUpperBound(elementType);
6456 if (propagatedType == null) { 6456 if (propagatedType == null) {
6457 propagatedType = _dynamicType; 6457 propagatedType = _dynamicType;
6458 } 6458 }
6459 } 6459 }
6460 } 6460 }
6461 if (propagatedType.isMoreSpecificThan(staticType)) { 6461 if (propagatedType.isMoreSpecificThan(staticType)) {
(...skipping 11 matching lines...) Expand all
6473 * map literal of the form <i><b>const</b> {k<sub>1</sub>:e<sub>1</sub>, &hell ip;, 6473 * map literal of the form <i><b>const</b> {k<sub>1</sub>:e<sub>1</sub>, &hell ip;,
6474 * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>{k<sub>1</sub>:e<sub>1</sub >, &hellip;, 6474 * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>{k<sub>1</sub>:e<sub>1</sub >, &hellip;,
6475 * k<sub>n</sub>:e<sub>n</sub>}</i> is {@code Map&lt;String, dynamic&gt;}. 6475 * k<sub>n</sub>:e<sub>n</sub>}</i> is {@code Map&lt;String, dynamic&gt;}.
6476 * <p> 6476 * <p>
6477 * It is a compile-time error if the first type argument to a map literal is n ot 6477 * It is a compile-time error if the first type argument to a map literal is n ot
6478 * <i>String</i>.</blockquote> 6478 * <i>String</i>.</blockquote>
6479 */ 6479 */
6480 Object visitMapLiteral(MapLiteral node) { 6480 Object visitMapLiteral(MapLiteral node) {
6481 Type2 staticKeyType = _dynamicType; 6481 Type2 staticKeyType = _dynamicType;
6482 Type2 staticValueType = _dynamicType; 6482 Type2 staticValueType = _dynamicType;
6483 TypeArgumentList typeArguments2 = node.typeArguments; 6483 TypeArgumentList typeArguments = node.typeArguments;
6484 if (typeArguments2 != null) { 6484 if (typeArguments != null) {
6485 NodeList<TypeName> arguments2 = typeArguments2.arguments; 6485 NodeList<TypeName> arguments = typeArguments.arguments;
6486 if (arguments2 != null && arguments2.length == 2) { 6486 if (arguments != null && arguments.length == 2) {
6487 TypeName entryKeyTypeName = arguments2[0]; 6487 TypeName entryKeyTypeName = arguments[0];
6488 Type2 entryKeyType = getType2(entryKeyTypeName); 6488 Type2 entryKeyType = getType2(entryKeyTypeName);
6489 if (entryKeyType != null) { 6489 if (entryKeyType != null) {
6490 staticKeyType = entryKeyType; 6490 staticKeyType = entryKeyType;
6491 } 6491 }
6492 TypeName entryValueTypeName = arguments2[1]; 6492 TypeName entryValueTypeName = arguments[1];
6493 Type2 entryValueType = getType2(entryValueTypeName); 6493 Type2 entryValueType = getType2(entryValueTypeName);
6494 if (entryValueType != null) { 6494 if (entryValueType != null) {
6495 staticValueType = entryValueType; 6495 staticValueType = entryValueType;
6496 } 6496 }
6497 } 6497 }
6498 } 6498 }
6499 recordStaticType(node, _typeProvider.mapType.substitute5(<Type2> [staticKeyT ype, staticValueType])); 6499 recordStaticType(node, _typeProvider.mapType.substitute5(<Type2> [staticKeyT ype, staticValueType]));
6500 NodeList<MapLiteralEntry> entries2 = node.entries; 6500 NodeList<MapLiteralEntry> entries = node.entries;
6501 int count = entries2.length; 6501 int count = entries.length;
6502 if (count > 0) { 6502 if (count > 0) {
6503 MapLiteralEntry entry = entries2[0]; 6503 MapLiteralEntry entry = entries[0];
6504 Type2 propagatedKeyType = getBestType(entry.key); 6504 Type2 propagatedKeyType = getBestType(entry.key);
6505 Type2 propagatedValueType = getBestType(entry.value); 6505 Type2 propagatedValueType = getBestType(entry.value);
6506 for (int i = 1; i < count; i++) { 6506 for (int i = 1; i < count; i++) {
6507 entry = entries2[i]; 6507 entry = entries[i];
6508 Type2 elementKeyType = getBestType(entry.key); 6508 Type2 elementKeyType = getBestType(entry.key);
6509 if (propagatedKeyType != elementKeyType) { 6509 if (propagatedKeyType != elementKeyType) {
6510 propagatedKeyType = _dynamicType; 6510 propagatedKeyType = _dynamicType;
6511 } else { 6511 } else {
6512 propagatedKeyType = propagatedKeyType.getLeastUpperBound(elementKeyTyp e); 6512 propagatedKeyType = propagatedKeyType.getLeastUpperBound(elementKeyTyp e);
6513 if (propagatedKeyType == null) { 6513 if (propagatedKeyType == null) {
6514 propagatedKeyType = _dynamicType; 6514 propagatedKeyType = _dynamicType;
6515 } 6515 }
6516 } 6516 }
6517 Type2 elementValueType = getBestType(entry.value); 6517 Type2 elementValueType = getBestType(entry.value);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
6582 staticMethodElement = methodNameNode.element; 6582 staticMethodElement = methodNameNode.element;
6583 } 6583 }
6584 Type2 staticType = computeReturnType(staticMethodElement); 6584 Type2 staticType = computeReturnType(staticMethodElement);
6585 recordStaticType(node, staticType); 6585 recordStaticType(node, staticType);
6586 String methodName = methodNameNode.name; 6586 String methodName = methodNameNode.name;
6587 if (methodName == "\$dom_createEvent") { 6587 if (methodName == "\$dom_createEvent") {
6588 Expression target = node.realTarget; 6588 Expression target = node.realTarget;
6589 if (target != null) { 6589 if (target != null) {
6590 Type2 targetType = getBestType(target); 6590 Type2 targetType = getBestType(target);
6591 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) { 6591 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
6592 LibraryElement library2 = targetType.element.library; 6592 LibraryElement library = targetType.element.library;
6593 if (isHtmlLibrary(library2)) { 6593 if (isHtmlLibrary(library)) {
6594 Type2 returnType = getFirstArgumentAsType(library2, node.argumentLis t); 6594 Type2 returnType = getFirstArgumentAsType(library, node.argumentList );
6595 if (returnType != null) { 6595 if (returnType != null) {
6596 recordPropagatedType(node, returnType); 6596 recordPropagatedType(node, returnType);
6597 } 6597 }
6598 } 6598 }
6599 } 6599 }
6600 } 6600 }
6601 } else if (methodName == "query") { 6601 } else if (methodName == "query") {
6602 Expression target = node.realTarget; 6602 Expression target = node.realTarget;
6603 if (target == null) { 6603 if (target == null) {
6604 Element methodElement = methodNameNode.element; 6604 Element methodElement = methodNameNode.element;
6605 if (methodElement != null) { 6605 if (methodElement != null) {
6606 LibraryElement library3 = methodElement.library; 6606 LibraryElement library = methodElement.library;
6607 if (isHtmlLibrary(library3)) { 6607 if (isHtmlLibrary(library)) {
6608 Type2 returnType = getFirstArgumentAsQuery(library3, node.argumentLi st); 6608 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentLis t);
6609 if (returnType != null) { 6609 if (returnType != null) {
6610 recordPropagatedType(node, returnType); 6610 recordPropagatedType(node, returnType);
6611 } 6611 }
6612 } 6612 }
6613 } 6613 }
6614 } else { 6614 } else {
6615 Type2 targetType = getBestType(target); 6615 Type2 targetType = getBestType(target);
6616 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) { 6616 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
6617 LibraryElement library4 = targetType.element.library; 6617 LibraryElement library = targetType.element.library;
6618 if (isHtmlLibrary(library4)) { 6618 if (isHtmlLibrary(library)) {
6619 Type2 returnType = getFirstArgumentAsQuery(library4, node.argumentLi st); 6619 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentLis t);
6620 if (returnType != null) { 6620 if (returnType != null) {
6621 recordPropagatedType(node, returnType); 6621 recordPropagatedType(node, returnType);
6622 } 6622 }
6623 } 6623 }
6624 } 6624 }
6625 } 6625 }
6626 } else if (methodName == "\$dom_createElement") { 6626 } else if (methodName == "\$dom_createElement") {
6627 Expression target = node.realTarget; 6627 Expression target = node.realTarget;
6628 Type2 targetType = getBestType(target); 6628 Type2 targetType = getBestType(target);
6629 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || t argetType.name == "Document")) { 6629 if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || t argetType.name == "Document")) {
6630 LibraryElement library5 = targetType.element.library; 6630 LibraryElement library = targetType.element.library;
6631 if (isHtmlLibrary(library5)) { 6631 if (isHtmlLibrary(library)) {
6632 Type2 returnType = getFirstArgumentAsQuery(library5, node.argumentList ); 6632 Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList) ;
6633 if (returnType != null) { 6633 if (returnType != null) {
6634 recordPropagatedType(node, returnType); 6634 recordPropagatedType(node, returnType);
6635 } 6635 }
6636 } 6636 }
6637 } 6637 }
6638 } else if (methodName == "JS") { 6638 } else if (methodName == "JS") {
6639 Type2 returnType = getFirstArgumentAsType(_typeProvider.objectType.element .library, node.argumentList); 6639 Type2 returnType = getFirstArgumentAsType(_typeProvider.objectType.element .library, node.argumentList);
6640 if (returnType != null) { 6640 if (returnType != null) {
6641 recordPropagatedType(node, returnType); 6641 recordPropagatedType(node, returnType);
6642 } 6642 }
6643 } else { 6643 } else {
6644 Element propagatedElement = methodNameNode.element; 6644 Element propagatedElement = methodNameNode.element;
6645 if (propagatedElement != staticMethodElement) { 6645 if (propagatedElement != staticMethodElement) {
6646 Type2 propagatedType = computeReturnType(propagatedElement); 6646 Type2 propagatedType = computeReturnType(propagatedElement);
6647 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) { 6647 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) {
6648 recordPropagatedType(node, propagatedType); 6648 recordPropagatedType(node, propagatedType);
6649 } 6649 }
6650 } 6650 }
6651 } 6651 }
6652 return null; 6652 return null;
6653 } 6653 }
6654 Object visitNamedExpression(NamedExpression node) { 6654 Object visitNamedExpression(NamedExpression node) {
6655 Expression expression2 = node.expression; 6655 Expression expression = node.expression;
6656 recordStaticType(node, getStaticType(expression2)); 6656 recordStaticType(node, getStaticType(expression));
6657 recordPropagatedType(node, getPropagatedType(expression2)); 6657 recordPropagatedType(node, getPropagatedType(expression));
6658 return null; 6658 return null;
6659 } 6659 }
6660 6660
6661 /** 6661 /**
6662 * The Dart Language Specification, 12.2: <blockquote>The static type of {@cod e null} is bottom. 6662 * The Dart Language Specification, 12.2: <blockquote>The static type of {@cod e null} is bottom.
6663 * </blockquote> 6663 * </blockquote>
6664 */ 6664 */
6665 Object visitNullLiteral(NullLiteral node) { 6665 Object visitNullLiteral(NullLiteral node) {
6666 recordStaticType(node, _typeProvider.bottomType); 6666 recordStaticType(node, _typeProvider.bottomType);
6667 return null; 6667 return null;
6668 } 6668 }
6669 Object visitParenthesizedExpression(ParenthesizedExpression node) { 6669 Object visitParenthesizedExpression(ParenthesizedExpression node) {
6670 Expression expression2 = node.expression; 6670 Expression expression = node.expression;
6671 recordStaticType(node, getStaticType(expression2)); 6671 recordStaticType(node, getStaticType(expression));
6672 recordPropagatedType(node, getPropagatedType(expression2)); 6672 recordPropagatedType(node, getPropagatedType(expression));
6673 return null; 6673 return null;
6674 } 6674 }
6675 6675
6676 /** 6676 /**
6677 * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form 6677 * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form
6678 * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1; 6678 * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1;
6679 * return r}()</i>. 6679 * return r}()</i>.
6680 * <p> 6680 * <p>
6681 * A postfix expression of the form <i>C.v++</i> is equivalent to <i>(){var r = C.v; C.v = r + 1; 6681 * A postfix expression of the form <i>C.v++</i> is equivalent to <i>(){var r = C.v; C.v = r + 1;
6682 * return r}()</i>. 6682 * return r}()</i>.
(...skipping 10 matching lines...) Expand all
6693 * A postfix expression of the form <i>C.v--</i> is equivalent to <i>(){var r = C.v; C.v = r - 1; 6693 * A postfix expression of the form <i>C.v--</i> is equivalent to <i>(){var r = C.v; C.v = r - 1;
6694 * return r}()</i>. 6694 * return r}()</i>.
6695 * <p> 6695 * <p>
6696 * A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r - 6696 * A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r -
6697 * 1; return r}(e1)</i>. 6697 * 1; return r}(e1)</i>.
6698 * <p> 6698 * <p>
6699 * A postfix expression of the form <i>e1\[e2\]--</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\] 6699 * A postfix expression of the form <i>e1\[e2\]--</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\]
6700 * = r - 1; return r}(e1, e2)</i></blockquote> 6700 * = r - 1; return r}(e1, e2)</i></blockquote>
6701 */ 6701 */
6702 Object visitPostfixExpression(PostfixExpression node) { 6702 Object visitPostfixExpression(PostfixExpression node) {
6703 Expression operand2 = node.operand; 6703 Expression operand = node.operand;
6704 Type2 staticType = getStaticType(operand2); 6704 Type2 staticType = getStaticType(operand);
6705 sc.TokenType operator2 = node.operator.type; 6705 sc.TokenType operator = node.operator.type;
6706 if (identical(operator2, sc.TokenType.MINUS_MINUS) || identical(operator2, s c.TokenType.PLUS_PLUS)) { 6706 if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, sc. TokenType.PLUS_PLUS)) {
6707 Type2 intType2 = _typeProvider.intType; 6707 Type2 intType = _typeProvider.intType;
6708 if (identical(getStaticType(node.operand), intType2)) { 6708 if (identical(getStaticType(node.operand), intType)) {
6709 staticType = intType2; 6709 staticType = intType;
6710 } 6710 }
6711 } 6711 }
6712 recordStaticType(node, staticType); 6712 recordStaticType(node, staticType);
6713 recordPropagatedType(node, getPropagatedType(operand2)); 6713 recordPropagatedType(node, getPropagatedType(operand));
6714 return null; 6714 return null;
6715 } 6715 }
6716 6716
6717 /** 6717 /**
6718 * See {@link #visitSimpleIdentifier(SimpleIdentifier)}. 6718 * See {@link #visitSimpleIdentifier(SimpleIdentifier)}.
6719 */ 6719 */
6720 Object visitPrefixedIdentifier(PrefixedIdentifier node) { 6720 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
6721 SimpleIdentifier prefixedIdentifier = node.identifier; 6721 SimpleIdentifier prefixedIdentifier = node.identifier;
6722 Element element2 = prefixedIdentifier.element; 6722 Element element = prefixedIdentifier.element;
6723 Type2 staticType = _dynamicType; 6723 Type2 staticType = _dynamicType;
6724 if (element2 is ClassElement) { 6724 if (element is ClassElement) {
6725 if (isNotTypeLiteral(node)) { 6725 if (isNotTypeLiteral(node)) {
6726 staticType = ((element2 as ClassElement)).type; 6726 staticType = ((element as ClassElement)).type;
6727 } else { 6727 } else {
6728 staticType = _typeProvider.typeType; 6728 staticType = _typeProvider.typeType;
6729 } 6729 }
6730 } else if (element2 is FunctionTypeAliasElement) { 6730 } else if (element is FunctionTypeAliasElement) {
6731 staticType = ((element2 as FunctionTypeAliasElement)).type; 6731 staticType = ((element as FunctionTypeAliasElement)).type;
6732 } else if (element2 is MethodElement) { 6732 } else if (element is MethodElement) {
6733 staticType = ((element2 as MethodElement)).type; 6733 staticType = ((element as MethodElement)).type;
6734 } else if (element2 is PropertyAccessorElement) { 6734 } else if (element is PropertyAccessorElement) {
6735 staticType = getType((element2 as PropertyAccessorElement), node.prefix.st aticType); 6735 staticType = getType((element as PropertyAccessorElement), node.prefix.sta ticType);
6736 } else if (element2 is ExecutableElement) { 6736 } else if (element is ExecutableElement) {
6737 staticType = ((element2 as ExecutableElement)).type; 6737 staticType = ((element as ExecutableElement)).type;
6738 } else if (element2 is TypeVariableElement) { 6738 } else if (element is TypeVariableElement) {
6739 staticType = ((element2 as TypeVariableElement)).type; 6739 staticType = ((element as TypeVariableElement)).type;
6740 } else if (element2 is VariableElement) { 6740 } else if (element is VariableElement) {
6741 staticType = ((element2 as VariableElement)).type; 6741 staticType = ((element as VariableElement)).type;
6742 } 6742 }
6743 recordStaticType(prefixedIdentifier, staticType); 6743 recordStaticType(prefixedIdentifier, staticType);
6744 recordStaticType(node, staticType); 6744 recordStaticType(node, staticType);
6745 Type2 propagatedType = _overrideManager.getType(element2); 6745 Type2 propagatedType = _overrideManager.getType(element);
6746 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) { 6746 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
6747 recordPropagatedType(prefixedIdentifier, propagatedType); 6747 recordPropagatedType(prefixedIdentifier, propagatedType);
6748 recordPropagatedType(node, propagatedType); 6748 recordPropagatedType(node, propagatedType);
6749 } 6749 }
6750 return null; 6750 return null;
6751 } 6751 }
6752 6752
6753 /** 6753 /**
6754 * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u </i> of the form 6754 * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u </i> of the form
6755 * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the 6755 * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the
6756 * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i >.</blockquote> 6756 * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i >.</blockquote>
6757 */ 6757 */
6758 Object visitPrefixExpression(PrefixExpression node) { 6758 Object visitPrefixExpression(PrefixExpression node) {
6759 sc.TokenType operator2 = node.operator.type; 6759 sc.TokenType operator = node.operator.type;
6760 if (identical(operator2, sc.TokenType.BANG)) { 6760 if (identical(operator, sc.TokenType.BANG)) {
6761 recordStaticType(node, _typeProvider.boolType); 6761 recordStaticType(node, _typeProvider.boolType);
6762 } else { 6762 } else {
6763 ExecutableElement staticMethodElement = node.staticElement; 6763 ExecutableElement staticMethodElement = node.staticElement;
6764 Type2 staticType = computeReturnType(staticMethodElement); 6764 Type2 staticType = computeReturnType(staticMethodElement);
6765 if (identical(operator2, sc.TokenType.MINUS_MINUS) || identical(operator2, sc.TokenType.PLUS_PLUS)) { 6765 if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, s c.TokenType.PLUS_PLUS)) {
6766 Type2 intType2 = _typeProvider.intType; 6766 Type2 intType = _typeProvider.intType;
6767 if (identical(getStaticType(node.operand), intType2)) { 6767 if (identical(getStaticType(node.operand), intType)) {
6768 staticType = intType2; 6768 staticType = intType;
6769 } 6769 }
6770 } 6770 }
6771 recordStaticType(node, staticType); 6771 recordStaticType(node, staticType);
6772 MethodElement propagatedMethodElement = node.element; 6772 MethodElement propagatedMethodElement = node.element;
6773 if (propagatedMethodElement != staticMethodElement) { 6773 if (propagatedMethodElement != staticMethodElement) {
6774 Type2 propagatedType = computeReturnType(propagatedMethodElement); 6774 Type2 propagatedType = computeReturnType(propagatedMethodElement);
6775 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) { 6775 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticTy pe)) {
6776 recordPropagatedType(node, propagatedType); 6776 recordPropagatedType(node, propagatedType);
6777 } 6777 }
6778 } 6778 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
6817 * <p> 6817 * <p>
6818 * The static type of <i>i</i> is the declared return type of <i>C.m</i> if it exists or dynamic 6818 * The static type of <i>i</i> is the declared return type of <i>C.m</i> if it exists or dynamic
6819 * otherwise. 6819 * otherwise.
6820 * <p> 6820 * <p>
6821 * ... a top-level getter invocation <i>i</i> of the form <i>m</i>, where <i>m </i> is an 6821 * ... a top-level getter invocation <i>i</i> of the form <i>m</i>, where <i>m </i> is an
6822 * identifier ... 6822 * identifier ...
6823 * <p> 6823 * <p>
6824 * The static type of <i>i</i> is the declared return type of <i>m</i>.</block quote> 6824 * The static type of <i>i</i> is the declared return type of <i>m</i>.</block quote>
6825 */ 6825 */
6826 Object visitPropertyAccess(PropertyAccess node) { 6826 Object visitPropertyAccess(PropertyAccess node) {
6827 SimpleIdentifier propertyName2 = node.propertyName; 6827 SimpleIdentifier propertyName = node.propertyName;
6828 Element element2 = propertyName2.element; 6828 Element element = propertyName.element;
6829 Type2 staticType = _dynamicType; 6829 Type2 staticType = _dynamicType;
6830 if (element2 is MethodElement) { 6830 if (element is MethodElement) {
6831 staticType = ((element2 as MethodElement)).type; 6831 staticType = ((element as MethodElement)).type;
6832 } else if (element2 is PropertyAccessorElement) { 6832 } else if (element is PropertyAccessorElement) {
6833 staticType = getType((element2 as PropertyAccessorElement), node.target != null ? getStaticType(node.target) : null); 6833 staticType = getType((element as PropertyAccessorElement), node.target != null ? getStaticType(node.target) : null);
6834 } else { 6834 } else {
6835 } 6835 }
6836 recordStaticType(propertyName2, staticType); 6836 recordStaticType(propertyName, staticType);
6837 recordStaticType(node, staticType); 6837 recordStaticType(node, staticType);
6838 Type2 propagatedType = _overrideManager.getType(element2); 6838 Type2 propagatedType = _overrideManager.getType(element);
6839 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) { 6839 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
6840 recordPropagatedType(node, propagatedType); 6840 recordPropagatedType(node, propagatedType);
6841 } 6841 }
6842 return null; 6842 return null;
6843 } 6843 }
6844 6844
6845 /** 6845 /**
6846 * The Dart Language Specification, 12.9: <blockquote>The static type of a ret hrow expression is 6846 * The Dart Language Specification, 12.9: <blockquote>The static type of a ret hrow expression is
6847 * bottom.</blockquote> 6847 * bottom.</blockquote>
6848 */ 6848 */
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
6887 * <li>If <i>d</i> is the declaration of a top level getter, then <i>e</i> is equivalent to the 6887 * <li>If <i>d</i> is the declaration of a top level getter, then <i>e</i> is equivalent to the
6888 * getter invocation <i>id</i>. 6888 * getter invocation <i>id</i>.
6889 * <li>Otherwise, if <i>e</i> occurs inside a top level or static function (be it function, 6889 * <li>Otherwise, if <i>e</i> occurs inside a top level or static function (be it function,
6890 * method, getter, or setter) or variable initializer, evaluation of e causes a NoSuchMethodError 6890 * method, getter, or setter) or variable initializer, evaluation of e causes a NoSuchMethodError
6891 * to be thrown. 6891 * to be thrown.
6892 * <li>Otherwise <i>e</i> is equivalent to the property extraction <i>this.id< /i>. 6892 * <li>Otherwise <i>e</i> is equivalent to the property extraction <i>this.id< /i>.
6893 * </ul> 6893 * </ul>
6894 * </blockquote> 6894 * </blockquote>
6895 */ 6895 */
6896 Object visitSimpleIdentifier(SimpleIdentifier node) { 6896 Object visitSimpleIdentifier(SimpleIdentifier node) {
6897 Element element2 = node.element; 6897 Element element = node.element;
6898 Type2 staticType = _dynamicType; 6898 Type2 staticType = _dynamicType;
6899 if (element2 is ClassElement) { 6899 if (element is ClassElement) {
6900 if (isNotTypeLiteral(node)) { 6900 if (isNotTypeLiteral(node)) {
6901 staticType = ((element2 as ClassElement)).type; 6901 staticType = ((element as ClassElement)).type;
6902 } else { 6902 } else {
6903 staticType = _typeProvider.typeType; 6903 staticType = _typeProvider.typeType;
6904 } 6904 }
6905 } else if (element2 is FunctionTypeAliasElement) { 6905 } else if (element is FunctionTypeAliasElement) {
6906 staticType = ((element2 as FunctionTypeAliasElement)).type; 6906 staticType = ((element as FunctionTypeAliasElement)).type;
6907 } else if (element2 is MethodElement) { 6907 } else if (element is MethodElement) {
6908 staticType = ((element2 as MethodElement)).type; 6908 staticType = ((element as MethodElement)).type;
6909 } else if (element2 is PropertyAccessorElement) { 6909 } else if (element is PropertyAccessorElement) {
6910 staticType = getType((element2 as PropertyAccessorElement), null); 6910 staticType = getType((element as PropertyAccessorElement), null);
6911 } else if (element2 is ExecutableElement) { 6911 } else if (element is ExecutableElement) {
6912 staticType = ((element2 as ExecutableElement)).type; 6912 staticType = ((element as ExecutableElement)).type;
6913 } else if (element2 is TypeVariableElement) { 6913 } else if (element is TypeVariableElement) {
6914 staticType = ((element2 as TypeVariableElement)).type; 6914 staticType = ((element as TypeVariableElement)).type;
6915 } else if (element2 is VariableElement) { 6915 } else if (element is VariableElement) {
6916 staticType = ((element2 as VariableElement)).type; 6916 staticType = ((element as VariableElement)).type;
6917 } else if (element2 is PrefixElement) { 6917 } else if (element is PrefixElement) {
6918 return null; 6918 return null;
6919 } else { 6919 } else {
6920 staticType = _dynamicType; 6920 staticType = _dynamicType;
6921 } 6921 }
6922 recordStaticType(node, staticType); 6922 recordStaticType(node, staticType);
6923 Type2 propagatedType = _overrideManager.getType(element2); 6923 Type2 propagatedType = _overrideManager.getType(element);
6924 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) { 6924 if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
6925 recordPropagatedType(node, propagatedType); 6925 recordPropagatedType(node, propagatedType);
6926 } 6926 }
6927 return null; 6927 return null;
6928 } 6928 }
6929 6929
6930 /** 6930 /**
6931 * The Dart Language Specification, 12.5: <blockquote>The static type of a str ing literal is{@code String}.</blockquote> 6931 * The Dart Language Specification, 12.5: <blockquote>The static type of a str ing literal is{@code String}.</blockquote>
6932 */ 6932 */
6933 Object visitSimpleStringLiteral(SimpleStringLiteral node) { 6933 Object visitSimpleStringLiteral(SimpleStringLiteral node) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
6966 6966
6967 /** 6967 /**
6968 * The Dart Language Specification, 12.8: <blockquote>The static type of a thr ow expression is 6968 * The Dart Language Specification, 12.8: <blockquote>The static type of a thr ow expression is
6969 * bottom.</blockquote> 6969 * bottom.</blockquote>
6970 */ 6970 */
6971 Object visitThrowExpression(ThrowExpression node) { 6971 Object visitThrowExpression(ThrowExpression node) {
6972 recordStaticType(node, _typeProvider.bottomType); 6972 recordStaticType(node, _typeProvider.bottomType);
6973 return null; 6973 return null;
6974 } 6974 }
6975 Object visitVariableDeclaration(VariableDeclaration node) { 6975 Object visitVariableDeclaration(VariableDeclaration node) {
6976 Expression initializer2 = node.initializer; 6976 Expression initializer = node.initializer;
6977 if (initializer2 != null) { 6977 if (initializer != null) {
6978 Type2 rightType = getBestType(initializer2); 6978 Type2 rightType = getBestType(initializer);
6979 VariableElement element2 = node.name.element as VariableElement; 6979 VariableElement element = node.name.element as VariableElement;
6980 if (element2 != null) { 6980 if (element != null) {
6981 _resolver.override(element2, rightType); 6981 _resolver.override(element, rightType);
6982 } 6982 }
6983 } 6983 }
6984 return null; 6984 return null;
6985 } 6985 }
6986 6986
6987 /** 6987 /**
6988 * Record that the static type of the given node is the type of the second arg ument to the method 6988 * Record that the static type of the given node is the type of the second arg ument to the method
6989 * represented by the given element. 6989 * represented by the given element.
6990 * @param element the element representing the method invoked by the given nod e 6990 * @param element the element representing the method invoked by the given nod e
6991 */ 6991 */
6992 Type2 computeArgumentType(ExecutableElement element) { 6992 Type2 computeArgumentType(ExecutableElement element) {
6993 if (element != null) { 6993 if (element != null) {
6994 List<ParameterElement> parameters2 = element.parameters; 6994 List<ParameterElement> parameters = element.parameters;
6995 if (parameters2 != null && parameters2.length == 2) { 6995 if (parameters != null && parameters.length == 2) {
6996 return parameters2[1].type; 6996 return parameters[1].type;
6997 } 6997 }
6998 } 6998 }
6999 return _dynamicType; 6999 return _dynamicType;
7000 } 7000 }
7001 7001
7002 /** 7002 /**
7003 * Compute the return type of the method or function represented by the given element. 7003 * Compute the return type of the method or function represented by the given element.
7004 * @param element the element representing the method or function invoked by t he given node 7004 * @param element the element representing the method or function invoked by t he given node
7005 * @return the return type that was computed 7005 * @return the return type that was computed
7006 */ 7006 */
7007 Type2 computeReturnType(Element element) { 7007 Type2 computeReturnType(Element element) {
7008 if (element is PropertyAccessorElement) { 7008 if (element is PropertyAccessorElement) {
7009 FunctionType propertyType = ((element as PropertyAccessorElement)).type; 7009 FunctionType propertyType = ((element as PropertyAccessorElement)).type;
7010 if (propertyType != null) { 7010 if (propertyType != null) {
7011 Type2 returnType2 = propertyType.returnType; 7011 Type2 returnType = propertyType.returnType;
7012 if (returnType2 is InterfaceType) { 7012 if (returnType is InterfaceType) {
7013 if (identical(returnType2, _typeProvider.functionType)) { 7013 if (identical(returnType, _typeProvider.functionType)) {
7014 return _dynamicType; 7014 return _dynamicType;
7015 } 7015 }
7016 MethodElement callMethod = ((returnType2 as InterfaceType)).lookUpMeth od(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary); 7016 MethodElement callMethod = ((returnType as InterfaceType)).lookUpMetho d(ElementResolver.CALL_METHOD_NAME, _resolver.definingLibrary);
7017 if (callMethod != null) { 7017 if (callMethod != null) {
7018 return callMethod.type.returnType; 7018 return callMethod.type.returnType;
7019 } 7019 }
7020 } else if (returnType2 is FunctionType) { 7020 } else if (returnType is FunctionType) {
7021 Type2 innerReturnType = ((returnType2 as FunctionType)).returnType; 7021 Type2 innerReturnType = ((returnType as FunctionType)).returnType;
7022 if (innerReturnType != null) { 7022 if (innerReturnType != null) {
7023 return innerReturnType; 7023 return innerReturnType;
7024 } 7024 }
7025 } else if (returnType2.isDartCoreFunction()) { 7025 } else if (returnType.isDartCoreFunction()) {
7026 return _dynamicType; 7026 return _dynamicType;
7027 } 7027 }
7028 if (returnType2 != null) { 7028 if (returnType != null) {
7029 return returnType2; 7029 return returnType;
7030 } 7030 }
7031 } 7031 }
7032 } else if (element is ExecutableElement) { 7032 } else if (element is ExecutableElement) {
7033 FunctionType type2 = ((element as ExecutableElement)).type; 7033 FunctionType type = ((element as ExecutableElement)).type;
7034 if (type2 != null) { 7034 if (type != null) {
7035 return type2.returnType; 7035 return type.returnType;
7036 } 7036 }
7037 } else if (element is VariableElement) { 7037 } else if (element is VariableElement) {
7038 Type2 variableType = ((element as VariableElement)).type; 7038 Type2 variableType = ((element as VariableElement)).type;
7039 if (variableType is FunctionType) { 7039 if (variableType is FunctionType) {
7040 return ((variableType as FunctionType)).returnType; 7040 return ((variableType as FunctionType)).returnType;
7041 } 7041 }
7042 } 7042 }
7043 return _dynamicType; 7043 return _dynamicType;
7044 } 7044 }
7045 7045
7046 /** 7046 /**
7047 * Given a function declaration, compute the return type of the function. The return type of 7047 * Given a function declaration, compute the return type of the function. The return type of
7048 * functions with a block body is {@code dynamicType}, with an expression body it is the type of 7048 * functions with a block body is {@code dynamicType}, with an expression body it is the type of
7049 * the expression. 7049 * the expression.
7050 * @param node the function expression whose return type is to be computed 7050 * @param node the function expression whose return type is to be computed
7051 * @return the return type that was computed 7051 * @return the return type that was computed
7052 */ 7052 */
7053 Type2 computeReturnType2(FunctionDeclaration node) { 7053 Type2 computeReturnType2(FunctionDeclaration node) {
7054 TypeName returnType2 = node.returnType; 7054 TypeName returnType = node.returnType;
7055 if (returnType2 == null) { 7055 if (returnType == null) {
7056 return _dynamicType; 7056 return _dynamicType;
7057 } 7057 }
7058 return returnType2.type; 7058 return returnType.type;
7059 } 7059 }
7060 7060
7061 /** 7061 /**
7062 * Given a function expression, compute the return type of the function. The r eturn type of 7062 * Given a function expression, compute the return type of the function. The r eturn type of
7063 * functions with a block body is {@code dynamicType}, with an expression body it is the type of 7063 * functions with a block body is {@code dynamicType}, with an expression body it is the type of
7064 * the expression. 7064 * the expression.
7065 * @param node the function expression whose return type is to be computed 7065 * @param node the function expression whose return type is to be computed
7066 * @return the return type that was computed 7066 * @return the return type that was computed
7067 */ 7067 */
7068 Type2 computeReturnType3(FunctionExpression node) { 7068 Type2 computeReturnType3(FunctionExpression node) {
7069 FunctionBody body2 = node.body; 7069 FunctionBody body = node.body;
7070 if (body2 is ExpressionFunctionBody) { 7070 if (body is ExpressionFunctionBody) {
7071 return getStaticType(((body2 as ExpressionFunctionBody)).expression); 7071 return getStaticType(((body as ExpressionFunctionBody)).expression);
7072 } 7072 }
7073 return _dynamicType; 7073 return _dynamicType;
7074 } 7074 }
7075 7075
7076 /** 7076 /**
7077 * Return the propagated type of the given expression if it is available, or t he static type if 7077 * Return the propagated type of the given expression if it is available, or t he static type if
7078 * there is no propagated type. 7078 * there is no propagated type.
7079 * @param expression the expression whose type is to be returned 7079 * @param expression the expression whose type is to be returned
7080 * @return the propagated or static type of the given expression 7080 * @return the propagated or static type of the given expression
7081 */ 7081 */
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
7118 return null; 7118 return null;
7119 } 7119 }
7120 7120
7121 /** 7121 /**
7122 * If the given argument list contains at least one argument, and if the argum ent is a simple 7122 * If the given argument list contains at least one argument, and if the argum ent is a simple
7123 * string literal, return the String value of the argument. 7123 * string literal, return the String value of the argument.
7124 * @param argumentList the list of arguments from which a string value is to b e extracted 7124 * @param argumentList the list of arguments from which a string value is to b e extracted
7125 * @return the string specified by the first argument in the argument list 7125 * @return the string specified by the first argument in the argument list
7126 */ 7126 */
7127 String getFirstArgumentAsString(ArgumentList argumentList) { 7127 String getFirstArgumentAsString(ArgumentList argumentList) {
7128 NodeList<Expression> arguments2 = argumentList.arguments; 7128 NodeList<Expression> arguments = argumentList.arguments;
7129 if (arguments2.length > 0) { 7129 if (arguments.length > 0) {
7130 Expression argument = arguments2[0]; 7130 Expression argument = arguments[0];
7131 if (argument is SimpleStringLiteral) { 7131 if (argument is SimpleStringLiteral) {
7132 return ((argument as SimpleStringLiteral)).value; 7132 return ((argument as SimpleStringLiteral)).value;
7133 } 7133 }
7134 } 7134 }
7135 return null; 7135 return null;
7136 } 7136 }
7137 7137
7138 /** 7138 /**
7139 * If the given argument list contains at least one argument, and if the argum ent is a simple 7139 * If the given argument list contains at least one argument, and if the argum ent is a simple
7140 * string literal, and if the value of the argument is the name of a class def ined within the 7140 * string literal, and if the value of the argument is the name of a class def ined within the
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
7201 Type2 getType(PropertyAccessorElement accessor, Type2 context) { 7201 Type2 getType(PropertyAccessorElement accessor, Type2 context) {
7202 FunctionType functionType = accessor.type; 7202 FunctionType functionType = accessor.type;
7203 if (functionType == null) { 7203 if (functionType == null) {
7204 return _dynamicType; 7204 return _dynamicType;
7205 } 7205 }
7206 if (accessor.isSetter()) { 7206 if (accessor.isSetter()) {
7207 List<Type2> parameterTypes = functionType.normalParameterTypes; 7207 List<Type2> parameterTypes = functionType.normalParameterTypes;
7208 if (parameterTypes != null && parameterTypes.length > 0) { 7208 if (parameterTypes != null && parameterTypes.length > 0) {
7209 return parameterTypes[0]; 7209 return parameterTypes[0];
7210 } 7210 }
7211 PropertyAccessorElement getter2 = accessor.variable.getter; 7211 PropertyAccessorElement getter = accessor.variable.getter;
7212 if (getter2 != null) { 7212 if (getter != null) {
7213 functionType = getter2.type; 7213 functionType = getter.type;
7214 if (functionType != null) { 7214 if (functionType != null) {
7215 return functionType.returnType; 7215 return functionType.returnType;
7216 } 7216 }
7217 } 7217 }
7218 return _dynamicType; 7218 return _dynamicType;
7219 } 7219 }
7220 Type2 returnType2 = functionType.returnType; 7220 Type2 returnType = functionType.returnType;
7221 if (returnType2 is TypeVariableType && context is InterfaceType) { 7221 if (returnType is TypeVariableType && context is InterfaceType) {
7222 InterfaceType interfaceTypeContext = (context as InterfaceType); 7222 InterfaceType interfaceTypeContext = (context as InterfaceType);
7223 List<TypeVariableElement> parameterElements = interfaceTypeContext.element != null ? interfaceTypeContext.element.typeVariables : null; 7223 List<TypeVariableElement> parameterElements = interfaceTypeContext.element != null ? interfaceTypeContext.element.typeVariables : null;
7224 if (parameterElements != null) { 7224 if (parameterElements != null) {
7225 for (int i = 0; i < parameterElements.length; i++) { 7225 for (int i = 0; i < parameterElements.length; i++) {
7226 TypeVariableElement varElt = parameterElements[i]; 7226 TypeVariableElement varElt = parameterElements[i];
7227 if (returnType2.name == varElt.name) { 7227 if (returnType.name == varElt.name) {
7228 return interfaceTypeContext.typeArguments[i]; 7228 return interfaceTypeContext.typeArguments[i];
7229 } 7229 }
7230 } 7230 }
7231 } 7231 }
7232 } 7232 }
7233 return returnType2; 7233 return returnType;
7234 } 7234 }
7235 7235
7236 /** 7236 /**
7237 * Return the type represented by the given type name. 7237 * Return the type represented by the given type name.
7238 * @param typeName the type name representing the type to be returned 7238 * @param typeName the type name representing the type to be returned
7239 * @return the type represented by the type name 7239 * @return the type represented by the type name
7240 */ 7240 */
7241 Type2 getType2(TypeName typeName) { 7241 Type2 getType2(TypeName typeName) {
7242 Type2 type2 = typeName.type; 7242 Type2 type = typeName.type;
7243 if (type2 == null) { 7243 if (type == null) {
7244 return _dynamicType; 7244 return _dynamicType;
7245 } 7245 }
7246 return type2; 7246 return type;
7247 } 7247 }
7248 7248
7249 /** 7249 /**
7250 * Return {@code true} if the given library is the 'dart:html' library. 7250 * Return {@code true} if the given library is the 'dart:html' library.
7251 * @param library the library being tested 7251 * @param library the library being tested
7252 * @return {@code true} if the library is 'dart:html' 7252 * @return {@code true} if the library is 'dart:html'
7253 */ 7253 */
7254 bool isHtmlLibrary(LibraryElement library) => library.name == "dart.dom.html"; 7254 bool isHtmlLibrary(LibraryElement library) => library.name == "dart.dom.html";
7255 7255
7256 /** 7256 /**
7257 * Return {@code true} if the given node is not a type literal. 7257 * Return {@code true} if the given node is not a type literal.
7258 * @param node the node being tested 7258 * @param node the node being tested
7259 * @return {@code true} if the given node is not a type literal 7259 * @return {@code true} if the given node is not a type literal
7260 */ 7260 */
7261 bool isNotTypeLiteral(Identifier node) { 7261 bool isNotTypeLiteral(Identifier node) {
7262 ASTNode parent2 = node.parent; 7262 ASTNode parent = node.parent;
7263 return parent2 is TypeName || (parent2 is PrefixedIdentifier && (parent2.par ent is TypeName || identical(((parent2 as PrefixedIdentifier)).prefix, node))) | | (parent2 is PropertyAccess && identical(((parent2 as PropertyAccess)).target, node)) || (parent2 is MethodInvocation && identical(node, ((parent2 as MethodInv ocation)).target)); 7263 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));
7264 } 7264 }
7265 7265
7266 /** 7266 /**
7267 * Record that the propagated type of the given node is the given type. 7267 * Record that the propagated type of the given node is the given type.
7268 * @param expression the node whose type is to be recorded 7268 * @param expression the node whose type is to be recorded
7269 * @param type the propagated type of the node 7269 * @param type the propagated type of the node
7270 */ 7270 */
7271 void recordPropagatedType(Expression expression, Type2 type) { 7271 void recordPropagatedType(Expression expression, Type2 type) {
7272 if (type != null && !type.isDynamic()) { 7272 if (type != null && !type.isDynamic()) {
7273 expression.propagatedType = type; 7273 expression.propagatedType = type;
(...skipping 13 matching lines...) Expand all
7287 } 7287 }
7288 } 7288 }
7289 7289
7290 /** 7290 /**
7291 * Attempts to make a better guess for the static type of the given binary exp ression. 7291 * Attempts to make a better guess for the static type of the given binary exp ression.
7292 * @param node the binary expression to analyze 7292 * @param node the binary expression to analyze
7293 * @param staticType the static type of the expression as resolved 7293 * @param staticType the static type of the expression as resolved
7294 * @return the better type guess, or the same static type as given 7294 * @return the better type guess, or the same static type as given
7295 */ 7295 */
7296 Type2 refineBinaryExpressionType(BinaryExpression node, Type2 staticType) { 7296 Type2 refineBinaryExpressionType(BinaryExpression node, Type2 staticType) {
7297 sc.TokenType operator2 = node.operator.type; 7297 sc.TokenType operator = node.operator.type;
7298 if (identical(operator2, sc.TokenType.AMPERSAND_AMPERSAND) || identical(oper ator2, sc.TokenType.BAR_BAR) || identical(operator2, sc.TokenType.EQ_EQ) || iden tical(operator2, sc.TokenType.BANG_EQ)) { 7298 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)) {
7299 return _typeProvider.boolType; 7299 return _typeProvider.boolType;
7300 } 7300 }
7301 if (identical(operator2, sc.TokenType.MINUS) || identical(operator2, sc.Toke nType.PERCENT) || identical(operator2, sc.TokenType.PLUS) || identical(operator2 , sc.TokenType.STAR)) { 7301 if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenT ype.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc .TokenType.STAR)) {
7302 Type2 doubleType2 = _typeProvider.doubleType; 7302 Type2 doubleType = _typeProvider.doubleType;
7303 if (identical(getStaticType(node.leftOperand), doubleType2) || identical(g etStaticType(node.rightOperand), doubleType2)) { 7303 if (identical(getStaticType(node.leftOperand), doubleType) || identical(ge tStaticType(node.rightOperand), doubleType)) {
7304 return doubleType2; 7304 return doubleType;
7305 } 7305 }
7306 } 7306 }
7307 if (identical(operator2, sc.TokenType.MINUS) || identical(operator2, sc.Toke nType.PERCENT) || identical(operator2, sc.TokenType.PLUS) || identical(operator2 , sc.TokenType.STAR) || identical(operator2, sc.TokenType.TILDE_SLASH)) { 7307 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)) {
7308 Type2 intType2 = _typeProvider.intType; 7308 Type2 intType = _typeProvider.intType;
7309 if (identical(getStaticType(node.leftOperand), intType2) && identical(getS taticType(node.rightOperand), intType2)) { 7309 if (identical(getStaticType(node.leftOperand), intType) && identical(getSt aticType(node.rightOperand), intType)) {
7310 staticType = intType2; 7310 staticType = intType;
7311 } 7311 }
7312 } 7312 }
7313 return staticType; 7313 return staticType;
7314 } 7314 }
7315 7315
7316 /** 7316 /**
7317 * Set the return type and parameter type information for the given function t ype based on the 7317 * Set the return type and parameter type information for the given function t ype based on the
7318 * given return type and parameter elements. 7318 * given return type and parameter elements.
7319 * @param functionType the function type to be filled in 7319 * @param functionType the function type to be filled in
7320 * @param returnType the return type of the function, or {@code null} if no ty pe was declared 7320 * @param returnType the return type of the function, or {@code null} if no ty pe was declared
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
7479 /** 7479 /**
7480 * Return a map from the elements for the variables in the given list that hav e their types 7480 * Return a map from the elements for the variables in the given list that hav e their types
7481 * overridden to the overriding type. 7481 * overridden to the overriding type.
7482 * @param variableList the list of variables whose overriding types are to be captured 7482 * @param variableList the list of variables whose overriding types are to be captured
7483 * @return a table mapping elements to their overriding types 7483 * @return a table mapping elements to their overriding types
7484 */ 7484 */
7485 Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) { 7485 Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
7486 Map<Element, Type2> overrides = new Map<Element, Type2>(); 7486 Map<Element, Type2> overrides = new Map<Element, Type2>();
7487 if (variableList.isConst() || variableList.isFinal()) { 7487 if (variableList.isConst() || variableList.isFinal()) {
7488 for (VariableDeclaration variable in variableList.variables) { 7488 for (VariableDeclaration variable in variableList.variables) {
7489 Element element2 = variable.element; 7489 Element element = variable.element;
7490 if (element2 != null) { 7490 if (element != null) {
7491 Type2 type = _overridenTypes[element2]; 7491 Type2 type = _overridenTypes[element];
7492 if (type != null) { 7492 if (type != null) {
7493 overrides[element2] = type; 7493 overrides[element] = type;
7494 } 7494 }
7495 } 7495 }
7496 } 7496 }
7497 } 7497 }
7498 return overrides; 7498 return overrides;
7499 } 7499 }
7500 7500
7501 /** 7501 /**
7502 * Return the overridden type of the given element, or {@code null} if the typ e of the element 7502 * Return the overridden type of the given element, or {@code null} if the typ e of the element
7503 * has not been overridden. 7503 * has not been overridden.
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
7793 SimpleIdentifier exception = node.exceptionParameter; 7793 SimpleIdentifier exception = node.exceptionParameter;
7794 if (exception != null) { 7794 if (exception != null) {
7795 TypeName exceptionTypeName = node.exceptionType; 7795 TypeName exceptionTypeName = node.exceptionType;
7796 Type2 exceptionType; 7796 Type2 exceptionType;
7797 if (exceptionTypeName == null) { 7797 if (exceptionTypeName == null) {
7798 exceptionType = typeProvider.objectType; 7798 exceptionType = typeProvider.objectType;
7799 } else { 7799 } else {
7800 exceptionType = getType3(exceptionTypeName); 7800 exceptionType = getType3(exceptionTypeName);
7801 } 7801 }
7802 recordType(exception, exceptionType); 7802 recordType(exception, exceptionType);
7803 Element element2 = exception.element; 7803 Element element = exception.element;
7804 if (element2 is VariableElementImpl) { 7804 if (element is VariableElementImpl) {
7805 ((element2 as VariableElementImpl)).type = exceptionType; 7805 ((element as VariableElementImpl)).type = exceptionType;
7806 } else { 7806 } else {
7807 } 7807 }
7808 } 7808 }
7809 SimpleIdentifier stackTrace = node.stackTraceParameter; 7809 SimpleIdentifier stackTrace = node.stackTraceParameter;
7810 if (stackTrace != null) { 7810 if (stackTrace != null) {
7811 recordType(stackTrace, typeProvider.stackTraceType); 7811 recordType(stackTrace, typeProvider.stackTraceType);
7812 } 7812 }
7813 return null; 7813 return null;
7814 } 7814 }
7815 Object visitClassDeclaration(ClassDeclaration node) { 7815 Object visitClassDeclaration(ClassDeclaration node) {
7816 _hasReferenceToSuper = false; 7816 _hasReferenceToSuper = false;
7817 super.visitClassDeclaration(node); 7817 super.visitClassDeclaration(node);
7818 ClassElementImpl classElement = getClassElement(node.name); 7818 ClassElementImpl classElement = getClassElement(node.name);
7819 InterfaceType superclassType = null; 7819 InterfaceType superclassType = null;
7820 ExtendsClause extendsClause2 = node.extendsClause; 7820 ExtendsClause extendsClause = node.extendsClause;
7821 if (extendsClause2 != null) { 7821 if (extendsClause != null) {
7822 ErrorCode errorCode = node.withClause == null ? CompileTimeErrorCode.EXTEN DS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS; 7822 ErrorCode errorCode = node.withClause == null ? CompileTimeErrorCode.EXTEN DS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS;
7823 superclassType = resolveType(extendsClause2.superclass, errorCode); 7823 superclassType = resolveType(extendsClause.superclass, errorCode);
7824 if (superclassType != typeProvider.objectType) { 7824 if (superclassType != typeProvider.objectType) {
7825 classElement.validMixin = false; 7825 classElement.validMixin = false;
7826 } 7826 }
7827 } 7827 }
7828 if (classElement != null) { 7828 if (classElement != null) {
7829 if (superclassType == null) { 7829 if (superclassType == null) {
7830 InterfaceType objectType2 = typeProvider.objectType; 7830 InterfaceType objectType = typeProvider.objectType;
7831 if (classElement.type != objectType2) { 7831 if (classElement.type != objectType) {
7832 superclassType = objectType2; 7832 superclassType = objectType;
7833 } 7833 }
7834 } 7834 }
7835 classElement.supertype = superclassType; 7835 classElement.supertype = superclassType;
7836 classElement.hasReferenceToSuper2 = _hasReferenceToSuper; 7836 classElement.hasReferenceToSuper2 = _hasReferenceToSuper;
7837 } 7837 }
7838 resolve(classElement, node.withClause, node.implementsClause); 7838 resolve(classElement, node.withClause, node.implementsClause);
7839 return null; 7839 return null;
7840 } 7840 }
7841 Object visitClassTypeAlias(ClassTypeAlias node) { 7841 Object visitClassTypeAlias(ClassTypeAlias node) {
7842 super.visitClassTypeAlias(node); 7842 super.visitClassTypeAlias(node);
7843 ClassElementImpl classElement = getClassElement(node.name); 7843 ClassElementImpl classElement = getClassElement(node.name);
7844 InterfaceType superclassType = resolveType(node.superclass, CompileTimeError Code.MIXIN_WITH_NON_CLASS_SUPERCLASS); 7844 InterfaceType superclassType = resolveType(node.superclass, CompileTimeError Code.MIXIN_WITH_NON_CLASS_SUPERCLASS);
7845 if (superclassType == null) { 7845 if (superclassType == null) {
7846 superclassType = typeProvider.objectType; 7846 superclassType = typeProvider.objectType;
7847 } 7847 }
7848 if (classElement != null && superclassType != null) { 7848 if (classElement != null && superclassType != null) {
7849 classElement.supertype = superclassType; 7849 classElement.supertype = superclassType;
7850 } 7850 }
7851 resolve(classElement, node.withClause, node.implementsClause); 7851 resolve(classElement, node.withClause, node.implementsClause);
7852 return null; 7852 return null;
7853 } 7853 }
7854 Object visitConstructorDeclaration(ConstructorDeclaration node) { 7854 Object visitConstructorDeclaration(ConstructorDeclaration node) {
7855 super.visitConstructorDeclaration(node); 7855 super.visitConstructorDeclaration(node);
7856 ExecutableElementImpl element2 = node.element as ExecutableElementImpl; 7856 ExecutableElementImpl element = node.element as ExecutableElementImpl;
7857 FunctionTypeImpl type = new FunctionTypeImpl.con1(element2); 7857 FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
7858 setTypeInformation(type, null, element2.parameters); 7858 setTypeInformation(type, null, element.parameters);
7859 type.returnType = ((element2.enclosingElement as ClassElement)).type; 7859 type.returnType = ((element.enclosingElement as ClassElement)).type;
7860 element2.type = type; 7860 element.type = type;
7861 return null; 7861 return null;
7862 } 7862 }
7863 Object visitDeclaredIdentifier(DeclaredIdentifier node) { 7863 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
7864 super.visitDeclaredIdentifier(node); 7864 super.visitDeclaredIdentifier(node);
7865 Type2 declaredType; 7865 Type2 declaredType;
7866 TypeName typeName = node.type; 7866 TypeName typeName = node.type;
7867 if (typeName == null) { 7867 if (typeName == null) {
7868 declaredType = _dynamicType; 7868 declaredType = _dynamicType;
7869 } else { 7869 } else {
7870 declaredType = getType3(typeName); 7870 declaredType = getType3(typeName);
7871 } 7871 }
7872 LocalVariableElementImpl element2 = node.element as LocalVariableElementImpl ; 7872 LocalVariableElementImpl element = node.element as LocalVariableElementImpl;
7873 element2.type = declaredType; 7873 element.type = declaredType;
7874 return null; 7874 return null;
7875 } 7875 }
7876 Object visitDefaultFormalParameter(DefaultFormalParameter node) { 7876 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
7877 super.visitDefaultFormalParameter(node); 7877 super.visitDefaultFormalParameter(node);
7878 return null; 7878 return null;
7879 } 7879 }
7880 Object visitFieldFormalParameter(FieldFormalParameter node) { 7880 Object visitFieldFormalParameter(FieldFormalParameter node) {
7881 super.visitFieldFormalParameter(node); 7881 super.visitFieldFormalParameter(node);
7882 Element element2 = node.identifier.element; 7882 Element element = node.identifier.element;
7883 if (element2 is ParameterElementImpl) { 7883 if (element is ParameterElementImpl) {
7884 ParameterElementImpl parameter = element2 as ParameterElementImpl; 7884 ParameterElementImpl parameter = element as ParameterElementImpl;
7885 Type2 type; 7885 Type2 type;
7886 TypeName typeName = node.type; 7886 TypeName typeName = node.type;
7887 if (typeName == null) { 7887 if (typeName == null) {
7888 type = _dynamicType; 7888 type = _dynamicType;
7889 } else { 7889 } else {
7890 type = getType3(typeName); 7890 type = getType3(typeName);
7891 } 7891 }
7892 parameter.type = type; 7892 parameter.type = type;
7893 } else { 7893 } else {
7894 } 7894 }
7895 return null; 7895 return null;
7896 } 7896 }
7897 Object visitFunctionDeclaration(FunctionDeclaration node) { 7897 Object visitFunctionDeclaration(FunctionDeclaration node) {
7898 super.visitFunctionDeclaration(node); 7898 super.visitFunctionDeclaration(node);
7899 ExecutableElementImpl element2 = node.element as ExecutableElementImpl; 7899 ExecutableElementImpl element = node.element as ExecutableElementImpl;
7900 FunctionTypeImpl type = new FunctionTypeImpl.con1(element2); 7900 FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
7901 setTypeInformation(type, node.returnType, element2.parameters); 7901 setTypeInformation(type, node.returnType, element.parameters);
7902 element2.type = type; 7902 element.type = type;
7903 return null; 7903 return null;
7904 } 7904 }
7905 Object visitFunctionTypeAlias(FunctionTypeAlias node) { 7905 Object visitFunctionTypeAlias(FunctionTypeAlias node) {
7906 super.visitFunctionTypeAlias(node); 7906 super.visitFunctionTypeAlias(node);
7907 FunctionTypeAliasElementImpl element2 = node.element as FunctionTypeAliasEle mentImpl; 7907 FunctionTypeAliasElementImpl element = node.element as FunctionTypeAliasElem entImpl;
7908 FunctionTypeImpl type2 = element2.type as FunctionTypeImpl; 7908 FunctionTypeImpl type = element.type as FunctionTypeImpl;
7909 setTypeInformation(type2, node.returnType, element2.parameters); 7909 setTypeInformation(type, node.returnType, element.parameters);
7910 return null; 7910 return null;
7911 } 7911 }
7912 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { 7912 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
7913 super.visitFunctionTypedFormalParameter(node); 7913 super.visitFunctionTypedFormalParameter(node);
7914 ParameterElementImpl element2 = node.identifier.element as ParameterElementI mpl; 7914 ParameterElementImpl element = node.identifier.element as ParameterElementIm pl;
7915 AnonymousFunctionTypeImpl type = new AnonymousFunctionTypeImpl(); 7915 AnonymousFunctionTypeImpl type = new AnonymousFunctionTypeImpl();
7916 List<ParameterElement> parameters2 = getElements(node.parameters); 7916 List<ParameterElement> parameters = getElements(node.parameters);
7917 setTypeInformation(type, node.returnType, parameters2); 7917 setTypeInformation(type, node.returnType, parameters);
7918 type.baseParameters = parameters2; 7918 type.baseParameters = parameters;
7919 element2.type = type; 7919 element.type = type;
7920 return null; 7920 return null;
7921 } 7921 }
7922 Object visitMethodDeclaration(MethodDeclaration node) { 7922 Object visitMethodDeclaration(MethodDeclaration node) {
7923 super.visitMethodDeclaration(node); 7923 super.visitMethodDeclaration(node);
7924 ExecutableElementImpl element2 = node.element as ExecutableElementImpl; 7924 ExecutableElementImpl element = node.element as ExecutableElementImpl;
7925 FunctionTypeImpl type = new FunctionTypeImpl.con1(element2); 7925 FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
7926 setTypeInformation(type, node.returnType, element2.parameters); 7926 setTypeInformation(type, node.returnType, element.parameters);
7927 element2.type = type; 7927 element.type = type;
7928 if (element2 is PropertyAccessorElement) { 7928 if (element is PropertyAccessorElement) {
7929 PropertyAccessorElement accessor = element2 as PropertyAccessorElement; 7929 PropertyAccessorElement accessor = element as PropertyAccessorElement;
7930 PropertyInducingElementImpl variable2 = accessor.variable as PropertyInduc ingElementImpl; 7930 PropertyInducingElementImpl variable = accessor.variable as PropertyInduci ngElementImpl;
7931 if (accessor.isGetter()) { 7931 if (accessor.isGetter()) {
7932 variable2.type = type.returnType; 7932 variable.type = type.returnType;
7933 } else if (variable2.type == null) { 7933 } else if (variable.type == null) {
7934 List<Type2> parameterTypes = type.normalParameterTypes; 7934 List<Type2> parameterTypes = type.normalParameterTypes;
7935 if (parameterTypes != null && parameterTypes.length > 0) { 7935 if (parameterTypes != null && parameterTypes.length > 0) {
7936 variable2.type = parameterTypes[0]; 7936 variable.type = parameterTypes[0];
7937 } 7937 }
7938 } 7938 }
7939 } 7939 }
7940 return null; 7940 return null;
7941 } 7941 }
7942 Object visitSimpleFormalParameter(SimpleFormalParameter node) { 7942 Object visitSimpleFormalParameter(SimpleFormalParameter node) {
7943 super.visitSimpleFormalParameter(node); 7943 super.visitSimpleFormalParameter(node);
7944 Type2 declaredType; 7944 Type2 declaredType;
7945 TypeName typeName = node.type; 7945 TypeName typeName = node.type;
7946 if (typeName == null) { 7946 if (typeName == null) {
7947 declaredType = _dynamicType; 7947 declaredType = _dynamicType;
7948 } else { 7948 } else {
7949 declaredType = getType3(typeName); 7949 declaredType = getType3(typeName);
7950 } 7950 }
7951 Element element2 = node.identifier.element; 7951 Element element = node.identifier.element;
7952 if (element2 is ParameterElement) { 7952 if (element is ParameterElement) {
7953 ((element2 as ParameterElementImpl)).type = declaredType; 7953 ((element as ParameterElementImpl)).type = declaredType;
7954 } else { 7954 } else {
7955 } 7955 }
7956 return null; 7956 return null;
7957 } 7957 }
7958 Object visitSuperExpression(SuperExpression node) { 7958 Object visitSuperExpression(SuperExpression node) {
7959 _hasReferenceToSuper = true; 7959 _hasReferenceToSuper = true;
7960 return super.visitSuperExpression(node); 7960 return super.visitSuperExpression(node);
7961 } 7961 }
7962 Object visitTypeName(TypeName node) { 7962 Object visitTypeName(TypeName node) {
7963 super.visitTypeName(node); 7963 super.visitTypeName(node);
(...skipping 10 matching lines...) Expand all
7974 return null; 7974 return null;
7975 } 7975 }
7976 VoidTypeImpl voidType = VoidTypeImpl.instance; 7976 VoidTypeImpl voidType = VoidTypeImpl.instance;
7977 if (typeName.name == voidType.name) { 7977 if (typeName.name == voidType.name) {
7978 if (argumentList != null) { 7978 if (argumentList != null) {
7979 } 7979 }
7980 typeName.staticType = voidType; 7980 typeName.staticType = voidType;
7981 node.type = voidType; 7981 node.type = voidType;
7982 return null; 7982 return null;
7983 } 7983 }
7984 ASTNode parent2 = node.parent; 7984 ASTNode parent = node.parent;
7985 if (typeName is PrefixedIdentifier && parent2 is ConstructorName && argume ntList == null) { 7985 if (typeName is PrefixedIdentifier && parent is ConstructorName && argumen tList == null) {
7986 ConstructorName name = parent2 as ConstructorName; 7986 ConstructorName name = parent as ConstructorName;
7987 if (name.name == null) { 7987 if (name.name == null) {
7988 SimpleIdentifier prefix2 = ((typeName as PrefixedIdentifier)).prefix; 7988 SimpleIdentifier prefix = ((typeName as PrefixedIdentifier)).prefix;
7989 element = nameScope.lookup(prefix2, definingLibrary); 7989 element = nameScope.lookup(prefix, definingLibrary);
7990 if (element is PrefixElement) { 7990 if (element is PrefixElement) {
7991 return null; 7991 return null;
7992 } else if (element != null) { 7992 } else if (element != null) {
7993 name.name = ((typeName as PrefixedIdentifier)).identifier; 7993 name.name = ((typeName as PrefixedIdentifier)).identifier;
7994 name.period = ((typeName as PrefixedIdentifier)).period; 7994 name.period = ((typeName as PrefixedIdentifier)).period;
7995 node.name = prefix2; 7995 node.name = prefix;
7996 typeName = prefix2; 7996 typeName = prefix;
7997 } 7997 }
7998 } 7998 }
7999 } 7999 }
8000 } 8000 }
8001 bool elementValid = element is! MultiplyDefinedElement; 8001 bool elementValid = element is! MultiplyDefinedElement;
8002 if (elementValid && element is! ClassElement && isTypeNameInInstanceCreation Expression(node)) { 8002 if (elementValid && element is! ClassElement && isTypeNameInInstanceCreation Expression(node)) {
8003 SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName); 8003 SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
8004 InstanceCreationExpression creation = node.parent.parent as InstanceCreati onExpression; 8004 InstanceCreationExpression creation = node.parent.parent as InstanceCreati onExpression;
8005 if (creation.isConst()) { 8005 if (creation.isConst()) {
8006 if (element == null) { 8006 if (element == null) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
8058 node.type = type; 8058 node.type = type;
8059 } 8059 }
8060 } else { 8060 } else {
8061 if (isTypeNameInCatchClause(node)) { 8061 if (isTypeNameInCatchClause(node)) {
8062 reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeN ame.name]); 8062 reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeN ame.name]);
8063 } else if (isTypeNameInAsExpression(node)) { 8063 } else if (isTypeNameInAsExpression(node)) {
8064 reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name ]); 8064 reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name ]);
8065 } else if (isTypeNameInIsExpression(node)) { 8065 } else if (isTypeNameInIsExpression(node)) {
8066 reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.na me]); 8066 reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.na me]);
8067 } else { 8067 } else {
8068 ASTNode parent3 = typeName.parent; 8068 ASTNode parent = typeName.parent;
8069 while (parent3 is TypeName) { 8069 while (parent is TypeName) {
8070 parent3 = parent3.parent; 8070 parent = parent.parent;
8071 } 8071 }
8072 if (parent3 is ExtendsClause || parent3 is ImplementsClause || parent3 i s WithClause || parent3 is ClassTypeAlias) { 8072 if (parent is ExtendsClause || parent is ImplementsClause || parent is W ithClause || parent is ClassTypeAlias) {
8073 } else { 8073 } else {
8074 reportError(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]); 8074 reportError(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
8075 } 8075 }
8076 } 8076 }
8077 setElement(typeName, _dynamicType.element); 8077 setElement(typeName, _dynamicType.element);
8078 typeName.staticType = _dynamicType; 8078 typeName.staticType = _dynamicType;
8079 node.type = _dynamicType; 8079 node.type = _dynamicType;
8080 return null; 8080 return null;
8081 } 8081 }
8082 if (argumentList != null) { 8082 if (argumentList != null) {
8083 NodeList<TypeName> arguments2 = argumentList.arguments; 8083 NodeList<TypeName> arguments = argumentList.arguments;
8084 int argumentCount = arguments2.length; 8084 int argumentCount = arguments.length;
8085 List<Type2> parameters = getTypeArguments(type); 8085 List<Type2> parameters = getTypeArguments(type);
8086 int parameterCount = parameters.length; 8086 int parameterCount = parameters.length;
8087 int count = Math.min(argumentCount, parameterCount); 8087 int count = Math.min(argumentCount, parameterCount);
8088 List<Type2> typeArguments = new List<Type2>(); 8088 List<Type2> typeArguments = new List<Type2>();
8089 for (int i = 0; i < count; i++) { 8089 for (int i = 0; i < count; i++) {
8090 Type2 argumentType = getType3(arguments2[i]); 8090 Type2 argumentType = getType3(arguments[i]);
8091 if (argumentType != null) { 8091 if (argumentType != null) {
8092 typeArguments.add(argumentType); 8092 typeArguments.add(argumentType);
8093 } 8093 }
8094 } 8094 }
8095 if (argumentCount != parameterCount) { 8095 if (argumentCount != parameterCount) {
8096 reportError(getInvalidTypeParametersErrorCode(node), node, [typeName.nam e, parameterCount, argumentCount]); 8096 reportError(getInvalidTypeParametersErrorCode(node), node, [typeName.nam e, parameterCount, argumentCount]);
8097 } 8097 }
8098 argumentCount = typeArguments.length; 8098 argumentCount = typeArguments.length;
8099 if (argumentCount < parameterCount) { 8099 if (argumentCount < parameterCount) {
8100 for (int i = argumentCount; i < parameterCount; i++) { 8100 for (int i = argumentCount; i < parameterCount; i++) {
(...skipping 26 matching lines...) Expand all
8127 } 8127 }
8128 Object visitVariableDeclaration(VariableDeclaration node) { 8128 Object visitVariableDeclaration(VariableDeclaration node) {
8129 super.visitVariableDeclaration(node); 8129 super.visitVariableDeclaration(node);
8130 Type2 declaredType; 8130 Type2 declaredType;
8131 TypeName typeName = ((node.parent as VariableDeclarationList)).type; 8131 TypeName typeName = ((node.parent as VariableDeclarationList)).type;
8132 if (typeName == null) { 8132 if (typeName == null) {
8133 declaredType = _dynamicType; 8133 declaredType = _dynamicType;
8134 } else { 8134 } else {
8135 declaredType = getType3(typeName); 8135 declaredType = getType3(typeName);
8136 } 8136 }
8137 Element element2 = node.name.element; 8137 Element element = node.name.element;
8138 if (element2 is VariableElement) { 8138 if (element is VariableElement) {
8139 ((element2 as VariableElementImpl)).type = declaredType; 8139 ((element as VariableElementImpl)).type = declaredType;
8140 if (element2 is PropertyInducingElement) { 8140 if (element is PropertyInducingElement) {
8141 PropertyInducingElement variableElement = element2 as PropertyInducingEl ement; 8141 PropertyInducingElement variableElement = element as PropertyInducingEle ment;
8142 PropertyAccessorElementImpl getter2 = variableElement.getter as Property AccessorElementImpl; 8142 PropertyAccessorElementImpl getter = variableElement.getter as PropertyA ccessorElementImpl;
8143 FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter2); 8143 FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter);
8144 getterType.returnType = declaredType; 8144 getterType.returnType = declaredType;
8145 getter2.type = getterType; 8145 getter.type = getterType;
8146 PropertyAccessorElementImpl setter2 = variableElement.setter as Property AccessorElementImpl; 8146 PropertyAccessorElementImpl setter = variableElement.setter as PropertyA ccessorElementImpl;
8147 if (setter2 != null) { 8147 if (setter != null) {
8148 FunctionTypeImpl setterType = new FunctionTypeImpl.con1(setter2); 8148 FunctionTypeImpl setterType = new FunctionTypeImpl.con1(setter);
8149 setterType.returnType = VoidTypeImpl.instance; 8149 setterType.returnType = VoidTypeImpl.instance;
8150 setterType.normalParameterTypes = <Type2> [declaredType]; 8150 setterType.normalParameterTypes = <Type2> [declaredType];
8151 setter2.type = setterType; 8151 setter.type = setterType;
8152 } 8152 }
8153 } 8153 }
8154 } else { 8154 } else {
8155 } 8155 }
8156 return null; 8156 return null;
8157 } 8157 }
8158 8158
8159 /** 8159 /**
8160 * Return the class element that represents the class whose name was provided. 8160 * Return the class element that represents the class whose name was provided.
8161 * @param identifier the name from the declaration of a class 8161 * @param identifier the name from the declaration of a class
8162 * @return the class element that represents the class 8162 * @return the class element that represents the class
8163 */ 8163 */
8164 ClassElementImpl getClassElement(SimpleIdentifier identifier) { 8164 ClassElementImpl getClassElement(SimpleIdentifier identifier) {
8165 if (identifier == null) { 8165 if (identifier == null) {
8166 return null; 8166 return null;
8167 } 8167 }
8168 Element element2 = identifier.element; 8168 Element element = identifier.element;
8169 if (element2 is! ClassElementImpl) { 8169 if (element is! ClassElementImpl) {
8170 return null; 8170 return null;
8171 } 8171 }
8172 return element2 as ClassElementImpl; 8172 return element as ClassElementImpl;
8173 } 8173 }
8174 8174
8175 /** 8175 /**
8176 * Return an array containing all of the elements associated with the paramete rs in the given 8176 * Return an array containing all of the elements associated with the paramete rs in the given
8177 * list. 8177 * list.
8178 * @param parameterList the list of parameters whose elements are to be return ed 8178 * @param parameterList the list of parameters whose elements are to be return ed
8179 * @return the elements associated with the parameters 8179 * @return the elements associated with the parameters
8180 */ 8180 */
8181 List<ParameterElement> getElements(FormalParameterList parameterList) { 8181 List<ParameterElement> getElements(FormalParameterList parameterList) {
8182 List<ParameterElement> elements = new List<ParameterElement>(); 8182 List<ParameterElement> elements = new List<ParameterElement>();
8183 for (FormalParameter parameter in parameterList.parameters) { 8183 for (FormalParameter parameter in parameterList.parameters) {
8184 ParameterElement element2 = parameter.identifier.element as ParameterEleme nt; 8184 ParameterElement element = parameter.identifier.element as ParameterElemen t;
8185 if (element2 != null) { 8185 if (element != null) {
8186 elements.add(element2); 8186 elements.add(element);
8187 } 8187 }
8188 } 8188 }
8189 return new List.from(elements); 8189 return new List.from(elements);
8190 } 8190 }
8191 8191
8192 /** 8192 /**
8193 * The number of type arguments in the given type name does not match the numb er of parameters in 8193 * The number of type arguments in the given type name does not match the numb er of parameters in
8194 * the corresponding class element. Return the error code that should be used to report this 8194 * the corresponding class element. Return the error code that should be used to report this
8195 * error. 8195 * error.
8196 * @param node the type name with the wrong number of type arguments 8196 * @param node the type name with the wrong number of type arguments
8197 * @return the error code that should be used to report that the wrong number of type arguments 8197 * @return the error code that should be used to report that the wrong number of type arguments
8198 * were provided 8198 * were provided
8199 */ 8199 */
8200 ErrorCode getInvalidTypeParametersErrorCode(TypeName node) { 8200 ErrorCode getInvalidTypeParametersErrorCode(TypeName node) {
8201 ASTNode parent2 = node.parent; 8201 ASTNode parent = node.parent;
8202 if (parent2 is ConstructorName) { 8202 if (parent is ConstructorName) {
8203 parent2 = parent2.parent; 8203 parent = parent.parent;
8204 if (parent2 is InstanceCreationExpression) { 8204 if (parent is InstanceCreationExpression) {
8205 if (((parent2 as InstanceCreationExpression)).isConst()) { 8205 if (((parent as InstanceCreationExpression)).isConst()) {
8206 return CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS; 8206 return CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS;
8207 } else { 8207 } else {
8208 return CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS; 8208 return CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS;
8209 } 8209 }
8210 } 8210 }
8211 } 8211 }
8212 return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS; 8212 return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
8213 } 8213 }
8214 8214
8215 /** 8215 /**
(...skipping 14 matching lines...) Expand all
8230 } 8230 }
8231 return type; 8231 return type;
8232 } 8232 }
8233 8233
8234 /** 8234 /**
8235 * Return the type represented by the given type name. 8235 * Return the type represented by the given type name.
8236 * @param typeName the type name representing the type to be returned 8236 * @param typeName the type name representing the type to be returned
8237 * @return the type represented by the type name 8237 * @return the type represented by the type name
8238 */ 8238 */
8239 Type2 getType3(TypeName typeName) { 8239 Type2 getType3(TypeName typeName) {
8240 Type2 type2 = typeName.type; 8240 Type2 type = typeName.type;
8241 if (type2 == null) { 8241 if (type == null) {
8242 return _dynamicType; 8242 return _dynamicType;
8243 } 8243 }
8244 return type2; 8244 return type;
8245 } 8245 }
8246 8246
8247 /** 8247 /**
8248 * Return the type arguments associated with the given type. 8248 * Return the type arguments associated with the given type.
8249 * @param type the type whole type arguments are to be returned 8249 * @param type the type whole type arguments are to be returned
8250 * @return the type arguments associated with the given type 8250 * @return the type arguments associated with the given type
8251 */ 8251 */
8252 List<Type2> getTypeArguments(Type2 type) { 8252 List<Type2> getTypeArguments(Type2 type) {
8253 if (type is InterfaceType) { 8253 if (type is InterfaceType) {
8254 return ((type as InterfaceType)).typeArguments; 8254 return ((type as InterfaceType)).typeArguments;
(...skipping 15 matching lines...) Expand all
8270 return ((typeName as PrefixedIdentifier)).identifier; 8270 return ((typeName as PrefixedIdentifier)).identifier;
8271 } 8271 }
8272 } 8272 }
8273 8273
8274 /** 8274 /**
8275 * Checks if the given type name is used as the type in an as expression. 8275 * Checks if the given type name is used as the type in an as expression.
8276 * @param typeName the type name to analyzer 8276 * @param typeName the type name to analyzer
8277 * @return {@code true} if the given type name is used as the type in an as ex pression 8277 * @return {@code true} if the given type name is used as the type in an as ex pression
8278 */ 8278 */
8279 bool isTypeNameInAsExpression(TypeName typeName) { 8279 bool isTypeNameInAsExpression(TypeName typeName) {
8280 ASTNode parent2 = typeName.parent; 8280 ASTNode parent = typeName.parent;
8281 if (parent2 is AsExpression) { 8281 if (parent is AsExpression) {
8282 AsExpression asExpression = parent2 as AsExpression; 8282 AsExpression asExpression = parent as AsExpression;
8283 return identical(asExpression.type, typeName); 8283 return identical(asExpression.type, typeName);
8284 } 8284 }
8285 return false; 8285 return false;
8286 } 8286 }
8287 8287
8288 /** 8288 /**
8289 * Checks if the given type name is used as the exception type in a catch clau se. 8289 * Checks if the given type name is used as the exception type in a catch clau se.
8290 * @param typeName the type name to analyzer 8290 * @param typeName the type name to analyzer
8291 * @return {@code true} if the given type name is used as the exception type i n a catch clause 8291 * @return {@code true} if the given type name is used as the exception type i n a catch clause
8292 */ 8292 */
8293 bool isTypeNameInCatchClause(TypeName typeName) { 8293 bool isTypeNameInCatchClause(TypeName typeName) {
8294 ASTNode parent2 = typeName.parent; 8294 ASTNode parent = typeName.parent;
8295 if (parent2 is CatchClause) { 8295 if (parent is CatchClause) {
8296 CatchClause catchClause = parent2 as CatchClause; 8296 CatchClause catchClause = parent as CatchClause;
8297 return identical(catchClause.exceptionType, typeName); 8297 return identical(catchClause.exceptionType, typeName);
8298 } 8298 }
8299 return false; 8299 return false;
8300 } 8300 }
8301 8301
8302 /** 8302 /**
8303 * Checks if the given type name is used as the type in an instance creation e xpression. 8303 * Checks if the given type name is used as the type in an instance creation e xpression.
8304 * @param typeName the type name to analyzer 8304 * @param typeName the type name to analyzer
8305 * @return {@code true} if the given type name is used as the type in an insta nce creation 8305 * @return {@code true} if the given type name is used as the type in an insta nce creation
8306 * expression 8306 * expression
8307 */ 8307 */
8308 bool isTypeNameInInstanceCreationExpression(TypeName typeName) { 8308 bool isTypeNameInInstanceCreationExpression(TypeName typeName) {
8309 ASTNode parent2 = typeName.parent; 8309 ASTNode parent = typeName.parent;
8310 if (parent2 is ConstructorName && parent2.parent is InstanceCreationExpressi on) { 8310 if (parent is ConstructorName && parent.parent is InstanceCreationExpression ) {
8311 ConstructorName constructorName = parent2 as ConstructorName; 8311 ConstructorName constructorName = parent as ConstructorName;
8312 return constructorName != null && identical(constructorName.type, typeName ); 8312 return constructorName != null && identical(constructorName.type, typeName );
8313 } 8313 }
8314 return false; 8314 return false;
8315 } 8315 }
8316 8316
8317 /** 8317 /**
8318 * Checks if the given type name is used as the type in an is expression. 8318 * Checks if the given type name is used as the type in an is expression.
8319 * @param typeName the type name to analyzer 8319 * @param typeName the type name to analyzer
8320 * @return {@code true} if the given type name is used as the type in an is ex pression 8320 * @return {@code true} if the given type name is used as the type in an is ex pression
8321 */ 8321 */
8322 bool isTypeNameInIsExpression(TypeName typeName) { 8322 bool isTypeNameInIsExpression(TypeName typeName) {
8323 ASTNode parent2 = typeName.parent; 8323 ASTNode parent = typeName.parent;
8324 if (parent2 is IsExpression) { 8324 if (parent is IsExpression) {
8325 IsExpression isExpression = parent2 as IsExpression; 8325 IsExpression isExpression = parent as IsExpression;
8326 return identical(isExpression.type, typeName); 8326 return identical(isExpression.type, typeName);
8327 } 8327 }
8328 return false; 8328 return false;
8329 } 8329 }
8330 8330
8331 /** 8331 /**
8332 * Checks if the given type name is the target in a redirected constructor. 8332 * Checks if the given type name is the target in a redirected constructor.
8333 * @param typeName the type name to analyzer 8333 * @param typeName the type name to analyzer
8334 * @return {@code true} if the given type name is used as the type in a redire cted constructor 8334 * @return {@code true} if the given type name is used as the type in a redire cted constructor
8335 */ 8335 */
8336 bool isTypeNameTargetInRedirectedConstructor(TypeName typeName) { 8336 bool isTypeNameTargetInRedirectedConstructor(TypeName typeName) {
8337 ASTNode parent2 = typeName.parent; 8337 ASTNode parent = typeName.parent;
8338 if (parent2 is ConstructorName) { 8338 if (parent is ConstructorName) {
8339 ConstructorName constructorName = parent2 as ConstructorName; 8339 ConstructorName constructorName = parent as ConstructorName;
8340 parent2 = constructorName.parent; 8340 parent = constructorName.parent;
8341 if (parent2 is ConstructorDeclaration) { 8341 if (parent is ConstructorDeclaration) {
8342 ConstructorDeclaration constructorDeclaration = parent2 as ConstructorDe claration; 8342 ConstructorDeclaration constructorDeclaration = parent as ConstructorDec laration;
8343 return constructorName == constructorDeclaration.redirectedConstructor; 8343 return constructorName == constructorDeclaration.redirectedConstructor;
8344 } 8344 }
8345 } 8345 }
8346 return false; 8346 return false;
8347 } 8347 }
8348 8348
8349 /** 8349 /**
8350 * Record that the static type of the given node is the given type. 8350 * Record that the static type of the given node is the given type.
8351 * @param expression the node whose type is to be recorded 8351 * @param expression the node whose type is to be recorded
8352 * @param type the static type of the node 8352 * @param type the static type of the node
(...skipping 10 matching lines...) Expand all
8363 /** 8363 /**
8364 * Resolve the types in the given with and implements clauses and associate th ose types with the 8364 * Resolve the types in the given with and implements clauses and associate th ose types with the
8365 * given class element. 8365 * given class element.
8366 * @param classElement the class element with which the mixin and interface ty pes are to be 8366 * @param classElement the class element with which the mixin and interface ty pes are to be
8367 * associated 8367 * associated
8368 * @param withClause the with clause to be resolved 8368 * @param withClause the with clause to be resolved
8369 * @param implementsClause the implements clause to be resolved 8369 * @param implementsClause the implements clause to be resolved
8370 */ 8370 */
8371 void resolve(ClassElementImpl classElement, WithClause withClause, ImplementsC lause implementsClause) { 8371 void resolve(ClassElementImpl classElement, WithClause withClause, ImplementsC lause implementsClause) {
8372 if (withClause != null) { 8372 if (withClause != null) {
8373 List<InterfaceType> mixinTypes2 = resolveTypes(withClause.mixinTypes, Comp ileTimeErrorCode.MIXIN_OF_NON_CLASS); 8373 List<InterfaceType> mixinTypes = resolveTypes(withClause.mixinTypes, Compi leTimeErrorCode.MIXIN_OF_NON_CLASS);
8374 if (classElement != null) { 8374 if (classElement != null) {
8375 classElement.mixins = mixinTypes2; 8375 classElement.mixins = mixinTypes;
8376 } 8376 }
8377 } 8377 }
8378 if (implementsClause != null) { 8378 if (implementsClause != null) {
8379 NodeList<TypeName> interfaces2 = implementsClause.interfaces; 8379 NodeList<TypeName> interfaces = implementsClause.interfaces;
8380 List<InterfaceType> interfaceTypes = resolveTypes(interfaces2, CompileTime ErrorCode.IMPLEMENTS_NON_CLASS); 8380 List<InterfaceType> interfaceTypes = resolveTypes(interfaces, CompileTimeE rrorCode.IMPLEMENTS_NON_CLASS);
8381 List<TypeName> typeNames = new List.from(interfaces2); 8381 List<TypeName> typeNames = new List.from(interfaces);
8382 String dynamicKeyword = sc.Keyword.DYNAMIC.syntax; 8382 String dynamicKeyword = sc.Keyword.DYNAMIC.syntax;
8383 List<bool> detectedRepeatOnIndex = new List<bool>.filled(typeNames.length, false); 8383 List<bool> detectedRepeatOnIndex = new List<bool>.filled(typeNames.length, false);
8384 for (int i = 0; i < detectedRepeatOnIndex.length; i++) { 8384 for (int i = 0; i < detectedRepeatOnIndex.length; i++) {
8385 detectedRepeatOnIndex[i] = false; 8385 detectedRepeatOnIndex[i] = false;
8386 } 8386 }
8387 for (int i = 0; i < typeNames.length; i++) { 8387 for (int i = 0; i < typeNames.length; i++) {
8388 TypeName typeName = typeNames[i]; 8388 TypeName typeName = typeNames[i];
8389 String name3 = typeName.name.name; 8389 String name = typeName.name.name;
8390 if (name3 == dynamicKeyword) { 8390 if (name == dynamicKeyword) {
8391 reportError(CompileTimeErrorCode.IMPLEMENTS_DYNAMIC, typeName, []); 8391 reportError(CompileTimeErrorCode.IMPLEMENTS_DYNAMIC, typeName, []);
8392 } 8392 }
8393 if (!detectedRepeatOnIndex[i]) { 8393 if (!detectedRepeatOnIndex[i]) {
8394 for (int j = i + 1; j < typeNames.length; j++) { 8394 for (int j = i + 1; j < typeNames.length; j++) {
8395 Element element3 = typeName.name.element; 8395 Element element = typeName.name.element;
8396 TypeName typeName2 = typeNames[j]; 8396 TypeName typeName2 = typeNames[j];
8397 Identifier identifier2 = typeName2.name; 8397 Identifier identifier2 = typeName2.name;
8398 String name2 = identifier2.name; 8398 String name2 = identifier2.name;
8399 Element element2 = identifier2.element; 8399 Element element2 = identifier2.element;
8400 if (element3 != null && element3 == element2) { 8400 if (element != null && element == element2) {
8401 detectedRepeatOnIndex[j] = true; 8401 detectedRepeatOnIndex[j] = true;
8402 reportError(CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [ name2]); 8402 reportError(CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [ name2]);
8403 } 8403 }
8404 } 8404 }
8405 } 8405 }
8406 } 8406 }
8407 if (classElement != null) { 8407 if (classElement != null) {
8408 classElement.interfaces = interfaceTypes; 8408 classElement.interfaces = interfaceTypes;
8409 } 8409 }
8410 } 8410 }
8411 } 8411 }
8412 8412
8413 /** 8413 /**
8414 * Return the type specified by the given name. 8414 * Return the type specified by the given name.
8415 * @param typeName the type name specifying the type to be returned 8415 * @param typeName the type name specifying the type to be returned
8416 * @param nonTypeError the error to produce if the type name is defined to be something other than 8416 * @param nonTypeError the error to produce if the type name is defined to be something other than
8417 * a type 8417 * a type
8418 * @return the type specified by the type name 8418 * @return the type specified by the type name
8419 */ 8419 */
8420 InterfaceType resolveType(TypeName typeName, ErrorCode nonTypeError) { 8420 InterfaceType resolveType(TypeName typeName, ErrorCode nonTypeError) {
8421 Type2 type2 = typeName.type; 8421 Type2 type = typeName.type;
8422 if (type2 is InterfaceType) { 8422 if (type is InterfaceType) {
8423 return type2 as InterfaceType; 8423 return type as InterfaceType;
8424 } 8424 }
8425 Identifier name2 = typeName.name; 8425 Identifier name = typeName.name;
8426 if (name2.name != sc.Keyword.DYNAMIC.syntax) { 8426 if (name.name != sc.Keyword.DYNAMIC.syntax) {
8427 reportError(nonTypeError, name2, [name2.name]); 8427 reportError(nonTypeError, name, [name.name]);
8428 } 8428 }
8429 return null; 8429 return null;
8430 } 8430 }
8431 8431
8432 /** 8432 /**
8433 * Resolve the types in the given list of type names. 8433 * Resolve the types in the given list of type names.
8434 * @param typeNames the type names to be resolved 8434 * @param typeNames the type names to be resolved
8435 * @param nonTypeError the error to produce if the type name is defined to be something other than 8435 * @param nonTypeError the error to produce if the type name is defined to be something other than
8436 * a type 8436 * a type
8437 * @return an array containing all of the types that were resolved. 8437 * @return an array containing all of the types that were resolved.
(...skipping 10 matching lines...) Expand all
8448 } 8448 }
8449 void setElement(Identifier typeName, Element element2) { 8449 void setElement(Identifier typeName, Element element2) {
8450 if (element2 != null) { 8450 if (element2 != null) {
8451 if (typeName is SimpleIdentifier) { 8451 if (typeName is SimpleIdentifier) {
8452 ((typeName as SimpleIdentifier)).staticElement = element2; 8452 ((typeName as SimpleIdentifier)).staticElement = element2;
8453 ((typeName as SimpleIdentifier)).element = element2; 8453 ((typeName as SimpleIdentifier)).element = element2;
8454 } else if (typeName is PrefixedIdentifier) { 8454 } else if (typeName is PrefixedIdentifier) {
8455 PrefixedIdentifier identifier = typeName as PrefixedIdentifier; 8455 PrefixedIdentifier identifier = typeName as PrefixedIdentifier;
8456 identifier.identifier.staticElement = element2; 8456 identifier.identifier.staticElement = element2;
8457 identifier.identifier.element = element2; 8457 identifier.identifier.element = element2;
8458 SimpleIdentifier prefix2 = identifier.prefix; 8458 SimpleIdentifier prefix = identifier.prefix;
8459 Element prefixElement = nameScope.lookup(prefix2, definingLibrary); 8459 Element prefixElement = nameScope.lookup(prefix, definingLibrary);
8460 if (prefixElement != null) { 8460 if (prefixElement != null) {
8461 prefix2.staticElement = prefixElement; 8461 prefix.staticElement = prefixElement;
8462 prefix2.element = prefixElement; 8462 prefix.element = prefixElement;
8463 } 8463 }
8464 } 8464 }
8465 } 8465 }
8466 } 8466 }
8467 8467
8468 /** 8468 /**
8469 * Set the return type and parameter type information for the given function t ype based on the 8469 * Set the return type and parameter type information for the given function t ype based on the
8470 * given return type and parameter elements. 8470 * given return type and parameter elements.
8471 * @param functionType the function type to be filled in 8471 * @param functionType the function type to be filled in
8472 * @param returnType the return type of the function, or {@code null} if no ty pe was declared 8472 * @param returnType the return type of the function, or {@code null} if no ty pe was declared
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
8604 defineParameters(functionElement); 8604 defineParameters(functionElement);
8605 } 8605 }
8606 8606
8607 /** 8607 /**
8608 * Define the parameters for the given function in the scope that encloses thi s function. 8608 * Define the parameters for the given function in the scope that encloses thi s function.
8609 * @param functionElement the element representing the function represented by this scope 8609 * @param functionElement the element representing the function represented by this scope
8610 */ 8610 */
8611 void defineParameters(ExecutableElement functionElement) { 8611 void defineParameters(ExecutableElement functionElement) {
8612 Scope parameterScope = enclosingScope; 8612 Scope parameterScope = enclosingScope;
8613 if (functionElement.enclosingElement is ExecutableElement) { 8613 if (functionElement.enclosingElement is ExecutableElement) {
8614 String name2 = functionElement.name; 8614 String name = functionElement.name;
8615 if (name2 != null && !name2.isEmpty) { 8615 if (name != null && !name.isEmpty) {
8616 parameterScope.define(functionElement); 8616 parameterScope.define(functionElement);
8617 } 8617 }
8618 } 8618 }
8619 for (ParameterElement parameter in functionElement.parameters) { 8619 for (ParameterElement parameter in functionElement.parameters) {
8620 if (!parameter.isInitializingFormal()) { 8620 if (!parameter.isInitializingFormal()) {
8621 parameterScope.define(parameter); 8621 parameterScope.define(parameter);
8622 } 8622 }
8623 } 8623 }
8624 } 8624 }
8625 } 8625 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
8748 * Instances of the class {@code LibraryImportScope} represent the scope contain ing all of the names 8748 * Instances of the class {@code LibraryImportScope} represent the scope contain ing all of the names
8749 * available from imported libraries. 8749 * available from imported libraries.
8750 * @coverage dart.engine.resolver 8750 * @coverage dart.engine.resolver
8751 */ 8751 */
8752 class LibraryImportScope extends Scope { 8752 class LibraryImportScope extends Scope {
8753 8753
8754 /** 8754 /**
8755 * @return {@code true} if the given {@link Identifier} is the part of type an notation. 8755 * @return {@code true} if the given {@link Identifier} is the part of type an notation.
8756 */ 8756 */
8757 static bool isTypeAnnotation(Identifier identifier) { 8757 static bool isTypeAnnotation(Identifier identifier) {
8758 ASTNode parent4 = identifier.parent; 8758 ASTNode parent = identifier.parent;
8759 if (parent4 is TypeName) { 8759 if (parent is TypeName) {
8760 ASTNode parent2 = parent4.parent; 8760 ASTNode parent2 = parent.parent;
8761 if (parent2 is FunctionDeclaration) { 8761 if (parent2 is FunctionDeclaration) {
8762 FunctionDeclaration decl = parent2 as FunctionDeclaration; 8762 FunctionDeclaration decl = parent2 as FunctionDeclaration;
8763 return identical(decl.returnType, parent4); 8763 return identical(decl.returnType, parent);
8764 } 8764 }
8765 if (parent2 is FunctionTypeAlias) { 8765 if (parent2 is FunctionTypeAlias) {
8766 FunctionTypeAlias decl = parent2 as FunctionTypeAlias; 8766 FunctionTypeAlias decl = parent2 as FunctionTypeAlias;
8767 return identical(decl.returnType, parent4); 8767 return identical(decl.returnType, parent);
8768 } 8768 }
8769 if (parent2 is MethodDeclaration) { 8769 if (parent2 is MethodDeclaration) {
8770 MethodDeclaration decl = parent2 as MethodDeclaration; 8770 MethodDeclaration decl = parent2 as MethodDeclaration;
8771 return identical(decl.returnType, parent4); 8771 return identical(decl.returnType, parent);
8772 } 8772 }
8773 if (parent2 is VariableDeclarationList) { 8773 if (parent2 is VariableDeclarationList) {
8774 VariableDeclarationList decl = parent2 as VariableDeclarationList; 8774 VariableDeclarationList decl = parent2 as VariableDeclarationList;
8775 return identical(decl.type, parent4); 8775 return identical(decl.type, parent);
8776 } 8776 }
8777 if (parent2 is SimpleFormalParameter) { 8777 if (parent2 is SimpleFormalParameter) {
8778 SimpleFormalParameter decl = parent2 as SimpleFormalParameter; 8778 SimpleFormalParameter decl = parent2 as SimpleFormalParameter;
8779 return identical(decl.type, parent4); 8779 return identical(decl.type, parent);
8780 } 8780 }
8781 if (parent2 is TypeParameter) { 8781 if (parent2 is TypeParameter) {
8782 TypeParameter decl = parent2 as TypeParameter; 8782 TypeParameter decl = parent2 as TypeParameter;
8783 return identical(decl.bound, parent4); 8783 return identical(decl.bound, parent);
8784 } 8784 }
8785 if (parent2 is TypeArgumentList) { 8785 if (parent2 is TypeArgumentList) {
8786 ASTNode parent3 = parent2.parent; 8786 ASTNode parent3 = parent2.parent;
8787 if (parent3 is TypeName) { 8787 if (parent3 is TypeName) {
8788 TypeName typeName = parent3 as TypeName; 8788 TypeName typeName = parent3 as TypeName;
8789 if (identical((typeName).typeArguments, parent2)) { 8789 if (identical((typeName).typeArguments, parent2)) {
8790 return isTypeAnnotation(typeName.name); 8790 return isTypeAnnotation(typeName.name);
8791 } 8791 }
8792 } 8792 }
8793 } 8793 }
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
8992 * @coverage dart.engine.resolver 8992 * @coverage dart.engine.resolver
8993 */ 8993 */
8994 class NamespaceBuilder { 8994 class NamespaceBuilder {
8995 8995
8996 /** 8996 /**
8997 * Create a namespace representing the export namespace of the given {@link Ex portElement}. 8997 * Create a namespace representing the export namespace of the given {@link Ex portElement}.
8998 * @param element the export element whose export namespace is to be created 8998 * @param element the export element whose export namespace is to be created
8999 * @return the export namespace that was created 8999 * @return the export namespace that was created
9000 */ 9000 */
9001 Namespace createExportNamespace(ExportElement element) { 9001 Namespace createExportNamespace(ExportElement element) {
9002 LibraryElement exportedLibrary2 = element.exportedLibrary; 9002 LibraryElement exportedLibrary = element.exportedLibrary;
9003 if (exportedLibrary2 == null) { 9003 if (exportedLibrary == null) {
9004 return Namespace.EMPTY; 9004 return Namespace.EMPTY;
9005 } 9005 }
9006 Map<String, Element> definedNames = createExportMapping(exportedLibrary2, ne w Set<LibraryElement>()); 9006 Map<String, Element> definedNames = createExportMapping(exportedLibrary, new Set<LibraryElement>());
9007 definedNames = apply(definedNames, element.combinators); 9007 definedNames = apply(definedNames, element.combinators);
9008 return new Namespace(definedNames); 9008 return new Namespace(definedNames);
9009 } 9009 }
9010 9010
9011 /** 9011 /**
9012 * Create a namespace representing the export namespace of the given library. 9012 * Create a namespace representing the export namespace of the given library.
9013 * @param library the library whose export namespace is to be created 9013 * @param library the library whose export namespace is to be created
9014 * @return the export namespace that was created 9014 * @return the export namespace that was created
9015 */ 9015 */
9016 Namespace createExportNamespace2(LibraryElement library) => new Namespace(crea teExportMapping(library, new Set<LibraryElement>())); 9016 Namespace createExportNamespace2(LibraryElement library) => new Namespace(crea teExportMapping(library, new Set<LibraryElement>()));
9017 9017
9018 /** 9018 /**
9019 * Create a namespace representing the import namespace of the given library. 9019 * Create a namespace representing the import namespace of the given library.
9020 * @param library the library whose import namespace is to be created 9020 * @param library the library whose import namespace is to be created
9021 * @return the import namespace that was created 9021 * @return the import namespace that was created
9022 */ 9022 */
9023 Namespace createImportNamespace(ImportElement element) { 9023 Namespace createImportNamespace(ImportElement element) {
9024 LibraryElement importedLibrary2 = element.importedLibrary; 9024 LibraryElement importedLibrary = element.importedLibrary;
9025 if (importedLibrary2 == null) { 9025 if (importedLibrary == null) {
9026 return Namespace.EMPTY; 9026 return Namespace.EMPTY;
9027 } 9027 }
9028 Map<String, Element> definedNames = createExportMapping(importedLibrary2, ne w Set<LibraryElement>()); 9028 Map<String, Element> definedNames = createExportMapping(importedLibrary, new Set<LibraryElement>());
9029 definedNames = apply(definedNames, element.combinators); 9029 definedNames = apply(definedNames, element.combinators);
9030 definedNames = apply2(definedNames, element.prefix); 9030 definedNames = apply2(definedNames, element.prefix);
9031 return new Namespace(definedNames); 9031 return new Namespace(definedNames);
9032 } 9032 }
9033 9033
9034 /** 9034 /**
9035 * Create a namespace representing the public namespace of the given library. 9035 * Create a namespace representing the public namespace of the given library.
9036 * @param library the library whose public namespace is to be created 9036 * @param library the library whose public namespace is to be created
9037 * @return the public namespace that was created 9037 * @return the public namespace that was created
9038 */ 9038 */
(...skipping 27 matching lines...) Expand all
9066 addAll(definedNames2, namespace.definedNames); 9066 addAll(definedNames2, namespace.definedNames);
9067 } 9067 }
9068 } 9068 }
9069 9069
9070 /** 9070 /**
9071 * Add the given element to the given mapping table if it has a publicly visib le name. 9071 * Add the given element to the given mapping table if it has a publicly visib le name.
9072 * @param definedNames the mapping table to which the public name is to be add ed 9072 * @param definedNames the mapping table to which the public name is to be add ed
9073 * @param element the element to be added 9073 * @param element the element to be added
9074 */ 9074 */
9075 void addIfPublic(Map<String, Element> definedNames, Element element) { 9075 void addIfPublic(Map<String, Element> definedNames, Element element) {
9076 String name2 = element.name; 9076 String name = element.name;
9077 if (name2 != null && !Scope.isPrivateName(name2)) { 9077 if (name != null && !Scope.isPrivateName(name)) {
9078 definedNames[name2] = element; 9078 definedNames[name] = element;
9079 } 9079 }
9080 } 9080 }
9081 9081
9082 /** 9082 /**
9083 * Add to the given mapping table all of the public top-level names that are d efined in the given 9083 * Add to the given mapping table all of the public top-level names that are d efined in the given
9084 * compilation unit. 9084 * compilation unit.
9085 * @param definedNames the mapping table to which the public names are to be a dded 9085 * @param definedNames the mapping table to which the public names are to be a dded
9086 * @param compilationUnit the compilation unit defining the top-level names to be added to this 9086 * @param compilationUnit the compilation unit defining the top-level names to be added to this
9087 * namespace 9087 * namespace
9088 */ 9088 */
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
9143 * @param visitedElements a set of libraries that do not need to be visited wh en processing the 9143 * @param visitedElements a set of libraries that do not need to be visited wh en processing the
9144 * export directives of the given library because all of the names defined by them will 9144 * export directives of the given library because all of the names defined by them will
9145 * be added by another library 9145 * be added by another library
9146 * @return the mapping table that was created 9146 * @return the mapping table that was created
9147 */ 9147 */
9148 Map<String, Element> createExportMapping(LibraryElement library, Set<LibraryEl ement> visitedElements) { 9148 Map<String, Element> createExportMapping(LibraryElement library, Set<LibraryEl ement> visitedElements) {
9149 javaSetAdd(visitedElements, library); 9149 javaSetAdd(visitedElements, library);
9150 try { 9150 try {
9151 Map<String, Element> definedNames = new Map<String, Element>(); 9151 Map<String, Element> definedNames = new Map<String, Element>();
9152 for (ExportElement element in library.exports) { 9152 for (ExportElement element in library.exports) {
9153 LibraryElement exportedLibrary2 = element.exportedLibrary; 9153 LibraryElement exportedLibrary = element.exportedLibrary;
9154 if (exportedLibrary2 != null && !visitedElements.contains(exportedLibrar y2)) { 9154 if (exportedLibrary != null && !visitedElements.contains(exportedLibrary )) {
9155 Map<String, Element> exportedNames = createExportMapping(exportedLibra ry2, visitedElements); 9155 Map<String, Element> exportedNames = createExportMapping(exportedLibra ry, visitedElements);
9156 exportedNames = apply(exportedNames, element.combinators); 9156 exportedNames = apply(exportedNames, element.combinators);
9157 addAll(definedNames, exportedNames); 9157 addAll(definedNames, exportedNames);
9158 } 9158 }
9159 } 9159 }
9160 addAll2(definedNames, ((library.context as InternalAnalysisContext)).getPu blicNamespace(library)); 9160 addAll2(definedNames, ((library.context as InternalAnalysisContext)).getPu blicNamespace(library));
9161 return definedNames; 9161 return definedNames;
9162 } finally { 9162 } finally {
9163 visitedElements.remove(library); 9163 visitedElements.remove(library);
9164 } 9164 }
9165 } 9165 }
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
9287 LibraryElement get definingLibrary; 9287 LibraryElement get definingLibrary;
9288 9288
9289 /** 9289 /**
9290 * Return the error code to be used when reporting that a name being defined l ocally conflicts 9290 * Return the error code to be used when reporting that a name being defined l ocally conflicts
9291 * with another element of the same name in the local scope. 9291 * with another element of the same name in the local scope.
9292 * @param existing the first element to be declared with the conflicting name 9292 * @param existing the first element to be declared with the conflicting name
9293 * @param duplicate another element declared with the conflicting name 9293 * @param duplicate another element declared with the conflicting name
9294 * @return the error code used to report duplicate names within a scope 9294 * @return the error code used to report duplicate names within a scope
9295 */ 9295 */
9296 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { 9296 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
9297 Source source2 = duplicate.source; 9297 Source source = duplicate.source;
9298 if (source2 == null) { 9298 if (source == null) {
9299 source2 = source; 9299 source = source;
9300 } 9300 }
9301 return new AnalysisError.con2(source2, duplicate.nameOffset, duplicate.displ ayName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName] ); 9301 return new AnalysisError.con2(source, duplicate.nameOffset, duplicate.displa yName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName]) ;
9302 } 9302 }
9303 9303
9304 /** 9304 /**
9305 * Return the listener that is to be informed when an error is encountered. 9305 * Return the listener that is to be informed when an error is encountered.
9306 * @return the listener that is to be informed when an error is encountered 9306 * @return the listener that is to be informed when an error is encountered
9307 */ 9307 */
9308 AnalysisErrorListener get errorListener; 9308 AnalysisErrorListener get errorListener;
9309 9309
9310 /** 9310 /**
9311 * Return the source object representing the compilation unit with which error s related to this 9311 * Return the source object representing the compilation unit with which error s related to this
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
9420 } 9420 }
9421 return null; 9421 return null;
9422 } 9422 }
9423 Object visitMapLiteral(MapLiteral node) { 9423 Object visitMapLiteral(MapLiteral node) {
9424 super.visitMapLiteral(node); 9424 super.visitMapLiteral(node);
9425 bool isConst = node.modifier != null; 9425 bool isConst = node.modifier != null;
9426 bool reportEqualKeys = true; 9426 bool reportEqualKeys = true;
9427 Set<Object> keys = new Set<Object>(); 9427 Set<Object> keys = new Set<Object>();
9428 List<Expression> invalidKeys = new List<Expression>(); 9428 List<Expression> invalidKeys = new List<Expression>();
9429 for (MapLiteralEntry entry in node.entries) { 9429 for (MapLiteralEntry entry in node.entries) {
9430 Expression key2 = entry.key; 9430 Expression key = entry.key;
9431 if (isConst) { 9431 if (isConst) {
9432 EvaluationResultImpl result = validate(key2, CompileTimeErrorCode.NON_CO NSTANT_MAP_KEY); 9432 EvaluationResultImpl result = validate(key, CompileTimeErrorCode.NON_CON STANT_MAP_KEY);
9433 validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE); 9433 validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
9434 if (result is ValidResult) { 9434 if (result is ValidResult) {
9435 Object value2 = ((result as ValidResult)).value; 9435 Object value = ((result as ValidResult)).value;
9436 if (keys.contains(value2)) { 9436 if (keys.contains(value)) {
9437 invalidKeys.add(key2); 9437 invalidKeys.add(key);
9438 } else { 9438 } else {
9439 javaSetAdd(keys, value2); 9439 javaSetAdd(keys, value);
9440 } 9440 }
9441 } 9441 }
9442 } else { 9442 } else {
9443 EvaluationResultImpl result = key2.accept(new ConstantVisitor()); 9443 EvaluationResultImpl result = key.accept(new ConstantVisitor());
9444 if (result is ValidResult) { 9444 if (result is ValidResult) {
9445 Object value3 = ((result as ValidResult)).value; 9445 Object value = ((result as ValidResult)).value;
9446 if (keys.contains(value3)) { 9446 if (keys.contains(value)) {
9447 invalidKeys.add(key2); 9447 invalidKeys.add(key);
9448 } else { 9448 } else {
9449 javaSetAdd(keys, value3); 9449 javaSetAdd(keys, value);
9450 } 9450 }
9451 } else { 9451 } else {
9452 reportEqualKeys = false; 9452 reportEqualKeys = false;
9453 } 9453 }
9454 } 9454 }
9455 } 9455 }
9456 if (reportEqualKeys) { 9456 if (reportEqualKeys) {
9457 for (Expression key in invalidKeys) { 9457 for (Expression key in invalidKeys) {
9458 _errorReporter.reportError2(StaticWarningCode.EQUAL_KEYS_IN_MAP, key, [] ); 9458 _errorReporter.reportError2(StaticWarningCode.EQUAL_KEYS_IN_MAP, key, [] );
9459 } 9459 }
9460 } 9460 }
9461 return null; 9461 return null;
9462 } 9462 }
9463 Object visitMethodDeclaration(MethodDeclaration node) { 9463 Object visitMethodDeclaration(MethodDeclaration node) {
9464 super.visitMethodDeclaration(node); 9464 super.visitMethodDeclaration(node);
9465 validateDefaultValues(node.parameters); 9465 validateDefaultValues(node.parameters);
9466 return null; 9466 return null;
9467 } 9467 }
9468 Object visitSwitchCase(SwitchCase node) { 9468 Object visitSwitchCase(SwitchCase node) {
9469 super.visitSwitchCase(node); 9469 super.visitSwitchCase(node);
9470 validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION) ; 9470 validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION) ;
9471 return null; 9471 return null;
9472 } 9472 }
9473 Object visitVariableDeclaration(VariableDeclaration node) { 9473 Object visitVariableDeclaration(VariableDeclaration node) {
9474 super.visitVariableDeclaration(node); 9474 super.visitVariableDeclaration(node);
9475 Expression initializer2 = node.initializer; 9475 Expression initializer = node.initializer;
9476 if (initializer2 != null && node.isConst()) { 9476 if (initializer != null && node.isConst()) {
9477 VariableElementImpl element2 = node.element as VariableElementImpl; 9477 VariableElementImpl element = node.element as VariableElementImpl;
9478 EvaluationResultImpl result = element2.evaluationResult; 9478 EvaluationResultImpl result = element.evaluationResult;
9479 if (result == null) { 9479 if (result == null) {
9480 result = validate(initializer2, CompileTimeErrorCode.CONST_INITIALIZED_W ITH_NON_CONSTANT_VALUE); 9480 result = validate(initializer, CompileTimeErrorCode.CONST_INITIALIZED_WI TH_NON_CONSTANT_VALUE);
9481 element2.evaluationResult = result; 9481 element.evaluationResult = result;
9482 } else if (result is ErrorResult) { 9482 } else if (result is ErrorResult) {
9483 reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CON STANT_VALUE); 9483 reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CON STANT_VALUE);
9484 } 9484 }
9485 } 9485 }
9486 return null; 9486 return null;
9487 } 9487 }
9488 9488
9489 /** 9489 /**
9490 * Return {@code true} if the given value is the result of evaluating an expre ssion whose value is 9490 * Return {@code true} if the given value is the result of evaluating an expre ssion whose value is
9491 * a valid key in a const map literal. Keys in const map literals must be eith er a string, number, 9491 * a valid key in a const map literal. Keys in const map literals must be eith er a string, number,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
9529 9529
9530 /** 9530 /**
9531 * Validate that if the passed instance creation is 'const' then all its argum ents are constant 9531 * Validate that if the passed instance creation is 'const' then all its argum ents are constant
9532 * expressions. 9532 * expressions.
9533 * @param node the instance creation evaluate 9533 * @param node the instance creation evaluate
9534 */ 9534 */
9535 void validateConstantArguments(InstanceCreationExpression node) { 9535 void validateConstantArguments(InstanceCreationExpression node) {
9536 if (!node.isConst()) { 9536 if (!node.isConst()) {
9537 return; 9537 return;
9538 } 9538 }
9539 ArgumentList argumentList2 = node.argumentList; 9539 ArgumentList argumentList = node.argumentList;
9540 if (argumentList2 == null) { 9540 if (argumentList == null) {
9541 return; 9541 return;
9542 } 9542 }
9543 for (Expression argument in argumentList2.arguments) { 9543 for (Expression argument in argumentList.arguments) {
9544 if (argument is NamedExpression) { 9544 if (argument is NamedExpression) {
9545 argument = ((argument as NamedExpression)).expression; 9545 argument = ((argument as NamedExpression)).expression;
9546 } 9546 }
9547 validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT); 9547 validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
9548 } 9548 }
9549 } 9549 }
9550 9550
9551 /** 9551 /**
9552 * Validate that the default value associated with each of the parameters in t he given list is a 9552 * Validate that the default value associated with each of the parameters in t he given list is a
9553 * compile time constant. 9553 * compile time constant.
9554 * @param parameters the list of parameters to be validated 9554 * @param parameters the list of parameters to be validated
9555 */ 9555 */
9556 void validateDefaultValues(FormalParameterList parameters2) { 9556 void validateDefaultValues(FormalParameterList parameters2) {
9557 if (parameters2 == null) { 9557 if (parameters2 == null) {
9558 return; 9558 return;
9559 } 9559 }
9560 for (FormalParameter parameter in parameters2.parameters) { 9560 for (FormalParameter parameter in parameters2.parameters) {
9561 if (parameter is DefaultFormalParameter) { 9561 if (parameter is DefaultFormalParameter) {
9562 DefaultFormalParameter defaultParameter = parameter as DefaultFormalPara meter; 9562 DefaultFormalParameter defaultParameter = parameter as DefaultFormalPara meter;
9563 Expression defaultValue2 = defaultParameter.defaultValue; 9563 Expression defaultValue = defaultParameter.defaultValue;
9564 if (defaultValue2 != null) { 9564 if (defaultValue != null) {
9565 EvaluationResultImpl result = validate(defaultValue2, CompileTimeError Code.NON_CONSTANT_DEFAULT_VALUE); 9565 EvaluationResultImpl result = validate(defaultValue, CompileTimeErrorC ode.NON_CONSTANT_DEFAULT_VALUE);
9566 if (defaultParameter.isConst()) { 9566 if (defaultParameter.isConst()) {
9567 VariableElementImpl element2 = parameter.element as VariableElementI mpl; 9567 VariableElementImpl element = parameter.element as VariableElementIm pl;
9568 element2.evaluationResult = result; 9568 element.evaluationResult = result;
9569 } 9569 }
9570 } 9570 }
9571 } 9571 }
9572 } 9572 }
9573 } 9573 }
9574 9574
9575 /** 9575 /**
9576 * Validates that the given expression is a compile time constant. 9576 * Validates that the given expression is a compile time constant.
9577 * @param parameterElements the elements of parameters of constant constructor , they are 9577 * @param parameterElements the elements of parameters of constant constructor , they are
9578 * considered as a valid potentially constant expressions 9578 * considered as a valid potentially constant expressions
(...skipping 19 matching lines...) Expand all
9598 } 9598 }
9599 } 9599 }
9600 9600
9601 /** 9601 /**
9602 * Validates that the expressions of the given initializers (of a constant con structor) are all 9602 * Validates that the expressions of the given initializers (of a constant con structor) are all
9603 * compile time constants. 9603 * compile time constants.
9604 * @param constructor the constant constructor declaration to validate 9604 * @param constructor the constant constructor declaration to validate
9605 */ 9605 */
9606 void validateInitializers(ConstructorDeclaration constructor) { 9606 void validateInitializers(ConstructorDeclaration constructor) {
9607 List<ParameterElement> parameterElements = constructor.parameters.elements; 9607 List<ParameterElement> parameterElements = constructor.parameters.elements;
9608 NodeList<ConstructorInitializer> initializers2 = constructor.initializers; 9608 NodeList<ConstructorInitializer> initializers = constructor.initializers;
9609 for (ConstructorInitializer initializer in initializers2) { 9609 for (ConstructorInitializer initializer in initializers) {
9610 if (initializer is ConstructorFieldInitializer) { 9610 if (initializer is ConstructorFieldInitializer) {
9611 ConstructorFieldInitializer fieldInitializer = initializer as Constructo rFieldInitializer; 9611 ConstructorFieldInitializer fieldInitializer = initializer as Constructo rFieldInitializer;
9612 validateInitializerExpression(parameterElements, fieldInitializer.expres sion); 9612 validateInitializerExpression(parameterElements, fieldInitializer.expres sion);
9613 } 9613 }
9614 if (initializer is RedirectingConstructorInvocation) { 9614 if (initializer is RedirectingConstructorInvocation) {
9615 RedirectingConstructorInvocation invocation = initializer as Redirecting ConstructorInvocation; 9615 RedirectingConstructorInvocation invocation = initializer as Redirecting ConstructorInvocation;
9616 validateInitializerInvocationArguments(parameterElements, invocation.arg umentList); 9616 validateInitializerInvocationArguments(parameterElements, invocation.arg umentList);
9617 } 9617 }
9618 if (initializer is SuperConstructorInvocation) { 9618 if (initializer is SuperConstructorInvocation) {
9619 SuperConstructorInvocation invocation = initializer as SuperConstructorI nvocation; 9619 SuperConstructorInvocation invocation = initializer as SuperConstructorI nvocation;
9620 validateInitializerInvocationArguments(parameterElements, invocation.arg umentList); 9620 validateInitializerInvocationArguments(parameterElements, invocation.arg umentList);
9621 } 9621 }
9622 } 9622 }
9623 } 9623 }
9624 } 9624 }
9625 class ConstantVisitor_10 extends ConstantVisitor { 9625 class ConstantVisitor_10 extends ConstantVisitor {
9626 final ConstantVerifier ConstantVerifier_this; 9626 final ConstantVerifier ConstantVerifier_this;
9627 List<ParameterElement> parameterElements; 9627 List<ParameterElement> parameterElements;
9628 ConstantVisitor_10(this.ConstantVerifier_this, this.parameterElements) : super (); 9628 ConstantVisitor_10(this.ConstantVerifier_this, this.parameterElements) : super ();
9629 EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) { 9629 EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
9630 Element element2 = node.element; 9630 Element element = node.element;
9631 for (ParameterElement parameterElement in parameterElements) { 9631 for (ParameterElement parameterElement in parameterElements) {
9632 if (identical(parameterElement, element2) && parameterElement != null) { 9632 if (identical(parameterElement, element) && parameterElement != null) {
9633 Type2 type2 = parameterElement.type; 9633 Type2 type = parameterElement.type;
9634 if (type2 != null) { 9634 if (type != null) {
9635 if (type2.isDynamic()) { 9635 if (type.isDynamic()) {
9636 return ValidResult.RESULT_DYNAMIC; 9636 return ValidResult.RESULT_DYNAMIC;
9637 } 9637 }
9638 if (type2.isSubtypeOf(ConstantVerifier_this._boolType)) { 9638 if (type.isSubtypeOf(ConstantVerifier_this._boolType)) {
9639 return ValidResult.RESULT_BOOL; 9639 return ValidResult.RESULT_BOOL;
9640 } 9640 }
9641 if (type2.isSubtypeOf(ConstantVerifier_this._intType)) { 9641 if (type.isSubtypeOf(ConstantVerifier_this._intType)) {
9642 return ValidResult.RESULT_INT; 9642 return ValidResult.RESULT_INT;
9643 } 9643 }
9644 if (type2.isSubtypeOf(ConstantVerifier_this._numType)) { 9644 if (type.isSubtypeOf(ConstantVerifier_this._numType)) {
9645 return ValidResult.RESULT_NUM; 9645 return ValidResult.RESULT_NUM;
9646 } 9646 }
9647 if (type2.isSubtypeOf(ConstantVerifier_this._stringType)) { 9647 if (type.isSubtypeOf(ConstantVerifier_this._stringType)) {
9648 return ValidResult.RESULT_STRING; 9648 return ValidResult.RESULT_STRING;
9649 } 9649 }
9650 } 9650 }
9651 return ValidResult.RESULT_OBJECT; 9651 return ValidResult.RESULT_OBJECT;
9652 } 9652 }
9653 } 9653 }
9654 return super.visitSimpleIdentifier(node); 9654 return super.visitSimpleIdentifier(node);
9655 } 9655 }
9656 } 9656 }
9657 /** 9657 /**
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
9794 } 9794 }
9795 Object visitArgumentList(ArgumentList node) { 9795 Object visitArgumentList(ArgumentList node) {
9796 checkForArgumentTypeNotAssignable(node); 9796 checkForArgumentTypeNotAssignable(node);
9797 return super.visitArgumentList(node); 9797 return super.visitArgumentList(node);
9798 } 9798 }
9799 Object visitAssertStatement(AssertStatement node) { 9799 Object visitAssertStatement(AssertStatement node) {
9800 checkForNonBoolExpression(node); 9800 checkForNonBoolExpression(node);
9801 return super.visitAssertStatement(node); 9801 return super.visitAssertStatement(node);
9802 } 9802 }
9803 Object visitAssignmentExpression(AssignmentExpression node) { 9803 Object visitAssignmentExpression(AssignmentExpression node) {
9804 sc.Token operator2 = node.operator; 9804 sc.Token operator = node.operator;
9805 sc.TokenType operatorType = operator2.type; 9805 sc.TokenType operatorType = operator.type;
9806 if (identical(operatorType, sc.TokenType.EQ)) { 9806 if (identical(operatorType, sc.TokenType.EQ)) {
9807 checkForInvalidAssignment2(node.leftHandSide, node.rightHandSide); 9807 checkForInvalidAssignment2(node.leftHandSide, node.rightHandSide);
9808 } else { 9808 } else {
9809 checkForInvalidAssignment(node); 9809 checkForInvalidAssignment(node);
9810 } 9810 }
9811 checkForAssignmentToFinal(node); 9811 checkForAssignmentToFinal(node);
9812 return super.visitAssignmentExpression(node); 9812 return super.visitAssignmentExpression(node);
9813 } 9813 }
9814 Object visitBinaryExpression(BinaryExpression node) { 9814 Object visitBinaryExpression(BinaryExpression node) {
9815 checkForArgumentTypeNotAssignable2(node.rightOperand); 9815 checkForArgumentTypeNotAssignable2(node.rightOperand);
9816 return super.visitBinaryExpression(node); 9816 return super.visitBinaryExpression(node);
9817 } 9817 }
9818 Object visitCatchClause(CatchClause node) { 9818 Object visitCatchClause(CatchClause node) {
9819 bool previousIsInCatchClause = _isInCatchClause; 9819 bool previousIsInCatchClause = _isInCatchClause;
9820 try { 9820 try {
9821 _isInCatchClause = true; 9821 _isInCatchClause = true;
9822 return super.visitCatchClause(node); 9822 return super.visitCatchClause(node);
9823 } finally { 9823 } finally {
9824 _isInCatchClause = previousIsInCatchClause; 9824 _isInCatchClause = previousIsInCatchClause;
9825 } 9825 }
9826 } 9826 }
9827 Object visitClassDeclaration(ClassDeclaration node) { 9827 Object visitClassDeclaration(ClassDeclaration node) {
9828 ClassElement outerClass = _enclosingClass; 9828 ClassElement outerClass = _enclosingClass;
9829 try { 9829 try {
9830 _enclosingClass = node.element; 9830 _enclosingClass = node.element;
9831 WithClause withClause2 = node.withClause; 9831 WithClause withClause = node.withClause;
9832 ImplementsClause implementsClause2 = node.implementsClause; 9832 ImplementsClause implementsClause = node.implementsClause;
9833 ExtendsClause extendsClause2 = node.extendsClause; 9833 ExtendsClause extendsClause = node.extendsClause;
9834 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_I DENTIFIER_AS_TYPE_NAME); 9834 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_I DENTIFIER_AS_TYPE_NAME);
9835 checkForMemberWithClassName(); 9835 checkForMemberWithClassName();
9836 checkForAllMixinErrorCodes(withClause2); 9836 checkForAllMixinErrorCodes(withClause);
9837 if (implementsClause2 != null || extendsClause2 != null) { 9837 if (implementsClause != null || extendsClause != null) {
9838 if (!checkForImplementsDisallowedClass(implementsClause2) && !checkForEx tendsDisallowedClass(extendsClause2)) { 9838 if (!checkForImplementsDisallowedClass(implementsClause) && !checkForExt endsDisallowedClass(extendsClause)) {
9839 checkForNonAbstractClassInheritsAbstractMember(node); 9839 checkForNonAbstractClassInheritsAbstractMember(node);
9840 checkForInconsistentMethodInheritance(); 9840 checkForInconsistentMethodInheritance();
9841 checkForRecursiveInterfaceInheritance(_enclosingClass, new List<ClassE lement>()); 9841 checkForRecursiveInterfaceInheritance(_enclosingClass, new List<ClassE lement>());
9842 } 9842 }
9843 } 9843 }
9844 ClassElement classElement = node.element; 9844 ClassElement classElement = node.element;
9845 if (classElement != null) { 9845 if (classElement != null) {
9846 List<FieldElement> fieldElements = classElement.fields; 9846 List<FieldElement> fieldElements = classElement.fields;
9847 _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>(); 9847 _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
9848 for (FieldElement fieldElement in fieldElements) { 9848 for (FieldElement fieldElement in fieldElements) {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
9937 try { 9937 try {
9938 SimpleIdentifier identifier = node.name; 9938 SimpleIdentifier identifier = node.name;
9939 String methoName = ""; 9939 String methoName = "";
9940 if (identifier != null) { 9940 if (identifier != null) {
9941 methoName = identifier.name; 9941 methoName = identifier.name;
9942 } 9942 }
9943 _enclosingFunction = node.element; 9943 _enclosingFunction = node.element;
9944 if (node.isSetter() || node.isGetter()) { 9944 if (node.isSetter() || node.isGetter()) {
9945 checkForMismatchedAccessorTypes(node, methoName); 9945 checkForMismatchedAccessorTypes(node, methoName);
9946 if (node.isSetter()) { 9946 if (node.isSetter()) {
9947 FunctionExpression functionExpression2 = node.functionExpression; 9947 FunctionExpression functionExpression = node.functionExpression;
9948 if (functionExpression2 != null) { 9948 if (functionExpression != null) {
9949 checkForWrongNumberOfParametersForSetter(node.name, functionExpressi on2.parameters); 9949 checkForWrongNumberOfParametersForSetter(node.name, functionExpressi on.parameters);
9950 } 9950 }
9951 TypeName returnType2 = node.returnType; 9951 TypeName returnType = node.returnType;
9952 checkForNonVoidReturnTypeForSetter(returnType2); 9952 checkForNonVoidReturnTypeForSetter(returnType);
9953 } 9953 }
9954 } 9954 }
9955 return super.visitFunctionDeclaration(node); 9955 return super.visitFunctionDeclaration(node);
9956 } finally { 9956 } finally {
9957 _enclosingFunction = outerFunction; 9957 _enclosingFunction = outerFunction;
9958 } 9958 }
9959 } 9959 }
9960 Object visitFunctionExpression(FunctionExpression node) { 9960 Object visitFunctionExpression(FunctionExpression node) {
9961 ExecutableElement outerFunction = _enclosingFunction; 9961 ExecutableElement outerFunction = _enclosingFunction;
9962 try { 9962 try {
(...skipping 15 matching lines...) Expand all
9978 Object visitImportDirective(ImportDirective node) { 9978 Object visitImportDirective(ImportDirective node) {
9979 checkForImportDuplicateLibraryName(node); 9979 checkForImportDuplicateLibraryName(node);
9980 checkForImportInternalLibrary(node); 9980 checkForImportInternalLibrary(node);
9981 return super.visitImportDirective(node); 9981 return super.visitImportDirective(node);
9982 } 9982 }
9983 Object visitIndexExpression(IndexExpression node) { 9983 Object visitIndexExpression(IndexExpression node) {
9984 checkForArgumentTypeNotAssignable2(node.index); 9984 checkForArgumentTypeNotAssignable2(node.index);
9985 return super.visitIndexExpression(node); 9985 return super.visitIndexExpression(node);
9986 } 9986 }
9987 Object visitInstanceCreationExpression(InstanceCreationExpression node) { 9987 Object visitInstanceCreationExpression(InstanceCreationExpression node) {
9988 ConstructorName constructorName2 = node.constructorName; 9988 ConstructorName constructorName = node.constructorName;
9989 TypeName typeName = constructorName2.type; 9989 TypeName typeName = constructorName.type;
9990 Type2 type2 = typeName.type; 9990 Type2 type = typeName.type;
9991 if (type2 is InterfaceType) { 9991 if (type is InterfaceType) {
9992 InterfaceType interfaceType = type2 as InterfaceType; 9992 InterfaceType interfaceType = type as InterfaceType;
9993 checkForConstOrNewWithAbstractClass(node, typeName, interfaceType); 9993 checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
9994 if (node.isConst()) { 9994 if (node.isConst()) {
9995 checkForConstWithNonConst(node); 9995 checkForConstWithNonConst(node);
9996 checkForConstWithUndefinedConstructor(node); 9996 checkForConstWithUndefinedConstructor(node);
9997 checkForConstWithTypeParameters(node); 9997 checkForConstWithTypeParameters(node);
9998 } else { 9998 } else {
9999 checkForNewWithUndefinedConstructor(node); 9999 checkForNewWithUndefinedConstructor(node);
10000 } 10000 }
10001 checkForTypeArgumentNotMatchingBounds(node, constructorName2.element, type Name); 10001 checkForTypeArgumentNotMatchingBounds(node, constructorName.element, typeN ame);
10002 } 10002 }
10003 return super.visitInstanceCreationExpression(node); 10003 return super.visitInstanceCreationExpression(node);
10004 } 10004 }
10005 Object visitListLiteral(ListLiteral node) { 10005 Object visitListLiteral(ListLiteral node) {
10006 if (node.modifier != null) { 10006 if (node.modifier != null) {
10007 TypeArgumentList typeArguments2 = node.typeArguments; 10007 TypeArgumentList typeArguments = node.typeArguments;
10008 if (typeArguments2 != null) { 10008 if (typeArguments != null) {
10009 NodeList<TypeName> arguments2 = typeArguments2.arguments; 10009 NodeList<TypeName> arguments = typeArguments.arguments;
10010 if (arguments2.length != 0) { 10010 if (arguments.length != 0) {
10011 checkForInvalidTypeArgumentInConstTypedLiteral(arguments2, CompileTime ErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST); 10011 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
10012 } 10012 }
10013 } 10013 }
10014 } 10014 }
10015 return super.visitListLiteral(node); 10015 return super.visitListLiteral(node);
10016 } 10016 }
10017 Object visitMapLiteral(MapLiteral node) { 10017 Object visitMapLiteral(MapLiteral node) {
10018 TypeArgumentList typeArguments2 = node.typeArguments; 10018 TypeArgumentList typeArguments = node.typeArguments;
10019 if (typeArguments2 != null) { 10019 if (typeArguments != null) {
10020 NodeList<TypeName> arguments2 = typeArguments2.arguments; 10020 NodeList<TypeName> arguments = typeArguments.arguments;
10021 if (arguments2.length != 0) { 10021 if (arguments.length != 0) {
10022 checkForInvalidTypeArgumentForKey(arguments2); 10022 checkForInvalidTypeArgumentForKey(arguments);
10023 if (node.modifier != null) { 10023 if (node.modifier != null) {
10024 checkForInvalidTypeArgumentInConstTypedLiteral(arguments2, CompileTime ErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP); 10024 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
10025 } 10025 }
10026 } 10026 }
10027 } 10027 }
10028 checkForNonConstMapAsExpressionStatement(node); 10028 checkForNonConstMapAsExpressionStatement(node);
10029 return super.visitMapLiteral(node); 10029 return super.visitMapLiteral(node);
10030 } 10030 }
10031 Object visitMethodDeclaration(MethodDeclaration node) { 10031 Object visitMethodDeclaration(MethodDeclaration node) {
10032 ExecutableElement previousFunction = _enclosingFunction; 10032 ExecutableElement previousFunction = _enclosingFunction;
10033 try { 10033 try {
10034 _enclosingFunction = node.element; 10034 _enclosingFunction = node.element;
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
10139 } 10139 }
10140 Object visitTypeParameter(TypeParameter node) { 10140 Object visitTypeParameter(TypeParameter node) {
10141 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDE NTIFIER_AS_TYPE_VARIABLE_NAME); 10141 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDE NTIFIER_AS_TYPE_VARIABLE_NAME);
10142 return super.visitTypeParameter(node); 10142 return super.visitTypeParameter(node);
10143 } 10143 }
10144 Object visitVariableDeclaration(VariableDeclaration node) { 10144 Object visitVariableDeclaration(VariableDeclaration node) {
10145 SimpleIdentifier nameNode = node.name; 10145 SimpleIdentifier nameNode = node.name;
10146 Expression initializerNode = node.initializer; 10146 Expression initializerNode = node.initializer;
10147 checkForInvalidAssignment2(nameNode, initializerNode); 10147 checkForInvalidAssignment2(nameNode, initializerNode);
10148 nameNode.accept(this); 10148 nameNode.accept(this);
10149 String name2 = nameNode.name; 10149 String name = nameNode.name;
10150 javaSetAdd(_namesForReferenceToDeclaredVariableInInitializer, name2); 10150 javaSetAdd(_namesForReferenceToDeclaredVariableInInitializer, name);
10151 try { 10151 try {
10152 if (initializerNode != null) { 10152 if (initializerNode != null) {
10153 initializerNode.accept(this); 10153 initializerNode.accept(this);
10154 } 10154 }
10155 } finally { 10155 } finally {
10156 _namesForReferenceToDeclaredVariableInInitializer.remove(name2); 10156 _namesForReferenceToDeclaredVariableInInitializer.remove(name);
10157 } 10157 }
10158 return null; 10158 return null;
10159 } 10159 }
10160 Object visitVariableDeclarationList(VariableDeclarationList node) { 10160 Object visitVariableDeclarationList(VariableDeclarationList node) {
10161 checkForBuiltInIdentifierAsName2(node); 10161 checkForBuiltInIdentifierAsName2(node);
10162 return super.visitVariableDeclarationList(node); 10162 return super.visitVariableDeclarationList(node);
10163 } 10163 }
10164 Object visitVariableDeclarationStatement(VariableDeclarationStatement node) { 10164 Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
10165 checkForFinalNotInitialized2(node.variables); 10165 checkForFinalNotInitialized2(node.variables);
10166 return super.visitVariableDeclarationStatement(node); 10166 return super.visitVariableDeclarationStatement(node);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
10202 foundError = true; 10202 foundError = true;
10203 } 10203 }
10204 } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) { 10204 } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
10205 if (fieldElement.isFinal() || fieldElement.isConst()) { 10205 if (fieldElement.isFinal() || fieldElement.isConst()) {
10206 _errorReporter.reportError2(CompileTimeErrorCode.FINAL_INITIALIZED_M ULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]); 10206 _errorReporter.reportError2(CompileTimeErrorCode.FINAL_INITIALIZED_M ULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
10207 foundError = true; 10207 foundError = true;
10208 } 10208 }
10209 } 10209 }
10210 } 10210 }
10211 } 10211 }
10212 NodeList<ConstructorInitializer> initializers2 = node.initializers; 10212 NodeList<ConstructorInitializer> initializers = node.initializers;
10213 for (ConstructorInitializer constructorInitializer in initializers2) { 10213 for (ConstructorInitializer constructorInitializer in initializers) {
10214 if (constructorInitializer is ConstructorFieldInitializer) { 10214 if (constructorInitializer is ConstructorFieldInitializer) {
10215 ConstructorFieldInitializer constructorFieldInitializer = constructorIni tializer as ConstructorFieldInitializer; 10215 ConstructorFieldInitializer constructorFieldInitializer = constructorIni tializer as ConstructorFieldInitializer;
10216 SimpleIdentifier fieldName2 = constructorFieldInitializer.fieldName; 10216 SimpleIdentifier fieldName = constructorFieldInitializer.fieldName;
10217 Element element2 = fieldName2.element; 10217 Element element = fieldName.element;
10218 if (element2 is FieldElement) { 10218 if (element is FieldElement) {
10219 FieldElement fieldElement = element2 as FieldElement; 10219 FieldElement fieldElement = element as FieldElement;
10220 INIT_STATE state = fieldElementsMap[fieldElement]; 10220 INIT_STATE state = fieldElementsMap[fieldElement];
10221 if (identical(state, INIT_STATE.NOT_INIT)) { 10221 if (identical(state, INIT_STATE.NOT_INIT)) {
10222 fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS; 10222 fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
10223 } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) { 10223 } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
10224 if (fieldElement.isFinal() || fieldElement.isConst()) { 10224 if (fieldElement.isFinal() || fieldElement.isConst()) {
10225 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED _IN_INITIALIZER_AND_DECLARATION, fieldName2, []); 10225 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED _IN_INITIALIZER_AND_DECLARATION, fieldName, []);
10226 foundError = true; 10226 foundError = true;
10227 } 10227 }
10228 } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) { 10228 } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
10229 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_I N_PARAMETER_AND_INITIALIZER, fieldName2, []); 10229 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_I N_PARAMETER_AND_INITIALIZER, fieldName, []);
10230 foundError = true; 10230 foundError = true;
10231 } else if (identical(state, INIT_STATE.INIT_IN_INITIALIZERS)) { 10231 } else if (identical(state, INIT_STATE.INIT_IN_INITIALIZERS)) {
10232 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_B Y_MULTIPLE_INITIALIZERS, fieldName2, [fieldElement.displayName]); 10232 _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_B Y_MULTIPLE_INITIALIZERS, fieldName, [fieldElement.displayName]);
10233 foundError = true; 10233 foundError = true;
10234 } 10234 }
10235 } 10235 }
10236 } 10236 }
10237 } 10237 }
10238 return foundError; 10238 return foundError;
10239 } 10239 }
10240 10240
10241 /** 10241 /**
10242 * This checks the passed method declaration against override-error codes. 10242 * This checks the passed method declaration against override-error codes.
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
10519 * already exported by other export directive. 10519 * already exported by other export directive.
10520 * @param node the export directive node to report problem on 10520 * @param node the export directive node to report problem on
10521 * @return {@code true} if and only if an error code is generated on the passe d node 10521 * @return {@code true} if and only if an error code is generated on the passe d node
10522 * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT 10522 * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
10523 */ 10523 */
10524 bool checkForAmbiguousExport(ExportDirective node) { 10524 bool checkForAmbiguousExport(ExportDirective node) {
10525 if (node.element is! ExportElement) { 10525 if (node.element is! ExportElement) {
10526 return false; 10526 return false;
10527 } 10527 }
10528 ExportElement exportElement = node.element as ExportElement; 10528 ExportElement exportElement = node.element as ExportElement;
10529 LibraryElement exportedLibrary2 = exportElement.exportedLibrary; 10529 LibraryElement exportedLibrary = exportElement.exportedLibrary;
10530 if (exportedLibrary2 == null) { 10530 if (exportedLibrary == null) {
10531 return false; 10531 return false;
10532 } 10532 }
10533 Namespace namespace = new NamespaceBuilder().createExportNamespace(exportEle ment); 10533 Namespace namespace = new NamespaceBuilder().createExportNamespace(exportEle ment);
10534 Set<String> newNames = namespace.definedNames.keys.toSet(); 10534 Set<String> newNames = namespace.definedNames.keys.toSet();
10535 for (String name in newNames) { 10535 for (String name in newNames) {
10536 ExportElement prevElement = _exportedNames[name]; 10536 ExportElement prevElement = _exportedNames[name];
10537 if (prevElement != null && prevElement != exportElement) { 10537 if (prevElement != null && prevElement != exportElement) {
10538 _errorReporter.reportError2(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [name, prevElement.exportedLibrary.definingCompilationUnit.displayName, exporte dLibrary2.definingCompilationUnit.displayName]); 10538 _errorReporter.reportError2(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [name, prevElement.exportedLibrary.definingCompilationUnit.displayName, exporte dLibrary.definingCompilationUnit.displayName]);
10539 return true; 10539 return true;
10540 } else { 10540 } else {
10541 _exportedNames[name] = exportElement; 10541 _exportedNames[name] = exportElement;
10542 } 10542 }
10543 } 10543 }
10544 return false; 10544 return false;
10545 } 10545 }
10546 10546
10547 /** 10547 /**
10548 * This verifies that the passed argument definition test identifier is a para meter. 10548 * This verifies that the passed argument definition test identifier is a para meter.
10549 * @param node the {@link ArgumentDefinitionTest} to evaluate 10549 * @param node the {@link ArgumentDefinitionTest} to evaluate
10550 * @return {@code true} if and only if an error code is generated on the passe d node 10550 * @return {@code true} if and only if an error code is generated on the passe d node
10551 * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER 10551 * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER
10552 */ 10552 */
10553 bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) { 10553 bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) {
10554 SimpleIdentifier identifier2 = node.identifier; 10554 SimpleIdentifier identifier = node.identifier;
10555 Element element2 = identifier2.element; 10555 Element element = identifier.element;
10556 if (element2 != null && element2 is! ParameterElement) { 10556 if (element != null && element is! ParameterElement) {
10557 _errorReporter.reportError2(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_ NON_PARAMETER, identifier2, [identifier2.name]); 10557 _errorReporter.reportError2(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_ NON_PARAMETER, identifier, [identifier.name]);
10558 return true; 10558 return true;
10559 } 10559 }
10560 return false; 10560 return false;
10561 } 10561 }
10562 10562
10563 /** 10563 /**
10564 * This verifies that the passed arguments can be assigned to their correspond ing parameters. 10564 * This verifies that the passed arguments can be assigned to their correspond ing parameters.
10565 * @param node the arguments to evaluate 10565 * @param node the arguments to evaluate
10566 * @return {@code true} if and only if an error code is generated on the passe d node 10566 * @return {@code true} if and only if an error code is generated on the passe d node
10567 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE 10567 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
(...skipping 12 matching lines...) Expand all
10580 /** 10580 /**
10581 * This verifies that the passed argument can be assigned to their correspondi ng parameters. 10581 * This verifies that the passed argument can be assigned to their correspondi ng parameters.
10582 * @param node the argument to evaluate 10582 * @param node the argument to evaluate
10583 * @return {@code true} if and only if an error code is generated on the passe d node 10583 * @return {@code true} if and only if an error code is generated on the passe d node
10584 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE 10584 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
10585 */ 10585 */
10586 bool checkForArgumentTypeNotAssignable2(Expression argument) { 10586 bool checkForArgumentTypeNotAssignable2(Expression argument) {
10587 if (argument == null) { 10587 if (argument == null) {
10588 return false; 10588 return false;
10589 } 10589 }
10590 ParameterElement staticParameterElement2 = argument.staticParameterElement; 10590 ParameterElement staticParameterElement = argument.staticParameterElement;
10591 Type2 staticParameterType = staticParameterElement2 == null ? null : staticP arameterElement2.type; 10591 Type2 staticParameterType = staticParameterElement == null ? null : staticPa rameterElement.type;
10592 Type2 staticArgumentType = getStaticType(argument); 10592 Type2 staticArgumentType = getStaticType(argument);
10593 if (staticArgumentType == null || staticParameterType == null) { 10593 if (staticArgumentType == null || staticParameterType == null) {
10594 return false; 10594 return false;
10595 } 10595 }
10596 if (_strictMode) { 10596 if (_strictMode) {
10597 if (staticArgumentType.isAssignableTo(staticParameterType)) { 10597 if (staticArgumentType.isAssignableTo(staticParameterType)) {
10598 return false; 10598 return false;
10599 } 10599 }
10600 _errorReporter.reportError2(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE , argument, [staticArgumentType.displayName, staticParameterType.displayName]); 10600 _errorReporter.reportError2(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE , argument, [staticArgumentType.displayName, staticParameterType.displayName]);
10601 return true; 10601 return true;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
10666 * on the identifier if it is a keyword. 10666 * on the identifier if it is a keyword.
10667 * @param identifier the identifier to check to ensure that it is not a keywor d 10667 * @param identifier the identifier to check to ensure that it is not a keywor d
10668 * @param errorCode if the passed identifier is a keyword then this error code is created on the 10668 * @param errorCode if the passed identifier is a keyword then this error code is created on the
10669 * identifier, the error code will be one of{@link CompileTimeErrorCode#BUILT_ IN_IDENTIFIER_AS_TYPE_NAME},{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_T YPE_VARIABLE_NAME} or{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_ NAME} 10669 * identifier, the error code will be one of{@link CompileTimeErrorCode#BUILT_ IN_IDENTIFIER_AS_TYPE_NAME},{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_T YPE_VARIABLE_NAME} or{@link CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_ NAME}
10670 * @return {@code true} if and only if an error code is generated on the passe d node 10670 * @return {@code true} if and only if an error code is generated on the passe d node
10671 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME 10671 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
10672 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME 10672 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME
10673 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME 10673 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
10674 */ 10674 */
10675 bool checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode er rorCode) { 10675 bool checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode er rorCode) {
10676 sc.Token token2 = identifier.token; 10676 sc.Token token = identifier.token;
10677 if (identical(token2.type, sc.TokenType.KEYWORD)) { 10677 if (identical(token.type, sc.TokenType.KEYWORD)) {
10678 _errorReporter.reportError2(errorCode, identifier, [identifier.name]); 10678 _errorReporter.reportError2(errorCode, identifier, [identifier.name]);
10679 return true; 10679 return true;
10680 } 10680 }
10681 return false; 10681 return false;
10682 } 10682 }
10683 10683
10684 /** 10684 /**
10685 * This verifies that the passed variable declaration list does not have a bui lt-in identifier. 10685 * This verifies that the passed variable declaration list does not have a bui lt-in identifier.
10686 * @param node the variable declaration list to check 10686 * @param node the variable declaration list to check
10687 * @return {@code true} if and only if an error code is generated on the passe d node 10687 * @return {@code true} if and only if an error code is generated on the passe d node
10688 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE 10688 * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE
10689 */ 10689 */
10690 bool checkForBuiltInIdentifierAsName2(VariableDeclarationList node) { 10690 bool checkForBuiltInIdentifierAsName2(VariableDeclarationList node) {
10691 TypeName typeName = node.type; 10691 TypeName typeName = node.type;
10692 if (typeName != null) { 10692 if (typeName != null) {
10693 Identifier identifier = typeName.name; 10693 Identifier identifier = typeName.name;
10694 if (identifier is SimpleIdentifier) { 10694 if (identifier is SimpleIdentifier) {
10695 SimpleIdentifier simpleIdentifier = identifier as SimpleIdentifier; 10695 SimpleIdentifier simpleIdentifier = identifier as SimpleIdentifier;
10696 sc.Token token2 = simpleIdentifier.token; 10696 sc.Token token = simpleIdentifier.token;
10697 if (identical(token2.type, sc.TokenType.KEYWORD)) { 10697 if (identical(token.type, sc.TokenType.KEYWORD)) {
10698 if (((token2 as sc.KeywordToken)).keyword != sc.Keyword.DYNAMIC) { 10698 if (((token as sc.KeywordToken)).keyword != sc.Keyword.DYNAMIC) {
10699 _errorReporter.reportError2(CompileTimeErrorCode.BUILT_IN_IDENTIFIER _AS_TYPE, identifier, [identifier.name]); 10699 _errorReporter.reportError2(CompileTimeErrorCode.BUILT_IN_IDENTIFIER _AS_TYPE, identifier, [identifier.name]);
10700 return true; 10700 return true;
10701 } 10701 }
10702 } 10702 }
10703 } 10703 }
10704 } 10704 }
10705 return false; 10705 return false;
10706 } 10706 }
10707 10707
10708 /** 10708 /**
10709 * This verifies that the given switch case is terminated with 'break', 'conti nue', 'return' or 10709 * This verifies that the given switch case is terminated with 'break', 'conti nue', 'return' or
10710 * 'throw'. 10710 * 'throw'.
10711 * @param node the switch case to evaluate 10711 * @param node the switch case to evaluate
10712 * @return {@code true} if and only if an error code is generated on the passe d node 10712 * @return {@code true} if and only if an error code is generated on the passe d node
10713 * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED 10713 * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
10714 */ 10714 */
10715 bool checkForCaseBlockNotTerminated(SwitchCase node) { 10715 bool checkForCaseBlockNotTerminated(SwitchCase node) {
10716 NodeList<Statement> statements2 = node.statements; 10716 NodeList<Statement> statements = node.statements;
10717 if (statements2.isEmpty) { 10717 if (statements.isEmpty) {
10718 ASTNode parent2 = node.parent; 10718 ASTNode parent = node.parent;
10719 if (parent2 is SwitchStatement) { 10719 if (parent is SwitchStatement) {
10720 SwitchStatement switchStatement = parent2 as SwitchStatement; 10720 SwitchStatement switchStatement = parent as SwitchStatement;
10721 NodeList<SwitchMember> members2 = switchStatement.members; 10721 NodeList<SwitchMember> members = switchStatement.members;
10722 int index = members2.indexOf(node); 10722 int index = members.indexOf(node);
10723 if (index != -1 && index < members2.length - 1) { 10723 if (index != -1 && index < members.length - 1) {
10724 return false; 10724 return false;
10725 } 10725 }
10726 } 10726 }
10727 } else { 10727 } else {
10728 Statement statement = statements2[statements2.length - 1]; 10728 Statement statement = statements[statements.length - 1];
10729 if (statement is BreakStatement || statement is ContinueStatement || state ment is ReturnStatement) { 10729 if (statement is BreakStatement || statement is ContinueStatement || state ment is ReturnStatement) {
10730 return false; 10730 return false;
10731 } 10731 }
10732 if (statement is ExpressionStatement) { 10732 if (statement is ExpressionStatement) {
10733 Expression expression2 = ((statement as ExpressionStatement)).expression ; 10733 Expression expression = ((statement as ExpressionStatement)).expression;
10734 if (expression2 is ThrowExpression) { 10734 if (expression is ThrowExpression) {
10735 return false; 10735 return false;
10736 } 10736 }
10737 } 10737 }
10738 } 10738 }
10739 _errorReporter.reportError4(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, nod e.keyword, []); 10739 _errorReporter.reportError4(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, nod e.keyword, []);
10740 return true; 10740 return true;
10741 } 10741 }
10742 10742
10743 /** 10743 /**
10744 * This verifies that the switch cases in the given switch statement is termin ated with 'break', 10744 * This verifies that the switch cases in the given switch statement is termin ated with 'break',
10745 * 'continue', 'return' or 'throw'. 10745 * 'continue', 'return' or 'throw'.
10746 * @param node the switch statement containing the cases to be checked 10746 * @param node the switch statement containing the cases to be checked
10747 * @return {@code true} if and only if an error code is generated on the passe d node 10747 * @return {@code true} if and only if an error code is generated on the passe d node
10748 * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED 10748 * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
10749 */ 10749 */
10750 bool checkForCaseBlocksNotTerminated(SwitchStatement node) { 10750 bool checkForCaseBlocksNotTerminated(SwitchStatement node) {
10751 bool foundError = false; 10751 bool foundError = false;
10752 NodeList<SwitchMember> members2 = node.members; 10752 NodeList<SwitchMember> members = node.members;
10753 int lastMember = members2.length - 1; 10753 int lastMember = members.length - 1;
10754 for (int i = 0; i < lastMember; i++) { 10754 for (int i = 0; i < lastMember; i++) {
10755 SwitchMember member = members2[i]; 10755 SwitchMember member = members[i];
10756 if (member is SwitchCase) { 10756 if (member is SwitchCase) {
10757 foundError = javaBooleanOr(foundError, checkForCaseBlockNotTerminated((m ember as SwitchCase))); 10757 foundError = javaBooleanOr(foundError, checkForCaseBlockNotTerminated((m ember as SwitchCase)));
10758 } 10758 }
10759 } 10759 }
10760 return foundError; 10760 return foundError;
10761 } 10761 }
10762 10762
10763 /** 10763 /**
10764 * This verifies that the passed switch statement does not have a case express ion with the 10764 * This verifies that the passed switch statement does not have a case express ion with the
10765 * operator '==' overridden. 10765 * operator '==' overridden.
10766 * @param node the switch statement to evaluate 10766 * @param node the switch statement to evaluate
10767 * @return {@code true} if and only if an error code is generated on the passe d node 10767 * @return {@code true} if and only if an error code is generated on the passe d node
10768 * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS 10768 * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
10769 */ 10769 */
10770 bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node) { 10770 bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node) {
10771 Expression expression2 = node.expression; 10771 Expression expression = node.expression;
10772 Type2 type = getStaticType(expression2); 10772 Type2 type = getStaticType(expression);
10773 if (type != null && type != _typeProvider.intType && type != _typeProvider.s tringType) { 10773 if (type != null && type != _typeProvider.intType && type != _typeProvider.s tringType) {
10774 Element element2 = type.element; 10774 Element element = type.element;
10775 if (element2 is ClassElement) { 10775 if (element is ClassElement) {
10776 ClassElement classElement = element2 as ClassElement; 10776 ClassElement classElement = element as ClassElement;
10777 MethodElement method = classElement.lookUpMethod("==", _currentLibrary); 10777 MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
10778 if (method != null && method.enclosingElement.type != _typeProvider.obje ctType) { 10778 if (method != null && method.enclosingElement.type != _typeProvider.obje ctType) {
10779 _errorReporter.reportError2(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_ IMPLEMENTS_EQUALS, expression2, [element2.displayName]); 10779 _errorReporter.reportError2(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_ IMPLEMENTS_EQUALS, expression, [element.displayName]);
10780 return true; 10780 return true;
10781 } 10781 }
10782 } 10782 }
10783 } 10783 }
10784 return false; 10784 return false;
10785 } 10785 }
10786 10786
10787 /** 10787 /**
10788 * This verifies that the passed method declaration is abstract only if the en closing class is 10788 * This verifies that the passed method declaration is abstract only if the en closing class is
10789 * also abstract. 10789 * also abstract.
(...skipping 16 matching lines...) Expand all
10806 * @param node the constructor declaration to evaluate 10806 * @param node the constructor declaration to evaluate
10807 * @return {@code true} if and only if an error code is generated on the passe d node 10807 * @return {@code true} if and only if an error code is generated on the passe d node
10808 * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT 10808 * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
10809 * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME 10809 * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
10810 * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD 10810 * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
10811 * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD 10811 * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
10812 */ 10812 */
10813 bool checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) { 10813 bool checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
10814 ConstructorElement constructorElement = node.element; 10814 ConstructorElement constructorElement = node.element;
10815 SimpleIdentifier constructorName = node.name; 10815 SimpleIdentifier constructorName = node.name;
10816 String name2 = constructorElement.name; 10816 String name = constructorElement.name;
10817 ClassElement classElement = constructorElement.enclosingElement; 10817 ClassElement classElement = constructorElement.enclosingElement;
10818 List<ConstructorElement> constructors2 = classElement.constructors; 10818 List<ConstructorElement> constructors = classElement.constructors;
10819 for (ConstructorElement otherConstructor in constructors2) { 10819 for (ConstructorElement otherConstructor in constructors) {
10820 if (identical(otherConstructor, constructorElement)) { 10820 if (identical(otherConstructor, constructorElement)) {
10821 continue; 10821 continue;
10822 } 10822 }
10823 if (name2 == otherConstructor.name) { 10823 if (name == otherConstructor.name) {
10824 if (name2 == null || name2.length == 0) { 10824 if (name == null || name.length == 0) {
10825 _errorReporter.reportError2(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR _DEFAULT, node, []); 10825 _errorReporter.reportError2(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR _DEFAULT, node, []);
10826 } else { 10826 } else {
10827 _errorReporter.reportError2(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR _NAME, node, [name2]); 10827 _errorReporter.reportError2(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR _NAME, node, [name]);
10828 } 10828 }
10829 return true; 10829 return true;
10830 } 10830 }
10831 } 10831 }
10832 if (constructorName != null && constructorElement != null && !constructorNam e.isSynthetic()) { 10832 if (constructorName != null && constructorElement != null && !constructorNam e.isSynthetic()) {
10833 List<FieldElement> fields2 = classElement.fields; 10833 List<FieldElement> fields = classElement.fields;
10834 for (FieldElement field in fields2) { 10834 for (FieldElement field in fields) {
10835 if (field.name == name2) { 10835 if (field.name == name) {
10836 _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCT OR_NAME_AND_FIELD, node, [name2]); 10836 _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCT OR_NAME_AND_FIELD, node, [name]);
10837 return true; 10837 return true;
10838 } 10838 }
10839 } 10839 }
10840 List<MethodElement> methods2 = classElement.methods; 10840 List<MethodElement> methods = classElement.methods;
10841 for (MethodElement method in methods2) { 10841 for (MethodElement method in methods) {
10842 if (method.name == name2) { 10842 if (method.name == name) {
10843 _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCT OR_NAME_AND_METHOD, node, [name2]); 10843 _errorReporter.reportError2(CompileTimeErrorCode.CONFLICTING_CONSTRUCT OR_NAME_AND_METHOD, node, [name]);
10844 return true; 10844 return true;
10845 } 10845 }
10846 } 10846 }
10847 } 10847 }
10848 return false; 10848 return false;
10849 } 10849 }
10850 10850
10851 /** 10851 /**
10852 * This verifies that the superclass of the enclosing class does not declare a ccessible static 10852 * This verifies that the superclass of the enclosing class does not declare a ccessible static
10853 * member with the same name as the passed instance getter/setter method decla ration. 10853 * member with the same name as the passed instance getter/setter method decla ration.
10854 * @param node the method declaration to evaluate 10854 * @param node the method declaration to evaluate
10855 * @return {@code true} if and only if an error code is generated on the passe d node 10855 * @return {@code true} if and only if an error code is generated on the passe d node
10856 * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER 10856 * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
10857 * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER 10857 * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
10858 */ 10858 */
10859 bool checkForConflictingInstanceGetterAndSuperclassMember(MethodDeclaration no de) { 10859 bool checkForConflictingInstanceGetterAndSuperclassMember(MethodDeclaration no de) {
10860 if (node.isStatic()) { 10860 if (node.isStatic()) {
10861 return false; 10861 return false;
10862 } 10862 }
10863 SimpleIdentifier nameNode = node.name; 10863 SimpleIdentifier nameNode = node.name;
10864 if (nameNode == null) { 10864 if (nameNode == null) {
10865 return false; 10865 return false;
10866 } 10866 }
10867 String name2 = nameNode.name; 10867 String name = nameNode.name;
10868 if (_enclosingClass == null) { 10868 if (_enclosingClass == null) {
10869 return false; 10869 return false;
10870 } 10870 }
10871 InterfaceType enclosingType = _enclosingClass.type; 10871 InterfaceType enclosingType = _enclosingClass.type;
10872 ExecutableElement superElement; 10872 ExecutableElement superElement;
10873 superElement = enclosingType.lookUpGetterInSuperclass(name2, _currentLibrary ); 10873 superElement = enclosingType.lookUpGetterInSuperclass(name, _currentLibrary) ;
10874 if (superElement == null) { 10874 if (superElement == null) {
10875 superElement = enclosingType.lookUpSetterInSuperclass(name2, _currentLibra ry); 10875 superElement = enclosingType.lookUpSetterInSuperclass(name, _currentLibrar y);
10876 } 10876 }
10877 if (superElement == null) { 10877 if (superElement == null) {
10878 superElement = enclosingType.lookUpMethodInSuperclass(name2, _currentLibra ry); 10878 superElement = enclosingType.lookUpMethodInSuperclass(name, _currentLibrar y);
10879 } 10879 }
10880 if (superElement == null) { 10880 if (superElement == null) {
10881 return false; 10881 return false;
10882 } 10882 }
10883 if (!superElement.isStatic()) { 10883 if (!superElement.isStatic()) {
10884 return false; 10884 return false;
10885 } 10885 }
10886 ClassElement superElementClass = superElement.enclosingElement as ClassEleme nt; 10886 ClassElement superElementClass = superElement.enclosingElement as ClassEleme nt;
10887 InterfaceType superElementType = superElementClass.type; 10887 InterfaceType superElementType = superElementClass.type;
10888 if (node.isGetter()) { 10888 if (node.isGetter()) {
(...skipping 12 matching lines...) Expand all
10901 * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER 10901 * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
10902 */ 10902 */
10903 bool checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) { 10903 bool checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
10904 if (!node.isStatic()) { 10904 if (!node.isStatic()) {
10905 return false; 10905 return false;
10906 } 10906 }
10907 SimpleIdentifier nameNode = node.name; 10907 SimpleIdentifier nameNode = node.name;
10908 if (nameNode == null) { 10908 if (nameNode == null) {
10909 return false; 10909 return false;
10910 } 10910 }
10911 String name2 = nameNode.name; 10911 String name = nameNode.name;
10912 if (_enclosingClass == null) { 10912 if (_enclosingClass == null) {
10913 return false; 10913 return false;
10914 } 10914 }
10915 InterfaceType enclosingType = _enclosingClass.type; 10915 InterfaceType enclosingType = _enclosingClass.type;
10916 ExecutableElement setter = enclosingType.lookUpSetter(name2, _currentLibrary ); 10916 ExecutableElement setter = enclosingType.lookUpSetter(name, _currentLibrary) ;
10917 if (setter == null) { 10917 if (setter == null) {
10918 return false; 10918 return false;
10919 } 10919 }
10920 if (setter.isStatic()) { 10920 if (setter.isStatic()) {
10921 return false; 10921 return false;
10922 } 10922 }
10923 ClassElement setterClass = setter.enclosingElement as ClassElement; 10923 ClassElement setterClass = setter.enclosingElement as ClassElement;
10924 InterfaceType setterType = setterClass.type; 10924 InterfaceType setterType = setterClass.type;
10925 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_ INSTANCE_SETTER, nameNode, [setterType.displayName]); 10925 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_ INSTANCE_SETTER, nameNode, [setterType.displayName]);
10926 return true; 10926 return true;
10927 } 10927 }
10928 10928
10929 /** 10929 /**
10930 * This verifies that the enclosing class does not have an instance member wit h the same name as 10930 * This verifies that the enclosing class does not have an instance member wit h the same name as
10931 * the passed static getter method declaration. 10931 * the passed static getter method declaration.
10932 * @param node the method declaration to evaluate 10932 * @param node the method declaration to evaluate
10933 * @return {@code true} if and only if an error code is generated on the passe d node 10933 * @return {@code true} if and only if an error code is generated on the passe d node
10934 * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER 10934 * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
10935 */ 10935 */
10936 bool checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) { 10936 bool checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
10937 if (!node.isStatic()) { 10937 if (!node.isStatic()) {
10938 return false; 10938 return false;
10939 } 10939 }
10940 SimpleIdentifier nameNode = node.name; 10940 SimpleIdentifier nameNode = node.name;
10941 if (nameNode == null) { 10941 if (nameNode == null) {
10942 return false; 10942 return false;
10943 } 10943 }
10944 String name2 = nameNode.name; 10944 String name = nameNode.name;
10945 if (_enclosingClass == null) { 10945 if (_enclosingClass == null) {
10946 return false; 10946 return false;
10947 } 10947 }
10948 InterfaceType enclosingType = _enclosingClass.type; 10948 InterfaceType enclosingType = _enclosingClass.type;
10949 ExecutableElement member; 10949 ExecutableElement member;
10950 member = enclosingType.lookUpMethod(name2, _currentLibrary); 10950 member = enclosingType.lookUpMethod(name, _currentLibrary);
10951 if (member == null) { 10951 if (member == null) {
10952 member = enclosingType.lookUpGetter(name2, _currentLibrary); 10952 member = enclosingType.lookUpGetter(name, _currentLibrary);
10953 } 10953 }
10954 if (member == null) { 10954 if (member == null) {
10955 member = enclosingType.lookUpSetter(name2, _currentLibrary); 10955 member = enclosingType.lookUpSetter(name, _currentLibrary);
10956 } 10956 }
10957 if (member == null) { 10957 if (member == null) {
10958 return false; 10958 return false;
10959 } 10959 }
10960 if (member.isStatic()) { 10960 if (member.isStatic()) {
10961 return false; 10961 return false;
10962 } 10962 }
10963 ClassElement memberClass = member.enclosingElement as ClassElement; 10963 ClassElement memberClass = member.enclosingElement as ClassElement;
10964 InterfaceType memberType = memberClass.type; 10964 InterfaceType memberType = memberClass.type;
10965 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_ INSTANCE_MEMBER, nameNode, [memberType.displayName]); 10965 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_ INSTANCE_MEMBER, nameNode, [memberType.displayName]);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
11020 * class. 11020 * class.
11021 * @param node the instance creation expression to evaluate 11021 * @param node the instance creation expression to evaluate
11022 * @param typeName the {@link TypeName} of the {@link ConstructorName} from th e{@link InstanceCreationExpression}, this is the AST node that the error is atta ched to 11022 * @param typeName the {@link TypeName} of the {@link ConstructorName} from th e{@link InstanceCreationExpression}, this is the AST node that the error is atta ched to
11023 * @param type the type being constructed with this {@link InstanceCreationExp ression} 11023 * @param type the type being constructed with this {@link InstanceCreationExp ression}
11024 * @return {@code true} if and only if an error code is generated on the passe d node 11024 * @return {@code true} if and only if an error code is generated on the passe d node
11025 * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS 11025 * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
11026 * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS 11026 * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
11027 */ 11027 */
11028 bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, Type Name typeName, InterfaceType type) { 11028 bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, Type Name typeName, InterfaceType type) {
11029 if (type.element.isAbstract()) { 11029 if (type.element.isAbstract()) {
11030 ConstructorElement element2 = node.element; 11030 ConstructorElement element = node.element;
11031 if (element2 != null && !element2.isFactory()) { 11031 if (element != null && !element.isFactory()) {
11032 if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CO NST)) { 11032 if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CO NST)) {
11033 _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLAS S, typeName, []); 11033 _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLAS S, typeName, []);
11034 } else { 11034 } else {
11035 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []); 11035 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
11036 } 11036 }
11037 return true; 11037 return true;
11038 } 11038 }
11039 } 11039 }
11040 return false; 11040 return false;
11041 } 11041 }
(...skipping 19 matching lines...) Expand all
11061 /** 11061 /**
11062 * This verifies that the passed 'const' instance creation expression does not reference any type 11062 * This verifies that the passed 'const' instance creation expression does not reference any type
11063 * parameters. 11063 * parameters.
11064 * <p> 11064 * <p>
11065 * This method assumes that the instance creation was tested to be 'const' bef ore being called. 11065 * This method assumes that the instance creation was tested to be 'const' bef ore being called.
11066 * @param node the instance creation expression to evaluate 11066 * @param node the instance creation expression to evaluate
11067 * @return {@code true} if and only if an error code is generated on the passe d node 11067 * @return {@code true} if and only if an error code is generated on the passe d node
11068 * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS 11068 * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
11069 */ 11069 */
11070 bool checkForConstWithTypeParameters(InstanceCreationExpression node) { 11070 bool checkForConstWithTypeParameters(InstanceCreationExpression node) {
11071 ConstructorName constructorName2 = node.constructorName; 11071 ConstructorName constructorName = node.constructorName;
11072 if (constructorName2 == null) { 11072 if (constructorName == null) {
11073 return false; 11073 return false;
11074 } 11074 }
11075 TypeName typeName = constructorName2.type; 11075 TypeName typeName = constructorName.type;
11076 return checkForConstWithTypeParameters2(typeName); 11076 return checkForConstWithTypeParameters2(typeName);
11077 } 11077 }
11078 11078
11079 /** 11079 /**
11080 * This verifies that the passed type name does not reference any type paramet ers. 11080 * This verifies that the passed type name does not reference any type paramet ers.
11081 * @param typeName the type name to evaluate 11081 * @param typeName the type name to evaluate
11082 * @return {@code true} if and only if an error code is generated on the passe d node 11082 * @return {@code true} if and only if an error code is generated on the passe d node
11083 * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS 11083 * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
11084 */ 11084 */
11085 bool checkForConstWithTypeParameters2(TypeName typeName) { 11085 bool checkForConstWithTypeParameters2(TypeName typeName) {
11086 if (typeName == null) { 11086 if (typeName == null) {
11087 return false; 11087 return false;
11088 } 11088 }
11089 Identifier name2 = typeName.name; 11089 Identifier name = typeName.name;
11090 if (name2 == null) { 11090 if (name == null) {
11091 return false; 11091 return false;
11092 } 11092 }
11093 if (name2.element is TypeVariableElement) { 11093 if (name.element is TypeVariableElement) {
11094 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETER S, name2, []); 11094 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETER S, name, []);
11095 } 11095 }
11096 TypeArgumentList typeArguments2 = typeName.typeArguments; 11096 TypeArgumentList typeArguments = typeName.typeArguments;
11097 if (typeArguments2 != null) { 11097 if (typeArguments != null) {
11098 bool hasError = false; 11098 bool hasError = false;
11099 for (TypeName argument in typeArguments2.arguments) { 11099 for (TypeName argument in typeArguments.arguments) {
11100 hasError = javaBooleanOr(hasError, checkForConstWithTypeParameters2(argu ment)); 11100 hasError = javaBooleanOr(hasError, checkForConstWithTypeParameters2(argu ment));
11101 } 11101 }
11102 return hasError; 11102 return hasError;
11103 } 11103 }
11104 return false; 11104 return false;
11105 } 11105 }
11106 11106
11107 /** 11107 /**
11108 * This verifies that if the passed 'const' instance creation expression is be ing invoked on the 11108 * This verifies that if the passed 'const' instance creation expression is be ing invoked on the
11109 * resolved constructor. 11109 * resolved constructor.
11110 * <p> 11110 * <p>
11111 * This method assumes that the instance creation was tested to be 'const' bef ore being called. 11111 * This method assumes that the instance creation was tested to be 'const' bef ore being called.
11112 * @param node the instance creation expression to evaluate 11112 * @param node the instance creation expression to evaluate
11113 * @return {@code true} if and only if an error code is generated on the passe d node 11113 * @return {@code true} if and only if an error code is generated on the passe d node
11114 * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR 11114 * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
11115 * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT 11115 * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
11116 */ 11116 */
11117 bool checkForConstWithUndefinedConstructor(InstanceCreationExpression node) { 11117 bool checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
11118 if (node.element != null) { 11118 if (node.element != null) {
11119 return false; 11119 return false;
11120 } 11120 }
11121 ConstructorName constructorName2 = node.constructorName; 11121 ConstructorName constructorName = node.constructorName;
11122 if (constructorName2 == null) { 11122 if (constructorName == null) {
11123 return false; 11123 return false;
11124 } 11124 }
11125 TypeName type2 = constructorName2.type; 11125 TypeName type = constructorName.type;
11126 if (type2 == null) { 11126 if (type == null) {
11127 return false; 11127 return false;
11128 } 11128 }
11129 Identifier className = type2.name; 11129 Identifier className = type.name;
11130 SimpleIdentifier name2 = constructorName2.name; 11130 SimpleIdentifier name = constructorName.name;
11131 if (name2 != null) { 11131 if (name != null) {
11132 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONS TRUCTOR, name2, [className, name2]); 11132 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONS TRUCTOR, name, [className, name]);
11133 } else { 11133 } else {
11134 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONS TRUCTOR_DEFAULT, constructorName2, [className]); 11134 _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONS TRUCTOR_DEFAULT, constructorName, [className]);
11135 } 11135 }
11136 return true; 11136 return true;
11137 } 11137 }
11138 11138
11139 /** 11139 /**
11140 * This verifies that there are no default parameters in the passed function t ype alias. 11140 * This verifies that there are no default parameters in the passed function t ype alias.
11141 * @param node the function type alias to evaluate 11141 * @param node the function type alias to evaluate
11142 * @return {@code true} if and only if an error code is generated on the passe d node 11142 * @return {@code true} if and only if an error code is generated on the passe d node
11143 * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS 11143 * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
11144 */ 11144 */
11145 bool checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) { 11145 bool checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
11146 bool result = false; 11146 bool result = false;
11147 FormalParameterList formalParameterList = node.parameters; 11147 FormalParameterList formalParameterList = node.parameters;
11148 NodeList<FormalParameter> parameters2 = formalParameterList.parameters; 11148 NodeList<FormalParameter> parameters = formalParameterList.parameters;
11149 for (FormalParameter formalParameter in parameters2) { 11149 for (FormalParameter formalParameter in parameters) {
11150 if (formalParameter is DefaultFormalParameter) { 11150 if (formalParameter is DefaultFormalParameter) {
11151 DefaultFormalParameter defaultFormalParameter = formalParameter as Defau ltFormalParameter; 11151 DefaultFormalParameter defaultFormalParameter = formalParameter as Defau ltFormalParameter;
11152 if (defaultFormalParameter.defaultValue != null) { 11152 if (defaultFormalParameter.defaultValue != null) {
11153 _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNC TION_TYPE_ALIAS, node, []); 11153 _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNC TION_TYPE_ALIAS, node, []);
11154 result = true; 11154 result = true;
11155 } 11155 }
11156 } 11156 }
11157 } 11157 }
11158 return result; 11158 return result;
11159 } 11159 }
11160 11160
11161 /** 11161 /**
11162 * This verifies the passed import has unique name among other exported librar ies. 11162 * This verifies the passed import has unique name among other exported librar ies.
11163 * @param node the export directive to evaluate 11163 * @param node the export directive to evaluate
11164 * @return {@code true} if and only if an error code is generated on the passe d node 11164 * @return {@code true} if and only if an error code is generated on the passe d node
11165 * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME 11165 * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
11166 */ 11166 */
11167 bool checkForExportDuplicateLibraryName(ExportDirective node) { 11167 bool checkForExportDuplicateLibraryName(ExportDirective node) {
11168 Element nodeElement = node.element; 11168 Element nodeElement = node.element;
11169 if (nodeElement is! ExportElement) { 11169 if (nodeElement is! ExportElement) {
11170 return false; 11170 return false;
11171 } 11171 }
11172 ExportElement nodeExportElement = nodeElement as ExportElement; 11172 ExportElement nodeExportElement = nodeElement as ExportElement;
11173 LibraryElement nodeLibrary = nodeExportElement.exportedLibrary; 11173 LibraryElement nodeLibrary = nodeExportElement.exportedLibrary;
11174 if (nodeLibrary == null) { 11174 if (nodeLibrary == null) {
11175 return false; 11175 return false;
11176 } 11176 }
11177 String name2 = nodeLibrary.name; 11177 String name = nodeLibrary.name;
11178 LibraryElement prevLibrary = _nameToExportElement[name2]; 11178 LibraryElement prevLibrary = _nameToExportElement[name];
11179 if (prevLibrary != null) { 11179 if (prevLibrary != null) {
11180 if (prevLibrary != nodeLibrary) { 11180 if (prevLibrary != nodeLibrary) {
11181 _errorReporter.reportError2(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_ NAME, node, [prevLibrary.definingCompilationUnit.displayName, nodeLibrary.defini ngCompilationUnit.displayName, name2]); 11181 _errorReporter.reportError2(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_ NAME, node, [prevLibrary.definingCompilationUnit.displayName, nodeLibrary.defini ngCompilationUnit.displayName, name]);
11182 return true; 11182 return true;
11183 } 11183 }
11184 } else { 11184 } else {
11185 _nameToExportElement[name2] = nodeLibrary; 11185 _nameToExportElement[name] = nodeLibrary;
11186 } 11186 }
11187 return false; 11187 return false;
11188 } 11188 }
11189 11189
11190 /** 11190 /**
11191 * Check that if the visiting library is not system, then any passed library s hould not be SDK 11191 * Check that if the visiting library is not system, then any passed library s hould not be SDK
11192 * internal library. 11192 * internal library.
11193 * @param node the export directive to evaluate 11193 * @param node the export directive to evaluate
11194 * @return {@code true} if and only if an error code is generated on the passe d node 11194 * @return {@code true} if and only if an error code is generated on the passe d node
11195 * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY 11195 * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
11196 */ 11196 */
11197 bool checkForExportInternalLibrary(ExportDirective node) { 11197 bool checkForExportInternalLibrary(ExportDirective node) {
11198 if (_isInSystemLibrary) { 11198 if (_isInSystemLibrary) {
11199 return false; 11199 return false;
11200 } 11200 }
11201 Element element2 = node.element; 11201 Element element = node.element;
11202 if (element2 is! ExportElement) { 11202 if (element is! ExportElement) {
11203 return false; 11203 return false;
11204 } 11204 }
11205 ExportElement exportElement = element2 as ExportElement; 11205 ExportElement exportElement = element as ExportElement;
11206 DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk; 11206 DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
11207 String uri2 = exportElement.uri; 11207 String uri = exportElement.uri;
11208 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri2); 11208 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
11209 if (sdkLibrary == null) { 11209 if (sdkLibrary == null) {
11210 return false; 11210 return false;
11211 } 11211 }
11212 if (!sdkLibrary.isInternal()) { 11212 if (!sdkLibrary.isInternal()) {
11213 return false; 11213 return false;
11214 } 11214 }
11215 _errorReporter.reportError2(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, no de, [node.uri]); 11215 _errorReporter.reportError2(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, no de, [node.uri]);
11216 return true; 11216 return true;
11217 } 11217 }
11218 11218
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
11271 * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE 11271 * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
11272 * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE 11272 * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
11273 */ 11273 */
11274 bool checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) { 11274 bool checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
11275 Element fieldNameElement = node.fieldName.element; 11275 Element fieldNameElement = node.fieldName.element;
11276 if (fieldNameElement is! FieldElement) { 11276 if (fieldNameElement is! FieldElement) {
11277 return false; 11277 return false;
11278 } 11278 }
11279 FieldElement fieldElement = fieldNameElement as FieldElement; 11279 FieldElement fieldElement = fieldNameElement as FieldElement;
11280 Type2 fieldType = fieldElement.type; 11280 Type2 fieldType = fieldElement.type;
11281 Expression expression2 = node.expression; 11281 Expression expression = node.expression;
11282 if (expression2 == null) { 11282 if (expression == null) {
11283 return false; 11283 return false;
11284 } 11284 }
11285 Type2 staticType = getStaticType(expression2); 11285 Type2 staticType = getStaticType(expression);
11286 if (staticType == null) { 11286 if (staticType == null) {
11287 return false; 11287 return false;
11288 } 11288 }
11289 if (staticType.isAssignableTo(fieldType)) { 11289 if (staticType.isAssignableTo(fieldType)) {
11290 return false; 11290 return false;
11291 } else if (_strictMode) { 11291 } else if (_strictMode) {
11292 if (_isEnclosingConstructorConst) { 11292 if (_isEnclosingConstructorConst) {
11293 _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER _NOT_ASSIGNABLE, expression2, [staticType.displayName, fieldType.displayName]); 11293 _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER _NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
11294 } else { 11294 } else {
11295 _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSI GNABLE, expression2, [staticType.displayName, fieldType.displayName]); 11295 _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSI GNABLE, expression, [staticType.displayName, fieldType.displayName]);
11296 } 11296 }
11297 return true; 11297 return true;
11298 } 11298 }
11299 Type2 propagatedType = getPropagatedType(expression2); 11299 Type2 propagatedType = getPropagatedType(expression);
11300 if (propagatedType != null && propagatedType.isAssignableTo(fieldType)) { 11300 if (propagatedType != null && propagatedType.isAssignableTo(fieldType)) {
11301 return false; 11301 return false;
11302 } 11302 }
11303 if (_isEnclosingConstructorConst) { 11303 if (_isEnclosingConstructorConst) {
11304 _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_N OT_ASSIGNABLE, expression2, [(propagatedType == null ? staticType : propagatedTy pe).displayName, fieldType.displayName]); 11304 _errorReporter.reportError2(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_N OT_ASSIGNABLE, expression, [(propagatedType == null ? staticType : propagatedTyp e).displayName, fieldType.displayName]);
11305 } else { 11305 } else {
11306 _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGN ABLE, expression2, [(propagatedType == null ? staticType : propagatedType).displ ayName, fieldType.displayName]); 11306 _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGN ABLE, expression, [(propagatedType == null ? staticType : propagatedType).displa yName, fieldType.displayName]);
11307 } 11307 }
11308 return true; 11308 return true;
11309 } 11309 }
11310 11310
11311 /** 11311 /**
11312 * This verifies that the passed field formal parameter is in a constructor de claration. 11312 * This verifies that the passed field formal parameter is in a constructor de claration.
11313 * @param node the field formal parameter to test 11313 * @param node the field formal parameter to test
11314 * @return {@code true} if and only if an error code is generated on the passe d node 11314 * @return {@code true} if and only if an error code is generated on the passe d node
11315 * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR 11315 * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
11316 */ 11316 */
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
11361 /** 11361 /**
11362 * This verifies that the passed variable declaration list has only initialize d variables if the 11362 * This verifies that the passed variable declaration list has only initialize d variables if the
11363 * list is final or const. This method is called by{@link #checkForFinalNotIni tialized(ClassDeclaration)},{@link #visitTopLevelVariableDeclaration(TopLevelVar iableDeclaration)} and{@link #visitVariableDeclarationStatement(VariableDeclarat ionStatement)}. 11363 * list is final or const. This method is called by{@link #checkForFinalNotIni tialized(ClassDeclaration)},{@link #visitTopLevelVariableDeclaration(TopLevelVar iableDeclaration)} and{@link #visitVariableDeclarationStatement(VariableDeclarat ionStatement)}.
11364 * @param node the class declaration to test 11364 * @param node the class declaration to test
11365 * @return {@code true} if and only if an error code is generated on the passe d node 11365 * @return {@code true} if and only if an error code is generated on the passe d node
11366 * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED 11366 * @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED
11367 */ 11367 */
11368 bool checkForFinalNotInitialized2(VariableDeclarationList node) { 11368 bool checkForFinalNotInitialized2(VariableDeclarationList node) {
11369 bool foundError = false; 11369 bool foundError = false;
11370 if (!node.isSynthetic() && (node.isConst() || node.isFinal())) { 11370 if (!node.isSynthetic() && (node.isConst() || node.isFinal())) {
11371 NodeList<VariableDeclaration> variables2 = node.variables; 11371 NodeList<VariableDeclaration> variables = node.variables;
11372 for (VariableDeclaration variable in variables2) { 11372 for (VariableDeclaration variable in variables) {
11373 if (variable.initializer == null) { 11373 if (variable.initializer == null) {
11374 _errorReporter.reportError2(StaticWarningCode.FINAL_NOT_INITIALIZED, v ariable, [variable.name.name]); 11374 _errorReporter.reportError2(StaticWarningCode.FINAL_NOT_INITIALIZED, v ariable, [variable.name.name]);
11375 foundError = true; 11375 foundError = true;
11376 } 11376 }
11377 } 11377 }
11378 } 11378 }
11379 return foundError; 11379 return foundError;
11380 } 11380 }
11381 11381
11382 /** 11382 /**
(...skipping 18 matching lines...) Expand all
11401 * This verifies that if the passed identifier is part of constructor initiali zer, then it does 11401 * This verifies that if the passed identifier is part of constructor initiali zer, then it does
11402 * not reference implicitly 'this' expression. 11402 * not reference implicitly 'this' expression.
11403 * @param node the simple identifier to test 11403 * @param node the simple identifier to test
11404 * @return {@code true} if and only if an error code is generated on the passe d node 11404 * @return {@code true} if and only if an error code is generated on the passe d node
11405 * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER 11405 * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
11406 */ 11406 */
11407 bool checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) { 11407 bool checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
11408 if (!_isInConstructorInitializer) { 11408 if (!_isInConstructorInitializer) {
11409 return false; 11409 return false;
11410 } 11410 }
11411 Element element2 = node.element; 11411 Element element = node.element;
11412 if (!(element2 is MethodElement || element2 is PropertyAccessorElement)) { 11412 if (!(element is MethodElement || element is PropertyAccessorElement)) {
11413 return false; 11413 return false;
11414 } 11414 }
11415 ExecutableElement executableElement = element2 as ExecutableElement; 11415 ExecutableElement executableElement = element as ExecutableElement;
11416 if (executableElement.isStatic()) { 11416 if (executableElement.isStatic()) {
11417 return false; 11417 return false;
11418 } 11418 }
11419 Element enclosingElement2 = element2.enclosingElement; 11419 Element enclosingElement = element.enclosingElement;
11420 if (enclosingElement2 is! ClassElement) { 11420 if (enclosingElement is! ClassElement) {
11421 return false; 11421 return false;
11422 } 11422 }
11423 ASTNode parent2 = node.parent; 11423 ASTNode parent = node.parent;
11424 if (parent2 is MethodInvocation) { 11424 if (parent is MethodInvocation) {
11425 MethodInvocation invocation = parent2 as MethodInvocation; 11425 MethodInvocation invocation = parent as MethodInvocation;
11426 if (identical(invocation.methodName, node) && invocation.realTarget != nul l) { 11426 if (identical(invocation.methodName, node) && invocation.realTarget != nul l) {
11427 return false; 11427 return false;
11428 } 11428 }
11429 } 11429 }
11430 { 11430 {
11431 if (parent2 is PropertyAccess) { 11431 if (parent is PropertyAccess) {
11432 PropertyAccess access = parent2 as PropertyAccess; 11432 PropertyAccess access = parent as PropertyAccess;
11433 if (identical(access.propertyName, node) && access.realTarget != null) { 11433 if (identical(access.propertyName, node) && access.realTarget != null) {
11434 return false; 11434 return false;
11435 } 11435 }
11436 } 11436 }
11437 if (parent2 is PrefixedIdentifier) { 11437 if (parent is PrefixedIdentifier) {
11438 PrefixedIdentifier prefixed = parent2 as PrefixedIdentifier; 11438 PrefixedIdentifier prefixed = parent as PrefixedIdentifier;
11439 if (identical(prefixed.identifier, node)) { 11439 if (identical(prefixed.identifier, node)) {
11440 return false; 11440 return false;
11441 } 11441 }
11442 } 11442 }
11443 } 11443 }
11444 _errorReporter.reportError2(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_ INITIALIZER, node, []); 11444 _errorReporter.reportError2(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_ INITIALIZER, node, []);
11445 return true; 11445 return true;
11446 } 11446 }
11447 11447
11448 /** 11448 /**
11449 * This verifies the passed import has unique name among other imported librar ies. 11449 * This verifies the passed import has unique name among other imported librar ies.
11450 * @param node the import directive to evaluate 11450 * @param node the import directive to evaluate
11451 * @return {@code true} if and only if an error code is generated on the passe d node 11451 * @return {@code true} if and only if an error code is generated on the passe d node
11452 * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME 11452 * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
11453 */ 11453 */
11454 bool checkForImportDuplicateLibraryName(ImportDirective node) { 11454 bool checkForImportDuplicateLibraryName(ImportDirective node) {
11455 Element nodeElement = node.element; 11455 Element nodeElement = node.element;
11456 if (nodeElement is! ImportElement) { 11456 if (nodeElement is! ImportElement) {
11457 return false; 11457 return false;
11458 } 11458 }
11459 ImportElement nodeImportElement = nodeElement as ImportElement; 11459 ImportElement nodeImportElement = nodeElement as ImportElement;
11460 LibraryElement nodeLibrary = nodeImportElement.importedLibrary; 11460 LibraryElement nodeLibrary = nodeImportElement.importedLibrary;
11461 if (nodeLibrary == null) { 11461 if (nodeLibrary == null) {
11462 return false; 11462 return false;
11463 } 11463 }
11464 String name2 = nodeLibrary.name; 11464 String name = nodeLibrary.name;
11465 LibraryElement prevLibrary = _nameToImportElement[name2]; 11465 LibraryElement prevLibrary = _nameToImportElement[name];
11466 if (prevLibrary != null) { 11466 if (prevLibrary != null) {
11467 if (prevLibrary != nodeLibrary) { 11467 if (prevLibrary != nodeLibrary) {
11468 _errorReporter.reportError2(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_ NAME, node, [prevLibrary.definingCompilationUnit.displayName, nodeLibrary.defini ngCompilationUnit.displayName, name2]); 11468 _errorReporter.reportError2(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_ NAME, node, [prevLibrary.definingCompilationUnit.displayName, nodeLibrary.defini ngCompilationUnit.displayName, name]);
11469 return true; 11469 return true;
11470 } 11470 }
11471 } else { 11471 } else {
11472 _nameToImportElement[name2] = nodeLibrary; 11472 _nameToImportElement[name] = nodeLibrary;
11473 } 11473 }
11474 return false; 11474 return false;
11475 } 11475 }
11476 11476
11477 /** 11477 /**
11478 * Check that if the visiting library is not system, then any passed library s hould not be SDK 11478 * Check that if the visiting library is not system, then any passed library s hould not be SDK
11479 * internal library. 11479 * internal library.
11480 * @param node the import directive to evaluate 11480 * @param node the import directive to evaluate
11481 * @return {@code true} if and only if an error code is generated on the passe d node 11481 * @return {@code true} if and only if an error code is generated on the passe d node
11482 * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY 11482 * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
11483 */ 11483 */
11484 bool checkForImportInternalLibrary(ImportDirective node) { 11484 bool checkForImportInternalLibrary(ImportDirective node) {
11485 if (_isInSystemLibrary) { 11485 if (_isInSystemLibrary) {
11486 return false; 11486 return false;
11487 } 11487 }
11488 Element element2 = node.element; 11488 Element element = node.element;
11489 if (element2 is! ImportElement) { 11489 if (element is! ImportElement) {
11490 return false; 11490 return false;
11491 } 11491 }
11492 ImportElement importElement = element2 as ImportElement; 11492 ImportElement importElement = element as ImportElement;
11493 DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk; 11493 DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
11494 String uri2 = importElement.uri; 11494 String uri = importElement.uri;
11495 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri2); 11495 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
11496 if (sdkLibrary == null) { 11496 if (sdkLibrary == null) {
11497 return false; 11497 return false;
11498 } 11498 }
11499 if (!sdkLibrary.isInternal()) { 11499 if (!sdkLibrary.isInternal()) {
11500 return false; 11500 return false;
11501 } 11501 }
11502 _errorReporter.reportError2(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, no de, [node.uri]); 11502 _errorReporter.reportError2(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, no de, [node.uri]);
11503 return true; 11503 return true;
11504 } 11504 }
11505 11505
11506 /** 11506 /**
11507 * This verifies that the passed switch statement case expressions all have th e same type. 11507 * This verifies that the passed switch statement case expressions all have th e same type.
11508 * @param node the switch statement to evaluate 11508 * @param node the switch statement to evaluate
11509 * @return {@code true} if and only if an error code is generated on the passe d node 11509 * @return {@code true} if and only if an error code is generated on the passe d node
11510 * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES 11510 * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
11511 */ 11511 */
11512 bool checkForInconsistentCaseExpressionTypes(SwitchStatement node) { 11512 bool checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
11513 NodeList<SwitchMember> switchMembers = node.members; 11513 NodeList<SwitchMember> switchMembers = node.members;
11514 bool foundError = false; 11514 bool foundError = false;
11515 Type2 firstType = null; 11515 Type2 firstType = null;
11516 for (SwitchMember switchMember in switchMembers) { 11516 for (SwitchMember switchMember in switchMembers) {
11517 if (switchMember is SwitchCase) { 11517 if (switchMember is SwitchCase) {
11518 SwitchCase switchCase = switchMember as SwitchCase; 11518 SwitchCase switchCase = switchMember as SwitchCase;
11519 Expression expression2 = switchCase.expression; 11519 Expression expression = switchCase.expression;
11520 if (firstType == null) { 11520 if (firstType == null) {
11521 firstType = getBestType(expression2); 11521 firstType = getBestType(expression);
11522 } else { 11522 } else {
11523 Type2 nType = getBestType(expression2); 11523 Type2 nType = getBestType(expression);
11524 if (firstType != nType) { 11524 if (firstType != nType) {
11525 _errorReporter.reportError2(CompileTimeErrorCode.INCONSISTENT_CASE_E XPRESSION_TYPES, expression2, [expression2.toSource(), firstType.displayName]); 11525 _errorReporter.reportError2(CompileTimeErrorCode.INCONSISTENT_CASE_E XPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
11526 foundError = true; 11526 foundError = true;
11527 } 11527 }
11528 } 11528 }
11529 } 11529 }
11530 } 11530 }
11531 return foundError; 11531 return foundError;
11532 } 11532 }
11533 11533
11534 /** 11534 /**
11535 * For each class declaration, this method is called which verifies that all i nherited members are 11535 * For each class declaration, this method is called which verifies that all i nherited members are
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
11799 * <p> 11799 * <p>
11800 * This method assumes that the instance creation was tested to be 'new' befor e being called. 11800 * This method assumes that the instance creation was tested to be 'new' befor e being called.
11801 * @param node the instance creation expression to evaluate 11801 * @param node the instance creation expression to evaluate
11802 * @return {@code true} if and only if an error code is generated on the passe d node 11802 * @return {@code true} if and only if an error code is generated on the passe d node
11803 * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR 11803 * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
11804 */ 11804 */
11805 bool checkForNewWithUndefinedConstructor(InstanceCreationExpression node) { 11805 bool checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
11806 if (node.element != null) { 11806 if (node.element != null) {
11807 return false; 11807 return false;
11808 } 11808 }
11809 ConstructorName constructorName2 = node.constructorName; 11809 ConstructorName constructorName = node.constructorName;
11810 if (constructorName2 == null) { 11810 if (constructorName == null) {
11811 return false; 11811 return false;
11812 } 11812 }
11813 TypeName type2 = constructorName2.type; 11813 TypeName type = constructorName.type;
11814 if (type2 == null) { 11814 if (type == null) {
11815 return false; 11815 return false;
11816 } 11816 }
11817 Identifier className = type2.name; 11817 Identifier className = type.name;
11818 SimpleIdentifier name2 = constructorName2.name; 11818 SimpleIdentifier name = constructorName.name;
11819 if (name2 != null) { 11819 if (name != null) {
11820 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCT OR, name2, [className, name2]); 11820 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCT OR, name, [className, name]);
11821 } else { 11821 } else {
11822 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCT OR_DEFAULT, constructorName2, [className]); 11822 _errorReporter.reportError2(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCT OR_DEFAULT, constructorName, [className]);
11823 } 11823 }
11824 return true; 11824 return true;
11825 } 11825 }
11826 11826
11827 /** 11827 /**
11828 * This checks that passed class declaration overrides all members required by its superclasses 11828 * This checks that passed class declaration overrides all members required by its superclasses
11829 * and interfaces. 11829 * and interfaces.
11830 * @param node the {@link ClassDeclaration} to evaluate 11830 * @param node the {@link ClassDeclaration} to evaluate
11831 * @return {@code true} if and only if an error code is generated on the passe d node 11831 * @return {@code true} if and only if an error code is generated on the passe d node
11832 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE 11832 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
11833 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO 11833 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO
11834 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE 11834 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE
11835 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR 11835 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR
11836 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLU S 11836 * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLU S
11837 */ 11837 */
11838 bool checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration node) { 11838 bool checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration node) {
11839 if (_enclosingClass.isAbstract()) { 11839 if (_enclosingClass.isAbstract()) {
11840 return false; 11840 return false;
11841 } 11841 }
11842 Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>(); 11842 Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
11843 Set<String> methodsInEnclosingClass = new Set<String>(); 11843 Set<String> methodsInEnclosingClass = new Set<String>();
11844 Set<String> accessorsInEnclosingClass = new Set<String>(); 11844 Set<String> accessorsInEnclosingClass = new Set<String>();
11845 List<MethodElement> methods2 = _enclosingClass.methods; 11845 List<MethodElement> methods = _enclosingClass.methods;
11846 for (MethodElement method in methods2) { 11846 for (MethodElement method in methods) {
11847 javaSetAdd(methodsInEnclosingClass, method.name); 11847 javaSetAdd(methodsInEnclosingClass, method.name);
11848 } 11848 }
11849 List<PropertyAccessorElement> accessors2 = _enclosingClass.accessors; 11849 List<PropertyAccessorElement> accessors = _enclosingClass.accessors;
11850 for (PropertyAccessorElement accessor in accessors2) { 11850 for (PropertyAccessorElement accessor in accessors) {
11851 javaSetAdd(accessorsInEnclosingClass, accessor.name); 11851 javaSetAdd(accessorsInEnclosingClass, accessor.name);
11852 } 11852 }
11853 Map<String, ExecutableElement> membersInheritedFromSuperclasses = _inheritan ceManager.getMapOfMembersInheritedFromClasses(_enclosingClass); 11853 Map<String, ExecutableElement> membersInheritedFromSuperclasses = _inheritan ceManager.getMapOfMembersInheritedFromClasses(_enclosingClass);
11854 for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(membersInhe ritedFromSuperclasses)) { 11854 for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(membersInhe ritedFromSuperclasses)) {
11855 ExecutableElement executableElt = entry.getValue(); 11855 ExecutableElement executableElt = entry.getValue();
11856 if (executableElt is MethodElement) { 11856 if (executableElt is MethodElement) {
11857 MethodElement methodElt = executableElt as MethodElement; 11857 MethodElement methodElt = executableElt as MethodElement;
11858 if (methodElt.isAbstract()) { 11858 if (methodElt.isAbstract()) {
11859 String methodName = entry.getKey(); 11859 String methodName = entry.getKey();
11860 if (!methodsInEnclosingClass.contains(methodName)) { 11860 if (!methodsInEnclosingClass.contains(methodName)) {
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
11992 } 11992 }
11993 11993
11994 /** 11994 /**
11995 * This verifies the passed method declaration of operator {@code \[\]=}, has {@code void} return 11995 * This verifies the passed method declaration of operator {@code \[\]=}, has {@code void} return
11996 * type. 11996 * type.
11997 * @param node the method declaration to evaluate 11997 * @param node the method declaration to evaluate
11998 * @return {@code true} if and only if an error code is generated on the passe d node 11998 * @return {@code true} if and only if an error code is generated on the passe d node
11999 * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR 11999 * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
12000 */ 12000 */
12001 bool checkForNonVoidReturnTypeForOperator(MethodDeclaration node) { 12001 bool checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
12002 SimpleIdentifier name2 = node.name; 12002 SimpleIdentifier name = node.name;
12003 if (name2.name != "[]=") { 12003 if (name.name != "[]=") {
12004 return false; 12004 return false;
12005 } 12005 }
12006 TypeName typeName = node.returnType; 12006 TypeName typeName = node.returnType;
12007 if (typeName != null) { 12007 if (typeName != null) {
12008 Type2 type2 = typeName.type; 12008 Type2 type = typeName.type;
12009 if (type2 != null && !type2.isVoid()) { 12009 if (type != null && !type.isVoid()) {
12010 _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_OPERAT OR, typeName, []); 12010 _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_OPERAT OR, typeName, []);
12011 } 12011 }
12012 } 12012 }
12013 return false; 12013 return false;
12014 } 12014 }
12015 12015
12016 /** 12016 /**
12017 * This verifies the passed setter has no return type or the {@code void} retu rn type. 12017 * This verifies the passed setter has no return type or the {@code void} retu rn type.
12018 * @param typeName the type name to evaluate 12018 * @param typeName the type name to evaluate
12019 * @return {@code true} if and only if an error code is generated on the passe d node 12019 * @return {@code true} if and only if an error code is generated on the passe d node
12020 * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER 12020 * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
12021 */ 12021 */
12022 bool checkForNonVoidReturnTypeForSetter(TypeName typeName) { 12022 bool checkForNonVoidReturnTypeForSetter(TypeName typeName) {
12023 if (typeName != null) { 12023 if (typeName != null) {
12024 Type2 type2 = typeName.type; 12024 Type2 type = typeName.type;
12025 if (type2 != null && !type2.isVoid()) { 12025 if (type != null && !type.isVoid()) {
12026 _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER , typeName, []); 12026 _errorReporter.reportError2(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER , typeName, []);
12027 } 12027 }
12028 } 12028 }
12029 return false; 12029 return false;
12030 } 12030 }
12031 12031
12032 /** 12032 /**
12033 * This verifies the passed operator-method declaration, does not have an opti onal parameter. 12033 * This verifies the passed operator-method declaration, does not have an opti onal parameter.
12034 * <p> 12034 * <p>
12035 * This method assumes that the method declaration was tested to be an operato r declaration before 12035 * This method assumes that the method declaration was tested to be an operato r declaration before
(...skipping 18 matching lines...) Expand all
12054 return foundError; 12054 return foundError;
12055 } 12055 }
12056 12056
12057 /** 12057 /**
12058 * This checks for named optional parameters that begin with '_'. 12058 * This checks for named optional parameters that begin with '_'.
12059 * @param node the default formal parameter to evaluate 12059 * @param node the default formal parameter to evaluate
12060 * @return {@code true} if and only if an error code is generated on the passe d node 12060 * @return {@code true} if and only if an error code is generated on the passe d node
12061 * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER 12061 * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER
12062 */ 12062 */
12063 bool checkForPrivateOptionalParameter(DefaultFormalParameter node) { 12063 bool checkForPrivateOptionalParameter(DefaultFormalParameter node) {
12064 sc.Token separator2 = node.separator; 12064 sc.Token separator = node.separator;
12065 if (separator2 != null && separator2.lexeme == ":") { 12065 if (separator != null && separator.lexeme == ":") {
12066 NormalFormalParameter parameter2 = node.parameter; 12066 NormalFormalParameter parameter = node.parameter;
12067 SimpleIdentifier name = parameter2.identifier; 12067 SimpleIdentifier name = parameter.identifier;
12068 if (!name.isSynthetic() && name.name.startsWith("_")) { 12068 if (!name.isSynthetic() && name.name.startsWith("_")) {
12069 _errorReporter.reportError2(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAME TER, node, []); 12069 _errorReporter.reportError2(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAME TER, node, []);
12070 return true; 12070 return true;
12071 } 12071 }
12072 } 12072 }
12073 return false; 12073 return false;
12074 } 12074 }
12075 12075
12076 /** 12076 /**
12077 * This checks if the passed constructor declaration is the redirecting genera tive constructor and 12077 * This checks if the passed constructor declaration is the redirecting genera tive constructor and
12078 * references itself directly or indirectly. 12078 * references itself directly or indirectly.
12079 * @param node the constructor declaration to evaluate 12079 * @param node the constructor declaration to evaluate
12080 * @return {@code true} if and only if an error code is generated on the passe d node 12080 * @return {@code true} if and only if an error code is generated on the passe d node
12081 * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT 12081 * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
12082 */ 12082 */
12083 bool checkForRecursiveConstructorRedirect(ConstructorDeclaration node) { 12083 bool checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
12084 if (node.factoryKeyword != null) { 12084 if (node.factoryKeyword != null) {
12085 return false; 12085 return false;
12086 } 12086 }
12087 for (ConstructorInitializer initializer in node.initializers) { 12087 for (ConstructorInitializer initializer in node.initializers) {
12088 if (initializer is RedirectingConstructorInvocation) { 12088 if (initializer is RedirectingConstructorInvocation) {
12089 ConstructorElement element2 = node.element; 12089 ConstructorElement element = node.element;
12090 if (!hasRedirectingFactoryConstructorCycle(element2)) { 12090 if (!hasRedirectingFactoryConstructorCycle(element)) {
12091 return false; 12091 return false;
12092 } 12092 }
12093 _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_R EDIRECT, initializer, []); 12093 _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_R EDIRECT, initializer, []);
12094 return true; 12094 return true;
12095 } 12095 }
12096 } 12096 }
12097 return false; 12097 return false;
12098 } 12098 }
12099 12099
12100 /** 12100 /**
12101 * This checks if the passed constructor declaration has redirected constructo r and references 12101 * This checks if the passed constructor declaration has redirected constructo r and references
12102 * itself directly or indirectly. 12102 * itself directly or indirectly.
12103 * @param node the constructor declaration to evaluate 12103 * @param node the constructor declaration to evaluate
12104 * @return {@code true} if and only if an error code is generated on the passe d node 12104 * @return {@code true} if and only if an error code is generated on the passe d node
12105 * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT 12105 * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
12106 */ 12106 */
12107 bool checkForRecursiveFactoryRedirect(ConstructorDeclaration node) { 12107 bool checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
12108 ConstructorName redirectedConstructorNode = node.redirectedConstructor; 12108 ConstructorName redirectedConstructorNode = node.redirectedConstructor;
12109 if (redirectedConstructorNode == null) { 12109 if (redirectedConstructorNode == null) {
12110 return false; 12110 return false;
12111 } 12111 }
12112 ConstructorElement element2 = node.element; 12112 ConstructorElement element = node.element;
12113 if (!hasRedirectingFactoryConstructorCycle(element2)) { 12113 if (!hasRedirectingFactoryConstructorCycle(element)) {
12114 return false; 12114 return false;
12115 } 12115 }
12116 _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []); 12116 _errorReporter.reportError2(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []);
12117 return true; 12117 return true;
12118 } 12118 }
12119 12119
12120 /** 12120 /**
12121 * This checks the class declaration is not a superinterface to itself. 12121 * This checks the class declaration is not a superinterface to itself.
12122 * @param classElt the class element to test 12122 * @param classElt the class element to test
12123 * @param list a list containing the potentially cyclic implements path 12123 * @param list a list containing the potentially cyclic implements path
12124 * @return {@code true} if and only if an error code is generated on the passe d element 12124 * @return {@code true} if and only if an error code is generated on the passe d element
12125 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE 12125 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
12126 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS 12126 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
12127 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEME NTS 12127 * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEME NTS
12128 */ 12128 */
12129 bool checkForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassEl ement> list) { 12129 bool checkForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassEl ement> list) {
12130 if (classElt == null) { 12130 if (classElt == null) {
12131 return false; 12131 return false;
12132 } 12132 }
12133 InterfaceType supertype2 = classElt.supertype; 12133 InterfaceType supertype = classElt.supertype;
12134 list.add(classElt); 12134 list.add(classElt);
12135 if (list.length != 1 && _enclosingClass == classElt) { 12135 if (list.length != 1 && _enclosingClass == classElt) {
12136 String enclosingClassName = _enclosingClass.displayName; 12136 String enclosingClassName = _enclosingClass.displayName;
12137 if (list.length > 2) { 12137 if (list.length > 2) {
12138 String separator = ", "; 12138 String separator = ", ";
12139 int listLength = list.length; 12139 int listLength = list.length;
12140 JavaStringBuilder builder = new JavaStringBuilder(); 12140 JavaStringBuilder builder = new JavaStringBuilder();
12141 for (int i = 0; i < listLength; i++) { 12141 for (int i = 0; i < listLength; i++) {
12142 builder.append(list[i].displayName); 12142 builder.append(list[i].displayName);
12143 if (i != listLength - 1) { 12143 if (i != listLength - 1) {
12144 builder.append(separator); 12144 builder.append(separator);
12145 } 12145 }
12146 } 12146 }
12147 _errorReporter.reportError3(CompileTimeErrorCode.RECURSIVE_INTERFACE_INH ERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClass Name, builder.toString()]); 12147 _errorReporter.reportError3(CompileTimeErrorCode.RECURSIVE_INTERFACE_INH ERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClass Name, builder.toString()]);
12148 return true; 12148 return true;
12149 } else if (list.length == 2) { 12149 } else if (list.length == 2) {
12150 ErrorCode errorCode = supertype2 != null && _enclosingClass == supertype 2.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTEN DS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS; 12150 ErrorCode errorCode = supertype != null && _enclosingClass == supertype. element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS;
12151 _errorReporter.reportError3(errorCode, _enclosingClass.nameOffset, enclo singClassName.length, [enclosingClassName]); 12151 _errorReporter.reportError3(errorCode, _enclosingClass.nameOffset, enclo singClassName.length, [enclosingClassName]);
12152 return true; 12152 return true;
12153 } 12153 }
12154 } 12154 }
12155 for (int i = 1; i < list.length - 1; i++) { 12155 for (int i = 1; i < list.length - 1; i++) {
12156 if (classElt == list[i]) { 12156 if (classElt == list[i]) {
12157 list.removeAt(list.length - 1); 12157 list.removeAt(list.length - 1);
12158 return false; 12158 return false;
12159 } 12159 }
12160 } 12160 }
12161 List<ClassElement> interfaceElements; 12161 List<ClassElement> interfaceElements;
12162 List<InterfaceType> interfaceTypes = classElt.interfaces; 12162 List<InterfaceType> interfaceTypes = classElt.interfaces;
12163 if (supertype2 != null && !supertype2.isObject()) { 12163 if (supertype != null && !supertype.isObject()) {
12164 interfaceElements = new List<ClassElement>(interfaceTypes.length + 1); 12164 interfaceElements = new List<ClassElement>(interfaceTypes.length + 1);
12165 interfaceElements[0] = supertype2.element; 12165 interfaceElements[0] = supertype.element;
12166 for (int i = 0; i < interfaceTypes.length; i++) { 12166 for (int i = 0; i < interfaceTypes.length; i++) {
12167 interfaceElements[i + 1] = interfaceTypes[i].element; 12167 interfaceElements[i + 1] = interfaceTypes[i].element;
12168 } 12168 }
12169 } else { 12169 } else {
12170 interfaceElements = new List<ClassElement>(interfaceTypes.length); 12170 interfaceElements = new List<ClassElement>(interfaceTypes.length);
12171 for (int i = 0; i < interfaceTypes.length; i++) { 12171 for (int i = 0; i < interfaceTypes.length; i++) {
12172 interfaceElements[i] = interfaceTypes[i].element; 12172 interfaceElements[i] = interfaceTypes[i].element;
12173 } 12173 }
12174 } 12174 }
12175 for (ClassElement classElt2 in interfaceElements) { 12175 for (ClassElement classElt2 in interfaceElements) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
12222 * itself directly or indirectly. TODO(scheglov) 12222 * itself directly or indirectly. TODO(scheglov)
12223 * @param node the constructor declaration to evaluate 12223 * @param node the constructor declaration to evaluate
12224 * @return {@code true} if and only if an error code is generated on the passe d node 12224 * @return {@code true} if and only if an error code is generated on the passe d node
12225 * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR 12225 * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
12226 */ 12226 */
12227 bool checkForRedirectToNonConstConstructor(ConstructorDeclaration node) { 12227 bool checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
12228 ConstructorName redirectedConstructorNode = node.redirectedConstructor; 12228 ConstructorName redirectedConstructorNode = node.redirectedConstructor;
12229 if (redirectedConstructorNode == null) { 12229 if (redirectedConstructorNode == null) {
12230 return false; 12230 return false;
12231 } 12231 }
12232 ConstructorElement element2 = node.element; 12232 ConstructorElement element = node.element;
12233 if (element2 == null) { 12233 if (element == null) {
12234 return false; 12234 return false;
12235 } 12235 }
12236 if (!element2.isConst()) { 12236 if (!element.isConst()) {
12237 return false; 12237 return false;
12238 } 12238 }
12239 ConstructorElement redirectedConstructor2 = element2.redirectedConstructor; 12239 ConstructorElement redirectedConstructor = element.redirectedConstructor;
12240 if (redirectedConstructor2 == null) { 12240 if (redirectedConstructor == null) {
12241 return false; 12241 return false;
12242 } 12242 }
12243 if (redirectedConstructor2.isConst()) { 12243 if (redirectedConstructor.isConst()) {
12244 return false; 12244 return false;
12245 } 12245 }
12246 _errorReporter.reportError2(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONST RUCTOR, redirectedConstructorNode, []); 12246 _errorReporter.reportError2(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONST RUCTOR, redirectedConstructorNode, []);
12247 return true; 12247 return true;
12248 } 12248 }
12249 12249
12250 /** 12250 /**
12251 * This checks if the passed identifier is banned because it is part of the va riable declaration 12251 * This checks if the passed identifier is banned because it is part of the va riable declaration
12252 * with the same name. 12252 * with the same name.
12253 * @param node the identifier to evaluate 12253 * @param node the identifier to evaluate
12254 * @return {@code true} if and only if an error code is generated on the passe d node 12254 * @return {@code true} if and only if an error code is generated on the passe d node
12255 * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER 12255 * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER
12256 */ 12256 */
12257 bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) { 12257 bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) {
12258 ASTNode parent2 = node.parent; 12258 ASTNode parent = node.parent;
12259 if (parent2 is PrefixedIdentifier) { 12259 if (parent is PrefixedIdentifier) {
12260 PrefixedIdentifier prefixedIdentifier = parent2 as PrefixedIdentifier; 12260 PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier;
12261 if (identical(prefixedIdentifier.identifier, node)) { 12261 if (identical(prefixedIdentifier.identifier, node)) {
12262 return false; 12262 return false;
12263 } 12263 }
12264 } 12264 }
12265 if (parent2 is PropertyAccess) { 12265 if (parent is PropertyAccess) {
12266 PropertyAccess propertyAccess = parent2 as PropertyAccess; 12266 PropertyAccess propertyAccess = parent as PropertyAccess;
12267 if (identical(propertyAccess.propertyName, node)) { 12267 if (identical(propertyAccess.propertyName, node)) {
12268 return false; 12268 return false;
12269 } 12269 }
12270 } 12270 }
12271 if (parent2 is MethodInvocation) { 12271 if (parent is MethodInvocation) {
12272 MethodInvocation methodInvocation = parent2 as MethodInvocation; 12272 MethodInvocation methodInvocation = parent as MethodInvocation;
12273 if (methodInvocation.target != null && identical(methodInvocation.methodNa me, node)) { 12273 if (methodInvocation.target != null && identical(methodInvocation.methodNa me, node)) {
12274 return false; 12274 return false;
12275 } 12275 }
12276 } 12276 }
12277 if (parent2 is ConstructorName) { 12277 if (parent is ConstructorName) {
12278 ConstructorName constructorName = parent2 as ConstructorName; 12278 ConstructorName constructorName = parent as ConstructorName;
12279 if (identical(constructorName.name, node)) { 12279 if (identical(constructorName.name, node)) {
12280 return false; 12280 return false;
12281 } 12281 }
12282 } 12282 }
12283 if (parent2 is Label) { 12283 if (parent is Label) {
12284 Label label = parent2 as Label; 12284 Label label = parent as Label;
12285 if (identical(label.label, node)) { 12285 if (identical(label.label, node)) {
12286 return false; 12286 return false;
12287 } 12287 }
12288 } 12288 }
12289 String name2 = node.name; 12289 String name = node.name;
12290 if (!_namesForReferenceToDeclaredVariableInInitializer.contains(name2)) { 12290 if (!_namesForReferenceToDeclaredVariableInInitializer.contains(name)) {
12291 return false; 12291 return false;
12292 } 12292 }
12293 _errorReporter.reportError2(CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIA BLE_IN_INITIALIZER, node, [name2]); 12293 _errorReporter.reportError2(CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIA BLE_IN_INITIALIZER, node, [name]);
12294 return true; 12294 return true;
12295 } 12295 }
12296 12296
12297 /** 12297 /**
12298 * This checks that the rethrow is inside of a catch clause. 12298 * This checks that the rethrow is inside of a catch clause.
12299 * @param node the rethrow expression to evaluate 12299 * @param node the rethrow expression to evaluate
12300 * @return {@code true} if and only if an error code is generated on the passe d node 12300 * @return {@code true} if and only if an error code is generated on the passe d node
12301 * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH 12301 * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
12302 */ 12302 */
12303 bool checkForRethrowOutsideCatch(RethrowExpression node) { 12303 bool checkForRethrowOutsideCatch(RethrowExpression node) {
12304 if (!_isInCatchClause) { 12304 if (!_isInCatchClause) {
12305 _errorReporter.reportError2(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, no de, []); 12305 _errorReporter.reportError2(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, no de, []);
12306 return true; 12306 return true;
12307 } 12307 }
12308 return false; 12308 return false;
12309 } 12309 }
12310 12310
12311 /** 12311 /**
12312 * This checks that if the given "target" is the type reference then the "name " is not the 12312 * This checks that if the given "target" is the type reference then the "name " is not the
12313 * reference to a instance member. 12313 * reference to a instance member.
12314 * @param target the target of the name access to evaluate 12314 * @param target the target of the name access to evaluate
12315 * @param name the accessed name to evaluate 12315 * @param name the accessed name to evaluate
12316 * @return {@code true} if and only if an error code is generated on the passe d node 12316 * @return {@code true} if and only if an error code is generated on the passe d node
12317 * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER 12317 * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
12318 */ 12318 */
12319 bool checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name2) { 12319 bool checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name2) {
12320 Element element2 = name2.element; 12320 Element element = name2.element;
12321 if (element2 is! ExecutableElement) { 12321 if (element is! ExecutableElement) {
12322 return false; 12322 return false;
12323 } 12323 }
12324 ExecutableElement memberElement = element2 as ExecutableElement; 12324 ExecutableElement memberElement = element as ExecutableElement;
12325 if (memberElement.isStatic()) { 12325 if (memberElement.isStatic()) {
12326 return false; 12326 return false;
12327 } 12327 }
12328 if (!isTypeReference(target)) { 12328 if (!isTypeReference(target)) {
12329 return false; 12329 return false;
12330 } 12330 }
12331 _errorReporter.reportError2(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMB ER, name2, [name2.name]); 12331 _errorReporter.reportError2(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMB ER, name2, [name2.name]);
12332 return true; 12332 return true;
12333 } 12333 }
12334 12334
12335 /** 12335 /**
12336 * This checks that the type of the passed 'switch' expression is assignable t o the type of the 12336 * This checks that the type of the passed 'switch' expression is assignable t o the type of the
12337 * 'case' members. 12337 * 'case' members.
12338 * @param node the 'switch' statement to evaluate 12338 * @param node the 'switch' statement to evaluate
12339 * @return {@code true} if and only if an error code is generated on the passe d node 12339 * @return {@code true} if and only if an error code is generated on the passe d node
12340 * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE 12340 * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
12341 */ 12341 */
12342 bool checkForSwitchExpressionNotAssignable(SwitchStatement node) { 12342 bool checkForSwitchExpressionNotAssignable(SwitchStatement node) {
12343 Expression expression2 = node.expression; 12343 Expression expression = node.expression;
12344 Type2 expressionType = getStaticType(expression2); 12344 Type2 expressionType = getStaticType(expression);
12345 if (expressionType == null) { 12345 if (expressionType == null) {
12346 return false; 12346 return false;
12347 } 12347 }
12348 NodeList<SwitchMember> members2 = node.members; 12348 NodeList<SwitchMember> members = node.members;
12349 for (SwitchMember switchMember in members2) { 12349 for (SwitchMember switchMember in members) {
12350 if (switchMember is! SwitchCase) { 12350 if (switchMember is! SwitchCase) {
12351 continue; 12351 continue;
12352 } 12352 }
12353 SwitchCase switchCase = switchMember as SwitchCase; 12353 SwitchCase switchCase = switchMember as SwitchCase;
12354 Expression caseExpression = switchCase.expression; 12354 Expression caseExpression = switchCase.expression;
12355 Type2 caseType = getStaticType(caseExpression); 12355 Type2 caseType = getStaticType(caseExpression);
12356 if (expressionType.isAssignableTo(caseType)) { 12356 if (expressionType.isAssignableTo(caseType)) {
12357 return false; 12357 return false;
12358 } 12358 }
12359 _errorReporter.reportError2(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGN ABLE, expression2, [expressionType, caseType]); 12359 _errorReporter.reportError2(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGN ABLE, expression, [expressionType, caseType]);
12360 return true; 12360 return true;
12361 } 12361 }
12362 return false; 12362 return false;
12363 } 12363 }
12364 12364
12365 /** 12365 /**
12366 * This verifies that the type arguments in the passed instance creation expre ssion are all within 12366 * This verifies that the type arguments in the passed instance creation expre ssion are all within
12367 * their bounds as specified by the class element where the constructor \[that is being invoked\] is 12367 * their bounds as specified by the class element where the constructor \[that is being invoked\] is
12368 * declared. 12368 * declared.
12369 * @param node the instance creation expression to evaluate 12369 * @param node the instance creation expression to evaluate
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
12442 bool checkForWrongNumberOfParametersForOperator(MethodDeclaration node) { 12442 bool checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
12443 FormalParameterList parameterList = node.parameters; 12443 FormalParameterList parameterList = node.parameters;
12444 if (parameterList == null) { 12444 if (parameterList == null) {
12445 return false; 12445 return false;
12446 } 12446 }
12447 int numParameters = parameterList.parameters.length; 12447 int numParameters = parameterList.parameters.length;
12448 SimpleIdentifier nameNode = node.name; 12448 SimpleIdentifier nameNode = node.name;
12449 if (nameNode == null) { 12449 if (nameNode == null) {
12450 return false; 12450 return false;
12451 } 12451 }
12452 String name2 = nameNode.name; 12452 String name = nameNode.name;
12453 int expected = -1; 12453 int expected = -1;
12454 if ("[]=" == name2) { 12454 if ("[]=" == name) {
12455 expected = 2; 12455 expected = 2;
12456 } else if ("<" == name2 || ">" == name2 || "<=" == name2 || ">=" == name2 || "==" == name2 || "+" == name2 || "/" == name2 || "~/" == name2 || "*" == name2 || "%" == name2 || "|" == name2 || "^" == name2 || "&" == name2 || "<<" == name2 || ">>" == name2 || "[]" == name2) { 12456 } else if ("<" == name || ">" == name || "<=" == name || ">=" == name || "== " == name || "+" == name || "/" == name || "~/" == name || "*" == name || "%" == name || "|" == name || "^" == name || "&" == name || "<<" == name || ">>" == na me || "[]" == name) {
12457 expected = 1; 12457 expected = 1;
12458 } else if ("~" == name2) { 12458 } else if ("~" == name) {
12459 expected = 0; 12459 expected = 0;
12460 } 12460 }
12461 if (expected != -1 && numParameters != expected) { 12461 if (expected != -1 && numParameters != expected) {
12462 _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETER S_FOR_OPERATOR, nameNode, [name2, expected, numParameters]); 12462 _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETER S_FOR_OPERATOR, nameNode, [name, expected, numParameters]);
12463 return true; 12463 return true;
12464 } 12464 }
12465 if ("-" == name2 && numParameters > 1) { 12465 if ("-" == name && numParameters > 1) {
12466 _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETER S_FOR_OPERATOR_MINUS, nameNode, [numParameters]); 12466 _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETER S_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
12467 return true; 12467 return true;
12468 } 12468 }
12469 return false; 12469 return false;
12470 } 12470 }
12471 12471
12472 /** 12472 /**
12473 * This verifies if the passed setter parameter list have only one parameter. 12473 * This verifies if the passed setter parameter list have only one parameter.
12474 * <p> 12474 * <p>
12475 * This method assumes that the method declaration was tested to be a setter b efore being called. 12475 * This method assumes that the method declaration was tested to be a setter b efore being called.
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
12555 } 12555 }
12556 12556
12557 /** 12557 /**
12558 * Return the variable element represented by the given expression, or {@code null} if there is no 12558 * Return the variable element represented by the given expression, or {@code null} if there is no
12559 * such element. 12559 * such element.
12560 * @param expression the expression whose element is to be returned 12560 * @param expression the expression whose element is to be returned
12561 * @return the variable element represented by the expression 12561 * @return the variable element represented by the expression
12562 */ 12562 */
12563 VariableElement getVariableElement(Expression expression) { 12563 VariableElement getVariableElement(Expression expression) {
12564 if (expression is Identifier) { 12564 if (expression is Identifier) {
12565 Element element2 = ((expression as Identifier)).element; 12565 Element element = ((expression as Identifier)).element;
12566 if (element2 is VariableElement) { 12566 if (element is VariableElement) {
12567 return element2 as VariableElement; 12567 return element as VariableElement;
12568 } 12568 }
12569 } 12569 }
12570 return null; 12570 return null;
12571 } 12571 }
12572 12572
12573 /** 12573 /**
12574 * @return {@code true} if the given constructor redirects to itself, directly or indirectly 12574 * @return {@code true} if the given constructor redirects to itself, directly or indirectly
12575 */ 12575 */
12576 bool hasRedirectingFactoryConstructorCycle(ConstructorElement element) { 12576 bool hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
12577 Set<ConstructorElement> constructors = new Set<ConstructorElement>(); 12577 Set<ConstructorElement> constructors = new Set<ConstructorElement>();
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
12708 12708
12709 /** 12709 /**
12710 * Answer the full name of the source associated with the compilation unit con taining the given 12710 * Answer the full name of the source associated with the compilation unit con taining the given
12711 * AST node. The returned value will have all {@link File#separatorChar} repla ce by '/'. 12711 * AST node. The returned value will have all {@link File#separatorChar} repla ce by '/'.
12712 * @param node the node (not {@code null}) 12712 * @param node the node (not {@code null})
12713 * @return the full name or {@code null} if it could not be determined 12713 * @return the full name or {@code null} if it could not be determined
12714 */ 12714 */
12715 String getSourceFullName(ASTNode node) { 12715 String getSourceFullName(ASTNode node) {
12716 CompilationUnit unit = node.getAncestor(CompilationUnit); 12716 CompilationUnit unit = node.getAncestor(CompilationUnit);
12717 if (unit != null) { 12717 if (unit != null) {
12718 CompilationUnitElement element2 = unit.element; 12718 CompilationUnitElement element = unit.element;
12719 if (element2 != null) { 12719 if (element != null) {
12720 Source librarySource = element2.source; 12720 Source librarySource = element.source;
12721 if (librarySource != null) { 12721 if (librarySource != null) {
12722 String fullName2 = librarySource.fullName; 12722 String fullName = librarySource.fullName;
12723 if (fullName2 != null) { 12723 if (fullName != null) {
12724 return fullName2.replaceAll(r'\', '/'); 12724 return fullName.replaceAll(r'\', '/');
12725 } 12725 }
12726 } 12726 }
12727 } 12727 }
12728 } 12728 }
12729 return null; 12729 return null;
12730 } 12730 }
12731 } 12731 }
12732 /** 12732 /**
12733 * The enumeration {@code ResolverErrorCode} defines the error codes used for er rors detected by the 12733 * The enumeration {@code ResolverErrorCode} defines the error codes used for er rors detected by the
12734 * resolver. The convention for this class is for the name of the error code to indicate the problem 12734 * resolver. The convention for this class is for the name of the error code to indicate the problem
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
12767 this._type = type; 12767 this._type = type;
12768 this._message = message; 12768 this._message = message;
12769 } 12769 }
12770 ErrorSeverity get errorSeverity => _type.severity; 12770 ErrorSeverity get errorSeverity => _type.severity;
12771 String get message => _message; 12771 String get message => _message;
12772 ErrorType get type => _type; 12772 ErrorType get type => _type;
12773 int compareTo(ResolverErrorCode other) => ordinal - other.ordinal; 12773 int compareTo(ResolverErrorCode other) => ordinal - other.ordinal;
12774 int get hashCode => ordinal; 12774 int get hashCode => ordinal;
12775 String toString() => name; 12775 String toString() => name;
12776 } 12776 }
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