| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analyzer.src.generated.resolver; | 5 library analyzer.src.generated.resolver; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/resolution_accessors.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart'; | 11 import 'package:analyzer/dart/ast/token.dart'; |
| 11 import 'package:analyzer/dart/ast/visitor.dart'; | 12 import 'package:analyzer/dart/ast/visitor.dart'; |
| 12 import 'package:analyzer/dart/element/element.dart'; | 13 import 'package:analyzer/dart/element/element.dart'; |
| 13 import 'package:analyzer/dart/element/type.dart'; | 14 import 'package:analyzer/dart/element/type.dart'; |
| 14 import 'package:analyzer/dart/element/visitor.dart'; | 15 import 'package:analyzer/dart/element/visitor.dart'; |
| 15 import 'package:analyzer/error/error.dart'; | 16 import 'package:analyzer/error/error.dart'; |
| 16 import 'package:analyzer/error/listener.dart'; | 17 import 'package:analyzer/error/listener.dart'; |
| 17 import 'package:analyzer/exception/exception.dart'; | 18 import 'package:analyzer/exception/exception.dart'; |
| 18 import 'package:analyzer/src/dart/ast/ast.dart'; | 19 import 'package:analyzer/src/dart/ast/ast.dart'; |
| 19 import 'package:analyzer/src/dart/ast/utilities.dart'; | 20 import 'package:analyzer/src/dart/ast/utilities.dart'; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 this._currentLibrary, this._manager, | 99 this._currentLibrary, this._manager, |
| 99 {TypeSystem typeSystem}) | 100 {TypeSystem typeSystem}) |
| 100 : _nullType = typeProvider.nullType, | 101 : _nullType = typeProvider.nullType, |
| 101 _futureNullType = typeProvider.futureNullType, | 102 _futureNullType = typeProvider.futureNullType, |
| 102 _typeSystem = typeSystem ?? new TypeSystemImpl() { | 103 _typeSystem = typeSystem ?? new TypeSystemImpl() { |
| 103 inDeprecatedMember = _currentLibrary.isDeprecated; | 104 inDeprecatedMember = _currentLibrary.isDeprecated; |
| 104 } | 105 } |
| 105 | 106 |
| 106 @override | 107 @override |
| 107 Object visitAnnotation(Annotation node) { | 108 Object visitAnnotation(Annotation node) { |
| 108 if (node.elementAnnotation?.isFactory == true) { | 109 if (elementAnnotationForAnnotation(node)?.isFactory == true) { |
| 109 AstNode parent = node.parent; | 110 AstNode parent = node.parent; |
| 110 if (parent is MethodDeclaration) { | 111 if (parent is MethodDeclaration) { |
| 111 _checkForInvalidFactory(parent); | 112 _checkForInvalidFactory(parent); |
| 112 } else { | 113 } else { |
| 113 _errorReporter | 114 _errorReporter |
| 114 .reportErrorForNode(HintCode.INVALID_FACTORY_ANNOTATION, node, []); | 115 .reportErrorForNode(HintCode.INVALID_FACTORY_ANNOTATION, node, []); |
| 115 } | 116 } |
| 116 } | 117 } |
| 117 return super.visitAnnotation(node); | 118 return super.visitAnnotation(node); |
| 118 } | 119 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 } | 187 } |
| 187 | 188 |
| 188 @override | 189 @override |
| 189 Object visitConditionalExpression(ConditionalExpression node) { | 190 Object visitConditionalExpression(ConditionalExpression node) { |
| 190 _checkForPossibleNullCondition(node.condition); | 191 _checkForPossibleNullCondition(node.condition); |
| 191 return super.visitConditionalExpression(node); | 192 return super.visitConditionalExpression(node); |
| 192 } | 193 } |
| 193 | 194 |
| 194 @override | 195 @override |
| 195 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 196 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| 196 if (node.element.isFactory) { | 197 if (elementForConstructorDeclaration(node).isFactory) { |
| 197 if (node.body is BlockFunctionBody) { | 198 if (node.body is BlockFunctionBody) { |
| 198 // Check the block for a return statement, if not, create the hint. | 199 // Check the block for a return statement, if not, create the hint. |
| 199 if (!ExitDetector.exits(node.body)) { | 200 if (!ExitDetector.exits(node.body)) { |
| 200 _errorReporter.reportErrorForNode( | 201 _errorReporter.reportErrorForNode( |
| 201 HintCode.MISSING_RETURN, node, [node.returnType.name]); | 202 HintCode.MISSING_RETURN, node, [node.returnType.name]); |
| 202 } | 203 } |
| 203 } | 204 } |
| 204 } | 205 } |
| 205 return super.visitConstructorDeclaration(node); | 206 return super.visitConstructorDeclaration(node); |
| 206 } | 207 } |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 // or have the logic centralized elsewhere, instead of doing this logic | 642 // or have the logic centralized elsewhere, instead of doing this logic |
| 642 // here. | 643 // here. |
| 643 displayName = element.enclosingElement.displayName; | 644 displayName = element.enclosingElement.displayName; |
| 644 if (!element.displayName.isEmpty) { | 645 if (!element.displayName.isEmpty) { |
| 645 displayName = "$displayName.${element.displayName}"; | 646 displayName = "$displayName.${element.displayName}"; |
| 646 } | 647 } |
| 647 } else if (displayName == FunctionElement.CALL_METHOD_NAME && | 648 } else if (displayName == FunctionElement.CALL_METHOD_NAME && |
| 648 node is MethodInvocation && | 649 node is MethodInvocation && |
| 649 node.staticInvokeType is InterfaceType) { | 650 node.staticInvokeType is InterfaceType) { |
| 650 displayName = | 651 displayName = |
| 651 "${node.staticInvokeType.displayName}.${element.displayName}"; | 652 "${staticInvokeTypeForInvocationExpression(node).displayName}.${elem
ent.displayName}"; |
| 652 } | 653 } |
| 653 _errorReporter.reportErrorForNode( | 654 _errorReporter.reportErrorForNode( |
| 654 HintCode.DEPRECATED_MEMBER_USE, node, [displayName]); | 655 HintCode.DEPRECATED_MEMBER_USE, node, [displayName]); |
| 655 } | 656 } |
| 656 } | 657 } |
| 657 | 658 |
| 658 /** | 659 /** |
| 659 * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse] | 660 * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse] |
| 660 * if the node is not in a declaration context. | 661 * if the node is not in a declaration context. |
| 661 * | 662 * |
| (...skipping 1618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2280 * elements. | 2281 * elements. |
| 2281 * | 2282 * |
| 2282 * The resulting AST must have everything resolved that would have been resolved | 2283 * The resulting AST must have everything resolved that would have been resolved |
| 2283 * by a [DirectiveElementBuilder]. | 2284 * by a [DirectiveElementBuilder]. |
| 2284 */ | 2285 */ |
| 2285 class DirectiveResolver extends SimpleAstVisitor { | 2286 class DirectiveResolver extends SimpleAstVisitor { |
| 2286 LibraryElement _enclosingLibrary; | 2287 LibraryElement _enclosingLibrary; |
| 2287 | 2288 |
| 2288 @override | 2289 @override |
| 2289 void visitCompilationUnit(CompilationUnit node) { | 2290 void visitCompilationUnit(CompilationUnit node) { |
| 2290 _enclosingLibrary = node.element.library; | 2291 _enclosingLibrary = elementForCompilationUnit(node).library; |
| 2291 for (Directive directive in node.directives) { | 2292 for (Directive directive in node.directives) { |
| 2292 directive.accept(this); | 2293 directive.accept(this); |
| 2293 } | 2294 } |
| 2294 } | 2295 } |
| 2295 | 2296 |
| 2296 @override | 2297 @override |
| 2297 void visitExportDirective(ExportDirective node) { | 2298 void visitExportDirective(ExportDirective node) { |
| 2298 int nodeOffset = node.offset; | 2299 int nodeOffset = node.offset; |
| 2299 node.element = null; | 2300 node.element = null; |
| 2300 for (ExportElement element in _enclosingLibrary.exports) { | 2301 for (ExportElement element in _enclosingLibrary.exports) { |
| (...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3587 bool _enableDart2JSHints = false; | 3588 bool _enableDart2JSHints = false; |
| 3588 | 3589 |
| 3589 /** | 3590 /** |
| 3590 * The inheritance manager used to find overridden methods. | 3591 * The inheritance manager used to find overridden methods. |
| 3591 */ | 3592 */ |
| 3592 InheritanceManager _manager; | 3593 InheritanceManager _manager; |
| 3593 | 3594 |
| 3594 GatherUsedLocalElementsVisitor _usedLocalElementsVisitor; | 3595 GatherUsedLocalElementsVisitor _usedLocalElementsVisitor; |
| 3595 | 3596 |
| 3596 HintGenerator(this._compilationUnits, this._context, this._errorListener) { | 3597 HintGenerator(this._compilationUnits, this._context, this._errorListener) { |
| 3597 _library = _compilationUnits[0].element.library; | 3598 _library = elementForCompilationUnit(_compilationUnits[0]).library; |
| 3598 _usedImportedElementsVisitor = | 3599 _usedImportedElementsVisitor = |
| 3599 new GatherUsedImportedElementsVisitor(_library); | 3600 new GatherUsedImportedElementsVisitor(_library); |
| 3600 _enableDart2JSHints = _context.analysisOptions.dart2jsHint; | 3601 _enableDart2JSHints = _context.analysisOptions.dart2jsHint; |
| 3601 _manager = | 3602 _manager = |
| 3602 new InheritanceManager(_library, includeAbstractFromSuperclasses: true); | 3603 new InheritanceManager(_library, includeAbstractFromSuperclasses: true); |
| 3603 _usedLocalElementsVisitor = new GatherUsedLocalElementsVisitor(_library); | 3604 _usedLocalElementsVisitor = new GatherUsedLocalElementsVisitor(_library); |
| 3604 } | 3605 } |
| 3605 | 3606 |
| 3606 void generateForLibrary() { | 3607 void generateForLibrary() { |
| 3607 PerformanceStatistics.hints.makeCurrentWhile(() { | 3608 PerformanceStatistics.hints.makeCurrentWhile(() { |
| 3608 int length = _compilationUnits.length; | 3609 int length = _compilationUnits.length; |
| 3609 for (int i = 0; i < length; i++) { | 3610 for (int i = 0; i < length; i++) { |
| 3610 CompilationUnit unit = _compilationUnits[i]; | 3611 CompilationUnit unit = _compilationUnits[i]; |
| 3611 CompilationUnitElement element = unit.element; | 3612 CompilationUnitElement element = unit.element; |
| 3612 if (element != null) { | 3613 if (element != null) { |
| 3613 _generateForCompilationUnit(unit, element.source); | 3614 _generateForCompilationUnit(unit, element.source); |
| 3614 } | 3615 } |
| 3615 } | 3616 } |
| 3616 CompilationUnit definingUnit = _compilationUnits[0]; | 3617 CompilationUnit definingUnit = _compilationUnits[0]; |
| 3617 ErrorReporter definingUnitErrorReporter = | 3618 ErrorReporter definingUnitErrorReporter = new ErrorReporter( |
| 3618 new ErrorReporter(_errorListener, definingUnit.element.source); | 3619 _errorListener, elementForCompilationUnit(definingUnit).source); |
| 3619 { | 3620 { |
| 3620 ImportsVerifier importsVerifier = new ImportsVerifier(); | 3621 ImportsVerifier importsVerifier = new ImportsVerifier(); |
| 3621 importsVerifier.addImports(definingUnit); | 3622 importsVerifier.addImports(definingUnit); |
| 3622 importsVerifier | 3623 importsVerifier |
| 3623 .removeUsedElements(_usedImportedElementsVisitor.usedElements); | 3624 .removeUsedElements(_usedImportedElementsVisitor.usedElements); |
| 3624 importsVerifier.generateDuplicateImportHints(definingUnitErrorReporter); | 3625 importsVerifier.generateDuplicateImportHints(definingUnitErrorReporter); |
| 3625 importsVerifier.generateUnusedImportHints(definingUnitErrorReporter); | 3626 importsVerifier.generateUnusedImportHints(definingUnitErrorReporter); |
| 3626 importsVerifier.generateUnusedShownNameHints(definingUnitErrorReporter); | 3627 importsVerifier.generateUnusedShownNameHints(definingUnitErrorReporter); |
| 3627 } | 3628 } |
| 3628 _library.accept(new UnusedLocalElementsVerifier( | 3629 _library.accept(new UnusedLocalElementsVerifier( |
| (...skipping 2152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5781 // We do not visit the label because it needs to be visited in the context | 5782 // We do not visit the label because it needs to be visited in the context |
| 5782 // of the statement. | 5783 // of the statement. |
| 5783 // | 5784 // |
| 5784 node.accept(elementResolver); | 5785 node.accept(elementResolver); |
| 5785 node.accept(typeAnalyzer); | 5786 node.accept(typeAnalyzer); |
| 5786 return null; | 5787 return null; |
| 5787 } | 5788 } |
| 5788 | 5789 |
| 5789 @override | 5790 @override |
| 5790 Object visitDefaultFormalParameter(DefaultFormalParameter node) { | 5791 Object visitDefaultFormalParameter(DefaultFormalParameter node) { |
| 5791 InferenceContext.setType(node.defaultValue, node.parameter.element?.type); | 5792 InferenceContext.setType( |
| 5793 node.defaultValue, elementForFormalParameter(node.parameter)?.type); |
| 5792 super.visitDefaultFormalParameter(node); | 5794 super.visitDefaultFormalParameter(node); |
| 5793 ParameterElement element = node.element; | 5795 ParameterElement element = node.element; |
| 5794 if (element.initializer != null && node.defaultValue != null) { | 5796 if (element.initializer != null && node.defaultValue != null) { |
| 5795 (element.initializer as FunctionElementImpl).returnType = | 5797 (element.initializer as FunctionElementImpl).returnType = |
| 5796 node.defaultValue.staticType; | 5798 node.defaultValue.staticType; |
| 5797 } | 5799 } |
| 5798 // Clone the ASTs for default formal parameters, so that we can use them | 5800 // Clone the ASTs for default formal parameters, so that we can use them |
| 5799 // during constant evaluation. | 5801 // during constant evaluation. |
| 5800 if (!_hasSerializedConstantInitializer(element)) { | 5802 if (!_hasSerializedConstantInitializer(element)) { |
| 5801 (element as ConstVariableElement).constantInitializer = | 5803 (element as ConstVariableElement).constantInitializer = |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5899 // We visit the iterator before the loop variable because the loop variable | 5901 // We visit the iterator before the loop variable because the loop variable |
| 5900 // cannot be in scope while visiting the iterator. | 5902 // cannot be in scope while visiting the iterator. |
| 5901 // | 5903 // |
| 5902 Expression iterable = node.iterable; | 5904 Expression iterable = node.iterable; |
| 5903 DeclaredIdentifier loopVariable = node.loopVariable; | 5905 DeclaredIdentifier loopVariable = node.loopVariable; |
| 5904 SimpleIdentifier identifier = node.identifier; | 5906 SimpleIdentifier identifier = node.identifier; |
| 5905 if (loopVariable?.type?.type != null) { | 5907 if (loopVariable?.type?.type != null) { |
| 5906 InterfaceType targetType = (node.awaitKeyword == null) | 5908 InterfaceType targetType = (node.awaitKeyword == null) |
| 5907 ? typeProvider.iterableType | 5909 ? typeProvider.iterableType |
| 5908 : typeProvider.streamType; | 5910 : typeProvider.streamType; |
| 5909 InferenceContext.setType( | 5911 InferenceContext.setType(iterable, |
| 5910 iterable, targetType.instantiate([loopVariable.type.type])); | 5912 targetType.instantiate([typeForTypeName(loopVariable.type)])); |
| 5911 } | 5913 } |
| 5912 iterable?.accept(this); | 5914 iterable?.accept(this); |
| 5913 loopVariable?.accept(this); | 5915 loopVariable?.accept(this); |
| 5914 identifier?.accept(this); | 5916 identifier?.accept(this); |
| 5915 Statement body = node.body; | 5917 Statement body = node.body; |
| 5916 if (body != null) { | 5918 if (body != null) { |
| 5917 _overrideManager.enterScope(); | 5919 _overrideManager.enterScope(); |
| 5918 try { | 5920 try { |
| 5919 if (loopVariable != null && iterable != null) { | 5921 if (loopVariable != null && iterable != null) { |
| 5920 LocalVariableElement loopElement = loopVariable.element; | 5922 LocalVariableElement loopElement = loopVariable.element; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6010 _overrideManager.enterScope(); | 6012 _overrideManager.enterScope(); |
| 6011 try { | 6013 try { |
| 6012 DartType functionType = InferenceContext.getType(node); | 6014 DartType functionType = InferenceContext.getType(node); |
| 6013 if (functionType is FunctionType) { | 6015 if (functionType is FunctionType) { |
| 6014 functionType = | 6016 functionType = |
| 6015 matchFunctionTypeParameters(node.typeParameters, functionType); | 6017 matchFunctionTypeParameters(node.typeParameters, functionType); |
| 6016 if (functionType is FunctionType) { | 6018 if (functionType is FunctionType) { |
| 6017 _inferFormalParameterList(node.parameters, functionType); | 6019 _inferFormalParameterList(node.parameters, functionType); |
| 6018 | 6020 |
| 6019 DartType returnType; | 6021 DartType returnType; |
| 6020 if (isFutureThen(node.staticParameterElement?.enclosingElement)) { | 6022 ParameterElement parameterElement = |
| 6023 staticParameterElementForExpression(node); |
| 6024 if (isFutureThen(parameterElement?.enclosingElement)) { |
| 6021 var futureThenType = | 6025 var futureThenType = |
| 6022 InferenceContext.getContext(node.parent) as FunctionType; | 6026 InferenceContext.getContext(node.parent) as FunctionType; |
| 6023 | 6027 |
| 6024 // Pretend the return type of Future<T>.then<S> first parameter is | 6028 // Pretend the return type of Future<T>.then<S> first parameter is |
| 6025 // | 6029 // |
| 6026 // T -> (S | Future<S>) | 6030 // T -> (S | Future<S>) |
| 6027 // | 6031 // |
| 6028 // We can't represent this in Dart so we populate it here during | 6032 // We can't represent this in Dart so we populate it here during |
| 6029 // inference. | 6033 // inference. |
| 6030 var typeParamS = | 6034 var typeParamS = |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6171 // | 6175 // |
| 6172 // For example it can infer this case: | 6176 // For example it can infer this case: |
| 6173 // | 6177 // |
| 6174 // class E<S, T> extends A<C<S>, T> { ... } | 6178 // class E<S, T> extends A<C<S>, T> { ... } |
| 6175 // A<C<int>, String> a0 = /*infer<int, String>*/new E("hello"); | 6179 // A<C<int>, String> a0 = /*infer<int, String>*/new E("hello"); |
| 6176 // | 6180 // |
| 6177 // See _inferArgumentTypesFromContext in this file for use of it. | 6181 // See _inferArgumentTypesFromContext in this file for use of it. |
| 6178 List<DartType> targs = | 6182 List<DartType> targs = |
| 6179 inferenceContext.matchTypes(classTypeName.type, contextType); | 6183 inferenceContext.matchTypes(classTypeName.type, contextType); |
| 6180 if (targs != null && targs.any((t) => !t.isDynamic)) { | 6184 if (targs != null && targs.any((t) => !t.isDynamic)) { |
| 6181 ClassElement classElement = classTypeName.type.element; | 6185 ClassElement classElement = typeForTypeName(classTypeName).element; |
| 6182 InterfaceType rawType = classElement.type; | 6186 InterfaceType rawType = classElement.type; |
| 6183 InterfaceType fullType = | 6187 InterfaceType fullType = |
| 6184 rawType.substitute2(targs, rawType.typeArguments); | 6188 rawType.substitute2(targs, rawType.typeArguments); |
| 6185 // The element resolver uses the type on the constructor name, so | 6189 // The element resolver uses the type on the constructor name, so |
| 6186 // infer it first | 6190 // infer it first |
| 6187 typeAnalyzer.inferConstructorName(node.constructorName, fullType); | 6191 typeAnalyzer.inferConstructorName(node.constructorName, fullType); |
| 6188 break; | 6192 break; |
| 6189 } | 6193 } |
| 6190 } | 6194 } |
| 6191 } | 6195 } |
| 6192 } | 6196 } |
| 6193 node.constructorName?.accept(this); | 6197 node.constructorName?.accept(this); |
| 6194 FunctionType constructorType = node.constructorName.staticElement?.type; | 6198 FunctionType constructorType = |
| 6199 staticElementForConstructorReference(node.constructorName)?.type; |
| 6195 if (constructorType != null) { | 6200 if (constructorType != null) { |
| 6196 InferenceContext.setType(node.argumentList, constructorType); | 6201 InferenceContext.setType(node.argumentList, constructorType); |
| 6197 } | 6202 } |
| 6198 node.argumentList?.accept(this); | 6203 node.argumentList?.accept(this); |
| 6199 node.accept(elementResolver); | 6204 node.accept(elementResolver); |
| 6200 node.accept(typeAnalyzer); | 6205 node.accept(typeAnalyzer); |
| 6201 return null; | 6206 return null; |
| 6202 } | 6207 } |
| 6203 | 6208 |
| 6204 @override | 6209 @override |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6343 } | 6348 } |
| 6344 | 6349 |
| 6345 @override | 6350 @override |
| 6346 Object visitRedirectingConstructorInvocation( | 6351 Object visitRedirectingConstructorInvocation( |
| 6347 RedirectingConstructorInvocation node) { | 6352 RedirectingConstructorInvocation node) { |
| 6348 // | 6353 // |
| 6349 // We visit the argument list, but do not visit the optional identifier | 6354 // We visit the argument list, but do not visit the optional identifier |
| 6350 // because it needs to be visited in the context of the constructor | 6355 // because it needs to be visited in the context of the constructor |
| 6351 // invocation. | 6356 // invocation. |
| 6352 // | 6357 // |
| 6353 InferenceContext.setType(node.argumentList, node.staticElement?.type); | 6358 InferenceContext.setType( |
| 6359 node.argumentList, staticElementForConstructorReference(node)?.type); |
| 6354 node.argumentList?.accept(this); | 6360 node.argumentList?.accept(this); |
| 6355 node.accept(elementResolver); | 6361 node.accept(elementResolver); |
| 6356 node.accept(typeAnalyzer); | 6362 node.accept(typeAnalyzer); |
| 6357 return null; | 6363 return null; |
| 6358 } | 6364 } |
| 6359 | 6365 |
| 6360 @override | 6366 @override |
| 6361 Object visitReturnStatement(ReturnStatement node) { | 6367 Object visitReturnStatement(ReturnStatement node) { |
| 6362 Expression e = node.expression; | 6368 Expression e = node.expression; |
| 6363 InferenceContext.setType(e, inferenceContext.returnContext); | 6369 InferenceContext.setType(e, inferenceContext.returnContext); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 6377 @override | 6383 @override |
| 6378 Object visitShowCombinator(ShowCombinator node) => null; | 6384 Object visitShowCombinator(ShowCombinator node) => null; |
| 6379 | 6385 |
| 6380 @override | 6386 @override |
| 6381 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { | 6387 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { |
| 6382 // | 6388 // |
| 6383 // We visit the argument list, but do not visit the optional identifier | 6389 // We visit the argument list, but do not visit the optional identifier |
| 6384 // because it needs to be visited in the context of the constructor | 6390 // because it needs to be visited in the context of the constructor |
| 6385 // invocation. | 6391 // invocation. |
| 6386 // | 6392 // |
| 6387 InferenceContext.setType(node.argumentList, node.staticElement?.type); | 6393 InferenceContext.setType( |
| 6394 node.argumentList, staticElementForConstructorReference(node)?.type); |
| 6388 node.argumentList?.accept(this); | 6395 node.argumentList?.accept(this); |
| 6389 node.accept(elementResolver); | 6396 node.accept(elementResolver); |
| 6390 node.accept(typeAnalyzer); | 6397 node.accept(typeAnalyzer); |
| 6391 return null; | 6398 return null; |
| 6392 } | 6399 } |
| 6393 | 6400 |
| 6394 @override | 6401 @override |
| 6395 Object visitSwitchCase(SwitchCase node) { | 6402 Object visitSwitchCase(SwitchCase node) { |
| 6396 _overrideManager.enterScope(); | 6403 _overrideManager.enterScope(); |
| 6397 try { | 6404 try { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6450 node.initializer != null) { | 6457 node.initializer != null) { |
| 6451 (element as ConstVariableElement).constantInitializer = | 6458 (element as ConstVariableElement).constantInitializer = |
| 6452 new ConstantAstCloner().cloneNode(node.initializer); | 6459 new ConstantAstCloner().cloneNode(node.initializer); |
| 6453 } | 6460 } |
| 6454 return null; | 6461 return null; |
| 6455 } | 6462 } |
| 6456 | 6463 |
| 6457 @override | 6464 @override |
| 6458 visitVariableDeclarationList(VariableDeclarationList node) { | 6465 visitVariableDeclarationList(VariableDeclarationList node) { |
| 6459 for (VariableDeclaration decl in node.variables) { | 6466 for (VariableDeclaration decl in node.variables) { |
| 6460 InferenceContext.setType(decl, decl.element?.type); | 6467 VariableElement variableElement = elementForVariableDeclaration(decl); |
| 6468 InferenceContext.setType(decl, variableElement?.type); |
| 6461 } | 6469 } |
| 6462 super.visitVariableDeclarationList(node); | 6470 super.visitVariableDeclarationList(node); |
| 6463 } | 6471 } |
| 6464 | 6472 |
| 6465 @override | 6473 @override |
| 6466 Object visitWhileStatement(WhileStatement node) { | 6474 Object visitWhileStatement(WhileStatement node) { |
| 6467 // Note: since we don't call the base class, we have to maintain | 6475 // Note: since we don't call the base class, we have to maintain |
| 6468 // _implicitLabelScope ourselves. | 6476 // _implicitLabelScope ourselves. |
| 6469 ImplicitLabelScope outerImplicitScope = _implicitLabelScope; | 6477 ImplicitLabelScope outerImplicitScope = _implicitLabelScope; |
| 6470 try { | 6478 try { |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6737 return; | 6745 return; |
| 6738 } | 6746 } |
| 6739 FunctionExpression closure = mayBeClosure as FunctionExpression; | 6747 FunctionExpression closure = mayBeClosure as FunctionExpression; |
| 6740 // prepare expected closure type | 6748 // prepare expected closure type |
| 6741 if (mayByFunctionType is! FunctionType) { | 6749 if (mayByFunctionType is! FunctionType) { |
| 6742 return; | 6750 return; |
| 6743 } | 6751 } |
| 6744 FunctionType expectedClosureType = mayByFunctionType as FunctionType; | 6752 FunctionType expectedClosureType = mayByFunctionType as FunctionType; |
| 6745 // If the expectedClosureType is not more specific than the static type, | 6753 // If the expectedClosureType is not more specific than the static type, |
| 6746 // return. | 6754 // return. |
| 6747 DartType staticClosureType = closure.element?.type; | 6755 DartType staticClosureType = elementForFunctionExpression(closure)?.type; |
| 6748 if (staticClosureType != null && | 6756 if (staticClosureType != null && |
| 6749 !FunctionTypeImpl.relate( | 6757 !FunctionTypeImpl.relate( |
| 6750 expectedClosureType, | 6758 expectedClosureType, |
| 6751 staticClosureType, | 6759 staticClosureType, |
| 6752 (DartType t, DartType s, _, __) => | 6760 (DartType t, DartType s, _, __) => |
| 6753 (t as TypeImpl).isMoreSpecificThan(s), | 6761 (t as TypeImpl).isMoreSpecificThan(s), |
| 6754 new TypeSystemImpl().instantiateToBounds, | 6762 new TypeSystemImpl().instantiateToBounds, |
| 6755 returnRelation: (s, t) => true)) { | 6763 returnRelation: (s, t) => true)) { |
| 6756 return; | 6764 return; |
| 6757 } | 6765 } |
| (...skipping 4004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10762 return null; | 10770 return null; |
| 10763 } | 10771 } |
| 10764 if (identical(node.staticElement, variable)) { | 10772 if (identical(node.staticElement, variable)) { |
| 10765 if (node.inSetterContext()) { | 10773 if (node.inSetterContext()) { |
| 10766 result = true; | 10774 result = true; |
| 10767 } | 10775 } |
| 10768 } | 10776 } |
| 10769 return null; | 10777 return null; |
| 10770 } | 10778 } |
| 10771 } | 10779 } |
| OLD | NEW |