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

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

Issue 2859703004: Re-remove ad hoc Future.then inference. (Closed)
Patch Set: rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « CHANGELOG.md ('k') | pkg/analyzer/lib/src/generated/static_type_analyzer.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 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/standard_resolution_map.dart'; 10 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
(...skipping 5152 matching lines...) Expand 10 before | Expand all | Expand 10 after
5163 } 5163 }
5164 5164
5165 /** 5165 /**
5166 * Prepares this [ResolverVisitor] to using it for incremental resolution. 5166 * Prepares this [ResolverVisitor] to using it for incremental resolution.
5167 */ 5167 */
5168 void initForIncrementalResolution() { 5168 void initForIncrementalResolution() {
5169 _overrideManager.enterScope(); 5169 _overrideManager.enterScope();
5170 } 5170 }
5171 5171
5172 /** 5172 /**
5173 * Returns true if this method is `Future.then` or an override thereof.
5174 *
5175 * If so we will apply special typing rules in strong mode, to handle the
5176 * implicit union of `S | Future<S>`
5177 */
5178 // TODO(leafp): Eliminate this when code is switched to using FutureOr
5179 bool isFutureThen(Element element) {
5180 // If we are a method named then
5181 if (element is MethodElement && element.name == 'then') {
5182 DartType type = element.enclosingElement.type;
5183 // On Future or a subtype, then we're good.
5184 return (type.isDartAsyncFuture || isSubtypeOfFuture(type));
5185 }
5186 return false;
5187 }
5188
5189 /**
5190 * Returns true if this type is any subtype of the built in Future type.
5191 */
5192 // TODO(leafp): Eliminate this when code is switched to using FutureOr
5193 bool isSubtypeOfFuture(DartType type) =>
5194 typeSystem.isSubtypeOf(type, typeProvider.futureDynamicType);
5195
5196 /**
5197 * Given a downward inference type [fnType], and the declared 5173 * Given a downward inference type [fnType], and the declared
5198 * [typeParameterList] for a function expression, determines if we can enable 5174 * [typeParameterList] for a function expression, determines if we can enable
5199 * downward inference and if so, returns the function type to use for 5175 * downward inference and if so, returns the function type to use for
5200 * inference. 5176 * inference.
5201 * 5177 *
5202 * This will return null if inference is not possible. This happens when 5178 * This will return null if inference is not possible. This happens when
5203 * there is no way we can find a subtype of the function type, given the 5179 * there is no way we can find a subtype of the function type, given the
5204 * provided type parameter list. 5180 * provided type parameter list.
5205 */ 5181 */
5206 FunctionType matchFunctionTypeParameters( 5182 FunctionType matchFunctionTypeParameters(
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after
6024 _enclosingFunction = node.element; 6000 _enclosingFunction = node.element;
6025 _overrideManager.enterScope(); 6001 _overrideManager.enterScope();
6026 try { 6002 try {
6027 DartType functionType = InferenceContext.getContext(node); 6003 DartType functionType = InferenceContext.getContext(node);
6028 var ts = typeSystem; 6004 var ts = typeSystem;
6029 if (functionType is FunctionType && ts is StrongTypeSystemImpl) { 6005 if (functionType is FunctionType && ts is StrongTypeSystemImpl) {
6030 functionType = 6006 functionType =
6031 matchFunctionTypeParameters(node.typeParameters, functionType); 6007 matchFunctionTypeParameters(node.typeParameters, functionType);
6032 if (functionType is FunctionType) { 6008 if (functionType is FunctionType) {
6033 _inferFormalParameterList(node.parameters, functionType); 6009 _inferFormalParameterList(node.parameters, functionType);
6034 DartType returnType; 6010 InferenceContext.setType(
6035 ParameterElement parameterElement = 6011 node.body, _computeReturnOrYieldType(functionType.returnType));
6036 resolutionMap.staticParameterElementForExpression(node);
6037 if (isFutureThen(parameterElement?.enclosingElement)) {
6038 var futureThenType =
6039 InferenceContext.getContext(node.parent) as FunctionType;
6040
6041 // TODO(leafp): Get rid of this once code has been updated to use
6042 // FutureOr
6043 // Introduce FutureOr<T> for backwards compatibility if it was
6044 // missing in old code.
6045 if (futureThenType.parameters.isNotEmpty) {
6046 if (!futureThenType.parameters[0].type.isDartAsyncFutureOr) {
6047 var typeParamS = futureThenType.returnType.flattenFutures(ts);
6048 returnType = _createFutureOr(typeParamS);
6049 }
6050 }
6051 }
6052 returnType ??= _computeReturnOrYieldType(functionType.returnType);
6053 InferenceContext.setType(node.body, returnType);
6054 } 6012 }
6055 } 6013 }
6056 super.visitFunctionExpression(node); 6014 super.visitFunctionExpression(node);
6057 } finally { 6015 } finally {
6058 _overrideManager.exitScope(); 6016 _overrideManager.exitScope();
6059 } 6017 }
6060 } finally { 6018 } finally {
6061 _currentFunctionBody = outerFunctionBody; 6019 _currentFunctionBody = outerFunctionBody;
6062 _enclosingFunction = outerFunction; 6020 _enclosingFunction = outerFunction;
6063 } 6021 }
(...skipping 4874 matching lines...) Expand 10 before | Expand all | Expand 10 after
10938 return null; 10896 return null;
10939 } 10897 }
10940 if (identical(node.staticElement, variable)) { 10898 if (identical(node.staticElement, variable)) {
10941 if (node.inSetterContext()) { 10899 if (node.inSetterContext()) {
10942 result = true; 10900 result = true;
10943 } 10901 }
10944 } 10902 }
10945 return null; 10903 return null;
10946 } 10904 }
10947 } 10905 }
OLDNEW
« no previous file with comments | « CHANGELOG.md ('k') | pkg/analyzer/lib/src/generated/static_type_analyzer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698