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

Unified Diff: pkg/analyzer/lib/src/generated/element_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.dart ('k') | pkg/analyzer/lib/src/generated/resolver.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/element_resolver.dart
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index ffe623b8879a2d6fec0def73917e44a4cba80f42..cdec8c24cf6722378a58d3d7fdbf7c7eef58392b 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -1573,76 +1573,13 @@ class ElementResolver extends SimpleAstVisitor<Object> {
Expression target, DartType type, String getterName) {
type = _resolveTypeParameter(type);
if (type is InterfaceType) {
- InterfaceType interfaceType = type;
- PropertyAccessorElement accessor;
- if (target is SuperExpression) {
- accessor = interfaceType.lookUpGetterInSuperclass(
- getterName, _definingLibrary);
- } else {
- accessor = interfaceType.lookUpGetter(getterName, _definingLibrary);
- }
- if (accessor != null) {
- return accessor;
- }
- return _lookUpGetterInInterfaces(
- interfaceType, false, getterName, new HashSet<ClassElement>());
+ return type.lookUpInheritedGetter(getterName,
+ library: _definingLibrary, thisType: target is! SuperExpression);
}
return null;
}
/**
- * Look up the getter with the given [getterName] in the interfaces
- * implemented by the given [targetType], either directly or indirectly.
- * Return the element representing the getter that was found, or `null` if
- * there is no getter with the given name. The flag [includeTargetType] should
- * be `true` if the search should include the target type. The
- * [visitedInterfaces] is a set containing all of the interfaces that have
- * been examined, used to prevent infinite recursion and to optimize the
- * search.
- */
- PropertyAccessorElement _lookUpGetterInInterfaces(
- InterfaceType targetType,
- bool includeTargetType,
- String getterName,
- HashSet<ClassElement> visitedInterfaces) {
- // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
- // specification (titled "Inheritance and Overriding" under "Interfaces")
- // describes a much more complex scheme for finding the inherited member.
- // We need to follow that scheme. The code below should cover the 80% case.
- ClassElement targetClass = targetType.element;
- if (visitedInterfaces.contains(targetClass)) {
- return null;
- }
- visitedInterfaces.add(targetClass);
- if (includeTargetType) {
- PropertyAccessorElement getter = targetType.getGetter(getterName);
- if (getter != null && getter.isAccessibleIn(_definingLibrary)) {
- return getter;
- }
- }
- for (InterfaceType interfaceType in targetType.interfaces) {
- PropertyAccessorElement getter = _lookUpGetterInInterfaces(
- interfaceType, true, getterName, visitedInterfaces);
- if (getter != null) {
- return getter;
- }
- }
- for (InterfaceType mixinType in targetType.mixins.reversed) {
- PropertyAccessorElement getter = _lookUpGetterInInterfaces(
- mixinType, true, getterName, visitedInterfaces);
- if (getter != null) {
- return getter;
- }
- }
- InterfaceType superclass = targetType.superclass;
- if (superclass == null) {
- return null;
- }
- return _lookUpGetterInInterfaces(
- superclass, true, getterName, visitedInterfaces);
- }
-
- /**
* Look up the method or getter with the given [memberName] in the given
* [type]. Return the element representing the method or getter that was
* found, or `null` if there is no method or getter with the given name.
@@ -1650,79 +1587,13 @@ class ElementResolver extends SimpleAstVisitor<Object> {
ExecutableElement _lookupGetterOrMethod(DartType type, String memberName) {
type = _resolveTypeParameter(type);
if (type is InterfaceType) {
- InterfaceType interfaceType = type;
- ExecutableElement member =
- interfaceType.lookUpMethod(memberName, _definingLibrary);
- if (member != null) {
- return member;
- }
- member = interfaceType.lookUpGetter(memberName, _definingLibrary);
- if (member != null) {
- return member;
- }
- return _lookUpGetterOrMethodInInterfaces(
- interfaceType, false, memberName, new HashSet<ClassElement>());
+ return type.lookUpInheritedGetterOrMethod(memberName,
+ library: _definingLibrary);
}
return null;
}
/**
- * Look up the method or getter with the given [memberName] in the interfaces
- * implemented by the given [targetType], either directly or indirectly.
- * Return the element representing the method or getter that was found, or
- * `null` if there is no method or getter with the given name. The flag
- * [includeTargetType] should be `true` if the search should include the
- * target type. The [visitedInterfaces] is a set containing all of the
- * interfaces that have been examined, used to prevent infinite recursion and
- * to optimize the search.
- */
- ExecutableElement _lookUpGetterOrMethodInInterfaces(
- InterfaceType targetType,
- bool includeTargetType,
- String memberName,
- HashSet<ClassElement> visitedInterfaces) {
- // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
- // specification (titled "Inheritance and Overriding" under "Interfaces")
- // describes a much more complex scheme for finding the inherited member.
- // We need to follow that scheme. The code below should cover the 80% case.
- ClassElement targetClass = targetType.element;
- if (visitedInterfaces.contains(targetClass)) {
- return null;
- }
- visitedInterfaces.add(targetClass);
- if (includeTargetType) {
- ExecutableElement member = targetType.getMethod(memberName);
- if (member != null) {
- return member;
- }
- member = targetType.getGetter(memberName);
- if (member != null) {
- return member;
- }
- }
- for (InterfaceType interfaceType in targetType.interfaces) {
- ExecutableElement member = _lookUpGetterOrMethodInInterfaces(
- interfaceType, true, memberName, visitedInterfaces);
- if (member != null) {
- return member;
- }
- }
- for (InterfaceType mixinType in targetType.mixins.reversed) {
- ExecutableElement member = _lookUpGetterOrMethodInInterfaces(
- mixinType, true, memberName, visitedInterfaces);
- if (member != null) {
- return member;
- }
- }
- InterfaceType superclass = targetType.superclass;
- if (superclass == null) {
- return null;
- }
- return _lookUpGetterOrMethodInInterfaces(
- superclass, true, memberName, visitedInterfaces);
- }
-
- /**
* Look up the method with the given [methodName] in the given [type]. Return
* the element representing the method that was found, or `null` if there is
* no method with the given name. The [target] is the target of the
@@ -1732,76 +1603,13 @@ class ElementResolver extends SimpleAstVisitor<Object> {
Expression target, DartType type, String methodName) {
type = _resolveTypeParameter(type);
if (type is InterfaceType) {
- InterfaceType interfaceType = type;
- MethodElement method;
- if (target is SuperExpression) {
- method = interfaceType.lookUpMethodInSuperclass(
- methodName, _definingLibrary);
- } else {
- method = interfaceType.lookUpMethod(methodName, _definingLibrary);
- }
- if (method != null) {
- return method;
- }
- return _lookUpMethodInInterfaces(
- interfaceType, false, methodName, new HashSet<ClassElement>());
+ return type.lookUpInheritedMethod(methodName,
+ library: _definingLibrary, thisType: target is! SuperExpression);
}
return null;
}
/**
- * Look up the method with the given [methodName] in the interfaces
- * implemented by the given [targetType], either directly or indirectly.
- * Return the element representing the method that was found, or `null` if
- * there is no method with the given name. The flag [includeTargetType] should
- * be `true` if the search should include the target type. The
- * [visitedInterfaces] is a set containing all of the interfaces that have
- * been examined, used to prevent infinite recursion and to optimize the
- * search.
- */
- MethodElement _lookUpMethodInInterfaces(
- InterfaceType targetType,
- bool includeTargetType,
- String methodName,
- HashSet<ClassElement> visitedInterfaces) {
- // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
- // specification (titled "Inheritance and Overriding" under "Interfaces")
- // describes a much more complex scheme for finding the inherited member.
- // We need to follow that scheme. The code below should cover the 80% case.
- ClassElement targetClass = targetType.element;
- if (visitedInterfaces.contains(targetClass)) {
- return null;
- }
- visitedInterfaces.add(targetClass);
- if (includeTargetType) {
- MethodElement method = targetType.getMethod(methodName);
- if (method != null && method.isAccessibleIn(_definingLibrary)) {
- return method;
- }
- }
- for (InterfaceType interfaceType in targetType.interfaces) {
- MethodElement method = _lookUpMethodInInterfaces(
- interfaceType, true, methodName, visitedInterfaces);
- if (method != null) {
- return method;
- }
- }
- for (InterfaceType mixinType in targetType.mixins.reversed) {
- MethodElement method = _lookUpMethodInInterfaces(
- mixinType, true, methodName, visitedInterfaces);
- if (method != null) {
- return method;
- }
- }
- InterfaceType superclass = targetType.superclass;
- if (superclass == null) {
- return null;
- }
- return _lookUpMethodInInterfaces(
- superclass, true, methodName, visitedInterfaces);
- }
-
- /**
* Look up the setter with the given [setterName] in the given [type]. Return
* the element representing the setter that was found, or `null` if there is
* no setter with the given name. The [target] is the target of the
@@ -1811,77 +1619,13 @@ class ElementResolver extends SimpleAstVisitor<Object> {
Expression target, DartType type, String setterName) {
type = _resolveTypeParameter(type);
if (type is InterfaceType) {
- InterfaceType interfaceType = type;
- PropertyAccessorElement accessor;
- if (target is SuperExpression) {
- accessor = interfaceType.lookUpSetterInSuperclass(
- setterName, _definingLibrary);
- } else {
- accessor = interfaceType.lookUpSetter(setterName, _definingLibrary);
- }
- if (accessor != null) {
- return accessor;
- }
- return _lookUpSetterInInterfaces(
- interfaceType, false, setterName, new HashSet<ClassElement>());
+ return type.lookUpInheritedSetter(setterName,
+ library: _definingLibrary, thisType: target is! SuperExpression);
}
return null;
}
/**
- * Look up the setter with the given [setterName] in the interfaces
- * implemented by the given [targetType], either directly or indirectly.
- * Return the element representing the setter that was found, or `null` if
- * there is no setter with the given name. The [targetType] is the type in
- * which the setter might be defined. The flag [includeTargetType] should be
- * `true` if the search should include the target type. The
- * [visitedInterfaces] is a set containing all of the interfaces that have
- * been examined, used to prevent infinite recursion and to optimize the
- * search.
- */
- PropertyAccessorElement _lookUpSetterInInterfaces(
- InterfaceType targetType,
- bool includeTargetType,
- String setterName,
- HashSet<ClassElement> visitedInterfaces) {
- // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
- // specification (titled "Inheritance and Overriding" under "Interfaces")
- // describes a much more complex scheme for finding the inherited member.
- // We need to follow that scheme. The code below should cover the 80% case.
- ClassElement targetClass = targetType.element;
- if (visitedInterfaces.contains(targetClass)) {
- return null;
- }
- visitedInterfaces.add(targetClass);
- if (includeTargetType) {
- PropertyAccessorElement setter = targetType.getSetter(setterName);
- if (setter != null && setter.isAccessibleIn(_definingLibrary)) {
- return setter;
- }
- }
- for (InterfaceType interfaceType in targetType.interfaces) {
- PropertyAccessorElement setter = _lookUpSetterInInterfaces(
- interfaceType, true, setterName, visitedInterfaces);
- if (setter != null) {
- return setter;
- }
- }
- for (InterfaceType mixinType in targetType.mixins.reversed) {
- PropertyAccessorElement setter = _lookUpSetterInInterfaces(
- mixinType, true, setterName, visitedInterfaces);
- if (setter != null) {
- return setter;
- }
- }
- InterfaceType superclass = targetType.superclass;
- if (superclass == null) {
- return null;
- }
- return _lookUpSetterInInterfaces(
- superclass, true, setterName, visitedInterfaces);
- }
-
- /**
* Given some class [element], this method uses [_subtypeManager] to find the
* set of all subtypes; the subtypes are then searched for a member (method,
* getter, or setter), that has the given [memberName]. The flag [asMethod]
« no previous file with comments | « pkg/analyzer/lib/src/generated/element.dart ('k') | pkg/analyzer/lib/src/generated/resolver.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698