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

Unified Diff: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/type/InterfaceTypeImpl.java

Issue 47923014: Issue 14364. Strengthen isDirectSupertypeOf() to check type parameters. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 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
Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/type/InterfaceTypeImpl.java
diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/type/InterfaceTypeImpl.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/type/InterfaceTypeImpl.java
index f19768886978ff92845ed09b61220a8b5e59ebcf..344ef3bc0fd0c2cfb9bfc401c5e008fe9035652d 100644
--- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/type/InterfaceTypeImpl.java
+++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/type/InterfaceTypeImpl.java
@@ -463,9 +463,10 @@ public class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
@Override
public boolean isDirectSupertypeOf(InterfaceType type) {
- ClassElement i = getElement();
- ClassElement j = type.getElement();
- InterfaceType supertype = j.getSupertype();
+ InterfaceType i = this;
+ InterfaceType j = type;
+ ClassElement je = j.getElement();
Brian Wilkerson 2013/10/30 14:00:02 nit: I really hate short names like 'je'. Can we u
scheglov 2013/10/30 15:58:50 Done.
+ InterfaceType supertype = je.getSupertype();
//
// If J has no direct supertype then it is Object, and Object has no direct supertypes.
//
@@ -475,23 +476,27 @@ public class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
//
// I is listed in the extends clause of J.
//
- ClassElement supertypeElement = supertype.getElement();
- if (supertypeElement.equals(i)) {
+ Type[] jArgs = j.getTypeArguments();
+ Type[] jVars = je.getType().getTypeArguments();
+ supertype = supertype.substitute(jArgs, jVars);
+ if (supertype.equals(i)) {
return true;
}
//
// I is listed in the implements clause of J.
//
- for (InterfaceType interfaceType : j.getInterfaces()) {
- if (interfaceType.getElement().equals(i)) {
+ for (InterfaceType interfaceType : je.getInterfaces()) {
+ interfaceType = interfaceType.substitute(jArgs, jVars);
+ if (interfaceType.equals(i)) {
return true;
}
}
//
// I is listed in the with clause of J.
//
- for (InterfaceType mixinType : j.getMixins()) {
- if (mixinType.getElement().equals(i)) {
+ for (InterfaceType mixinType : je.getMixins()) {
+ mixinType = mixinType.substitute(jArgs, jVars);
+ if (mixinType.equals(i)) {
return true;
}
}
@@ -504,7 +509,7 @@ public class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
}
@Override
- public boolean isMoreSpecificThan(Type type) {
+ public boolean isMoreSpecificThan(Type type, boolean withDynamic) {
//
// S is dynamic.
// The test to determine whether S is dynamic is done here because dynamic is not an instance of
@@ -515,7 +520,7 @@ public class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
} else if (!(type instanceof InterfaceType)) {
return false;
}
- return isMoreSpecificThan((InterfaceType) type, new HashSet<ClassElement>());
+ return isMoreSpecificThan((InterfaceType) type, new HashSet<ClassElement>(), withDynamic);
}
@Override
@@ -726,7 +731,8 @@ public class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
}
}
- private boolean isMoreSpecificThan(InterfaceType s, HashSet<ClassElement> visitedClasses) {
+ private boolean isMoreSpecificThan(InterfaceType s, HashSet<ClassElement> visitedClasses,
+ boolean withDynamic) {
//
// A type T is more specific than a type S, written T << S, if one of the following conditions
// is met:
@@ -758,7 +764,7 @@ public class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
return false;
}
for (int i = 0; i < tArguments.length; i++) {
- if (!tArguments[i].isMoreSpecificThan(sArguments[i])) {
+ if (!tArguments[i].isMoreSpecificThan(sArguments[i], withDynamic)) {
return false;
}
}
@@ -777,16 +783,17 @@ public class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
// Iterate over all of the types U that are more specific than T because they are direct
// supertypes of T and return true if any of them are more specific than S.
InterfaceType supertype = getSuperclass();
- if (supertype != null && ((InterfaceTypeImpl) supertype).isMoreSpecificThan(s, visitedClasses)) {
+ if (supertype != null
+ && ((InterfaceTypeImpl) supertype).isMoreSpecificThan(s, visitedClasses, withDynamic)) {
return true;
}
for (InterfaceType interfaceType : getInterfaces()) {
- if (((InterfaceTypeImpl) interfaceType).isMoreSpecificThan(s, visitedClasses)) {
+ if (((InterfaceTypeImpl) interfaceType).isMoreSpecificThan(s, visitedClasses, withDynamic)) {
return true;
}
}
for (InterfaceType mixinType : getMixins()) {
- if (((InterfaceTypeImpl) mixinType).isMoreSpecificThan(s, visitedClasses)) {
+ if (((InterfaceTypeImpl) mixinType).isMoreSpecificThan(s, visitedClasses, withDynamic)) {
return true;
}
}

Powered by Google App Engine
This is Rietveld 408576698