| OLD | NEW |
| 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 | 3 |
| 4 library engine.resolver; | 4 library engine.resolver; |
| 5 | 5 |
| 6 import 'dart:collection'; | 6 import 'dart:collection'; |
| 7 import 'java_core.dart'; | 7 import 'java_core.dart'; |
| 8 import 'java_engine.dart'; | 8 import 'java_engine.dart'; |
| 9 import 'source.dart'; | 9 import 'source.dart'; |
| 10 import 'error.dart'; | 10 import 'error.dart'; |
| 11 import 'scanner.dart' as sc; | 11 import 'scanner.dart' as sc; |
| 12 import 'utilities_dart.dart'; | 12 import 'utilities_dart.dart'; |
| 13 import 'ast.dart'; | 13 import 'ast.dart'; |
| 14 import 'parser.dart' show Parser; | 14 import 'parser.dart' show Parser; |
| 15 import 'element.dart' hide HideCombinator, ShowCombinator; | 15 import 'element.dart' hide HideCombinator, ShowCombinator; |
| 16 import 'html.dart' as ht; | 16 import 'html.dart' as ht; |
| 17 import 'engine.dart'; | 17 import 'engine.dart'; |
| 18 import 'constant.dart'; |
| 18 import 'element.dart' as __imp_combi show HideCombinator, ShowCombinator; | 19 import 'element.dart' as __imp_combi show HideCombinator, ShowCombinator; |
| 19 | 20 |
| 20 /** | 21 /** |
| 21 * Instances of the class {@code CompilationUnitBuilder} build an element model
for a single | 22 * Instances of the class {@code CompilationUnitBuilder} build an element model
for a single |
| 22 * compilation unit. | 23 * compilation unit. |
| 23 * @coverage dart.engine.resolver | 24 * @coverage dart.engine.resolver |
| 24 */ | 25 */ |
| 25 class CompilationUnitBuilder { | 26 class CompilationUnitBuilder { |
| 26 /** | 27 /** |
| 27 * The analysis context in which the element model will be built. | 28 * The analysis context in which the element model will be built. |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 visitChildren(holder, node); | 166 visitChildren(holder, node); |
| 166 SimpleIdentifier constructorName = node.name; | 167 SimpleIdentifier constructorName = node.name; |
| 167 ConstructorElementImpl element = new ConstructorElementImpl(constructorName)
; | 168 ConstructorElementImpl element = new ConstructorElementImpl(constructorName)
; |
| 168 if (node.factoryKeyword != null) { | 169 if (node.factoryKeyword != null) { |
| 169 element.factory = true; | 170 element.factory = true; |
| 170 } | 171 } |
| 171 element.functions = holder.functions; | 172 element.functions = holder.functions; |
| 172 element.labels = holder.labels; | 173 element.labels = holder.labels; |
| 173 element.localVariables = holder.localVariables; | 174 element.localVariables = holder.localVariables; |
| 174 element.parameters = holder.parameters; | 175 element.parameters = holder.parameters; |
| 176 element.const2 = node.constKeyword != null; |
| 175 _currentHolder.addConstructor(element); | 177 _currentHolder.addConstructor(element); |
| 176 node.element = element; | 178 node.element = element; |
| 177 if (constructorName != null) { | 179 if (constructorName != null) { |
| 178 constructorName.element = element; | 180 constructorName.element = element; |
| 179 } | 181 } |
| 180 return null; | 182 return null; |
| 181 } | 183 } |
| 182 Object visitDeclaredIdentifier(DeclaredIdentifier node) { | 184 Object visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 183 SimpleIdentifier variableName = node.identifier; | 185 SimpleIdentifier variableName = node.identifier; |
| 184 sc.Token keyword27 = node.keyword; | 186 sc.Token keyword27 = node.keyword; |
| 185 LocalVariableElementImpl element = new LocalVariableElementImpl(variableName
); | 187 LocalVariableElementImpl element = new LocalVariableElementImpl(variableName
); |
| 186 ForEachStatement statement = node.parent as ForEachStatement; | 188 ForEachStatement statement = node.parent as ForEachStatement; |
| 187 int declarationEnd = node.offset + node.length; | 189 int declarationEnd = node.offset + node.length; |
| 188 int statementEnd = statement.offset + statement.length; | 190 int statementEnd = statement.offset + statement.length; |
| 189 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1); | 191 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1); |
| 190 element.const2 = matches(keyword27, sc.Keyword.CONST); | 192 element.const3 = matches(keyword27, sc.Keyword.CONST); |
| 191 element.final2 = matches(keyword27, sc.Keyword.FINAL); | 193 element.final2 = matches(keyword27, sc.Keyword.FINAL); |
| 192 _currentHolder.addLocalVariable(element); | 194 _currentHolder.addLocalVariable(element); |
| 193 variableName.element = element; | 195 variableName.element = element; |
| 194 return super.visitDeclaredIdentifier(node); | 196 return super.visitDeclaredIdentifier(node); |
| 195 } | 197 } |
| 196 Object visitDefaultFormalParameter(DefaultFormalParameter node) { | 198 Object visitDefaultFormalParameter(DefaultFormalParameter node) { |
| 197 ElementHolder holder = new ElementHolder(); | 199 ElementHolder holder = new ElementHolder(); |
| 198 visit(holder, node.defaultValue); | 200 visit(holder, node.defaultValue); |
| 199 FunctionElementImpl initializer = new FunctionElementImpl(); | 201 FunctionElementImpl initializer = new FunctionElementImpl(); |
| 200 initializer.functions = holder.functions; | 202 initializer.functions = holder.functions; |
| 201 initializer.labels = holder.labels; | 203 initializer.labels = holder.labels; |
| 202 initializer.localVariables = holder.localVariables; | 204 initializer.localVariables = holder.localVariables; |
| 203 initializer.parameters = holder.parameters; | 205 initializer.parameters = holder.parameters; |
| 204 SimpleIdentifier parameterName = node.parameter.identifier; | 206 SimpleIdentifier parameterName = node.parameter.identifier; |
| 205 ParameterElementImpl parameter = new ParameterElementImpl(parameterName); | 207 ParameterElementImpl parameter; |
| 206 parameter.const2 = node.isConst(); | 208 if (node.isConst()) { |
| 209 parameter = new ConstParameterElementImpl(parameterName); |
| 210 parameter.const3 = true; |
| 211 } else { |
| 212 parameter = new ParameterElementImpl(parameterName); |
| 213 } |
| 207 parameter.final2 = node.isFinal(); | 214 parameter.final2 = node.isFinal(); |
| 208 parameter.initializer = initializer; | 215 parameter.initializer = initializer; |
| 209 parameter.parameterKind = node.kind; | 216 parameter.parameterKind = node.kind; |
| 210 FunctionBody body = getFunctionBody(node); | 217 FunctionBody body = getFunctionBody(node); |
| 211 if (body != null) { | 218 if (body != null) { |
| 212 parameter.setVisibleRange(body.offset, body.length); | 219 parameter.setVisibleRange(body.offset, body.length); |
| 213 } | 220 } |
| 214 _currentHolder.addParameter(parameter); | 221 _currentHolder.addParameter(parameter); |
| 215 parameterName.element = parameter; | 222 parameterName.element = parameter; |
| 216 node.parameter.accept(this); | 223 node.parameter.accept(this); |
| 217 return null; | 224 return null; |
| 218 } | 225 } |
| 219 Object visitFieldDeclaration(FieldDeclaration node) { | 226 Object visitFieldDeclaration(FieldDeclaration node) { |
| 220 bool wasInField = _inFieldContext; | 227 bool wasInField = _inFieldContext; |
| 221 _inFieldContext = true; | 228 _inFieldContext = true; |
| 222 try { | 229 try { |
| 223 node.visitChildren(this); | 230 node.visitChildren(this); |
| 224 } finally { | 231 } finally { |
| 225 _inFieldContext = wasInField; | 232 _inFieldContext = wasInField; |
| 226 } | 233 } |
| 227 return null; | 234 return null; |
| 228 } | 235 } |
| 229 Object visitFieldFormalParameter(FieldFormalParameter node) { | 236 Object visitFieldFormalParameter(FieldFormalParameter node) { |
| 230 if (node.parent is! DefaultFormalParameter) { | 237 if (node.parent is! DefaultFormalParameter) { |
| 231 SimpleIdentifier parameterName = node.identifier; | 238 SimpleIdentifier parameterName = node.identifier; |
| 232 ParameterElementImpl parameter = new ParameterElementImpl(parameterName); | 239 ParameterElementImpl parameter = new ParameterElementImpl(parameterName); |
| 233 parameter.const2 = node.isConst(); | 240 parameter.const3 = node.isConst(); |
| 234 parameter.initializingFormal = true; | 241 parameter.initializingFormal = true; |
| 235 parameter.final2 = node.isFinal(); | 242 parameter.final2 = node.isFinal(); |
| 236 parameter.parameterKind = node.kind; | 243 parameter.parameterKind = node.kind; |
| 237 _currentHolder.addParameter(parameter); | 244 _currentHolder.addParameter(parameter); |
| 238 parameterName.element = parameter; | 245 parameterName.element = parameter; |
| 239 } | 246 } |
| 240 return super.visitFieldFormalParameter(node); | 247 return super.visitFieldFormalParameter(node); |
| 241 } | 248 } |
| 242 Object visitFunctionDeclaration(FunctionDeclaration node) { | 249 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 243 FunctionExpression expression = node.functionExpression; | 250 FunctionExpression expression = node.functionExpression; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 _currentHolder.addFunction(element); | 337 _currentHolder.addFunction(element); |
| 331 node.element = element; | 338 node.element = element; |
| 332 return null; | 339 return null; |
| 333 } | 340 } |
| 334 Object visitFunctionTypeAlias(FunctionTypeAlias node) { | 341 Object visitFunctionTypeAlias(FunctionTypeAlias node) { |
| 335 ElementHolder holder = new ElementHolder(); | 342 ElementHolder holder = new ElementHolder(); |
| 336 visitChildren(holder, node); | 343 visitChildren(holder, node); |
| 337 SimpleIdentifier aliasName = node.name; | 344 SimpleIdentifier aliasName = node.name; |
| 338 List<ParameterElement> parameters10 = holder.parameters; | 345 List<ParameterElement> parameters10 = holder.parameters; |
| 339 List<TypeVariableElement> typeVariables6 = holder.typeVariables; | 346 List<TypeVariableElement> typeVariables6 = holder.typeVariables; |
| 340 TypeAliasElementImpl element = new TypeAliasElementImpl(aliasName); | 347 FunctionTypeAliasElementImpl element = new FunctionTypeAliasElementImpl(alia
sName); |
| 341 element.parameters = parameters10; | 348 element.parameters = parameters10; |
| 342 element.typeVariables = typeVariables6; | 349 element.typeVariables = typeVariables6; |
| 343 FunctionTypeImpl type = new FunctionTypeImpl.con2(element); | 350 FunctionTypeImpl type = new FunctionTypeImpl.con2(element); |
| 344 type.typeArguments = createTypeVariableTypes(typeVariables6); | 351 type.typeArguments = createTypeVariableTypes(typeVariables6); |
| 345 element.type = type; | 352 element.type = type; |
| 346 _currentHolder.addTypeAlias(element); | 353 _currentHolder.addTypeAlias(element); |
| 347 aliasName.element = element; | 354 aliasName.element = element; |
| 348 return null; | 355 return null; |
| 349 } | 356 } |
| 350 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { | 357 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 _currentHolder.addAccessor(setter); | 434 _currentHolder.addAccessor(setter); |
| 428 propertyNameNode.element = setter; | 435 propertyNameNode.element = setter; |
| 429 } | 436 } |
| 430 } | 437 } |
| 431 return null; | 438 return null; |
| 432 } | 439 } |
| 433 Object visitSimpleFormalParameter(SimpleFormalParameter node) { | 440 Object visitSimpleFormalParameter(SimpleFormalParameter node) { |
| 434 if (node.parent is! DefaultFormalParameter) { | 441 if (node.parent is! DefaultFormalParameter) { |
| 435 SimpleIdentifier parameterName = node.identifier; | 442 SimpleIdentifier parameterName = node.identifier; |
| 436 ParameterElementImpl parameter = new ParameterElementImpl(parameterName); | 443 ParameterElementImpl parameter = new ParameterElementImpl(parameterName); |
| 437 parameter.const2 = node.isConst(); | 444 parameter.const3 = node.isConst(); |
| 438 parameter.final2 = node.isFinal(); | 445 parameter.final2 = node.isFinal(); |
| 439 parameter.parameterKind = node.kind; | 446 parameter.parameterKind = node.kind; |
| 440 _currentHolder.addParameter(parameter); | 447 _currentHolder.addParameter(parameter); |
| 441 parameterName.element = parameter; | 448 parameterName.element = parameter; |
| 442 } | 449 } |
| 443 return super.visitSimpleFormalParameter(node); | 450 return super.visitSimpleFormalParameter(node); |
| 444 } | 451 } |
| 445 Object visitSuperExpression(SuperExpression node) { | 452 Object visitSuperExpression(SuperExpression node) { |
| 446 _isValidMixin = false; | 453 _isValidMixin = false; |
| 447 return super.visitSuperExpression(node); | 454 return super.visitSuperExpression(node); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 467 Object visitTypeParameter(TypeParameter node) { | 474 Object visitTypeParameter(TypeParameter node) { |
| 468 SimpleIdentifier parameterName = node.name; | 475 SimpleIdentifier parameterName = node.name; |
| 469 TypeVariableElementImpl element = new TypeVariableElementImpl(parameterName)
; | 476 TypeVariableElementImpl element = new TypeVariableElementImpl(parameterName)
; |
| 470 TypeVariableTypeImpl type = new TypeVariableTypeImpl(element); | 477 TypeVariableTypeImpl type = new TypeVariableTypeImpl(element); |
| 471 element.type = type; | 478 element.type = type; |
| 472 _currentHolder.addTypeVariable(element); | 479 _currentHolder.addTypeVariable(element); |
| 473 parameterName.element = element; | 480 parameterName.element = element; |
| 474 return super.visitTypeParameter(node); | 481 return super.visitTypeParameter(node); |
| 475 } | 482 } |
| 476 Object visitVariableDeclaration(VariableDeclaration node) { | 483 Object visitVariableDeclaration(VariableDeclaration node) { |
| 484 sc.Token keyword28 = ((node.parent as VariableDeclarationList)).keyword; |
| 485 bool isConst = matches(keyword28, sc.Keyword.CONST); |
| 486 bool isFinal = matches(keyword28, sc.Keyword.FINAL); |
| 487 bool hasInitializer = node.initializer != null; |
| 477 VariableElementImpl element; | 488 VariableElementImpl element; |
| 478 if (_inFieldContext) { | 489 if (_inFieldContext) { |
| 479 SimpleIdentifier fieldName = node.name; | 490 SimpleIdentifier fieldName = node.name; |
| 480 FieldElementImpl field = new FieldElementImpl.con1(fieldName); | 491 FieldElementImpl field; |
| 492 if (isConst && hasInitializer) { |
| 493 field = new ConstFieldElementImpl(fieldName); |
| 494 } else { |
| 495 field = new FieldElementImpl.con1(fieldName); |
| 496 } |
| 481 element = field; | 497 element = field; |
| 482 _currentHolder.addField(field); | 498 _currentHolder.addField(field); |
| 483 fieldName.element = field; | 499 fieldName.element = field; |
| 484 } else if (_inFunction) { | 500 } else if (_inFunction) { |
| 485 SimpleIdentifier variableName = node.name; | 501 SimpleIdentifier variableName = node.name; |
| 486 element = new LocalVariableElementImpl(variableName); | 502 LocalVariableElementImpl variable; |
| 503 if (isConst && hasInitializer) { |
| 504 variable = new ConstLocalVariableElementImpl(variableName); |
| 505 } else { |
| 506 variable = new LocalVariableElementImpl(variableName); |
| 507 } |
| 508 element = variable; |
| 487 Block enclosingBlock = node.getAncestor(Block); | 509 Block enclosingBlock = node.getAncestor(Block); |
| 488 int functionEnd = node.offset + node.length; | 510 int functionEnd = node.offset + node.length; |
| 489 int blockEnd = enclosingBlock.offset + enclosingBlock.length; | 511 int blockEnd = enclosingBlock.offset + enclosingBlock.length; |
| 490 ((element as LocalVariableElementImpl)).setVisibleRange(functionEnd, block
End - functionEnd - 1); | 512 variable.setVisibleRange(functionEnd, blockEnd - functionEnd - 1); |
| 491 _currentHolder.addLocalVariable((element as LocalVariableElementImpl)); | 513 _currentHolder.addLocalVariable(variable); |
| 492 variableName.element = element; | 514 variableName.element = element; |
| 493 } else { | 515 } else { |
| 494 SimpleIdentifier variableName = node.name; | 516 SimpleIdentifier variableName = node.name; |
| 495 element = new TopLevelVariableElementImpl.con1(variableName); | 517 TopLevelVariableElementImpl variable; |
| 496 _currentHolder.addTopLevelVariable((element as TopLevelVariableElementImpl
)); | 518 if (isConst && hasInitializer) { |
| 519 variable = new ConstTopLevelVariableElementImpl(variableName); |
| 520 } else { |
| 521 variable = new TopLevelVariableElementImpl.con1(variableName); |
| 522 } |
| 523 element = variable; |
| 524 _currentHolder.addTopLevelVariable(variable); |
| 497 variableName.element = element; | 525 variableName.element = element; |
| 498 } | 526 } |
| 499 sc.Token keyword28 = ((node.parent as VariableDeclarationList)).keyword; | 527 element.const3 = isConst; |
| 500 bool isFinal = matches(keyword28, sc.Keyword.FINAL); | |
| 501 element.const2 = matches(keyword28, sc.Keyword.CONST); | |
| 502 element.final2 = isFinal; | 528 element.final2 = isFinal; |
| 503 if (node.initializer != null) { | 529 if (hasInitializer) { |
| 504 ElementHolder holder = new ElementHolder(); | 530 ElementHolder holder = new ElementHolder(); |
| 505 bool wasInFieldContext = _inFieldContext; | 531 bool wasInFieldContext = _inFieldContext; |
| 506 _inFieldContext = false; | 532 _inFieldContext = false; |
| 507 try { | 533 try { |
| 508 visit(holder, node.initializer); | 534 visit(holder, node.initializer); |
| 509 } finally { | 535 } finally { |
| 510 _inFieldContext = wasInFieldContext; | 536 _inFieldContext = wasInFieldContext; |
| 511 } | 537 } |
| 512 FunctionElementImpl initializer = new FunctionElementImpl(); | 538 FunctionElementImpl initializer = new FunctionElementImpl(); |
| 513 initializer.functions = holder.functions; | 539 initializer.functions = holder.functions; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 * @coverage dart.engine.resolver | 635 * @coverage dart.engine.resolver |
| 610 */ | 636 */ |
| 611 class ElementHolder { | 637 class ElementHolder { |
| 612 List<PropertyAccessorElement> _accessors = new List<PropertyAccessorElement>()
; | 638 List<PropertyAccessorElement> _accessors = new List<PropertyAccessorElement>()
; |
| 613 List<ConstructorElement> _constructors = new List<ConstructorElement>(); | 639 List<ConstructorElement> _constructors = new List<ConstructorElement>(); |
| 614 List<FieldElement> _fields = new List<FieldElement>(); | 640 List<FieldElement> _fields = new List<FieldElement>(); |
| 615 List<FunctionElement> _functions = new List<FunctionElement>(); | 641 List<FunctionElement> _functions = new List<FunctionElement>(); |
| 616 List<LabelElement> _labels = new List<LabelElement>(); | 642 List<LabelElement> _labels = new List<LabelElement>(); |
| 617 List<VariableElement> _localVariables = new List<VariableElement>(); | 643 List<VariableElement> _localVariables = new List<VariableElement>(); |
| 618 List<MethodElement> _methods = new List<MethodElement>(); | 644 List<MethodElement> _methods = new List<MethodElement>(); |
| 619 List<TypeAliasElement> _typeAliases = new List<TypeAliasElement>(); | 645 List<FunctionTypeAliasElement> _typeAliases = new List<FunctionTypeAliasElemen
t>(); |
| 620 List<ParameterElement> _parameters = new List<ParameterElement>(); | 646 List<ParameterElement> _parameters = new List<ParameterElement>(); |
| 621 List<VariableElement> _topLevelVariables = new List<VariableElement>(); | 647 List<VariableElement> _topLevelVariables = new List<VariableElement>(); |
| 622 List<ClassElement> _types = new List<ClassElement>(); | 648 List<ClassElement> _types = new List<ClassElement>(); |
| 623 List<TypeVariableElement> _typeVariables = new List<TypeVariableElement>(); | 649 List<TypeVariableElement> _typeVariables = new List<TypeVariableElement>(); |
| 624 /** | 650 /** |
| 625 * Initialize a newly created element holder. | 651 * Initialize a newly created element holder. |
| 626 */ | 652 */ |
| 627 ElementHolder() : super() { | 653 ElementHolder() : super() { |
| 628 } | 654 } |
| 629 void addAccessor(PropertyAccessorElement element) { | 655 void addAccessor(PropertyAccessorElement element) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 649 } | 675 } |
| 650 void addParameter(ParameterElement element) { | 676 void addParameter(ParameterElement element) { |
| 651 _parameters.add(element); | 677 _parameters.add(element); |
| 652 } | 678 } |
| 653 void addTopLevelVariable(TopLevelVariableElement element) { | 679 void addTopLevelVariable(TopLevelVariableElement element) { |
| 654 _topLevelVariables.add(element); | 680 _topLevelVariables.add(element); |
| 655 } | 681 } |
| 656 void addType(ClassElement element) { | 682 void addType(ClassElement element) { |
| 657 _types.add(element); | 683 _types.add(element); |
| 658 } | 684 } |
| 659 void addTypeAlias(TypeAliasElement element) { | 685 void addTypeAlias(FunctionTypeAliasElement element) { |
| 660 _typeAliases.add(element); | 686 _typeAliases.add(element); |
| 661 } | 687 } |
| 662 void addTypeVariable(TypeVariableElement element) { | 688 void addTypeVariable(TypeVariableElement element) { |
| 663 _typeVariables.add(element); | 689 _typeVariables.add(element); |
| 664 } | 690 } |
| 665 List<PropertyAccessorElement> get accessors => new List.from(_accessors); | 691 List<PropertyAccessorElement> get accessors => new List.from(_accessors); |
| 666 List<ConstructorElement> get constructors => new List.from(_constructors); | 692 List<ConstructorElement> get constructors => new List.from(_constructors); |
| 667 FieldElement getField(String fieldName) { | 693 FieldElement getField(String fieldName) { |
| 668 for (FieldElement field in _fields) { | 694 for (FieldElement field in _fields) { |
| 669 if (field.name == fieldName) { | 695 if (field.name == fieldName) { |
| 670 return field; | 696 return field; |
| 671 } | 697 } |
| 672 } | 698 } |
| 673 return null; | 699 return null; |
| 674 } | 700 } |
| 675 List<FieldElement> get fields => new List.from(_fields); | 701 List<FieldElement> get fields => new List.from(_fields); |
| 676 List<FunctionElement> get functions => new List.from(_functions); | 702 List<FunctionElement> get functions => new List.from(_functions); |
| 677 List<LabelElement> get labels => new List.from(_labels); | 703 List<LabelElement> get labels => new List.from(_labels); |
| 678 List<LocalVariableElement> get localVariables => new List.from(_localVariables
); | 704 List<LocalVariableElement> get localVariables => new List.from(_localVariables
); |
| 679 List<MethodElement> get methods => new List.from(_methods); | 705 List<MethodElement> get methods => new List.from(_methods); |
| 680 List<ParameterElement> get parameters => new List.from(_parameters); | 706 List<ParameterElement> get parameters => new List.from(_parameters); |
| 681 List<TopLevelVariableElement> get topLevelVariables => new List.from(_topLevel
Variables); | 707 List<TopLevelVariableElement> get topLevelVariables => new List.from(_topLevel
Variables); |
| 682 List<TypeAliasElement> get typeAliases => new List.from(_typeAliases); | 708 List<FunctionTypeAliasElement> get typeAliases => new List.from(_typeAliases); |
| 683 List<ClassElement> get types => new List.from(_types); | 709 List<ClassElement> get types => new List.from(_types); |
| 684 List<TypeVariableElement> get typeVariables => new List.from(_typeVariables); | 710 List<TypeVariableElement> get typeVariables => new List.from(_typeVariables); |
| 685 } | 711 } |
| 686 /** | 712 /** |
| 687 * Instances of the class {@code HtmlUnitBuilder} build an element model for a s
ingle HTML unit. | 713 * Instances of the class {@code HtmlUnitBuilder} build an element model for a s
ingle HTML unit. |
| 688 */ | 714 */ |
| 689 class HtmlUnitBuilder implements ht.XmlVisitor<Object> { | 715 class HtmlUnitBuilder implements ht.XmlVisitor<Object> { |
| 690 static String _APPLICATION_DART_IN_DOUBLE_QUOTES = "\"application/dart\""; | 716 static String _APPLICATION_DART_IN_DOUBLE_QUOTES = "\"application/dart\""; |
| 691 static String _APPLICATION_DART_IN_SINGLE_QUOTES = "'application/dart'"; | 717 static String _APPLICATION_DART_IN_SINGLE_QUOTES = "'application/dart'"; |
| 692 static String _SCRIPT = "script"; | 718 static String _SCRIPT = "script"; |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 875 */ | 901 */ |
| 876 ElementResolver(ResolverVisitor resolver) { | 902 ElementResolver(ResolverVisitor resolver) { |
| 877 this._resolver = resolver; | 903 this._resolver = resolver; |
| 878 } | 904 } |
| 879 Object visitAssignmentExpression(AssignmentExpression node) { | 905 Object visitAssignmentExpression(AssignmentExpression node) { |
| 880 sc.TokenType operator7 = node.operator.type; | 906 sc.TokenType operator7 = node.operator.type; |
| 881 if (operator7 != sc.TokenType.EQ) { | 907 if (operator7 != sc.TokenType.EQ) { |
| 882 operator7 = operatorFromCompoundAssignment(operator7); | 908 operator7 = operatorFromCompoundAssignment(operator7); |
| 883 Expression leftNode = node.leftHandSide; | 909 Expression leftNode = node.leftHandSide; |
| 884 if (leftNode != null) { | 910 if (leftNode != null) { |
| 885 Type2 leftType = leftNode.staticType; | 911 Type2 leftType = getType(leftNode); |
| 886 if (leftType != null) { | 912 if (leftType != null) { |
| 887 Element leftElement = leftType.element; | 913 Element leftElement = leftType.element; |
| 888 if (leftElement != null) { | 914 if (leftElement != null) { |
| 889 MethodElement method = lookUpMethod(leftElement, operator7.lexeme); | 915 MethodElement method = lookUpMethod(leftElement, operator7.lexeme); |
| 890 if (method != null) { | 916 if (method != null) { |
| 891 node.element = method; | 917 node.element = method; |
| 892 } else { | 918 } else { |
| 893 } | 919 } |
| 894 } | 920 } |
| 895 } | 921 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 } | 981 } |
| 956 Object visitContinueStatement(ContinueStatement node) { | 982 Object visitContinueStatement(ContinueStatement node) { |
| 957 SimpleIdentifier labelNode = node.label; | 983 SimpleIdentifier labelNode = node.label; |
| 958 LabelElementImpl labelElement = lookupLabel(node, labelNode); | 984 LabelElementImpl labelElement = lookupLabel(node, labelNode); |
| 959 if (labelElement != null && labelElement.isOnSwitchStatement()) { | 985 if (labelElement != null && labelElement.isOnSwitchStatement()) { |
| 960 _resolver.reportError(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNod
e, []); | 986 _resolver.reportError(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNod
e, []); |
| 961 } | 987 } |
| 962 return null; | 988 return null; |
| 963 } | 989 } |
| 964 Object visitExportDirective(ExportDirective node) { | 990 Object visitExportDirective(ExportDirective node) { |
| 965 Element element21 = node.element; | 991 Element element22 = node.element; |
| 966 if (element21 is ExportElement) { | 992 if (element22 is ExportElement) { |
| 967 resolveCombinators(((element21 as ExportElement)).exportedLibrary, node.co
mbinators); | 993 resolveCombinators(((element22 as ExportElement)).exportedLibrary, node.co
mbinators); |
| 968 } | 994 } |
| 969 return null; | 995 return null; |
| 970 } | 996 } |
| 971 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
null; | 997 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
null; |
| 972 Object visitImportDirective(ImportDirective node) { | 998 Object visitImportDirective(ImportDirective node) { |
| 973 SimpleIdentifier prefixNode = node.prefix; | 999 SimpleIdentifier prefixNode = node.prefix; |
| 974 if (prefixNode != null) { | 1000 if (prefixNode != null) { |
| 975 String prefixName = prefixNode.name; | 1001 String prefixName = prefixNode.name; |
| 976 for (PrefixElement prefixElement in _resolver.definingLibrary.prefixes) { | 1002 for (PrefixElement prefixElement in _resolver.definingLibrary.prefixes) { |
| 977 if (prefixElement.name == prefixName) { | 1003 if (prefixElement.name == prefixName) { |
| 978 recordResolution(prefixNode, prefixElement); | 1004 recordResolution(prefixNode, prefixElement); |
| 979 break; | 1005 break; |
| 980 } | 1006 } |
| 981 } | 1007 } |
| 982 } | 1008 } |
| 983 Element element22 = node.element; | 1009 Element element23 = node.element; |
| 984 if (element22 is ImportElement) { | 1010 if (element23 is ImportElement) { |
| 985 resolveCombinators(((element22 as ImportElement)).importedLibrary, node.co
mbinators); | 1011 resolveCombinators(((element23 as ImportElement)).importedLibrary, node.co
mbinators); |
| 986 } | 1012 } |
| 987 return null; | 1013 return null; |
| 988 } | 1014 } |
| 989 Object visitIndexExpression(IndexExpression node) { | 1015 Object visitIndexExpression(IndexExpression node) { |
| 990 Type2 arrayType = getType(node.realTarget); | 1016 Type2 arrayType = getType(node.realTarget); |
| 991 if (arrayType == null || arrayType.isDynamic()) { | 1017 if (arrayType == null || arrayType.isDynamic()) { |
| 992 return null; | 1018 return null; |
| 993 } | 1019 } |
| 994 Element arrayTypeElement = arrayType.element; | 1020 Element arrayTypeElement = arrayType.element; |
| 995 String operator; | 1021 String operator; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1019 if (target == null) { | 1045 if (target == null) { |
| 1020 element = _resolver.nameScope.lookup(methodName2, _resolver.definingLibrar
y); | 1046 element = _resolver.nameScope.lookup(methodName2, _resolver.definingLibrar
y); |
| 1021 if (element == null) { | 1047 if (element == null) { |
| 1022 element = lookUpMethod(_resolver.enclosingClass, methodName2.name); | 1048 element = lookUpMethod(_resolver.enclosingClass, methodName2.name); |
| 1023 if (element == null) { | 1049 if (element == null) { |
| 1024 PropertyAccessorElement getter = lookUpGetter(_resolver.enclosingClass
, methodName2.name); | 1050 PropertyAccessorElement getter = lookUpGetter(_resolver.enclosingClass
, methodName2.name); |
| 1025 if (getter != null) { | 1051 if (getter != null) { |
| 1026 FunctionType getterType = getter.type; | 1052 FunctionType getterType = getter.type; |
| 1027 if (getterType != null) { | 1053 if (getterType != null) { |
| 1028 Type2 returnType4 = getterType.returnType; | 1054 Type2 returnType4 = getterType.returnType; |
| 1029 if (!returnType4.isDynamic() && returnType4 is! FunctionType && !r
eturnType4.isDartCoreFunction()) { | 1055 if (!isExecutableType(returnType4)) { |
| 1030 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FU
NCTION, methodName2, [methodName2.name]); | 1056 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FU
NCTION, methodName2, [methodName2.name]); |
| 1031 } | 1057 } |
| 1032 } | 1058 } |
| 1033 recordResolution(methodName2, getter); | 1059 recordResolution(methodName2, getter); |
| 1034 return null; | 1060 return null; |
| 1035 } | 1061 } |
| 1036 } | 1062 } |
| 1037 } | 1063 } |
| 1038 } else { | 1064 } else { |
| 1039 Type2 targetType = getType(target); | 1065 Type2 targetType = getType(target); |
| 1040 if (targetType is InterfaceType) { | 1066 if (targetType is InterfaceType) { |
| 1041 element = lookUpMethod(targetType.element, methodName2.name); | 1067 element = lookUpMethod(targetType.element, methodName2.name); |
| 1042 if (element == null) { | 1068 if (element == null) { |
| 1043 PropertyAccessorElement accessor = lookUpGetterInType((targetType.elem
ent as ClassElement), methodName2.name); | 1069 ClassElement targetClass = targetType.element as ClassElement; |
| 1070 PropertyAccessorElement accessor = lookUpGetterInType(targetClass, met
hodName2.name); |
| 1044 if (accessor != null) { | 1071 if (accessor != null) { |
| 1045 Type2 returnType5 = accessor.type.returnType; | 1072 Type2 returnType5 = accessor.type.returnType.substitute2(((targetTyp
e as InterfaceType)).typeArguments, TypeVariableTypeImpl.getTypes(targetClass.ty
peVariables)); |
| 1046 if (!returnType5.isDynamic() && returnType5 is! FunctionType && !ret
urnType5.isDartCoreFunction()) { | 1073 if (!isExecutableType(returnType5)) { |
| 1047 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNC
TION, methodName2, [methodName2.name]); | 1074 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNC
TION, methodName2, [methodName2.name]); |
| 1048 return null; | 1075 return null; |
| 1049 } | 1076 } |
| 1050 element = accessor; | 1077 element = accessor; |
| 1051 } | 1078 } |
| 1052 } | 1079 } |
| 1053 if (element == null && target is SuperExpression) { | 1080 if (element == null && target is SuperExpression) { |
| 1054 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, me
thodName2, [methodName2.name, targetType.element.name]); | 1081 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, me
thodName2, [methodName2.name, targetType.element.name]); |
| 1055 return null; | 1082 return null; |
| 1056 } | 1083 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1069 } | 1096 } |
| 1070 ExecutableElement invokedMethod = null; | 1097 ExecutableElement invokedMethod = null; |
| 1071 if (element is ExecutableElement) { | 1098 if (element is ExecutableElement) { |
| 1072 invokedMethod = element as ExecutableElement; | 1099 invokedMethod = element as ExecutableElement; |
| 1073 } else { | 1100 } else { |
| 1074 if (element is PropertyInducingElement) { | 1101 if (element is PropertyInducingElement) { |
| 1075 PropertyAccessorElement getter3 = ((element as PropertyInducingElement))
.getter; | 1102 PropertyAccessorElement getter3 = ((element as PropertyInducingElement))
.getter; |
| 1076 FunctionType getterType = getter3.type; | 1103 FunctionType getterType = getter3.type; |
| 1077 if (getterType != null) { | 1104 if (getterType != null) { |
| 1078 Type2 returnType6 = getterType.returnType; | 1105 Type2 returnType6 = getterType.returnType; |
| 1079 if (!returnType6.isDynamic() && returnType6 is! FunctionType && !retur
nType6.isDartCoreFunction()) { | 1106 if (!isExecutableType(returnType6)) { |
| 1080 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTI
ON, methodName2, [methodName2.name]); | 1107 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTI
ON, methodName2, [methodName2.name]); |
| 1081 } | 1108 } |
| 1082 } | 1109 } |
| 1083 recordResolution(methodName2, element); | 1110 recordResolution(methodName2, element); |
| 1084 return null; | 1111 return null; |
| 1085 } else if (element is VariableElement) { | 1112 } else if (element is VariableElement) { |
| 1086 Type2 variableType = ((element as VariableElement)).type; | 1113 Type2 variableType = ((element as VariableElement)).type; |
| 1087 if (!variableType.isDynamic() && variableType is! FunctionType && !varia
bleType.isDartCoreFunction()) { | 1114 if (!isExecutableType(variableType)) { |
| 1088 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION
, methodName2, [methodName2.name]); | 1115 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION
, methodName2, [methodName2.name]); |
| 1089 } | 1116 } |
| 1090 recordResolution(methodName2, element); | 1117 recordResolution(methodName2, element); |
| 1091 return null; | 1118 return null; |
| 1092 } else { | 1119 } else { |
| 1093 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
methodName2, [methodName2.name]); | 1120 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
methodName2, [methodName2.name]); |
| 1094 return null; | 1121 return null; |
| 1095 } | 1122 } |
| 1096 } | 1123 } |
| 1097 recordResolution(methodName2, invokedMethod); | 1124 recordResolution(methodName2, invokedMethod); |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1376 * @param expression the expression whose type is to be returned | 1403 * @param expression the expression whose type is to be returned |
| 1377 * @return the type of the given expression | 1404 * @return the type of the given expression |
| 1378 */ | 1405 */ |
| 1379 Type2 getType(Expression expression) { | 1406 Type2 getType(Expression expression) { |
| 1380 if (expression is NullLiteral) { | 1407 if (expression is NullLiteral) { |
| 1381 return _resolver.typeProvider.objectType; | 1408 return _resolver.typeProvider.objectType; |
| 1382 } | 1409 } |
| 1383 return expression.staticType; | 1410 return expression.staticType; |
| 1384 } | 1411 } |
| 1385 /** | 1412 /** |
| 1413 * Return {@code true} if the given type represents an object that could be in
voked using the call |
| 1414 * operator '()'. |
| 1415 * @param type the type being tested |
| 1416 * @return {@code true} if the given type represents an object that could be i
nvoked |
| 1417 */ |
| 1418 bool isExecutableType(Type2 type) => type.isDynamic() || (type is FunctionType
) || type.isDartCoreFunction(); |
| 1419 /** |
| 1386 * Look up the getter with the given name in the given type. Return the elemen
t representing the | 1420 * Look up the getter with the given name in the given type. Return the elemen
t representing the |
| 1387 * getter that was found, or {@code null} if there is no getter with the given
name. | 1421 * getter that was found, or {@code null} if there is no getter with the given
name. |
| 1388 * @param element the element representing the type in which the getter is def
ined | 1422 * @param element the element representing the type in which the getter is def
ined |
| 1389 * @param getterName the name of the getter being looked up | 1423 * @param getterName the name of the getter being looked up |
| 1390 * @return the element representing the getter that was found | 1424 * @return the element representing the getter that was found |
| 1391 */ | 1425 */ |
| 1392 PropertyAccessorElement lookUpGetter(Element element, String getterName) { | 1426 PropertyAccessorElement lookUpGetter(Element element, String getterName) { |
| 1393 if (identical(element, DynamicTypeImpl.instance)) { | 1427 if (identical(element, DynamicTypeImpl.instance)) { |
| 1394 return null; | 1428 return null; |
| 1395 } | 1429 } |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1657 break; | 1691 break; |
| 1658 } | 1692 } |
| 1659 AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to
it's corresponding operator"); | 1693 AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to
it's corresponding operator"); |
| 1660 return operator; | 1694 return operator; |
| 1661 } | 1695 } |
| 1662 /** | 1696 /** |
| 1663 * Record the fact that the given AST node was resolved to the given element. | 1697 * Record the fact that the given AST node was resolved to the given element. |
| 1664 * @param node the AST node that was resolved | 1698 * @param node the AST node that was resolved |
| 1665 * @param element the element to which the AST node was resolved | 1699 * @param element the element to which the AST node was resolved |
| 1666 */ | 1700 */ |
| 1667 void recordResolution(SimpleIdentifier node, Element element49) { | 1701 void recordResolution(SimpleIdentifier node, Element element52) { |
| 1668 if (element49 != null) { | 1702 if (element52 != null) { |
| 1669 node.element = element49; | 1703 node.element = element52; |
| 1670 } | 1704 } |
| 1671 } | 1705 } |
| 1672 /** | 1706 /** |
| 1673 * Report the {@link StaticTypeWarningCode}s <code>UNDEFINED_SETTER</code> and | 1707 * Report the {@link StaticTypeWarningCode}s <code>UNDEFINED_SETTER</code> and |
| 1674 * <code>UNDEFINED_GETTER</code>. | 1708 * <code>UNDEFINED_GETTER</code>. |
| 1675 * @param node the prefixed identifier that gives the context to determine if
the error on the | 1709 * @param node the prefixed identifier that gives the context to determine if
the error on the |
| 1676 * undefined identifier is a getter or a setter | 1710 * undefined identifier is a getter or a setter |
| 1677 * @param identifier the identifier in the passed prefix identifier | 1711 * @param identifier the identifier in the passed prefix identifier |
| 1678 * @param typeName the name of the type of the left hand side of the passed pr
efixed identifier | 1712 * @param typeName the name of the type of the left hand side of the passed pr
efixed identifier |
| 1679 */ | 1713 */ |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1729 } | 1763 } |
| 1730 } | 1764 } |
| 1731 } | 1765 } |
| 1732 /** | 1766 /** |
| 1733 * If the given element is a type variable, resolve it to the class that shoul
d be used when | 1767 * If the given element is a type variable, resolve it to the class that shoul
d be used when |
| 1734 * looking up members. Otherwise, return the original element. | 1768 * looking up members. Otherwise, return the original element. |
| 1735 * @param element the element that is to be resolved if it is a type variable | 1769 * @param element the element that is to be resolved if it is a type variable |
| 1736 * @return the class that should be used in place of the argument if it is a t
ype variable, or the | 1770 * @return the class that should be used in place of the argument if it is a t
ype variable, or the |
| 1737 * original argument if it isn't a type variable | 1771 * original argument if it isn't a type variable |
| 1738 */ | 1772 */ |
| 1739 Element resolveTypeVariable(Element element50) { | 1773 Element resolveTypeVariable(Element element53) { |
| 1740 if (element50 is TypeVariableElement) { | 1774 if (element53 is TypeVariableElement) { |
| 1741 Type2 bound4 = ((element50 as TypeVariableElement)).bound; | 1775 Type2 bound4 = ((element53 as TypeVariableElement)).bound; |
| 1742 if (bound4 == null) { | 1776 if (bound4 == null) { |
| 1743 return _resolver.typeProvider.objectType.element; | 1777 return _resolver.typeProvider.objectType.element; |
| 1744 } | 1778 } |
| 1745 return bound4.element; | 1779 return bound4.element; |
| 1746 } | 1780 } |
| 1747 return element50; | 1781 return element53; |
| 1748 } | 1782 } |
| 1749 } | 1783 } |
| 1750 class Identifier_4 extends Identifier { | 1784 class Identifier_4 extends Identifier { |
| 1751 String name9; | 1785 String name9; |
| 1752 Identifier_4(this.name9) : super(); | 1786 Identifier_4(this.name9) : super(); |
| 1753 accept(ASTVisitor visitor) => null; | 1787 accept(ASTVisitor visitor) => null; |
| 1754 sc.Token get beginToken => null; | 1788 sc.Token get beginToken => null; |
| 1755 Element get element => null; | 1789 Element get element => null; |
| 1756 sc.Token get endToken => null; | 1790 sc.Token get endToken => null; |
| 1757 String get name => name9; | 1791 String get name => name9; |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2165 Map<Source, Library> _libraryMap = new Map<Source, Library>(); | 2199 Map<Source, Library> _libraryMap = new Map<Source, Library>(); |
| 2166 /** | 2200 /** |
| 2167 * A collection containing the libraries that are being resolved together. | 2201 * A collection containing the libraries that are being resolved together. |
| 2168 */ | 2202 */ |
| 2169 Set<Library> _librariesInCycles; | 2203 Set<Library> _librariesInCycles; |
| 2170 /** | 2204 /** |
| 2171 * Initialize a newly created library resolver to resolve libraries within the
given context. | 2205 * Initialize a newly created library resolver to resolve libraries within the
given context. |
| 2172 * @param analysisContext the analysis context in which the library is being a
nalyzed | 2206 * @param analysisContext the analysis context in which the library is being a
nalyzed |
| 2173 */ | 2207 */ |
| 2174 LibraryResolver.con1(AnalysisContextImpl analysisContext) { | 2208 LibraryResolver.con1(AnalysisContextImpl analysisContext) { |
| 2175 _jtd_constructor_226_impl(analysisContext); | 2209 _jtd_constructor_237_impl(analysisContext); |
| 2176 } | 2210 } |
| 2177 _jtd_constructor_226_impl(AnalysisContextImpl analysisContext) { | 2211 _jtd_constructor_237_impl(AnalysisContextImpl analysisContext) { |
| 2178 _jtd_constructor_227_impl(analysisContext, null); | 2212 _jtd_constructor_238_impl(analysisContext, null); |
| 2179 } | 2213 } |
| 2180 /** | 2214 /** |
| 2181 * Initialize a newly created library resolver to resolve libraries within the
given context. | 2215 * Initialize a newly created library resolver to resolve libraries within the
given context. |
| 2182 * @param analysisContext the analysis context in which the library is being a
nalyzed | 2216 * @param analysisContext the analysis context in which the library is being a
nalyzed |
| 2183 * @param errorListener the listener to which analysis errors will be reported | 2217 * @param errorListener the listener to which analysis errors will be reported |
| 2184 */ | 2218 */ |
| 2185 LibraryResolver.con2(AnalysisContextImpl analysisContext2, AnalysisErrorListen
er additionalAnalysisErrorListener) { | 2219 LibraryResolver.con2(AnalysisContextImpl analysisContext2, AnalysisErrorListen
er additionalAnalysisErrorListener) { |
| 2186 _jtd_constructor_227_impl(analysisContext2, additionalAnalysisErrorListener)
; | 2220 _jtd_constructor_238_impl(analysisContext2, additionalAnalysisErrorListener)
; |
| 2187 } | 2221 } |
| 2188 _jtd_constructor_227_impl(AnalysisContextImpl analysisContext2, AnalysisErrorL
istener additionalAnalysisErrorListener) { | 2222 _jtd_constructor_238_impl(AnalysisContextImpl analysisContext2, AnalysisErrorL
istener additionalAnalysisErrorListener) { |
| 2189 this._analysisContext = analysisContext2; | 2223 this._analysisContext = analysisContext2; |
| 2190 this._recordingErrorListener = new RecordingErrorListener(); | 2224 this._recordingErrorListener = new RecordingErrorListener(); |
| 2191 if (additionalAnalysisErrorListener == null) { | 2225 if (additionalAnalysisErrorListener == null) { |
| 2192 this._errorListener = _recordingErrorListener; | 2226 this._errorListener = _recordingErrorListener; |
| 2193 } else { | 2227 } else { |
| 2194 this._errorListener = new AnalysisErrorListener_5(this, additionalAnalysis
ErrorListener); | 2228 this._errorListener = new AnalysisErrorListener_5(this, additionalAnalysis
ErrorListener); |
| 2195 } | 2229 } |
| 2196 _coreLibrarySource = analysisContext2.sourceFactory.forUri(LibraryElementBui
lder.CORE_LIBRARY_URI); | 2230 _coreLibrarySource = analysisContext2.sourceFactory.forUri(LibraryElementBui
lder.CORE_LIBRARY_URI); |
| 2197 } | 2231 } |
| 2198 /** | 2232 /** |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2982 } | 3016 } |
| 2983 try { | 3017 try { |
| 2984 super.visitSwitchStatement(node); | 3018 super.visitSwitchStatement(node); |
| 2985 } finally { | 3019 } finally { |
| 2986 _labelScope = outerScope; | 3020 _labelScope = outerScope; |
| 2987 } | 3021 } |
| 2988 return null; | 3022 return null; |
| 2989 } | 3023 } |
| 2990 Object visitVariableDeclaration(VariableDeclaration node) { | 3024 Object visitVariableDeclaration(VariableDeclaration node) { |
| 2991 if (node.parent.parent is! TopLevelVariableDeclaration && node.parent.parent
is! FieldDeclaration) { | 3025 if (node.parent.parent is! TopLevelVariableDeclaration && node.parent.parent
is! FieldDeclaration) { |
| 2992 VariableElement element23 = node.element; | 3026 VariableElement element24 = node.element; |
| 2993 if (element23 != null) { | 3027 if (element24 != null) { |
| 2994 _nameScope.define(element23); | 3028 _nameScope.define(element24); |
| 2995 } | 3029 } |
| 2996 } | 3030 } |
| 2997 super.visitVariableDeclaration(node); | 3031 super.visitVariableDeclaration(node); |
| 2998 return null; | 3032 return null; |
| 2999 } | 3033 } |
| 3000 Object visitWhileStatement(WhileStatement node) { | 3034 Object visitWhileStatement(WhileStatement node) { |
| 3001 LabelScope outerScope = _labelScope; | 3035 LabelScope outerScope = _labelScope; |
| 3002 _labelScope = new LabelScope.con1(outerScope, false, false); | 3036 _labelScope = new LabelScope.con1(outerScope, false, false); |
| 3003 try { | 3037 try { |
| 3004 super.visitWhileStatement(node); | 3038 super.visitWhileStatement(node); |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3325 /** | 3359 /** |
| 3326 * The Dart Language Specification, 12.6: <blockquote>The static type of a lis
t literal of the | 3360 * The Dart Language Specification, 12.6: <blockquote>The static type of a lis
t literal of the |
| 3327 * form <i><b>const</b> <E>[e<sub>1</sub>, …, e<sub>n</sub>]</i>
or the form | 3361 * form <i><b>const</b> <E>[e<sub>1</sub>, …, e<sub>n</sub>]</i>
or the form |
| 3328 * <i><E>[e<sub>1</sub>, …, e<sub>n</sub>]</i> is {@code List<
E>}. The static | 3362 * <i><E>[e<sub>1</sub>, …, e<sub>n</sub>]</i> is {@code List<
E>}. The static |
| 3329 * type a list literal of the form <i><b>const</b> [e<sub>1</sub>, …, e
<sub>n</sub>]</i> or | 3363 * type a list literal of the form <i><b>const</b> [e<sub>1</sub>, …, e
<sub>n</sub>]</i> or |
| 3330 * the form <i>[e<sub>1</sub>, …, e<sub>n</sub>]</i> is {@code List<
dynamic>}.</blockquote> | 3364 * the form <i>[e<sub>1</sub>, …, e<sub>n</sub>]</i> is {@code List<
dynamic>}.</blockquote> |
| 3331 */ | 3365 */ |
| 3332 Object visitListLiteral(ListLiteral node) { | 3366 Object visitListLiteral(ListLiteral node) { |
| 3333 TypeArgumentList typeArguments8 = node.typeArguments; | 3367 TypeArgumentList typeArguments8 = node.typeArguments; |
| 3334 if (typeArguments8 != null) { | 3368 if (typeArguments8 != null) { |
| 3335 NodeList<TypeName> arguments3 = typeArguments8.arguments; | 3369 NodeList<TypeName> arguments4 = typeArguments8.arguments; |
| 3336 if (arguments3 != null && arguments3.length == 1) { | 3370 if (arguments4 != null && arguments4.length == 1) { |
| 3337 TypeName argumentType = arguments3[0]; | 3371 TypeName argumentType = arguments4[0]; |
| 3338 return recordType(node, _typeProvider.listType.substitute5(<Type2> [getT
ype3(argumentType)])); | 3372 return recordType(node, _typeProvider.listType.substitute5(<Type2> [getT
ype3(argumentType)])); |
| 3339 } | 3373 } |
| 3340 } | 3374 } |
| 3341 return recordType(node, _typeProvider.listType.substitute5(<Type2> [_dynamic
Type])); | 3375 return recordType(node, _typeProvider.listType.substitute5(<Type2> [_dynamic
Type])); |
| 3342 } | 3376 } |
| 3343 /** | 3377 /** |
| 3344 * The Dart Language Specification, 12.7: <blockquote>The static type of a map
literal of the form | 3378 * The Dart Language Specification, 12.7: <blockquote>The static type of a map
literal of the form |
| 3345 * <i><b>const</b> <String, V> {k<sub>1</sub>:e<sub>1</sub>, …, | 3379 * <i><b>const</b> <String, V> {k<sub>1</sub>:e<sub>1</sub>, …, |
| 3346 * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i><String, V> {k<sub>1<
/sub>:e<sub>1</sub>, | 3380 * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i><String, V> {k<sub>1<
/sub>:e<sub>1</sub>, |
| 3347 * …, k<sub>n</sub>:e<sub>n</sub>}</i> is {@code Map<String, V>}.
The static type a | 3381 * …, k<sub>n</sub>:e<sub>n</sub>}</i> is {@code Map<String, V>}.
The static type a |
| 3348 * map literal of the form <i><b>const</b> {k<sub>1</sub>:e<sub>1</sub>, &hell
ip;, | 3382 * map literal of the form <i><b>const</b> {k<sub>1</sub>:e<sub>1</sub>, &hell
ip;, |
| 3349 * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>{k<sub>1</sub>:e<sub>1</sub
>, …, | 3383 * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>{k<sub>1</sub>:e<sub>1</sub
>, …, |
| 3350 * k<sub>n</sub>:e<sub>n</sub>}</i> is {@code Map<String, dynamic>}. | 3384 * k<sub>n</sub>:e<sub>n</sub>}</i> is {@code Map<String, dynamic>}. |
| 3351 * <p> | 3385 * <p> |
| 3352 * It is a compile-time error if the first type argument to a map literal is n
ot | 3386 * It is a compile-time error if the first type argument to a map literal is n
ot |
| 3353 * <i>String</i>.</blockquote> | 3387 * <i>String</i>.</blockquote> |
| 3354 */ | 3388 */ |
| 3355 Object visitMapLiteral(MapLiteral node) { | 3389 Object visitMapLiteral(MapLiteral node) { |
| 3356 TypeArgumentList typeArguments9 = node.typeArguments; | 3390 TypeArgumentList typeArguments9 = node.typeArguments; |
| 3357 if (typeArguments9 != null) { | 3391 if (typeArguments9 != null) { |
| 3358 NodeList<TypeName> arguments4 = typeArguments9.arguments; | 3392 NodeList<TypeName> arguments5 = typeArguments9.arguments; |
| 3359 if (arguments4 != null && arguments4.length == 2) { | 3393 if (arguments5 != null && arguments5.length == 2) { |
| 3360 TypeName keyType = arguments4[0]; | 3394 TypeName keyType = arguments5[0]; |
| 3361 if (keyType != _typeProvider.stringType) { | 3395 if (keyType != _typeProvider.stringType) { |
| 3362 } | 3396 } |
| 3363 TypeName valueType = arguments4[1]; | 3397 TypeName valueType = arguments5[1]; |
| 3364 return recordType(node, _typeProvider.mapType.substitute5(<Type2> [_type
Provider.stringType, getType3(valueType)])); | 3398 return recordType(node, _typeProvider.mapType.substitute5(<Type2> [_type
Provider.stringType, getType3(valueType)])); |
| 3365 } | 3399 } |
| 3366 } | 3400 } |
| 3367 return recordType(node, _typeProvider.mapType.substitute5(<Type2> [_typeProv
ider.stringType, _dynamicType])); | 3401 return recordType(node, _typeProvider.mapType.substitute5(<Type2> [_typeProv
ider.stringType, _dynamicType])); |
| 3368 } | 3402 } |
| 3369 /** | 3403 /** |
| 3370 * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method in
vocation <i>i</i> | 3404 * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method in
vocation <i>i</i> |
| 3371 * has the form <i>o.m(a<sub>1</sub>, …, a<sub>n</sub>, x<sub>n+1</sub>
: a<sub>n+1</sub>, | 3405 * has the form <i>o.m(a<sub>1</sub>, …, a<sub>n</sub>, x<sub>n+1</sub>
: a<sub>n+1</sub>, |
| 3372 * …, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. | 3406 * …, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. |
| 3373 * <p> | 3407 * <p> |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3435 * <p> | 3469 * <p> |
| 3436 * A postfix expression of the form <i>e1[e2]--</i> is equivalent to <i>(a, i)
{var r = a[i]; a[i] | 3470 * A postfix expression of the form <i>e1[e2]--</i> is equivalent to <i>(a, i)
{var r = a[i]; a[i] |
| 3437 * = r - 1; return r}(e1, e2)</i></blockquote> | 3471 * = r - 1; return r}(e1, e2)</i></blockquote> |
| 3438 */ | 3472 */ |
| 3439 Object visitPostfixExpression(PostfixExpression node) => recordType(node, getT
ype(node.operand)); | 3473 Object visitPostfixExpression(PostfixExpression node) => recordType(node, getT
ype(node.operand)); |
| 3440 /** | 3474 /** |
| 3441 * See {@link #visitSimpleIdentifier(SimpleIdentifier)}. | 3475 * See {@link #visitSimpleIdentifier(SimpleIdentifier)}. |
| 3442 */ | 3476 */ |
| 3443 Object visitPrefixedIdentifier(PrefixedIdentifier node) { | 3477 Object visitPrefixedIdentifier(PrefixedIdentifier node) { |
| 3444 SimpleIdentifier prefixedIdentifier = node.identifier; | 3478 SimpleIdentifier prefixedIdentifier = node.identifier; |
| 3445 Element element24 = prefixedIdentifier.element; | 3479 Element element25 = prefixedIdentifier.element; |
| 3446 if (element24 is VariableElement) { | 3480 if (element25 is VariableElement) { |
| 3447 Type2 variableType = ((element24 as VariableElement)).type; | 3481 Type2 variableType = ((element25 as VariableElement)).type; |
| 3448 recordType(prefixedIdentifier, variableType); | 3482 recordType(prefixedIdentifier, variableType); |
| 3449 return recordType(node, variableType); | 3483 return recordType(node, variableType); |
| 3450 } else if (element24 is PropertyAccessorElement) { | 3484 } else if (element25 is PropertyAccessorElement) { |
| 3451 Type2 propertyType = getType2((element24 as PropertyAccessorElement)); | 3485 Type2 propertyType = getType2((element25 as PropertyAccessorElement)); |
| 3452 recordType(prefixedIdentifier, propertyType); | 3486 recordType(prefixedIdentifier, propertyType); |
| 3453 return recordType(node, propertyType); | 3487 return recordType(node, propertyType); |
| 3454 } else if (element24 is MethodElement) { | 3488 } else if (element25 is MethodElement) { |
| 3455 Type2 returnType = ((element24 as MethodElement)).type; | 3489 Type2 returnType = ((element25 as MethodElement)).type; |
| 3456 recordType(prefixedIdentifier, returnType); | 3490 recordType(prefixedIdentifier, returnType); |
| 3457 return recordType(node, returnType); | 3491 return recordType(node, returnType); |
| 3458 } else { | 3492 } else { |
| 3459 } | 3493 } |
| 3460 recordType(prefixedIdentifier, _dynamicType); | 3494 recordType(prefixedIdentifier, _dynamicType); |
| 3461 return recordType(node, _dynamicType); | 3495 return recordType(node, _dynamicType); |
| 3462 } | 3496 } |
| 3463 /** | 3497 /** |
| 3464 * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u
</i> of the form | 3498 * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u
</i> of the form |
| 3465 * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>.
An expression of the | 3499 * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>.
An expression of the |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3510 * The static type of <i>i</i> is the declared return type of <i>C.m</i> if it
exists or dynamic | 3544 * The static type of <i>i</i> is the declared return type of <i>C.m</i> if it
exists or dynamic |
| 3511 * otherwise. | 3545 * otherwise. |
| 3512 * <p> | 3546 * <p> |
| 3513 * ... a top-level getter invocation <i>i</i> of the form <i>m</i>, where <i>m
</i> is an | 3547 * ... a top-level getter invocation <i>i</i> of the form <i>m</i>, where <i>m
</i> is an |
| 3514 * identifier ... | 3548 * identifier ... |
| 3515 * <p> | 3549 * <p> |
| 3516 * The static type of <i>i</i> is the declared return type of <i>m</i>.</block
quote> | 3550 * The static type of <i>i</i> is the declared return type of <i>m</i>.</block
quote> |
| 3517 */ | 3551 */ |
| 3518 Object visitPropertyAccess(PropertyAccess node) { | 3552 Object visitPropertyAccess(PropertyAccess node) { |
| 3519 SimpleIdentifier propertyName2 = node.propertyName; | 3553 SimpleIdentifier propertyName2 = node.propertyName; |
| 3520 Element element25 = propertyName2.element; | 3554 Element element26 = propertyName2.element; |
| 3521 if (element25 is MethodElement) { | 3555 if (element26 is MethodElement) { |
| 3522 FunctionType type15 = ((element25 as MethodElement)).type; | 3556 FunctionType type15 = ((element26 as MethodElement)).type; |
| 3523 recordType(propertyName2, type15); | 3557 recordType(propertyName2, type15); |
| 3524 return recordType(node, type15); | 3558 return recordType(node, type15); |
| 3525 } else if (element25 is PropertyAccessorElement) { | 3559 } else if (element26 is PropertyAccessorElement) { |
| 3526 Type2 propertyType = getType2((element25 as PropertyAccessorElement)); | 3560 Type2 propertyType = getType2((element26 as PropertyAccessorElement)); |
| 3527 recordType(propertyName2, propertyType); | 3561 recordType(propertyName2, propertyType); |
| 3528 return recordType(node, propertyType); | 3562 return recordType(node, propertyType); |
| 3529 } else { | 3563 } else { |
| 3530 } | 3564 } |
| 3531 recordType(propertyName2, _dynamicType); | 3565 recordType(propertyName2, _dynamicType); |
| 3532 return recordType(node, _dynamicType); | 3566 return recordType(node, _dynamicType); |
| 3533 } | 3567 } |
| 3534 /** | 3568 /** |
| 3535 * The Dart Language Specification, 12.30: <blockquote>Evaluation of an identi
fier expression | 3569 * The Dart Language Specification, 12.30: <blockquote>Evaluation of an identi
fier expression |
| 3536 * <i>e</i> of the form <i>id</i> proceeds as follows: | 3570 * <i>e</i> of the form <i>id</i> proceeds as follows: |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3567 * <li>If <i>d</i> is the declaration of a top level getter, then <i>e</i> is
equivalent to the | 3601 * <li>If <i>d</i> is the declaration of a top level getter, then <i>e</i> is
equivalent to the |
| 3568 * getter invocation <i>id</i>. | 3602 * getter invocation <i>id</i>. |
| 3569 * <li>Otherwise, if <i>e</i> occurs inside a top level or static function (be
it function, | 3603 * <li>Otherwise, if <i>e</i> occurs inside a top level or static function (be
it function, |
| 3570 * method, getter, or setter) or variable initializer, evaluation of e causes
a NoSuchMethodError | 3604 * method, getter, or setter) or variable initializer, evaluation of e causes
a NoSuchMethodError |
| 3571 * to be thrown. | 3605 * to be thrown. |
| 3572 * <li>Otherwise <i>e</i> is equivalent to the property extraction <i>this.id<
/i>. | 3606 * <li>Otherwise <i>e</i> is equivalent to the property extraction <i>this.id<
/i>. |
| 3573 * </ul> | 3607 * </ul> |
| 3574 * </blockquote> | 3608 * </blockquote> |
| 3575 */ | 3609 */ |
| 3576 Object visitSimpleIdentifier(SimpleIdentifier node) { | 3610 Object visitSimpleIdentifier(SimpleIdentifier node) { |
| 3577 Element element26 = node.element; | 3611 Element element27 = node.element; |
| 3578 if (element26 == null) { | 3612 if (element27 == null) { |
| 3579 return recordType(node, _dynamicType); | 3613 return recordType(node, _dynamicType); |
| 3580 } else if (element26 is ClassElement) { | 3614 } else if (element27 is ClassElement) { |
| 3581 if (isTypeName(node)) { | 3615 if (isNotTypeLiteral(node)) { |
| 3582 return recordType(node, ((element26 as ClassElement)).type); | 3616 return recordType(node, ((element27 as ClassElement)).type); |
| 3583 } | 3617 } |
| 3584 return recordType(node, _typeProvider.typeType); | 3618 return recordType(node, _typeProvider.typeType); |
| 3585 } else if (element26 is TypeVariableElement) { | 3619 } else if (element27 is TypeVariableElement) { |
| 3586 return recordType(node, ((element26 as TypeVariableElement)).type); | 3620 return recordType(node, ((element27 as TypeVariableElement)).type); |
| 3587 } else if (element26 is TypeAliasElement) { | 3621 } else if (element27 is FunctionTypeAliasElement) { |
| 3588 return recordType(node, ((element26 as TypeAliasElement)).type); | 3622 return recordType(node, ((element27 as FunctionTypeAliasElement)).type); |
| 3589 } else if (element26 is VariableElement) { | 3623 } else if (element27 is VariableElement) { |
| 3590 return recordType(node, ((element26 as VariableElement)).type); | 3624 return recordType(node, ((element27 as VariableElement)).type); |
| 3591 } else if (element26 is MethodElement) { | 3625 } else if (element27 is MethodElement) { |
| 3592 return recordType(node, ((element26 as MethodElement)).type); | 3626 return recordType(node, ((element27 as MethodElement)).type); |
| 3593 } else if (element26 is PropertyAccessorElement) { | 3627 } else if (element27 is PropertyAccessorElement) { |
| 3594 return recordType(node, getType2((element26 as PropertyAccessorElement))); | 3628 return recordType(node, getType2((element27 as PropertyAccessorElement))); |
| 3595 } else if (element26 is ExecutableElement) { | 3629 } else if (element27 is ExecutableElement) { |
| 3596 return recordType(node, ((element26 as ExecutableElement)).type); | 3630 return recordType(node, ((element27 as ExecutableElement)).type); |
| 3597 } else if (element26 is PrefixElement) { | 3631 } else if (element27 is PrefixElement) { |
| 3598 return null; | 3632 return null; |
| 3599 } else { | 3633 } else { |
| 3600 return recordType(node, _dynamicType); | 3634 return recordType(node, _dynamicType); |
| 3601 } | 3635 } |
| 3602 } | 3636 } |
| 3603 /** | 3637 /** |
| 3604 * The Dart Language Specification, 12.5: <blockquote>The static type of a str
ing literal is{@code String}.</blockquote> | 3638 * The Dart Language Specification, 12.5: <blockquote>The static type of a str
ing literal is{@code String}.</blockquote> |
| 3605 */ | 3639 */ |
| 3606 Object visitSimpleStringLiteral(SimpleStringLiteral node) => recordType(node,
_typeProvider.stringType); | 3640 Object visitSimpleStringLiteral(SimpleStringLiteral node) => recordType(node,
_typeProvider.stringType); |
| 3607 /** | 3641 /** |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3703 * @return the type represented by the type name | 3737 * @return the type represented by the type name |
| 3704 */ | 3738 */ |
| 3705 Type2 getType3(TypeName typeName) { | 3739 Type2 getType3(TypeName typeName) { |
| 3706 Type2 type16 = typeName.type; | 3740 Type2 type16 = typeName.type; |
| 3707 if (type16 == null) { | 3741 if (type16 == null) { |
| 3708 return _dynamicType; | 3742 return _dynamicType; |
| 3709 } | 3743 } |
| 3710 return type16; | 3744 return type16; |
| 3711 } | 3745 } |
| 3712 /** | 3746 /** |
| 3713 * Return {@code true} if the given node is being used as the name of a type. | 3747 * Return {@code true} if the given node is not a type literal. |
| 3714 * @param node the node being tested | 3748 * @param node the node being tested |
| 3715 * @return {@code true} if the given node is being used as the name of a type | 3749 * @return {@code true} if the given node is not a type literal |
| 3716 */ | 3750 */ |
| 3717 bool isTypeName(SimpleIdentifier node) { | 3751 bool isNotTypeLiteral(SimpleIdentifier node) { |
| 3718 ASTNode parent15 = node.parent; | 3752 ASTNode parent15 = node.parent; |
| 3719 return parent15 is TypeName || (parent15 is PrefixedIdentifier && parent15.p
arent is TypeName) || (parent15 is MethodInvocation && identical(node, ((parent1
5 as MethodInvocation)).target)); | 3753 return parent15 is TypeName || (parent15 is PrefixedIdentifier && (parent15.
parent is TypeName || identical(((parent15 as PrefixedIdentifier)).prefix, node)
)) || (parent15 is PropertyAccess && identical(((parent15 as PropertyAccess)).ta
rget, node)) || (parent15 is MethodInvocation && identical(node, ((parent15 as M
ethodInvocation)).target)); |
| 3720 } | 3754 } |
| 3721 /** | 3755 /** |
| 3722 * Record that the static type of the given node is the type of the second arg
ument to the method | 3756 * Record that the static type of the given node is the type of the second arg
ument to the method |
| 3723 * represented by the given element. | 3757 * represented by the given element. |
| 3724 * @param expression the node whose type is to be recorded | 3758 * @param expression the node whose type is to be recorded |
| 3725 * @param element the element representing the method invoked by the given nod
e | 3759 * @param element the element representing the method invoked by the given nod
e |
| 3726 */ | 3760 */ |
| 3727 Object recordArgumentType(IndexExpression expression, MethodElement element) { | 3761 Object recordArgumentType(IndexExpression expression, MethodElement element) { |
| 3728 if (element != null) { | 3762 if (element != null) { |
| 3729 List<ParameterElement> parameters12 = element.parameters; | 3763 List<ParameterElement> parameters12 = element.parameters; |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4014 SimpleIdentifier exception = node.exceptionParameter; | 4048 SimpleIdentifier exception = node.exceptionParameter; |
| 4015 if (exception != null) { | 4049 if (exception != null) { |
| 4016 TypeName exceptionTypeName = node.exceptionType; | 4050 TypeName exceptionTypeName = node.exceptionType; |
| 4017 Type2 exceptionType; | 4051 Type2 exceptionType; |
| 4018 if (exceptionTypeName == null) { | 4052 if (exceptionTypeName == null) { |
| 4019 exceptionType = typeProvider.objectType; | 4053 exceptionType = typeProvider.objectType; |
| 4020 } else { | 4054 } else { |
| 4021 exceptionType = getType4(exceptionTypeName); | 4055 exceptionType = getType4(exceptionTypeName); |
| 4022 } | 4056 } |
| 4023 recordType(exception, exceptionType); | 4057 recordType(exception, exceptionType); |
| 4024 Element element27 = exception.element; | 4058 Element element28 = exception.element; |
| 4025 if (element27 is VariableElementImpl) { | 4059 if (element28 is VariableElementImpl) { |
| 4026 ((element27 as VariableElementImpl)).type = exceptionType; | 4060 ((element28 as VariableElementImpl)).type = exceptionType; |
| 4027 } else { | 4061 } else { |
| 4028 } | 4062 } |
| 4029 } | 4063 } |
| 4030 SimpleIdentifier stackTrace = node.stackTraceParameter; | 4064 SimpleIdentifier stackTrace = node.stackTraceParameter; |
| 4031 if (stackTrace != null) { | 4065 if (stackTrace != null) { |
| 4032 recordType(stackTrace, typeProvider.stackTraceType); | 4066 recordType(stackTrace, typeProvider.stackTraceType); |
| 4033 } | 4067 } |
| 4034 return null; | 4068 return null; |
| 4035 } | 4069 } |
| 4036 Object visitClassDeclaration(ClassDeclaration node) { | 4070 Object visitClassDeclaration(ClassDeclaration node) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 4064 superclassType = typeProvider.objectType; | 4098 superclassType = typeProvider.objectType; |
| 4065 } | 4099 } |
| 4066 if (classElement != null && superclassType != null) { | 4100 if (classElement != null && superclassType != null) { |
| 4067 classElement.supertype = superclassType; | 4101 classElement.supertype = superclassType; |
| 4068 } | 4102 } |
| 4069 resolve(classElement, node.withClause, node.implementsClause); | 4103 resolve(classElement, node.withClause, node.implementsClause); |
| 4070 return null; | 4104 return null; |
| 4071 } | 4105 } |
| 4072 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 4106 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| 4073 super.visitConstructorDeclaration(node); | 4107 super.visitConstructorDeclaration(node); |
| 4074 ExecutableElementImpl element28 = node.element as ExecutableElementImpl; | 4108 ExecutableElementImpl element29 = node.element as ExecutableElementImpl; |
| 4075 FunctionTypeImpl type = new FunctionTypeImpl.con1(element28); | 4109 FunctionTypeImpl type = new FunctionTypeImpl.con1(element29); |
| 4076 setTypeInformation(type, null, element28.parameters); | 4110 setTypeInformation(type, null, element29.parameters); |
| 4077 type.returnType = ((element28.enclosingElement as ClassElement)).type; | 4111 type.returnType = ((element29.enclosingElement as ClassElement)).type; |
| 4078 element28.type = type; | 4112 element29.type = type; |
| 4079 return null; | 4113 return null; |
| 4080 } | 4114 } |
| 4081 Object visitDeclaredIdentifier(DeclaredIdentifier node) { | 4115 Object visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 4082 super.visitDeclaredIdentifier(node); | 4116 super.visitDeclaredIdentifier(node); |
| 4083 Type2 declaredType; | 4117 Type2 declaredType; |
| 4084 TypeName typeName = node.type; | 4118 TypeName typeName = node.type; |
| 4085 if (typeName == null) { | 4119 if (typeName == null) { |
| 4086 declaredType = _dynamicType; | 4120 declaredType = _dynamicType; |
| 4087 } else { | 4121 } else { |
| 4088 declaredType = getType4(typeName); | 4122 declaredType = getType4(typeName); |
| 4089 } | 4123 } |
| 4090 LocalVariableElementImpl element29 = node.element as LocalVariableElementImp
l; | 4124 LocalVariableElementImpl element30 = node.element as LocalVariableElementImp
l; |
| 4091 element29.type = declaredType; | 4125 element30.type = declaredType; |
| 4092 return null; | 4126 return null; |
| 4093 } | 4127 } |
| 4094 Object visitDefaultFormalParameter(DefaultFormalParameter node) { | 4128 Object visitDefaultFormalParameter(DefaultFormalParameter node) { |
| 4095 super.visitDefaultFormalParameter(node); | 4129 super.visitDefaultFormalParameter(node); |
| 4096 return null; | 4130 return null; |
| 4097 } | 4131 } |
| 4098 Object visitFieldFormalParameter(FieldFormalParameter node) { | 4132 Object visitFieldFormalParameter(FieldFormalParameter node) { |
| 4099 super.visitFieldFormalParameter(node); | 4133 super.visitFieldFormalParameter(node); |
| 4100 Element element30 = node.identifier.element; | 4134 Element element31 = node.identifier.element; |
| 4101 if (element30 is ParameterElementImpl) { | 4135 if (element31 is ParameterElementImpl) { |
| 4102 ParameterElementImpl parameter = element30 as ParameterElementImpl; | 4136 ParameterElementImpl parameter = element31 as ParameterElementImpl; |
| 4103 Type2 type; | 4137 Type2 type; |
| 4104 TypeName typeName = node.type; | 4138 TypeName typeName = node.type; |
| 4105 if (typeName == null) { | 4139 if (typeName == null) { |
| 4106 type = _dynamicType; | 4140 type = _dynamicType; |
| 4107 } else { | 4141 } else { |
| 4108 type = getType4(typeName); | 4142 type = getType4(typeName); |
| 4109 } | 4143 } |
| 4110 parameter.type = type; | 4144 parameter.type = type; |
| 4111 } else { | 4145 } else { |
| 4112 } | 4146 } |
| 4113 return null; | 4147 return null; |
| 4114 } | 4148 } |
| 4115 Object visitFunctionDeclaration(FunctionDeclaration node) { | 4149 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 4116 super.visitFunctionDeclaration(node); | 4150 super.visitFunctionDeclaration(node); |
| 4117 ExecutableElementImpl element31 = node.element as ExecutableElementImpl; | 4151 ExecutableElementImpl element32 = node.element as ExecutableElementImpl; |
| 4118 FunctionTypeImpl type = new FunctionTypeImpl.con1(element31); | 4152 FunctionTypeImpl type = new FunctionTypeImpl.con1(element32); |
| 4119 setTypeInformation(type, node.returnType, element31.parameters); | 4153 setTypeInformation(type, node.returnType, element32.parameters); |
| 4120 element31.type = type; | 4154 element32.type = type; |
| 4121 return null; | 4155 return null; |
| 4122 } | 4156 } |
| 4123 Object visitFunctionTypeAlias(FunctionTypeAlias node) { | 4157 Object visitFunctionTypeAlias(FunctionTypeAlias node) { |
| 4124 super.visitFunctionTypeAlias(node); | 4158 super.visitFunctionTypeAlias(node); |
| 4125 TypeAliasElementImpl element32 = node.element as TypeAliasElementImpl; | 4159 FunctionTypeAliasElementImpl element33 = node.element as FunctionTypeAliasEl
ementImpl; |
| 4126 FunctionTypeImpl type18 = element32.type as FunctionTypeImpl; | 4160 FunctionTypeImpl type18 = element33.type as FunctionTypeImpl; |
| 4127 setTypeInformation(type18, node.returnType, element32.parameters); | 4161 setTypeInformation(type18, node.returnType, element33.parameters); |
| 4128 return null; | 4162 return null; |
| 4129 } | 4163 } |
| 4130 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { | 4164 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { |
| 4131 super.visitFunctionTypedFormalParameter(node); | 4165 super.visitFunctionTypedFormalParameter(node); |
| 4132 ParameterElementImpl element33 = node.identifier.element as ParameterElement
Impl; | 4166 ParameterElementImpl element34 = node.identifier.element as ParameterElement
Impl; |
| 4133 FunctionTypeImpl type = new FunctionTypeImpl.con1((null as ExecutableElement
)); | 4167 FunctionTypeImpl type = new FunctionTypeImpl.con1((null as ExecutableElement
)); |
| 4134 setTypeInformation(type, node.returnType, getElements(node.parameters)); | 4168 setTypeInformation(type, node.returnType, getElements(node.parameters)); |
| 4135 element33.type = type; | 4169 element34.type = type; |
| 4136 return null; | 4170 return null; |
| 4137 } | 4171 } |
| 4138 Object visitMethodDeclaration(MethodDeclaration node) { | 4172 Object visitMethodDeclaration(MethodDeclaration node) { |
| 4139 super.visitMethodDeclaration(node); | 4173 super.visitMethodDeclaration(node); |
| 4140 ExecutableElementImpl element34 = node.element as ExecutableElementImpl; | 4174 ExecutableElementImpl element35 = node.element as ExecutableElementImpl; |
| 4141 FunctionTypeImpl type = new FunctionTypeImpl.con1(element34); | 4175 FunctionTypeImpl type = new FunctionTypeImpl.con1(element35); |
| 4142 setTypeInformation(type, node.returnType, element34.parameters); | 4176 setTypeInformation(type, node.returnType, element35.parameters); |
| 4143 element34.type = type; | 4177 element35.type = type; |
| 4144 if (element34 is PropertyAccessorElementImpl) { | 4178 if (element35 is PropertyAccessorElementImpl) { |
| 4145 PropertyAccessorElementImpl accessor = element34 as PropertyAccessorElemen
tImpl; | 4179 PropertyAccessorElementImpl accessor = element35 as PropertyAccessorElemen
tImpl; |
| 4146 PropertyInducingElementImpl variable5 = accessor.variable as PropertyInduc
ingElementImpl; | 4180 PropertyInducingElementImpl variable5 = accessor.variable as PropertyInduc
ingElementImpl; |
| 4147 if (accessor.isGetter()) { | 4181 if (accessor.isGetter()) { |
| 4148 variable5.type = type.returnType; | 4182 variable5.type = type.returnType; |
| 4149 } else if (variable5.type == null) { | 4183 } else if (variable5.type == null) { |
| 4150 List<Type2> parameterTypes = type.normalParameterTypes; | 4184 List<Type2> parameterTypes = type.normalParameterTypes; |
| 4151 if (parameterTypes != null && parameterTypes.length > 0) { | 4185 if (parameterTypes != null && parameterTypes.length > 0) { |
| 4152 variable5.type = parameterTypes[0]; | 4186 variable5.type = parameterTypes[0]; |
| 4153 } | 4187 } |
| 4154 } | 4188 } |
| 4155 } | 4189 } |
| 4156 return null; | 4190 return null; |
| 4157 } | 4191 } |
| 4158 Object visitSimpleFormalParameter(SimpleFormalParameter node) { | 4192 Object visitSimpleFormalParameter(SimpleFormalParameter node) { |
| 4159 super.visitSimpleFormalParameter(node); | 4193 super.visitSimpleFormalParameter(node); |
| 4160 Type2 declaredType; | 4194 Type2 declaredType; |
| 4161 TypeName typeName = node.type; | 4195 TypeName typeName = node.type; |
| 4162 if (typeName == null) { | 4196 if (typeName == null) { |
| 4163 declaredType = _dynamicType; | 4197 declaredType = _dynamicType; |
| 4164 } else { | 4198 } else { |
| 4165 declaredType = getType4(typeName); | 4199 declaredType = getType4(typeName); |
| 4166 } | 4200 } |
| 4167 Element element35 = node.identifier.element; | 4201 Element element36 = node.identifier.element; |
| 4168 if (element35 is ParameterElement) { | 4202 if (element36 is ParameterElement) { |
| 4169 ((element35 as ParameterElementImpl)).type = declaredType; | 4203 ((element36 as ParameterElementImpl)).type = declaredType; |
| 4170 } else { | 4204 } else { |
| 4171 } | 4205 } |
| 4172 return null; | 4206 return null; |
| 4173 } | 4207 } |
| 4174 Object visitTypeName(TypeName node) { | 4208 Object visitTypeName(TypeName node) { |
| 4175 super.visitTypeName(node); | 4209 super.visitTypeName(node); |
| 4176 Identifier typeName = node.name; | 4210 Identifier typeName = node.name; |
| 4177 TypeArgumentList argumentList = node.typeArguments; | 4211 TypeArgumentList argumentList = node.typeArguments; |
| 4178 Element element = nameScope.lookup(typeName, definingLibrary); | 4212 Element element = nameScope.lookup(typeName, definingLibrary); |
| 4179 if (element == null) { | 4213 if (element == null) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4213 if (element == null) { | 4247 if (element == null) { |
| 4214 setElement(typeName, _dynamicType.element); | 4248 setElement(typeName, _dynamicType.element); |
| 4215 typeName.staticType = _dynamicType; | 4249 typeName.staticType = _dynamicType; |
| 4216 node.type = _dynamicType; | 4250 node.type = _dynamicType; |
| 4217 return null; | 4251 return null; |
| 4218 } | 4252 } |
| 4219 Type2 type = null; | 4253 Type2 type = null; |
| 4220 if (element is ClassElement) { | 4254 if (element is ClassElement) { |
| 4221 setElement(typeName, element); | 4255 setElement(typeName, element); |
| 4222 type = ((element as ClassElement)).type; | 4256 type = ((element as ClassElement)).type; |
| 4223 } else if (element is TypeAliasElement) { | 4257 } else if (element is FunctionTypeAliasElement) { |
| 4224 setElement(typeName, element); | 4258 setElement(typeName, element); |
| 4225 type = ((element as TypeAliasElement)).type; | 4259 type = ((element as FunctionTypeAliasElement)).type; |
| 4226 } else if (element is TypeVariableElement) { | 4260 } else if (element is TypeVariableElement) { |
| 4227 setElement(typeName, element); | 4261 setElement(typeName, element); |
| 4228 type = ((element as TypeVariableElement)).type; | 4262 type = ((element as TypeVariableElement)).type; |
| 4229 if (argumentList != null) { | 4263 if (argumentList != null) { |
| 4230 } | 4264 } |
| 4231 } else { | 4265 } else { |
| 4232 setElement(typeName, _dynamicType.element); | 4266 setElement(typeName, _dynamicType.element); |
| 4233 typeName.staticType = _dynamicType; | 4267 typeName.staticType = _dynamicType; |
| 4234 node.type = _dynamicType; | 4268 node.type = _dynamicType; |
| 4235 return null; | 4269 return null; |
| 4236 } | 4270 } |
| 4237 if (argumentList != null) { | 4271 if (argumentList != null) { |
| 4238 NodeList<TypeName> arguments5 = argumentList.arguments; | 4272 NodeList<TypeName> arguments6 = argumentList.arguments; |
| 4239 int argumentCount = arguments5.length; | 4273 int argumentCount = arguments6.length; |
| 4240 List<Type2> parameters = getTypeArguments(type); | 4274 List<Type2> parameters = getTypeArguments(type); |
| 4241 int parameterCount = parameters.length; | 4275 int parameterCount = parameters.length; |
| 4242 int count = Math.min(argumentCount, parameterCount); | 4276 int count = Math.min(argumentCount, parameterCount); |
| 4243 List<Type2> typeArguments = new List<Type2>(); | 4277 List<Type2> typeArguments = new List<Type2>(); |
| 4244 for (int i = 0; i < count; i++) { | 4278 for (int i = 0; i < count; i++) { |
| 4245 Type2 argumentType = getType4(arguments5[i]); | 4279 Type2 argumentType = getType4(arguments6[i]); |
| 4246 if (argumentType != null) { | 4280 if (argumentType != null) { |
| 4247 typeArguments.add(argumentType); | 4281 typeArguments.add(argumentType); |
| 4248 } | 4282 } |
| 4249 } | 4283 } |
| 4250 if (argumentCount != parameterCount) { | 4284 if (argumentCount != parameterCount) { |
| 4251 reportError(getInvalidTypeParametersErrorCode(node), node, [typeName.nam
e, argumentCount, parameterCount]); | 4285 reportError(getInvalidTypeParametersErrorCode(node), node, [typeName.nam
e, argumentCount, parameterCount]); |
| 4252 } | 4286 } |
| 4253 argumentCount = typeArguments.length; | 4287 argumentCount = typeArguments.length; |
| 4254 if (argumentCount < parameterCount) { | 4288 if (argumentCount < parameterCount) { |
| 4255 for (int i = argumentCount; i < parameterCount; i++) { | 4289 for (int i = argumentCount; i < parameterCount; i++) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 4282 } | 4316 } |
| 4283 Object visitVariableDeclaration(VariableDeclaration node) { | 4317 Object visitVariableDeclaration(VariableDeclaration node) { |
| 4284 super.visitVariableDeclaration(node); | 4318 super.visitVariableDeclaration(node); |
| 4285 Type2 declaredType; | 4319 Type2 declaredType; |
| 4286 TypeName typeName = ((node.parent as VariableDeclarationList)).type; | 4320 TypeName typeName = ((node.parent as VariableDeclarationList)).type; |
| 4287 if (typeName == null) { | 4321 if (typeName == null) { |
| 4288 declaredType = _dynamicType; | 4322 declaredType = _dynamicType; |
| 4289 } else { | 4323 } else { |
| 4290 declaredType = getType4(typeName); | 4324 declaredType = getType4(typeName); |
| 4291 } | 4325 } |
| 4292 Element element36 = node.name.element; | 4326 Element element37 = node.name.element; |
| 4293 if (element36 is VariableElement) { | 4327 if (element37 is VariableElement) { |
| 4294 ((element36 as VariableElementImpl)).type = declaredType; | 4328 ((element37 as VariableElementImpl)).type = declaredType; |
| 4295 if (element36 is FieldElement) { | 4329 if (element37 is FieldElement) { |
| 4296 FieldElement field = element36 as FieldElement; | 4330 FieldElement field = element37 as FieldElement; |
| 4297 PropertyAccessorElementImpl getter5 = field.getter as PropertyAccessorEl
ementImpl; | 4331 PropertyAccessorElementImpl getter5 = field.getter as PropertyAccessorEl
ementImpl; |
| 4298 FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter5); | 4332 FunctionTypeImpl getterType = new FunctionTypeImpl.con1(getter5); |
| 4299 getterType.returnType = declaredType; | 4333 getterType.returnType = declaredType; |
| 4300 getter5.type = getterType; | 4334 getter5.type = getterType; |
| 4301 PropertyAccessorElementImpl setter4 = field.setter as PropertyAccessorEl
ementImpl; | 4335 PropertyAccessorElementImpl setter4 = field.setter as PropertyAccessorEl
ementImpl; |
| 4302 if (setter4 != null) { | 4336 if (setter4 != null) { |
| 4303 FunctionTypeImpl setterType = new FunctionTypeImpl.con1(setter4); | 4337 FunctionTypeImpl setterType = new FunctionTypeImpl.con1(setter4); |
| 4304 setterType.returnType = VoidTypeImpl.instance; | 4338 setterType.returnType = VoidTypeImpl.instance; |
| 4305 setterType.normalParameterTypes = <Type2> [declaredType]; | 4339 setterType.normalParameterTypes = <Type2> [declaredType]; |
| 4306 setter4.type = setterType; | 4340 setter4.type = setterType; |
| 4307 } | 4341 } |
| 4308 } | 4342 } |
| 4309 } else { | 4343 } else { |
| 4310 } | 4344 } |
| 4311 return null; | 4345 return null; |
| 4312 } | 4346 } |
| 4313 /** | 4347 /** |
| 4314 * Return the class element that represents the class whose name was provided. | 4348 * Return the class element that represents the class whose name was provided. |
| 4315 * @param identifier the name from the declaration of a class | 4349 * @param identifier the name from the declaration of a class |
| 4316 * @return the class element that represents the class | 4350 * @return the class element that represents the class |
| 4317 */ | 4351 */ |
| 4318 ClassElementImpl getClassElement(SimpleIdentifier identifier) { | 4352 ClassElementImpl getClassElement(SimpleIdentifier identifier) { |
| 4319 if (identifier == null) { | 4353 if (identifier == null) { |
| 4320 return null; | 4354 return null; |
| 4321 } | 4355 } |
| 4322 Element element37 = identifier.element; | 4356 Element element38 = identifier.element; |
| 4323 if (element37 is! ClassElementImpl) { | 4357 if (element38 is! ClassElementImpl) { |
| 4324 return null; | 4358 return null; |
| 4325 } | 4359 } |
| 4326 return element37 as ClassElementImpl; | 4360 return element38 as ClassElementImpl; |
| 4327 } | 4361 } |
| 4328 /** | 4362 /** |
| 4329 * Return an array containing all of the elements associated with the paramete
rs in the given | 4363 * Return an array containing all of the elements associated with the paramete
rs in the given |
| 4330 * list. | 4364 * list. |
| 4331 * @param parameterList the list of parameters whose elements are to be return
ed | 4365 * @param parameterList the list of parameters whose elements are to be return
ed |
| 4332 * @return the elements associated with the parameters | 4366 * @return the elements associated with the parameters |
| 4333 */ | 4367 */ |
| 4334 List<ParameterElement> getElements(FormalParameterList parameterList) { | 4368 List<ParameterElement> getElements(FormalParameterList parameterList) { |
| 4335 List<ParameterElement> elements = new List<ParameterElement>(); | 4369 List<ParameterElement> elements = new List<ParameterElement>(); |
| 4336 for (FormalParameter parameter in parameterList.parameters) { | 4370 for (FormalParameter parameter in parameterList.parameters) { |
| 4337 ParameterElement element38 = parameter.identifier.element as ParameterElem
ent; | 4371 ParameterElement element39 = parameter.identifier.element as ParameterElem
ent; |
| 4338 if (element38 != null) { | 4372 if (element39 != null) { |
| 4339 elements.add(element38); | 4373 elements.add(element39); |
| 4340 } | 4374 } |
| 4341 } | 4375 } |
| 4342 return new List.from(elements); | 4376 return new List.from(elements); |
| 4343 } | 4377 } |
| 4344 /** | 4378 /** |
| 4345 * The number of type arguments in the given type name does not match the numb
er of parameters in | 4379 * The number of type arguments in the given type name does not match the numb
er of parameters in |
| 4346 * the corresponding class element. Return the error code that should be used
to report this | 4380 * the corresponding class element. Return the error code that should be used
to report this |
| 4347 * error. | 4381 * error. |
| 4348 * @param node the type name with the wrong number of type arguments | 4382 * @param node the type name with the wrong number of type arguments |
| 4349 * @return the error code that should be used to report that the wrong number
of type arguments | 4383 * @return the error code that should be used to report that the wrong number
of type arguments |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4447 * @param undefinedError the error to produce if the type name is not defined | 4481 * @param undefinedError the error to produce if the type name is not defined |
| 4448 * @param nonTypeError the error to produce if the type name is defined to be
something other than | 4482 * @param nonTypeError the error to produce if the type name is defined to be
something other than |
| 4449 * a type | 4483 * a type |
| 4450 * @param nonInterfaceType the error to produce if the type is not an interfac
e type | 4484 * @param nonInterfaceType the error to produce if the type is not an interfac
e type |
| 4451 * @return the type specified by the type name | 4485 * @return the type specified by the type name |
| 4452 */ | 4486 */ |
| 4453 InterfaceType resolveType(TypeName typeName, ErrorCode undefinedError, ErrorCo
de nonTypeError, ErrorCode nonInterfaceType) { | 4487 InterfaceType resolveType(TypeName typeName, ErrorCode undefinedError, ErrorCo
de nonTypeError, ErrorCode nonInterfaceType) { |
| 4454 Identifier name16 = typeName.name; | 4488 Identifier name16 = typeName.name; |
| 4455 Element element = nameScope.lookup(name16, definingLibrary); | 4489 Element element = nameScope.lookup(name16, definingLibrary); |
| 4456 if (element == null) { | 4490 if (element == null) { |
| 4457 reportError(undefinedError, name16, []); | 4491 reportError(undefinedError, name16, [name16.name]); |
| 4458 } else if (element is ClassElement) { | 4492 } else if (element is ClassElement) { |
| 4459 Type2 classType = ((element as ClassElement)).type; | 4493 Type2 classType = ((element as ClassElement)).type; |
| 4460 typeName.type = classType; | 4494 typeName.type = classType; |
| 4461 if (classType is InterfaceType) { | 4495 if (classType is InterfaceType) { |
| 4462 return classType as InterfaceType; | 4496 return classType as InterfaceType; |
| 4463 } | 4497 } |
| 4464 reportError(nonInterfaceType, name16, []); | 4498 reportError(nonInterfaceType, name16, [name16.name]); |
| 4465 } else if (element is MultiplyDefinedElement) { | 4499 } else if (element is MultiplyDefinedElement) { |
| 4466 List<Element> elements = ((element as MultiplyDefinedElement)).conflicting
Elements; | 4500 List<Element> elements = ((element as MultiplyDefinedElement)).conflicting
Elements; |
| 4467 InterfaceType type = getType(elements); | 4501 InterfaceType type = getType(elements); |
| 4468 if (type != null) { | 4502 if (type != null) { |
| 4469 typeName.type = type; | 4503 typeName.type = type; |
| 4470 } | 4504 } |
| 4471 } else { | 4505 } else { |
| 4472 reportError(nonTypeError, name16, []); | 4506 reportError(nonTypeError, name16, [name16.name]); |
| 4473 } | 4507 } |
| 4474 return null; | 4508 return null; |
| 4475 } | 4509 } |
| 4476 /** | 4510 /** |
| 4477 * Resolve the types in the given list of type names. | 4511 * Resolve the types in the given list of type names. |
| 4478 * @param typeNames the type names to be resolved | 4512 * @param typeNames the type names to be resolved |
| 4479 * @param undefinedError the error to produce if the type name is not defined | 4513 * @param undefinedError the error to produce if the type name is not defined |
| 4480 * @param nonTypeError the error to produce if the type name is defined to be
something other than | 4514 * @param nonTypeError the error to produce if the type name is defined to be
something other than |
| 4481 * a type | 4515 * a type |
| 4482 * @param nonInterfaceType the error to produce if the type is not an interfac
e type | 4516 * @param nonInterfaceType the error to produce if the type is not an interfac
e type |
| 4483 * @return an array containing all of the types that were resolved. | 4517 * @return an array containing all of the types that were resolved. |
| 4484 */ | 4518 */ |
| 4485 List<InterfaceType> resolveTypes(NodeList<TypeName> typeNames, ErrorCode undef
inedError, ErrorCode nonTypeError, ErrorCode nonInterfaceType) { | 4519 List<InterfaceType> resolveTypes(NodeList<TypeName> typeNames, ErrorCode undef
inedError, ErrorCode nonTypeError, ErrorCode nonInterfaceType) { |
| 4486 List<InterfaceType> types = new List<InterfaceType>(); | 4520 List<InterfaceType> types = new List<InterfaceType>(); |
| 4487 for (TypeName typeName in typeNames) { | 4521 for (TypeName typeName in typeNames) { |
| 4488 InterfaceType type = resolveType(typeName, undefinedError, nonTypeError, n
onInterfaceType); | 4522 InterfaceType type = resolveType(typeName, undefinedError, nonTypeError, n
onInterfaceType); |
| 4489 if (type != null) { | 4523 if (type != null) { |
| 4490 types.add(type); | 4524 types.add(type); |
| 4491 } | 4525 } |
| 4492 } | 4526 } |
| 4493 return new List.from(types); | 4527 return new List.from(types); |
| 4494 } | 4528 } |
| 4495 void setElement(Identifier typeName, Element element51) { | 4529 void setElement(Identifier typeName, Element element54) { |
| 4496 if (element51 != null) { | 4530 if (element54 != null) { |
| 4497 if (typeName is SimpleIdentifier) { | 4531 if (typeName is SimpleIdentifier) { |
| 4498 ((typeName as SimpleIdentifier)).element = element51; | 4532 ((typeName as SimpleIdentifier)).element = element54; |
| 4499 } else if (typeName is PrefixedIdentifier) { | 4533 } else if (typeName is PrefixedIdentifier) { |
| 4500 PrefixedIdentifier identifier = typeName as PrefixedIdentifier; | 4534 PrefixedIdentifier identifier = typeName as PrefixedIdentifier; |
| 4501 identifier.identifier.element = element51; | 4535 identifier.identifier.element = element54; |
| 4502 SimpleIdentifier prefix9 = identifier.prefix; | 4536 SimpleIdentifier prefix9 = identifier.prefix; |
| 4503 Element prefixElement = nameScope.lookup(prefix9, definingLibrary); | 4537 Element prefixElement = nameScope.lookup(prefix9, definingLibrary); |
| 4504 if (prefixElement != null) { | 4538 if (prefixElement != null) { |
| 4505 prefix9.element = prefixElement; | 4539 prefix9.element = prefixElement; |
| 4506 } | 4540 } |
| 4507 } | 4541 } |
| 4508 } | 4542 } |
| 4509 } | 4543 } |
| 4510 /** | 4544 /** |
| 4511 * Set the return type and parameter type information for the given function t
ype based on the | 4545 * Set the return type and parameter type information for the given function t
ype based on the |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4651 * Instances of the class {@code FunctionTypeScope} implement the scope defined
by a function type | 4685 * Instances of the class {@code FunctionTypeScope} implement the scope defined
by a function type |
| 4652 * alias. | 4686 * alias. |
| 4653 * @coverage dart.engine.resolver | 4687 * @coverage dart.engine.resolver |
| 4654 */ | 4688 */ |
| 4655 class FunctionTypeScope extends EnclosedScope { | 4689 class FunctionTypeScope extends EnclosedScope { |
| 4656 /** | 4690 /** |
| 4657 * Initialize a newly created scope enclosed within another scope. | 4691 * Initialize a newly created scope enclosed within another scope. |
| 4658 * @param enclosingScope the scope in which this scope is lexically enclosed | 4692 * @param enclosingScope the scope in which this scope is lexically enclosed |
| 4659 * @param typeElement the element representing the type alias represented by t
his scope | 4693 * @param typeElement the element representing the type alias represented by t
his scope |
| 4660 */ | 4694 */ |
| 4661 FunctionTypeScope(Scope enclosingScope, TypeAliasElement typeElement) : super(
new EnclosedScope(enclosingScope)) { | 4695 FunctionTypeScope(Scope enclosingScope, FunctionTypeAliasElement typeElement)
: super(new EnclosedScope(enclosingScope)) { |
| 4662 defineTypeParameters(typeElement); | 4696 defineTypeParameters(typeElement); |
| 4663 } | 4697 } |
| 4664 /** | 4698 /** |
| 4665 * Define the type parameters for the function type alias. | 4699 * Define the type parameters for the function type alias. |
| 4666 * @param typeElement the element representing the type represented by this sc
ope | 4700 * @param typeElement the element representing the type represented by this sc
ope |
| 4667 */ | 4701 */ |
| 4668 void defineTypeParameters(TypeAliasElement typeElement) { | 4702 void defineTypeParameters(FunctionTypeAliasElement typeElement) { |
| 4669 Scope parameterScope = enclosingScope; | 4703 Scope parameterScope = enclosingScope; |
| 4670 for (TypeVariableElement parameter in typeElement.typeVariables) { | 4704 for (TypeVariableElement parameter in typeElement.typeVariables) { |
| 4671 parameterScope.define(parameter); | 4705 parameterScope.define(parameter); |
| 4672 } | 4706 } |
| 4673 } | 4707 } |
| 4674 } | 4708 } |
| 4675 /** | 4709 /** |
| 4676 * Instances of the class {@code LabelScope} represent a scope in which a single
label is defined. | 4710 * Instances of the class {@code LabelScope} represent a scope in which a single
label is defined. |
| 4677 * @coverage dart.engine.resolver | 4711 * @coverage dart.engine.resolver |
| 4678 */ | 4712 */ |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4697 * The label element returned for scopes that can be the target of an unlabele
d {@code break} or{@code continue}. | 4731 * The label element returned for scopes that can be the target of an unlabele
d {@code break} or{@code continue}. |
| 4698 */ | 4732 */ |
| 4699 static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier.full(ne
w sc.StringToken(sc.TokenType.IDENTIFIER, "", 0)); | 4733 static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier.full(ne
w sc.StringToken(sc.TokenType.IDENTIFIER, "", 0)); |
| 4700 /** | 4734 /** |
| 4701 * Initialize a newly created scope to represent the potential target of an un
labeled{@code break} or {@code continue}. | 4735 * Initialize a newly created scope to represent the potential target of an un
labeled{@code break} or {@code continue}. |
| 4702 * @param outerScope the label scope enclosing the new label scope | 4736 * @param outerScope the label scope enclosing the new label scope |
| 4703 * @param onSwitchStatement {@code true} if this label is associated with a {@
code switch}statement | 4737 * @param onSwitchStatement {@code true} if this label is associated with a {@
code switch}statement |
| 4704 * @param onSwitchMember {@code true} if this label is associated with a {@cod
e switch} member | 4738 * @param onSwitchMember {@code true} if this label is associated with a {@cod
e switch} member |
| 4705 */ | 4739 */ |
| 4706 LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMe
mber) { | 4740 LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMe
mber) { |
| 4707 _jtd_constructor_237_impl(outerScope, onSwitchStatement, onSwitchMember); | 4741 _jtd_constructor_248_impl(outerScope, onSwitchStatement, onSwitchMember); |
| 4708 } | 4742 } |
| 4709 _jtd_constructor_237_impl(LabelScope outerScope, bool onSwitchStatement, bool
onSwitchMember) { | 4743 _jtd_constructor_248_impl(LabelScope outerScope, bool onSwitchStatement, bool
onSwitchMember) { |
| 4710 _jtd_constructor_238_impl(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMP
TY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember)); | 4744 _jtd_constructor_249_impl(outerScope, EMPTY_LABEL, new LabelElementImpl(_EMP
TY_LABEL_IDENTIFIER, onSwitchStatement, onSwitchMember)); |
| 4711 } | 4745 } |
| 4712 /** | 4746 /** |
| 4713 * Initialize a newly created scope to represent the given label. | 4747 * Initialize a newly created scope to represent the given label. |
| 4714 * @param outerScope the label scope enclosing the new label scope | 4748 * @param outerScope the label scope enclosing the new label scope |
| 4715 * @param label the label defined in this scope | 4749 * @param label the label defined in this scope |
| 4716 * @param element the element to which the label resolves | 4750 * @param element the element to which the label resolves |
| 4717 */ | 4751 */ |
| 4718 LabelScope.con2(LabelScope outerScope2, String label4, LabelElement element19)
{ | 4752 LabelScope.con2(LabelScope outerScope2, String label4, LabelElement element19)
{ |
| 4719 _jtd_constructor_238_impl(outerScope2, label4, element19); | 4753 _jtd_constructor_249_impl(outerScope2, label4, element19); |
| 4720 } | 4754 } |
| 4721 _jtd_constructor_238_impl(LabelScope outerScope2, String label4, LabelElement
element19) { | 4755 _jtd_constructor_249_impl(LabelScope outerScope2, String label4, LabelElement
element19) { |
| 4722 this._outerScope = outerScope2; | 4756 this._outerScope = outerScope2; |
| 4723 this._label = label4; | 4757 this._label = label4; |
| 4724 this._element = element19; | 4758 this._element = element19; |
| 4725 } | 4759 } |
| 4726 /** | 4760 /** |
| 4727 * Return the label element corresponding to the given label, or {@code null}
if the given label | 4761 * Return the label element corresponding to the given label, or {@code null}
if the given label |
| 4728 * is not defined in this scope. | 4762 * is not defined in this scope. |
| 4729 * @param targetLabel the label being looked up | 4763 * @param targetLabel the label being looked up |
| 4730 * @return the label element corresponding to the given label | 4764 * @return the label element corresponding to the given label |
| 4731 */ | 4765 */ |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4841 * @param compilationUnit the compilation unit defining the top-level names to
be added to this | 4875 * @param compilationUnit the compilation unit defining the top-level names to
be added to this |
| 4842 * scope | 4876 * scope |
| 4843 */ | 4877 */ |
| 4844 void defineLocalNames(CompilationUnitElement compilationUnit) { | 4878 void defineLocalNames(CompilationUnitElement compilationUnit) { |
| 4845 for (PropertyAccessorElement element in compilationUnit.accessors) { | 4879 for (PropertyAccessorElement element in compilationUnit.accessors) { |
| 4846 define(element); | 4880 define(element); |
| 4847 } | 4881 } |
| 4848 for (FunctionElement element in compilationUnit.functions) { | 4882 for (FunctionElement element in compilationUnit.functions) { |
| 4849 define(element); | 4883 define(element); |
| 4850 } | 4884 } |
| 4851 for (TypeAliasElement element in compilationUnit.typeAliases) { | 4885 for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases
) { |
| 4852 define(element); | 4886 define(element); |
| 4853 } | 4887 } |
| 4854 for (ClassElement element in compilationUnit.types) { | 4888 for (ClassElement element in compilationUnit.types) { |
| 4855 define(element); | 4889 define(element); |
| 4856 } | 4890 } |
| 4857 } | 4891 } |
| 4858 /** | 4892 /** |
| 4859 * Add to this scope all of the names that are explicitly defined in the given
library. | 4893 * Add to this scope all of the names that are explicitly defined in the given
library. |
| 4860 * @param definingLibrary the element representing the library that defines th
e names in this | 4894 * @param definingLibrary the element representing the library that defines th
e names in this |
| 4861 * scope | 4895 * scope |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4987 * @param compilationUnit the compilation unit defining the top-level names to
be added to this | 5021 * @param compilationUnit the compilation unit defining the top-level names to
be added to this |
| 4988 * namespace | 5022 * namespace |
| 4989 */ | 5023 */ |
| 4990 void addPublicNames(Map<String, Element> definedNames, CompilationUnitElement
compilationUnit) { | 5024 void addPublicNames(Map<String, Element> definedNames, CompilationUnitElement
compilationUnit) { |
| 4991 for (PropertyAccessorElement element in compilationUnit.accessors) { | 5025 for (PropertyAccessorElement element in compilationUnit.accessors) { |
| 4992 addIfPublic(definedNames, element); | 5026 addIfPublic(definedNames, element); |
| 4993 } | 5027 } |
| 4994 for (FunctionElement element in compilationUnit.functions) { | 5028 for (FunctionElement element in compilationUnit.functions) { |
| 4995 addIfPublic(definedNames, element); | 5029 addIfPublic(definedNames, element); |
| 4996 } | 5030 } |
| 4997 for (TypeAliasElement element in compilationUnit.typeAliases) { | 5031 for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases
) { |
| 4998 addIfPublic(definedNames, element); | 5032 addIfPublic(definedNames, element); |
| 4999 } | 5033 } |
| 5000 for (ClassElement element in compilationUnit.types) { | 5034 for (ClassElement element in compilationUnit.types) { |
| 5001 addIfPublic(definedNames, element); | 5035 addIfPublic(definedNames, element); |
| 5002 } | 5036 } |
| 5003 for (VariableElement element in compilationUnit.topLevelVariables) { | 5037 for (VariableElement element in compilationUnit.topLevelVariables) { |
| 5004 addIfPublic(definedNames, element); | 5038 addIfPublic(definedNames, element); |
| 5005 } | 5039 } |
| 5006 } | 5040 } |
| 5007 /** | 5041 /** |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5226 * errors and warnings not covered by the parser and resolver. In particular, it
looks for errors | 5260 * errors and warnings not covered by the parser and resolver. In particular, it
looks for errors |
| 5227 * and warnings related to constant expressions. | 5261 * and warnings related to constant expressions. |
| 5228 * @coverage dart.engine.resolver | 5262 * @coverage dart.engine.resolver |
| 5229 */ | 5263 */ |
| 5230 class ConstantVerifier extends RecursiveASTVisitor<Object> { | 5264 class ConstantVerifier extends RecursiveASTVisitor<Object> { |
| 5231 /** | 5265 /** |
| 5232 * The error reporter by which errors will be reported. | 5266 * The error reporter by which errors will be reported. |
| 5233 */ | 5267 */ |
| 5234 ErrorReporter _errorReporter; | 5268 ErrorReporter _errorReporter; |
| 5235 /** | 5269 /** |
| 5236 * The constant evaluator used to evaluate constants. | |
| 5237 */ | |
| 5238 ConstantEvaluator _evaluator; | |
| 5239 /** | |
| 5240 * Initialize a newly created constant verifier. | 5270 * Initialize a newly created constant verifier. |
| 5241 * @param errorReporter the error reporter by which errors will be reported | 5271 * @param errorReporter the error reporter by which errors will be reported |
| 5242 */ | 5272 */ |
| 5243 ConstantVerifier(ErrorReporter errorReporter) { | 5273 ConstantVerifier(ErrorReporter errorReporter) { |
| 5244 this._errorReporter = errorReporter; | 5274 this._errorReporter = errorReporter; |
| 5245 _evaluator = new ConstantEvaluator(errorReporter); | |
| 5246 } | 5275 } |
| 5247 Object visitFunctionExpression(FunctionExpression node) { | 5276 Object visitFunctionExpression(FunctionExpression node) { |
| 5248 super.visitFunctionExpression(node); | 5277 super.visitFunctionExpression(node); |
| 5249 validateDefaultValues(node.parameters); | 5278 validateDefaultValues(node.parameters); |
| 5250 return null; | 5279 return null; |
| 5251 } | 5280 } |
| 5252 Object visitListLiteral(ListLiteral node) { | 5281 Object visitListLiteral(ListLiteral node) { |
| 5253 super.visitListLiteral(node); | 5282 super.visitListLiteral(node); |
| 5254 if (node.modifier != null) { | 5283 if (node.modifier != null) { |
| 5255 for (Expression element in node.elements) { | 5284 for (Expression element in node.elements) { |
| 5256 validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT); | 5285 validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT); |
| 5257 } | 5286 } |
| 5258 } | 5287 } |
| 5259 return null; | 5288 return null; |
| 5260 } | 5289 } |
| 5261 Object visitMapLiteral(MapLiteral node) { | 5290 Object visitMapLiteral(MapLiteral node) { |
| 5262 super.visitMapLiteral(node); | 5291 super.visitMapLiteral(node); |
| 5263 bool isConst = node.modifier != null; | 5292 bool isConst = node.modifier != null; |
| 5264 Set<String> keys = new Set<String>(); | 5293 Set<String> keys = new Set<String>(); |
| 5265 for (MapLiteralEntry entry in node.entries) { | 5294 for (MapLiteralEntry entry in node.entries) { |
| 5266 StringLiteral key4 = entry.key; | 5295 StringLiteral key4 = entry.key; |
| 5267 Object value = validate(key4, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY); | 5296 EvaluationResultImpl result = validate(key4, CompileTimeErrorCode.NON_CONS
TANT_MAP_KEY); |
| 5268 if (value is String) { | 5297 if (result is ValidResult && ((result as ValidResult)).value is String) { |
| 5269 if (keys.contains(value)) { | 5298 String value10 = ((result as ValidResult)).value as String; |
| 5299 if (keys.contains(value10)) { |
| 5270 _errorReporter.reportError(StaticWarningCode.EQUAL_KEYS_IN_MAP, key4,
[]); | 5300 _errorReporter.reportError(StaticWarningCode.EQUAL_KEYS_IN_MAP, key4,
[]); |
| 5271 } else { | 5301 } else { |
| 5272 javaSetAdd(keys, (value as String)); | 5302 javaSetAdd(keys, value10); |
| 5273 } | 5303 } |
| 5274 } else if (value != null) { | |
| 5275 } | 5304 } |
| 5276 if (isConst) { | 5305 if (isConst) { |
| 5277 validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE); | 5306 validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE); |
| 5278 } | 5307 } |
| 5279 } | 5308 } |
| 5280 return null; | 5309 return null; |
| 5281 } | 5310 } |
| 5282 Object visitMethodDeclaration(MethodDeclaration node) { | 5311 Object visitMethodDeclaration(MethodDeclaration node) { |
| 5283 super.visitMethodDeclaration(node); | 5312 super.visitMethodDeclaration(node); |
| 5284 validateDefaultValues(node.parameters); | 5313 validateDefaultValues(node.parameters); |
| 5285 return null; | 5314 return null; |
| 5286 } | 5315 } |
| 5287 Object visitSwitchCase(SwitchCase node) { | 5316 Object visitSwitchCase(SwitchCase node) { |
| 5288 super.visitSwitchCase(node); | 5317 super.visitSwitchCase(node); |
| 5289 validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION)
; | 5318 validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION)
; |
| 5290 return null; | 5319 return null; |
| 5291 } | 5320 } |
| 5292 Object visitVariableDeclaration(VariableDeclaration node) { | 5321 Object visitVariableDeclaration(VariableDeclaration node) { |
| 5293 super.visitVariableDeclaration(node); | 5322 super.visitVariableDeclaration(node); |
| 5294 Expression initializer4 = node.initializer; | 5323 Expression initializer4 = node.initializer; |
| 5295 if (initializer4 != null && node.isConst()) { | 5324 if (initializer4 != null && node.isConst()) { |
| 5296 validate(initializer4, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CON
STANT_VALUE); | 5325 EvaluationResultImpl result = validate(initializer4, CompileTimeErrorCode.
CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE); |
| 5326 VariableElementImpl element45 = node.element as VariableElementImpl; |
| 5327 element45.evaluationResult = result; |
| 5297 } | 5328 } |
| 5298 return null; | 5329 return null; |
| 5299 } | 5330 } |
| 5300 /** | 5331 /** |
| 5301 * Validate that the given expression is a compile time constant. Return the v
alue of the compile | 5332 * Validate that the given expression is a compile time constant. Return the v
alue of the compile |
| 5302 * time constant, or {@code null} if the expression is not a compile time cons
tant. | 5333 * time constant, or {@code null} if the expression is not a compile time cons
tant. |
| 5303 * @param expression the expression to be validated | 5334 * @param expression the expression to be validated |
| 5304 * @param errorCode the error code to be used if the expression is not a compi
le time constant | 5335 * @param errorCode the error code to be used if the expression is not a compi
le time constant |
| 5305 * @return the value of the compile time constant | 5336 * @return the value of the compile time constant |
| 5306 */ | 5337 */ |
| 5307 Object validate(Expression expression, ErrorCode errorCode) { | 5338 EvaluationResultImpl validate(Expression expression, ErrorCode errorCode4) { |
| 5308 Object value = expression.accept(_evaluator); | 5339 EvaluationResultImpl result = expression.accept(new ConstantVisitor()); |
| 5309 if (identical(value, ConstantEvaluator.NOT_A_CONSTANT)) { | 5340 if (result is ErrorResult) { |
| 5310 _errorReporter.reportError(errorCode, expression, []); | 5341 for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) { |
| 5311 return null; | 5342 if (identical(data.errorCode, CompileTimeErrorCode.COMPILE_TIME_CONSTANT
_RAISES_EXCEPTION_DIVIDE_BY_ZERO)) { |
| 5343 _errorReporter.reportError(data.errorCode, data.node, []); |
| 5344 } else { |
| 5345 _errorReporter.reportError(errorCode4, data.node, []); |
| 5346 } |
| 5347 } |
| 5312 } | 5348 } |
| 5313 if (identical(value, errorCode)) { | 5349 return result; |
| 5314 _errorReporter.reportError(CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAIS
ES_EXCEPTION, expression, []); | |
| 5315 return null; | |
| 5316 } | |
| 5317 if (identical(value, errorCode)) { | |
| 5318 _errorReporter.reportError(CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CON
STANT, expression, []); | |
| 5319 return null; | |
| 5320 } | |
| 5321 return value; | |
| 5322 } | 5350 } |
| 5323 /** | 5351 /** |
| 5324 * Validate that the default value associated with each of the parameters in t
he given list is a | 5352 * Validate that the default value associated with each of the parameters in t
he given list is a |
| 5325 * compile time constant. | 5353 * compile time constant. |
| 5326 * @param parameters the list of parameters to be validated | 5354 * @param parameters the list of parameters to be validated |
| 5327 */ | 5355 */ |
| 5328 void validateDefaultValues(FormalParameterList parameters14) { | 5356 void validateDefaultValues(FormalParameterList parameters14) { |
| 5329 if (parameters14 == null) { | 5357 if (parameters14 == null) { |
| 5330 return; | 5358 return; |
| 5331 } | 5359 } |
| 5332 for (FormalParameter parameter in parameters14.parameters) { | 5360 for (FormalParameter parameter in parameters14.parameters) { |
| 5333 if (parameter is DefaultFormalParameter) { | 5361 if (parameter is DefaultFormalParameter) { |
| 5334 Expression defaultValue2 = ((parameter as DefaultFormalParameter)).defau
ltValue; | 5362 DefaultFormalParameter defaultParameter = parameter as DefaultFormalPara
meter; |
| 5363 Expression defaultValue2 = defaultParameter.defaultValue; |
| 5335 if (defaultValue2 != null) { | 5364 if (defaultValue2 != null) { |
| 5336 validate(defaultValue2, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALU
E); | 5365 EvaluationResultImpl result = validate(defaultValue2, CompileTimeError
Code.NON_CONSTANT_DEFAULT_VALUE); |
| 5366 if (defaultParameter.isConst()) { |
| 5367 VariableElementImpl element46 = parameter.element as VariableElement
Impl; |
| 5368 element46.evaluationResult = result; |
| 5369 } |
| 5337 } | 5370 } |
| 5338 } | 5371 } |
| 5339 } | 5372 } |
| 5340 } | 5373 } |
| 5341 } | 5374 } |
| 5342 /** | 5375 /** |
| 5343 * Instances of the class {@code ErrorVerifier} traverse an AST structure lookin
g for additional | 5376 * Instances of the class {@code ErrorVerifier} traverse an AST structure lookin
g for additional |
| 5344 * errors and warnings not covered by the parser and resolver. | 5377 * errors and warnings not covered by the parser and resolver. |
| 5345 * @coverage dart.engine.resolver | 5378 * @coverage dart.engine.resolver |
| 5346 */ | 5379 */ |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5440 Object visitIfStatement(IfStatement node) { | 5473 Object visitIfStatement(IfStatement node) { |
| 5441 checkForNonBoolCondition(node.condition); | 5474 checkForNonBoolCondition(node.condition); |
| 5442 return super.visitIfStatement(node); | 5475 return super.visitIfStatement(node); |
| 5443 } | 5476 } |
| 5444 Object visitInstanceCreationExpression(InstanceCreationExpression node) { | 5477 Object visitInstanceCreationExpression(InstanceCreationExpression node) { |
| 5445 ConstructorName constructorName4 = node.constructorName; | 5478 ConstructorName constructorName4 = node.constructorName; |
| 5446 TypeName typeName = constructorName4.type; | 5479 TypeName typeName = constructorName4.type; |
| 5447 Type2 type20 = typeName.type; | 5480 Type2 type20 = typeName.type; |
| 5448 if (type20 is InterfaceType) { | 5481 if (type20 is InterfaceType) { |
| 5449 InterfaceType interfaceType = type20 as InterfaceType; | 5482 InterfaceType interfaceType = type20 as InterfaceType; |
| 5483 checkForConstWithNonConst(node); |
| 5450 checkForConstOrNewWithAbstractClass(node, typeName, interfaceType); | 5484 checkForConstOrNewWithAbstractClass(node, typeName, interfaceType); |
| 5451 checkForTypeArgumentNotMatchingBounds(node, constructorName4.element, type
Name); | 5485 checkForTypeArgumentNotMatchingBounds(node, constructorName4.element, type
Name); |
| 5452 } else { | |
| 5453 _errorReporter.reportError(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, type
Name, []); | |
| 5454 } | 5486 } |
| 5455 return super.visitInstanceCreationExpression(node); | 5487 return super.visitInstanceCreationExpression(node); |
| 5456 } | 5488 } |
| 5457 Object visitMethodDeclaration(MethodDeclaration node) { | 5489 Object visitMethodDeclaration(MethodDeclaration node) { |
| 5458 ExecutableElement previousFunction = _currentFunction; | 5490 ExecutableElement previousFunction = _currentFunction; |
| 5459 try { | 5491 try { |
| 5460 _currentFunction = node.element; | 5492 _currentFunction = node.element; |
| 5461 return super.visitMethodDeclaration(node); | 5493 return super.visitMethodDeclaration(node); |
| 5462 } finally { | 5494 } finally { |
| 5463 _currentFunction = previousFunction; | 5495 _currentFunction = previousFunction; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 5488 return super.visitWhileStatement(node); | 5520 return super.visitWhileStatement(node); |
| 5489 } | 5521 } |
| 5490 /** | 5522 /** |
| 5491 * This verifies that the passed argument definition test identifier is a para
meter. | 5523 * This verifies that the passed argument definition test identifier is a para
meter. |
| 5492 * @param node the {@link ArgumentDefinitionTest} to evaluate | 5524 * @param node the {@link ArgumentDefinitionTest} to evaluate |
| 5493 * @return return <code>true</code> if and only if an error code is generated
on the passed node | 5525 * @return return <code>true</code> if and only if an error code is generated
on the passed node |
| 5494 * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER | 5526 * @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER |
| 5495 */ | 5527 */ |
| 5496 bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) { | 5528 bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) { |
| 5497 SimpleIdentifier identifier14 = node.identifier; | 5529 SimpleIdentifier identifier14 = node.identifier; |
| 5498 Element element44 = identifier14.element; | 5530 Element element47 = identifier14.element; |
| 5499 if (element44 != null && element44 is! ParameterElement) { | 5531 if (element47 != null && element47 is! ParameterElement) { |
| 5500 _errorReporter.reportError(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_N
ON_PARAMETER, identifier14, [identifier14.name]); | 5532 _errorReporter.reportError(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_N
ON_PARAMETER, identifier14, [identifier14.name]); |
| 5501 return true; | 5533 return true; |
| 5502 } | 5534 } |
| 5503 return false; | 5535 return false; |
| 5504 } | 5536 } |
| 5505 /** | 5537 /** |
| 5506 * This verifies that the passed identifier is not a keyword, and generates th
e passed error code | 5538 * This verifies that the passed identifier is not a keyword, and generates th
e passed error code |
| 5507 * on the identifier if it is a keyword. | 5539 * on the identifier if it is a keyword. |
| 5508 * @param identifier the identifier to check to ensure that it is not a keywor
d | 5540 * @param identifier the identifier to check to ensure that it is not a keywor
d |
| 5509 * @param errorCode if the passed identifier is a keyword then this error code
is created on the | 5541 * @param errorCode if the passed identifier is a keyword then this error code
is created on the |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5548 * This verifies that the passed switch statement does not have a case express
ion with the | 5580 * This verifies that the passed switch statement does not have a case express
ion with the |
| 5549 * operator '==' overridden. | 5581 * operator '==' overridden. |
| 5550 * @param node the switch statement to evaluate | 5582 * @param node the switch statement to evaluate |
| 5551 * @return return <code>true</code> if and only if an error code is generated
on the passed node | 5583 * @return return <code>true</code> if and only if an error code is generated
on the passed node |
| 5552 * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS | 5584 * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS |
| 5553 */ | 5585 */ |
| 5554 bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node) { | 5586 bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node) { |
| 5555 Expression expression16 = node.expression; | 5587 Expression expression16 = node.expression; |
| 5556 Type2 type = expression16.staticType; | 5588 Type2 type = expression16.staticType; |
| 5557 if (type != null && type != _typeProvider.intType && type != _typeProvider.s
tringType) { | 5589 if (type != null && type != _typeProvider.intType && type != _typeProvider.s
tringType) { |
| 5558 Element element45 = type.element; | 5590 Element element48 = type.element; |
| 5559 if (element45 is ClassElement) { | 5591 if (element48 is ClassElement) { |
| 5560 ClassElement classElement = element45 as ClassElement; | 5592 ClassElement classElement = element48 as ClassElement; |
| 5561 MethodElement method = classElement.lookUpMethod("==", _currentLibrary); | 5593 MethodElement method = classElement.lookUpMethod("==", _currentLibrary); |
| 5562 if (method != null && method.enclosingElement.type != _typeProvider.obje
ctType) { | 5594 if (method != null && method.enclosingElement.type != _typeProvider.obje
ctType) { |
| 5563 _errorReporter.reportError(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_I
MPLEMENTS_EQUALS, expression16, [element45.name]); | 5595 _errorReporter.reportError(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_I
MPLEMENTS_EQUALS, expression16, [element48.name]); |
| 5564 return true; | 5596 return true; |
| 5565 } | 5597 } |
| 5566 } | 5598 } |
| 5567 } | 5599 } |
| 5568 return false; | 5600 return false; |
| 5569 } | 5601 } |
| 5570 bool checkForConflictingConstructorNameAndMember(ConstructorDeclaration node)
{ | 5602 bool checkForConflictingConstructorNameAndMember(ConstructorDeclaration node)
{ |
| 5571 ConstructorElement constructorElement = node.element; | 5603 ConstructorElement constructorElement = node.element; |
| 5572 SimpleIdentifier constructorName = node.name; | 5604 SimpleIdentifier constructorName = node.name; |
| 5573 if (constructorName != null && constructorElement != null && !constructorNam
e.isSynthetic()) { | 5605 if (constructorName != null && constructorElement != null && !constructorNam
e.isSynthetic()) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 5599 */ | 5631 */ |
| 5600 bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) { | 5632 bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) { |
| 5601 if (node.constKeyword == null) { | 5633 if (node.constKeyword == null) { |
| 5602 return false; | 5634 return false; |
| 5603 } | 5635 } |
| 5604 ConstructorElement constructorElement = node.element; | 5636 ConstructorElement constructorElement = node.element; |
| 5605 if (constructorElement != null) { | 5637 if (constructorElement != null) { |
| 5606 ClassElement classElement = constructorElement.enclosingElement; | 5638 ClassElement classElement = constructorElement.enclosingElement; |
| 5607 List<FieldElement> elements = classElement.fields; | 5639 List<FieldElement> elements = classElement.fields; |
| 5608 for (FieldElement field in elements) { | 5640 for (FieldElement field in elements) { |
| 5609 if (!field.isFinal() && !field.isConst()) { | 5641 if (!field.isFinal() && !field.isConst() && !field.isSynthetic()) { |
| 5610 _errorReporter.reportError(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH
_NON_FINAL_FIELD, node, []); | 5642 _errorReporter.reportError(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH
_NON_FINAL_FIELD, node, []); |
| 5611 return true; | 5643 return true; |
| 5612 } | 5644 } |
| 5613 } | 5645 } |
| 5614 } | 5646 } |
| 5615 return false; | 5647 return false; |
| 5616 } | 5648 } |
| 5617 /** | 5649 /** |
| 5618 * This verifies that the passed normal formal parameter is not 'const'. | 5650 * This verifies that the passed normal formal parameter is not 'const'. |
| 5619 * @param node the normal formal parameter to evaluate | 5651 * @param node the normal formal parameter to evaluate |
| (...skipping 12 matching lines...) Expand all Loading... |
| 5632 * class. | 5664 * class. |
| 5633 * @param node the instance creation expression to evaluate | 5665 * @param node the instance creation expression to evaluate |
| 5634 * @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 | 5666 * @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 |
| 5635 * @param type the type being constructed with this {@link InstanceCreationExp
ression} | 5667 * @param type the type being constructed with this {@link InstanceCreationExp
ression} |
| 5636 * @return return <code>true</code> if and only if an error code is generated
on the passed node | 5668 * @return return <code>true</code> if and only if an error code is generated
on the passed node |
| 5637 * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS | 5669 * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS |
| 5638 * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS | 5670 * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS |
| 5639 */ | 5671 */ |
| 5640 bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, Type
Name typeName, InterfaceType type) { | 5672 bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, Type
Name typeName, InterfaceType type) { |
| 5641 if (type.element.isAbstract()) { | 5673 if (type.element.isAbstract()) { |
| 5642 ConstructorElement element46 = node.element; | 5674 ConstructorElement element49 = node.element; |
| 5643 if (element46 != null && !element46.isFactory()) { | 5675 if (element49 != null && !element49.isFactory()) { |
| 5644 if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CO
NST)) { | 5676 if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CO
NST)) { |
| 5645 _errorReporter.reportError(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS
, typeName, []); | 5677 _errorReporter.reportError(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS
, typeName, []); |
| 5646 } else { | 5678 } else { |
| 5647 _errorReporter.reportError(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS,
typeName, []); | 5679 _errorReporter.reportError(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS,
typeName, []); |
| 5648 } | 5680 } |
| 5649 return true; | 5681 return true; |
| 5650 } | 5682 } |
| 5651 } | 5683 } |
| 5652 return false; | 5684 return false; |
| 5653 } | 5685 } |
| 5654 /** | 5686 /** |
| 5687 * This verifies that if the passed instance creation expression is 'const', t
hen it is not being |
| 5688 * invoked on a constructor that is not 'const'. |
| 5689 * @param node the instance creation expression to evaluate |
| 5690 * @return return <code>true</code> if and only if an error code is generated
on the passed node |
| 5691 * @see CompileTimeErrorCode#CONST_WITH_NON_CONST |
| 5692 */ |
| 5693 bool checkForConstWithNonConst(InstanceCreationExpression node) { |
| 5694 if (node.isConst() && !node.element.isConst()) { |
| 5695 _errorReporter.reportError(CompileTimeErrorCode.CONST_WITH_NON_CONST, node
, []); |
| 5696 return true; |
| 5697 } |
| 5698 return false; |
| 5699 } |
| 5700 /** |
| 5655 * This verifies that the passed assignment expression represents a valid assi
gnment. | 5701 * This verifies that the passed assignment expression represents a valid assi
gnment. |
| 5656 * @param node the assignment expression to evaluate | 5702 * @param node the assignment expression to evaluate |
| 5657 * @return return <code>true</code> if and only if an error code is generated
on the passed node | 5703 * @return return <code>true</code> if and only if an error code is generated
on the passed node |
| 5658 * @see StaticTypeWarningCode#INVALID_ASSIGNMENT | 5704 * @see StaticTypeWarningCode#INVALID_ASSIGNMENT |
| 5659 */ | 5705 */ |
| 5660 bool checkForInvalidAssignment(AssignmentExpression node) { | 5706 bool checkForInvalidAssignment(AssignmentExpression node) { |
| 5661 Expression lhs = node.leftHandSide; | 5707 Expression lhs = node.leftHandSide; |
| 5662 Expression rhs = node.rightHandSide; | 5708 Expression rhs = node.rightHandSide; |
| 5663 Type2 leftType = getType(lhs); | 5709 Type2 leftType = getType(lhs); |
| 5664 Type2 rightType = getType(rhs); | 5710 Type2 rightType = getType(rhs); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5798 ResolverErrorCode(this.__name, this.__ordinal, ErrorType type, String message)
{ | 5844 ResolverErrorCode(this.__name, this.__ordinal, ErrorType type, String message)
{ |
| 5799 this._type = type; | 5845 this._type = type; |
| 5800 this._message = message; | 5846 this._message = message; |
| 5801 } | 5847 } |
| 5802 ErrorSeverity get errorSeverity => _type.severity; | 5848 ErrorSeverity get errorSeverity => _type.severity; |
| 5803 String get message => _message; | 5849 String get message => _message; |
| 5804 ErrorType get type => _type; | 5850 ErrorType get type => _type; |
| 5805 bool needsRecompilation() => true; | 5851 bool needsRecompilation() => true; |
| 5806 String toString() => __name; | 5852 String toString() => __name; |
| 5807 } | 5853 } |
| OLD | NEW |