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

Side by Side Diff: pkg/analyzer/lib/src/generated/static_type_analyzer.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
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.static_type_analyzer; 5 library analyzer.src.generated.static_type_analyzer;
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 1930 matching lines...) Expand 10 before | Expand all | Expand 10 after
1941 1941
1942 List<ParameterElement> params = <ParameterElement>[]; 1942 List<ParameterElement> params = <ParameterElement>[];
1943 List<DartType> argTypes = <DartType>[]; 1943 List<DartType> argTypes = <DartType>[];
1944 for (int i = 0, length = rawParameters.length; i < length; i++) { 1944 for (int i = 0, length = rawParameters.length; i < length; i++) {
1945 ParameterElement parameter = rawParameters[i]; 1945 ParameterElement parameter = rawParameters[i];
1946 if (parameter != null) { 1946 if (parameter != null) {
1947 params.add(parameter); 1947 params.add(parameter);
1948 argTypes.add(argumentList.arguments[i].staticType); 1948 argTypes.add(argumentList.arguments[i].staticType);
1949 } 1949 }
1950 } 1950 }
1951
1952 // TODO(leafp): remove this again after code has been updated to
1953 // use FutureOr on classes that implement Future
1954 // Special case Future<T>.then upwards inference. It has signature:
1955 //
1956 // <S>(T -> (S | Future<S>)) -> Future<S>
1957 //
1958 // Based on the first argument type, we'll pick one of these signatures:
1959 //
1960 // <S>(T -> S) -> Future<S>
1961 // <S>(T -> Future<S>) -> Future<S>
1962 //
1963 // ... and finish the inference using that.
1964 if (argTypes.isNotEmpty && _resolver.isFutureThen(fnType.element)) {
1965 var firstArgType = argTypes[0];
1966 var firstParamType = params[0].type;
1967 if (firstArgType is FunctionType &&
1968 firstParamType is FunctionType &&
1969 !firstParamType.returnType.isDartAsyncFutureOr) {
1970 var argReturnType = firstArgType.returnType;
1971 // Skip the inference if we have the top type. It can only lead to
1972 // worse inference. For example, this happens when the lambda returns
1973 // S or Future<S> in a conditional.
1974 if (!argReturnType.isObject && !argReturnType.isDynamic) {
1975 DartType paramReturnType = _typeProvider.futureOrType
1976 .instantiate([fnType.typeFormals[0].type]);
1977
1978 // Adjust the expected parameter type to have this return type.
1979 var function = new FunctionElementImpl(firstParamType.name, -1)
1980 ..isSynthetic = true
1981 ..shareParameters(firstParamType.parameters.toList())
1982 ..returnType = paramReturnType;
1983 function.type = new FunctionTypeImpl(function);
1984 // Use this as the expected 1st parameter type.
1985 params[0] = new ParameterElementImpl.synthetic(
1986 params[0].name, function.type, params[0].parameterKind);
1987 }
1988 }
1989 }
1990
1991 return ts.inferGenericFunctionOrType( 1951 return ts.inferGenericFunctionOrType(
1992 fnType, params, argTypes, InferenceContext.getContext(node), 1952 fnType, params, argTypes, InferenceContext.getContext(node),
1993 errorReporter: _resolver.errorReporter, errorNode: errorNode); 1953 errorReporter: _resolver.errorReporter, errorNode: errorNode);
1994 } 1954 }
1995 return null; 1955 return null;
1996 } 1956 }
1997 1957
1998 /** 1958 /**
1999 * Given an instance creation of a possibly generic type, infer the type 1959 * Given an instance creation of a possibly generic type, infer the type
2000 * arguments using the current context type as well as the argument types. 1960 * arguments using the current context type as well as the argument types.
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
2446 } 2406 }
2447 // merge types 2407 // merge types
2448 if (result == null) { 2408 if (result == null) {
2449 result = type; 2409 result = type;
2450 } else { 2410 } else {
2451 result = _typeSystem.getLeastUpperBound(result, type); 2411 result = _typeSystem.getLeastUpperBound(result, type);
2452 } 2412 }
2453 return null; 2413 return null;
2454 } 2414 }
2455 } 2415 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | pkg/analyzer/test/src/task/strong/inferred_type_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698