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

Unified Diff: pkg/analyzer/lib/src/generated/resolver.dart

Issue 1405143006: improve static type analysis for `await for` (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/src/generated/element_resolver.dart ('k') | pkg/analyzer/lib/src/task/strong/rules.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/resolver.dart
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 2d5fac3269d04c5bcd01af8a8d70c3c9d7b6a13e..ae588e56627a14ff7ff66fb1c33bd816d0edb386 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -5852,28 +5852,6 @@ class InheritanceManager {
}
/**
- * Given some [InterfaceType] and some member name, this returns the
- * [FunctionType] of the [ExecutableElement] that the
- * class either declares itself, or inherits, that has the member name, if no member is inherited
- * `null` is returned. The returned [FunctionType] has all type
- * parameters substituted with corresponding type arguments from the given [InterfaceType].
- *
- * @param interfaceType the interface type to query
- * @param memberName the name of the executable element to find and return
- * @return the member's function type, or `null` if no such member exists
- */
- FunctionType lookupMemberType(
- InterfaceType interfaceType, String memberName) {
- ExecutableElement iteratorMember =
- lookupMember(interfaceType.element, memberName);
- if (iteratorMember == null) {
- return null;
- }
- return substituteTypeArgumentsInMemberFromInheritance(
- iteratorMember.type, memberName, interfaceType);
- }
-
- /**
* Determine the set of methods which is overridden by the given class member. If no member is
* inherited, an empty list is returned. If one of the inherited members is a
* [MultiplyInheritedExecutableElement], then it is expanded into its constituent inherited
@@ -5921,6 +5899,9 @@ class InheritanceManager {
* @param definingType the type that is overriding the member
* @return the passed function type with any parameterized types substituted
*/
+ // TODO(jmesserly): investigate why this is needed in ErrorVerifier's override
+ // checking. There seems to be some rare cases where we get partially
+ // substituted type arguments, and the function types don't compare equally.
FunctionType substituteTypeArgumentsInMemberFromInheritance(
FunctionType baseFunctionType,
String memberName,
@@ -11592,8 +11573,8 @@ class ResolverVisitor extends ScopedVisitor {
DartType expressionType = iteratorExpression.bestType;
if (expressionType is InterfaceType) {
InterfaceType interfaceType = expressionType;
- FunctionType iteratorFunction =
- _inheritanceManager.lookupMemberType(interfaceType, "iterator");
+ PropertyAccessorElement iteratorFunction =
+ interfaceType.lookUpInheritedGetter("iterator");
if (iteratorFunction == null) {
// TODO(brianwilkerson) Should we report this error?
return null;
@@ -11601,8 +11582,8 @@ class ResolverVisitor extends ScopedVisitor {
DartType iteratorType = iteratorFunction.returnType;
if (iteratorType is InterfaceType) {
InterfaceType iteratorInterfaceType = iteratorType;
- FunctionType currentFunction = _inheritanceManager.lookupMemberType(
- iteratorInterfaceType, "current");
+ PropertyAccessorElement currentFunction =
+ iteratorInterfaceType.lookUpInheritedGetter("current");
if (currentFunction == null) {
// TODO(brianwilkerson) Should we report this error?
return null;
@@ -11615,16 +11596,15 @@ class ResolverVisitor extends ScopedVisitor {
/**
* The given expression is the expression used to compute the stream for an
- * asyncronous for-each statement. Attempt to compute the type of objects that
- * will be assigned to the loop variable and return that type. Return `null`
- * if the type could not be determined. The [streamExpression] is the
- * expression that will return the stream being iterated over.
+ * asynchronous for-each statement. Attempt to compute the type of objects
+ * that will be assigned to the loop variable and return that type.
+ * Return `null` if the type could not be determined. The [streamExpression]
+ * is the expression that will return the stream being iterated over.
*/
DartType _getStreamElementType(Expression streamExpression) {
DartType streamType = streamExpression.bestType;
if (streamType is InterfaceType) {
- FunctionType listenFunction =
- _inheritanceManager.lookupMemberType(streamType, "listen");
+ MethodElement listenFunction = streamType.lookUpInheritedMethod("listen");
if (listenFunction == null) {
return null;
}
@@ -11635,17 +11615,10 @@ class ResolverVisitor extends ScopedVisitor {
DartType onDataType = listenParameters[0].type;
if (onDataType is FunctionType) {
List<ParameterElement> onDataParameters = onDataType.parameters;
- if (onDataParameters == null || onDataParameters.length < 1) {
+ if (onDataParameters == null || onDataParameters.isEmpty) {
return null;
}
- DartType eventType = onDataParameters[0].type;
- // TODO(paulberry): checking that typeParameters.isNotEmpty is a
- // band-aid fix for dartbug.com/24191. Figure out what the correct
- // logic should be.
- if (streamType.typeParameters.isNotEmpty &&
- eventType.element == streamType.typeParameters[0]) {
- return streamType.typeArguments[0];
- }
+ return onDataParameters[0].type;
}
}
return null;
@@ -12881,10 +12854,7 @@ class StrongTypeSystemImpl implements TypeSystem {
FunctionType _getCallMethodType(DartType t) {
if (t is InterfaceType) {
- ClassElement element = t.element;
- InheritanceManager manager = new InheritanceManager(element.library);
- FunctionType callType = manager.lookupMemberType(t, "call");
- return callType;
+ return t.lookUpInheritedMethod("call")?.type;
}
return null;
}
« no previous file with comments | « pkg/analyzer/lib/src/generated/element_resolver.dart ('k') | pkg/analyzer/lib/src/task/strong/rules.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698