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

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

Issue 234213002: Fix least upper bound computation for generic types (dartbug.com/15060) (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 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_test/src/com/google/dart/engine/internal/type/InterfaceTypeImplTest.java
diff --git a/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/type/InterfaceTypeImplTest.java b/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/type/InterfaceTypeImplTest.java
index 6c7d879e769704c550f0113ebd03576d6a7ac926..880286c4f1a18487d468c0eba87aaa33b7ebf3ef 100644
--- a/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/type/InterfaceTypeImplTest.java
+++ b/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/type/InterfaceTypeImplTest.java
@@ -164,6 +164,89 @@ public class InterfaceTypeImplTest extends EngineTestCase {
assertEquals(3, InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.getType()));
}
+ public void test_computeSuperinterfaceSet_genericInterfacePath() {
+ //
+ // A
+ // | implements
+ // B<T>
+ // | implements
+ // C<T>
+ //
+ // D
+ //
+ ClassElementImpl classA = classElement("A");
+ ClassElementImpl classB = classElement("B", "T");
+ ClassElementImpl classC = classElement("C", "T");
+ ClassElement classD = classElement("D");
+ InterfaceType typeA = classA.getType();
+ classB.setInterfaces(new InterfaceType[] {typeA});
+ InterfaceTypeImpl typeBT = new InterfaceTypeImpl(classB);
+ Type typeT = classC.getType().getTypeArguments()[0];
+ typeBT.setTypeArguments(new Type[] {typeT});
+ classC.setInterfaces(new InterfaceType[] {typeBT});
+ // A
+ Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(typeA);
+ assertSizeOfSet(1, superinterfacesOfA);
+ InterfaceType typeObject = ElementFactory.getObject().getType();
+ assertTrue(superinterfacesOfA.contains(typeObject));
+ // B<D>
+ InterfaceTypeImpl typeBD = new InterfaceTypeImpl(classB);
+ typeBD.setTypeArguments(new Type[] {classD.getType()});
+ Set<InterfaceType> superinterfacesOfBD = InterfaceTypeImpl.computeSuperinterfaceSet(typeBD);
+ assertSizeOfSet(2, superinterfacesOfBD);
+ assertTrue(superinterfacesOfBD.contains(typeObject));
+ assertTrue(superinterfacesOfBD.contains(typeA));
+ // C<D>
+ InterfaceTypeImpl typeCD = new InterfaceTypeImpl(classC);
+ typeCD.setTypeArguments(new Type[] {classD.getType()});
+ Set<InterfaceType> superinterfacesOfCD = InterfaceTypeImpl.computeSuperinterfaceSet(typeCD);
+ assertSizeOfSet(3, superinterfacesOfCD);
+ assertTrue(superinterfacesOfCD.contains(typeObject));
+ assertTrue(superinterfacesOfCD.contains(typeA));
+ assertTrue(superinterfacesOfCD.contains(typeBD));
+ }
+
+ public void test_computeSuperinterfaceSet_genericSuperclassPath() {
+ //
+ // A
+ // |
+ // B<T>
+ // |
+ // C<T>
+ //
+ // D
+ //
+ ClassElement classA = classElement("A");
+ InterfaceType typeA = classA.getType();
+ ClassElement classB = classElement("B", typeA, "T");
+ ClassElementImpl classC = classElement("C", "T");
+ InterfaceTypeImpl typeBT = new InterfaceTypeImpl(classB);
+ Type typeT = classC.getType().getTypeArguments()[0];
+ typeBT.setTypeArguments(new Type[] {typeT});
+ classC.setSupertype(typeBT);
+ ClassElement classD = classElement("D");
+ // A
+ Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(typeA);
+ assertSizeOfSet(1, superinterfacesOfA);
+ InterfaceType typeObject = ElementFactory.getObject().getType();
+ assertTrue(superinterfacesOfA.contains(typeObject));
+ // B<D>
+ InterfaceTypeImpl typeBD = new InterfaceTypeImpl(classB);
+ typeBD.setTypeArguments(new Type[] {classD.getType()});
+ Set<InterfaceType> superinterfacesOfBD = InterfaceTypeImpl.computeSuperinterfaceSet(typeBD);
+ assertSizeOfSet(2, superinterfacesOfBD);
+ assertTrue(superinterfacesOfBD.contains(typeObject));
+ assertTrue(superinterfacesOfBD.contains(typeA));
+ // C<D>
+ InterfaceTypeImpl typeCD = new InterfaceTypeImpl(classC);
+ typeCD.setTypeArguments(new Type[] {classD.getType()});
+ Set<InterfaceType> superinterfacesOfCD = InterfaceTypeImpl.computeSuperinterfaceSet(typeCD);
+ assertSizeOfSet(3, superinterfacesOfCD);
+ assertTrue(superinterfacesOfCD.contains(typeObject));
+ assertTrue(superinterfacesOfCD.contains(typeA));
+ assertTrue(superinterfacesOfCD.contains(typeBD));
+ }
+
public void test_computeSuperinterfaceSet_multipleInterfacePaths() {
ClassElementImpl classA = classElement("A");
ClassElementImpl classB = classElement("B");
@@ -626,9 +709,7 @@ public class InterfaceTypeImplTest extends EngineTestCase {
InterfaceType doubleType = typeProvider.getDoubleType();
InterfaceType listOfIntType = listType.substitute(new Type[] {intType});
InterfaceType listOfDoubleType = listType.substitute(new Type[] {doubleType});
- assertEquals(
- listType.substitute(new Type[] {typeProvider.getDynamicType()}),
- listOfIntType.getLeastUpperBound(listOfDoubleType));
+ assertEquals(typeProvider.getObjectType(), listOfIntType.getLeastUpperBound(listOfDoubleType));
}
public void test_getLeastUpperBound_typeParameters_same() {

Powered by Google App Engine
This is Rietveld 408576698