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

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

Issue 178173003: Fix for 16498. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 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/resolver/InheritanceManagerTest.java
diff --git a/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/resolver/InheritanceManagerTest.java b/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/resolver/InheritanceManagerTest.java
index cb14b98d4bfd3de7376930f7f550003a841e9893..2eb5586b1fd4e042009980b47855ccb7962f2ad0 100644
--- a/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/resolver/InheritanceManagerTest.java
+++ b/editor/tools/plugins/com.google.dart.engine_test/src/com/google/dart/engine/internal/resolver/InheritanceManagerTest.java
@@ -17,6 +17,7 @@ import com.google.dart.engine.EngineTestCase;
import com.google.dart.engine.context.AnalysisContextFactory;
import com.google.dart.engine.element.ClassElement;
import com.google.dart.engine.element.MethodElement;
+import com.google.dart.engine.element.ParameterElement;
import com.google.dart.engine.element.PropertyAccessorElement;
import com.google.dart.engine.error.AnalysisError;
import com.google.dart.engine.error.ErrorCode;
@@ -28,10 +29,13 @@ import com.google.dart.engine.internal.element.ClassElementImpl;
import com.google.dart.engine.internal.element.CompilationUnitElementImpl;
import com.google.dart.engine.internal.element.LibraryElementImpl;
import com.google.dart.engine.internal.element.MethodElementImpl;
+import com.google.dart.engine.internal.element.ParameterElementImpl;
import com.google.dart.engine.source.FileBasedSource;
import com.google.dart.engine.type.InterfaceType;
+import com.google.dart.engine.utilities.dart.ParameterKind;
import com.google.dart.engine.utilities.io.FileUtilities2;
+import static com.google.dart.engine.ast.ASTFactory.identifier;
import static com.google.dart.engine.element.ElementFactory.classElement;
import static com.google.dart.engine.element.ElementFactory.getterElement;
import static com.google.dart.engine.element.ElementFactory.library;
@@ -70,6 +74,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromClasses_accessor_extends() throws Exception {
+ // class A { int get g; }
+ // class B extends A {}
ClassElementImpl classA = classElement("A");
String getterName = "g";
PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType());
@@ -88,6 +94,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromClasses_accessor_implements() throws Exception {
+ // class A { int get g; }
+ // class B implements A {}
ClassElementImpl classA = classElement("A");
String getterName = "g";
PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType());
@@ -107,6 +115,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromClasses_accessor_with() throws Exception {
+ // class A { int get g; }
+ // class B extends Object with A {}
ClassElementImpl classA = classElement("A");
String getterName = "g";
PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType());
@@ -125,7 +135,18 @@ public class InheritanceManagerTest extends EngineTestCase {
assertNoErrors(classB);
}
+ public void test_getMapOfMembersInheritedFromClasses_implicitExtends() throws Exception {
+ // class A {}
+ ClassElementImpl classA = classElement("A");
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+ assertEquals(numOfMembersInObject, mapA.getSize());
+ assertNoErrors(classA);
+ }
+
public void test_getMapOfMembersInheritedFromClasses_method_extends() throws Exception {
+ // class A { int g(); }
+ // class B extends A {}
ClassElementImpl classA = classElement("A");
String methodName = "m";
MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
@@ -145,6 +166,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromClasses_method_implements() throws Exception {
+ // class A { int g(); }
+ // class B implements A {}
ClassElementImpl classA = classElement("A");
String methodName = "m";
MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
@@ -164,6 +187,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromClasses_method_with() throws Exception {
+ // class A { int g(); }
+ // class B extends Object with A {}
ClassElementImpl classA = classElement("A");
String methodName = "m";
MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
@@ -183,6 +208,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromInterfaces_accessor_extends() throws Exception {
+ // class A { int get g; }
+ // class B extends A {}
ClassElementImpl classA = classElement("A");
String getterName = "g";
PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType());
@@ -201,6 +228,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromInterfaces_accessor_implements() throws Exception {
+ // class A { int get g; }
+ // class B implements A {}
ClassElementImpl classA = classElement("A");
String getterName = "g";
PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType());
@@ -220,6 +249,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromInterfaces_accessor_with() throws Exception {
+ // class A { int get g; }
+ // class B extends Object with A {}
ClassElementImpl classA = classElement("A");
String getterName = "g";
PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType());
@@ -238,7 +269,150 @@ public class InheritanceManagerTest extends EngineTestCase {
assertNoErrors(classB);
}
+ public void test_getMapOfMembersInheritedFromInterfaces_implicitExtends() throws Exception {
+ // class A {}
+ ClassElementImpl classA = classElement("A");
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject, mapA.getSize());
+ assertNoErrors(classA);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method()
+ throws Exception {
+ // class I1 { int m(); }
+ // class I2 { int get m; }
+ // class A implements I2, I1 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
+ classI1.setMethods(new MethodElement[] {methodM});
+
+ ClassElementImpl classI2 = classElement("I2");
+ PropertyAccessorElement getter = getterElement(methodName, false, typeProvider.getIntType());
+ classI2.setAccessors(new PropertyAccessorElement[] {getter});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {classI2.getType(), classI1.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject, mapA.getSize());
+ assertNull(mapA.get(methodName));
+ assertErrors(classA, StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str()
+ throws Exception {
+ // class I1 { int m(); }
+ // class I2 { String m(); }
+ // class A implements I1, I2 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElement methodM1 = methodElement(methodName, null, typeProvider.getIntType());
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ MethodElement methodM2 = methodElement(methodName, null, typeProvider.getStringType());
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject, mapA.getSize());
+ assertNull(mapA.get(methodName));
+ assertErrors(classA, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter()
+ throws Exception {
+ // class I1 { int m(); }
+ // class I2 { int get m; }
+ // class A implements I1, I2 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
+ classI1.setMethods(new MethodElement[] {methodM});
+
+ ClassElementImpl classI2 = classElement("I2");
+ PropertyAccessorElement getter = getterElement(methodName, false, typeProvider.getIntType());
+ classI2.setAccessors(new PropertyAccessorElement[] {getter});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject, mapA.getSize());
+ assertNull(mapA.get(methodName));
+ assertErrors(classA, StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams()
+ throws Exception {
+ // class I1 { dynamic m(int, [int]); }
+ // class I2 { dynamic m(int, int, int); }
+ // class A implements I1, I2 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElementImpl methodM1 = methodElement(methodName, typeProvider.getDynamicType());
+ ParameterElementImpl parameter1 = new ParameterElementImpl(identifier("a1"));
+ parameter1.setType(typeProvider.getIntType());
+ parameter1.setParameterKind(ParameterKind.REQUIRED);
+ ParameterElementImpl parameter2 = new ParameterElementImpl(identifier("a2"));
+ parameter2.setType(typeProvider.getIntType());
+ parameter2.setParameterKind(ParameterKind.POSITIONAL);
+ methodM1.setParameters(new ParameterElement[] {parameter1, parameter2});
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ MethodElementImpl methodM2 = methodElement(methodName, typeProvider.getDynamicType());
+ ParameterElementImpl parameter3 = new ParameterElementImpl(identifier("a3"));
+ parameter3.setType(typeProvider.getIntType());
+ parameter3.setParameterKind(ParameterKind.REQUIRED);
+ ParameterElementImpl parameter4 = new ParameterElementImpl(identifier("a4"));
+ parameter4.setType(typeProvider.getIntType());
+ parameter4.setParameterKind(ParameterKind.REQUIRED);
+ ParameterElementImpl parameter5 = new ParameterElementImpl(identifier("a5"));
+ parameter5.setType(typeProvider.getIntType());
+ parameter5.setParameterKind(ParameterKind.REQUIRED);
+ methodM2.setParameters(new ParameterElement[] {parameter3, parameter4, parameter5});
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject, mapA.getSize());
+ assertNull(mapA.get(methodName));
+ assertErrors(classA, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int()
+ throws Exception {
+ // class I1 { int m(); }
+ // class I2 { String m(); }
+ // class A implements I2, I1 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElement methodM1 = methodElement(methodName, null, typeProvider.getStringType());
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ MethodElement methodM2 = methodElement(methodName, null, typeProvider.getIntType());
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {classI2.getType(), classI1.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject, mapA.getSize());
+ assertNull(mapA.get(methodName));
+ assertErrors(classA, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE);
+ }
+
public void test_getMapOfMembersInheritedFromInterfaces_method_extends() throws Exception {
+ // class A { int g(); }
+ // class B extends A {}
ClassElementImpl classA = classElement("A");
String methodName = "m";
MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
@@ -257,6 +431,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromInterfaces_method_implements() throws Exception {
+ // class A { int g(); }
+ // class B implements A {}
ClassElementImpl classA = classElement("A");
String methodName = "m";
MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
@@ -276,6 +452,8 @@ public class InheritanceManagerTest extends EngineTestCase {
}
public void test_getMapOfMembersInheritedFromInterfaces_method_with() throws Exception {
+ // class A { int g(); }
+ // class B extends Object with A {}
ClassElementImpl classA = classElement("A");
String methodName = "m";
MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
@@ -294,6 +472,230 @@ public class InheritanceManagerTest extends EngineTestCase {
assertNoErrors(classB);
}
+ public void test_getMapOfMembersInheritedFromInterfaces_union_differentNames() throws Exception {
+ // class I1 { int m1(); }
+ // class I2 { int m2(); }
+ // class A implements I1, I2 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName1 = "m1";
+ MethodElement methodM1 = methodElement(methodName1, typeProvider.getIntType());
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ String methodName2 = "m2";
+ MethodElement methodM2 = methodElement(methodName2, typeProvider.getIntType());
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+
+ assertEquals(numOfMembersInObject + 2, mapA.getSize());
+ assertSame(methodM1, mapA.get(methodName1));
+ assertSame(methodM2, mapA.get(methodName2));
+ assertNoErrors(classA);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_threeMethods()
+ throws Exception {
+ // class A {}
+ // class B extends A {}
+ // class C extends B {}
+ // class I1 { dynamic m(A a); }
+ // class I2 { dynamic m(B b); }
+ // class I3 { dynamic m(C c); }
+ // class D implements I1, I2, I3 {}
+ ClassElementImpl classA = classElement("A");
+ ClassElementImpl classB = classElement("B", classA.getType());
+ ClassElementImpl classC = classElement("C", classB.getType());
+
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElementImpl methodM1 = methodElement(methodName, typeProvider.getDynamicType());
+ ParameterElementImpl parameter1 = new ParameterElementImpl(identifier("a0"));
+ parameter1.setType(classA.getType());
+ parameter1.setParameterKind(ParameterKind.REQUIRED);
+ methodM1.setParameters(new ParameterElement[] {parameter1});
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ MethodElementImpl methodM2 = methodElement(methodName, typeProvider.getDynamicType());
+ ParameterElementImpl parameter2 = new ParameterElementImpl(identifier("a0"));
+ parameter2.setType(classB.getType());
+ parameter2.setParameterKind(ParameterKind.REQUIRED);
+ methodM2.setParameters(new ParameterElement[] {parameter2});
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classI3 = classElement("I3");
+ MethodElementImpl methodM3 = methodElement(methodName, typeProvider.getDynamicType());
+ ParameterElementImpl parameter3 = new ParameterElementImpl(identifier("a0"));
+ parameter3.setType(classC.getType());
+ parameter3.setParameterKind(ParameterKind.REQUIRED);
+ methodM3.setParameters(new ParameterElement[] {parameter3});
+ classI3.setMethods(new MethodElement[] {methodM3});
+
+ ClassElementImpl classD = classElement("D");
+ classD.setInterfaces(new InterfaceType[] {
+ classI1.getType(), classI2.getType(), classI3.getType()});
+
+ MemberMap mapD = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+ assertEquals(numOfMembersInObject + 1, mapD.getSize());
+ MethodElement syntheticMethod = methodElement(
+ methodName,
+ typeProvider.getDynamicType(),
+ typeProvider.getDynamicType());
+ assertEquals(syntheticMethod.getType(), mapD.get(methodName).getType());
+ assertNoErrors(classD);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_twoMethods()
+ throws Exception {
+ // class I1 { dynamic m(int); }
+ // class I2 { dynamic m(num); }
+ // class A implements I1, I2 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElementImpl methodM1 = methodElement(methodName, typeProvider.getDynamicType());
+ ParameterElementImpl parameter1 = new ParameterElementImpl(identifier("a0"));
+ parameter1.setType(typeProvider.getIntType());
+ parameter1.setParameterKind(ParameterKind.REQUIRED);
+ methodM1.setParameters(new ParameterElement[] {parameter1});
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ MethodElementImpl methodM2 = methodElement(methodName, typeProvider.getDynamicType());
+ ParameterElementImpl parameter2 = new ParameterElementImpl(identifier("a0"));
+ parameter2.setType(typeProvider.getNumType());
+ parameter2.setParameterKind(ParameterKind.REQUIRED);
+ methodM2.setParameters(new ParameterElement[] {parameter2});
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject + 1, mapA.getSize());
+ MethodElement syntheticMethod = methodElement(
+ methodName,
+ typeProvider.getDynamicType(),
+ typeProvider.getDynamicType());
+ assertEquals(syntheticMethod.getType(), mapA.get(methodName).getType());
+ assertNoErrors(classA);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_fourMethods()
+ throws Exception {
+ // class I1 { int m(); }
+ // class I2 { int m(); }
+ // class I3 { int m([int]); }
+ // class I4 { int m([int, int]); }
+ // class A implements I1, I2, I3, I4 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElement methodM1 = methodElement(methodName, typeProvider.getIntType());
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ MethodElement methodM2 = methodElement(methodName, typeProvider.getIntType());
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classI3 = classElement("I3");
+ MethodElementImpl methodM3 = methodElement(methodName, typeProvider.getIntType());
+ ParameterElementImpl parameter1 = new ParameterElementImpl(identifier("a1"));
+ parameter1.setType(typeProvider.getIntType());
+ parameter1.setParameterKind(ParameterKind.POSITIONAL);
+ methodM3.setParameters(new ParameterElement[] {parameter1});
+ classI3.setMethods(new MethodElement[] {methodM3});
+
+ ClassElementImpl classI4 = classElement("I4");
+ MethodElementImpl methodM4 = methodElement(methodName, typeProvider.getIntType());
+ ParameterElementImpl parameter2 = new ParameterElementImpl(identifier("a2"));
+ parameter2.setType(typeProvider.getIntType());
+ parameter2.setParameterKind(ParameterKind.POSITIONAL);
+ ParameterElementImpl parameter3 = new ParameterElementImpl(identifier("a3"));
+ parameter3.setType(typeProvider.getIntType());
+ parameter3.setParameterKind(ParameterKind.POSITIONAL);
+ methodM4.setParameters(new ParameterElement[] {parameter2, parameter3});
+ classI4.setMethods(new MethodElement[] {methodM4});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {
+ classI1.getType(), classI2.getType(), classI3.getType(), classI4.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject + 1, mapA.getSize());
+ assertSame(methodM4, mapA.get(methodName));
+ assertNoErrors(classA);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_threeMethods()
+ throws Exception {
+ // class I1 { int m(); }
+ // class I2 { int m([int]); }
+ // class I3 { int m([int, int]); }
+ // class A implements I1, I2, I3 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElementImpl methodM1 = methodElement(methodName, typeProvider.getIntType());
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ MethodElementImpl methodM2 = methodElement(methodName, typeProvider.getIntType());
+ ParameterElementImpl parameter1 = new ParameterElementImpl(identifier("a1"));
+ parameter1.setType(typeProvider.getIntType());
+ parameter1.setParameterKind(ParameterKind.POSITIONAL);
+ methodM1.setParameters(new ParameterElement[] {parameter1});
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classI3 = classElement("I3");
+ MethodElementImpl methodM3 = methodElement(methodName, typeProvider.getIntType());
+ ParameterElementImpl parameter2 = new ParameterElementImpl(identifier("a2"));
+ parameter2.setType(typeProvider.getIntType());
+ parameter2.setParameterKind(ParameterKind.POSITIONAL);
+ ParameterElementImpl parameter3 = new ParameterElementImpl(identifier("a3"));
+ parameter3.setType(typeProvider.getIntType());
+ parameter3.setParameterKind(ParameterKind.POSITIONAL);
+ methodM3.setParameters(new ParameterElement[] {parameter2, parameter3});
+ classI3.setMethods(new MethodElement[] {methodM3});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {
+ classI1.getType(), classI2.getType(), classI3.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject + 1, mapA.getSize());
+ assertSame(methodM3, mapA.get(methodName));
+ assertNoErrors(classA);
+ }
+
+ public void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_twoMethods()
+ throws Exception {
+ // class I1 { int m(); }
+ // class I2 { int m([int]); }
+ // class A implements I1, I2 {}
+ ClassElementImpl classI1 = classElement("I1");
+ String methodName = "m";
+ MethodElement methodM1 = methodElement(methodName, typeProvider.getIntType());
+ classI1.setMethods(new MethodElement[] {methodM1});
+
+ ClassElementImpl classI2 = classElement("I2");
+ MethodElementImpl methodM2 = methodElement(methodName, typeProvider.getIntType());
+ ParameterElementImpl parameter1 = new ParameterElementImpl(identifier("a1"));
+ parameter1.setType(typeProvider.getIntType());
+ parameter1.setParameterKind(ParameterKind.POSITIONAL);
+ methodM2.setParameters(new ParameterElement[] {parameter1});
+ classI2.setMethods(new MethodElement[] {methodM2});
+
+ ClassElementImpl classA = classElement("A");
+ classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
+
+ MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+ assertEquals(numOfMembersInObject + 1, mapA.getSize());
+ assertSame(methodM2, mapA.get(methodName));
+ assertNoErrors(classA);
+ }
+
public void test_lookupInheritance_interface_getter() throws Exception {
ClassElementImpl classA = classElement("A");
String getterName = "g";
@@ -364,64 +766,6 @@ public class InheritanceManagerTest extends EngineTestCase {
assertNoErrors(classB);
}
- public void test_lookupInheritance_interfaces_STWC_inconsistentMethodInheritance()
- throws Exception {
- ClassElementImpl classI1 = classElement("I1");
- String methodName = "m";
- MethodElement methodM1 = methodElement(methodName, null, typeProvider.getIntType());
- classI1.setMethods(new MethodElement[] {methodM1});
-
- ClassElementImpl classI2 = classElement("I2");
- MethodElement methodM2 = methodElement(methodName, null, typeProvider.getStringType());
- classI2.setMethods(new MethodElement[] {methodM2});
-
- ClassElementImpl classA = classElement("A");
- classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
- assertNull(inheritanceManager.lookupInheritance(classA, methodName));
- assertNoErrors(classI1);
- assertNoErrors(classI2);
- assertErrors(classA, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE);
- }
-
- public void test_lookupInheritance_interfaces_SWC_inconsistentMethodInheritance()
- throws Exception {
- ClassElementImpl classI1 = classElement("I1");
- String methodName = "m";
- MethodElement methodM = methodElement(methodName, typeProvider.getIntType());
- classI1.setMethods(new MethodElement[] {methodM});
-
- ClassElementImpl classI2 = classElement("I2");
- PropertyAccessorElement getter = getterElement(methodName, false, typeProvider.getIntType());
- classI2.setAccessors(new PropertyAccessorElement[] {getter});
-
- ClassElementImpl classA = classElement("A");
- classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
- assertNull(inheritanceManager.lookupInheritance(classA, methodName));
- assertNoErrors(classI1);
- assertNoErrors(classI2);
- assertErrors(classA, StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD);
- }
-
- public void test_lookupInheritance_interfaces_union1() throws Exception {
- ClassElementImpl classI1 = classElement("I1");
- String methodName1 = "m1";
- MethodElement methodM1 = methodElement(methodName1, typeProvider.getIntType());
- classI1.setMethods(new MethodElement[] {methodM1});
-
- ClassElementImpl classI2 = classElement("I2");
- String methodName2 = "m2";
- MethodElement methodM2 = methodElement(methodName2, typeProvider.getIntType());
- classI2.setMethods(new MethodElement[] {methodM2});
-
- ClassElementImpl classA = classElement("A");
- classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()});
- assertSame(methodM1, inheritanceManager.lookupInheritance(classA, methodName1));
- assertSame(methodM2, inheritanceManager.lookupInheritance(classA, methodName2));
- assertNoErrors(classI1);
- assertNoErrors(classI2);
- assertNoErrors(classA);
- }
-
public void test_lookupInheritance_interfaces_union2() throws Exception {
ClassElementImpl classI1 = classElement("I1");
String methodName1 = "m1";

Powered by Google App Engine
This is Rietveld 408576698