/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.engine.internal.resolver; 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.ExecutableElement; 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; import com.google.dart.engine.error.GatheringErrorListener; import com.google.dart.engine.error.StaticTypeWarningCode; import com.google.dart.engine.error.StaticWarningCode; import com.google.dart.engine.internal.context.AnalysisContextImpl; 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.internal.element.PropertyAccessorElementImpl; 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; import static com.google.dart.engine.element.ElementFactory.methodElement; import static com.google.dart.engine.element.ElementFactory.setterElement; import java.util.ArrayList; import java.util.HashSet; public class InheritanceManagerTest extends EngineTestCase { /** * The type provider used to access the types. */ private TestTypeProvider typeProvider; /** * The library containing the code being resolved. */ private LibraryElementImpl definingLibrary; /** * The inheritance manager being tested. */ private InheritanceManager inheritanceManager; /** * The number of members that Object implements (as determined by {@link TestTypeProvider}). */ private int numOfMembersInObject; @Override public void setUp() { typeProvider = new TestTypeProvider(); inheritanceManager = createInheritanceManager(); InterfaceType objectType = typeProvider.getObjectType(); numOfMembersInObject = objectType.getMethods().length + objectType.getAccessors().length; } 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()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B", classA.getType()); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromClasses(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromClasses(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(getterG, mapB.get(getterName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromClasses(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromClasses(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject, mapB.getSize()); assertNull(mapB.get(getterName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B"); classB.setMixins(new InterfaceType[] {classA.getType()}); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromClasses(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromClasses(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(getterG, mapB.get(getterName)); assertNoErrors(classA); 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()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setSupertype(classA.getType()); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromClasses(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromClasses(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(methodM, mapB.get(methodName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromClasses(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromClasses(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject, mapB.getSize()); assertNull(mapB.get(methodName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setMixins(new InterfaceType[] {classA.getType()}); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromClasses(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromClasses(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(methodM, mapB.get(methodName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B", classA.getType()); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(getterG, mapB.get(getterName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(getterG, mapB.get(getterName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B"); classB.setMixins(new InterfaceType[] {classA.getType()}); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(getterG, mapB.get(getterName)); assertNoErrors(classA); 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()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B", classA.getType()); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(methodM, mapB.get(methodName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(methodM, mapB.get(methodName)); assertNoErrors(classA); assertNoErrors(classB); } 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()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setMixins(new InterfaceType[] {classA.getType()}); MemberMap mapB = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA); assertEquals(numOfMembersInObject, mapA.getSize()); assertEquals(numOfMembersInObject + 1, mapB.getSize()); assertSame(methodM, mapB.get(methodName)); assertNoErrors(classA); 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_2_getters() throws Exception { // class I1 { int get g; } // class I2 { num get g; } // class A implements I1, I2 {} ClassElementImpl classI1 = classElement("I1"); String accessorName = "g"; PropertyAccessorElement getter1 = getterElement(accessorName, false, typeProvider.getIntType()); classI1.setAccessors(new PropertyAccessorElement[] {getter1}); ClassElementImpl classI2 = classElement("I2"); PropertyAccessorElement getter2 = getterElement(accessorName, false, typeProvider.getNumType()); classI2.setAccessors(new PropertyAccessorElement[] {getter2}); ClassElementImpl classA = classElement("A"); classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()}); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA); assertEquals(numOfMembersInObject + 1, mapA.getSize()); PropertyAccessorElement syntheticAccessor = getterElement( accessorName, false, typeProvider.getDynamicType()); assertEquals(syntheticAccessor.getType(), mapA.get(accessorName).getType()); assertNoErrors(classA); } public void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods() 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_multipleSubtypes_2_setters() throws Exception { // class I1 { set s(int); } // class I2 { set s(num); } // class A implements I1, I2 {} ClassElementImpl classI1 = classElement("I1"); String accessorName = "s"; PropertyAccessorElement setter1 = setterElement(accessorName, false, typeProvider.getIntType()); classI1.setAccessors(new PropertyAccessorElement[] {setter1}); ClassElementImpl classI2 = classElement("I2"); PropertyAccessorElement setter2 = setterElement(accessorName, false, typeProvider.getNumType()); classI2.setAccessors(new PropertyAccessorElement[] {setter2}); ClassElementImpl classA = classElement("A"); classA.setInterfaces(new InterfaceType[] {classI1.getType(), classI2.getType()}); MemberMap mapA = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA); assertEquals(numOfMembersInObject + 1, mapA.getSize()); PropertyAccessorElementImpl syntheticAccessor = setterElement( accessorName, false, typeProvider.getDynamicType()); syntheticAccessor.setReturnType(typeProvider.getDynamicType()); assertEquals(syntheticAccessor.getType(), mapA.get(accessorName + "=").getType()); assertNoErrors(classA); } public void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters() throws Exception { // class A {} // class B extends A {} // class C extends B {} // class I1 { A get g; } // class I2 { B get g; } // class I3 { C get g; } // 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 accessorName = "g"; PropertyAccessorElement getter1 = getterElement(accessorName, false, classA.getType()); classI1.setAccessors(new PropertyAccessorElement[] {getter1}); ClassElementImpl classI2 = classElement("I2"); PropertyAccessorElement getter2 = getterElement(accessorName, false, classB.getType()); classI2.setAccessors(new PropertyAccessorElement[] {getter2}); ClassElementImpl classI3 = classElement("I3"); PropertyAccessorElement getter3 = getterElement(accessorName, false, classC.getType()); classI3.setAccessors(new PropertyAccessorElement[] {getter3}); ClassElementImpl classD = classElement("D"); classD.setInterfaces(new InterfaceType[] { classI1.getType(), classI2.getType(), classI3.getType()}); MemberMap mapD = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD); assertEquals(numOfMembersInObject + 1, mapD.getSize()); PropertyAccessorElement syntheticAccessor = getterElement( accessorName, false, typeProvider.getDynamicType()); assertEquals(syntheticAccessor.getType(), mapD.get(accessorName).getType()); assertNoErrors(classD); } public void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods() 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_3_setters() throws Exception { // class A {} // class B extends A {} // class C extends B {} // class I1 { set s(A); } // class I2 { set s(B); } // class I3 { set s(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 accessorName = "s"; PropertyAccessorElement setter1 = setterElement(accessorName, false, classA.getType()); classI1.setAccessors(new PropertyAccessorElement[] {setter1}); ClassElementImpl classI2 = classElement("I2"); PropertyAccessorElement setter2 = setterElement(accessorName, false, classB.getType()); classI2.setAccessors(new PropertyAccessorElement[] {setter2}); ClassElementImpl classI3 = classElement("I3"); PropertyAccessorElement setter3 = setterElement(accessorName, false, classC.getType()); classI3.setAccessors(new PropertyAccessorElement[] {setter3}); ClassElementImpl classD = classElement("D"); classD.setInterfaces(new InterfaceType[] { classI1.getType(), classI2.getType(), classI3.getType()}); MemberMap mapD = inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD); assertEquals(numOfMembersInObject + 1, mapD.getSize()); PropertyAccessorElementImpl syntheticAccessor = setterElement( accessorName, false, typeProvider.getDynamicType()); syntheticAccessor.setReturnType(typeProvider.getDynamicType()); assertEquals(syntheticAccessor.getType(), mapD.get(accessorName + "=").getType()); assertNoErrors(classD); } public void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods() 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_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods() 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_4_methods() 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_lookupInheritance_interface_getter() throws Exception { ClassElementImpl classA = classElement("A"); String getterName = "g"; PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); assertSame(getterG, inheritanceManager.lookupInheritance(classB, getterName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_interface_method() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElement methodM = methodElement(methodName, typeProvider.getIntType()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); assertSame(methodM, inheritanceManager.lookupInheritance(classB, methodName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_interface_setter() throws Exception { ClassElementImpl classA = classElement("A"); String setterName = "s"; PropertyAccessorElement setterS = setterElement(setterName, false, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {setterS}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); assertSame(setterS, inheritanceManager.lookupInheritance(classB, setterName + '=')); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_interface_staticMember() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElement methodM = methodElement(methodName, typeProvider.getIntType()); ((MethodElementImpl) methodM).setStatic(true); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); assertNull(inheritanceManager.lookupInheritance(classB, methodName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_interfaces_infiniteLoop() throws Exception { ClassElementImpl classA = classElement("A"); classA.setInterfaces(new InterfaceType[] {classA.getType()}); assertNull(inheritanceManager.lookupInheritance(classA, "name")); assertNoErrors(classA); } public void test_lookupInheritance_interfaces_infiniteLoop2() throws Exception { ClassElementImpl classA = classElement("A"); ClassElementImpl classB = classElement("B"); classA.setInterfaces(new InterfaceType[] {classB.getType()}); classB.setInterfaces(new InterfaceType[] {classA.getType()}); assertNull(inheritanceManager.lookupInheritance(classA, "name")); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_interfaces_union2() 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}); classI2.setInterfaces(new InterfaceType[] {classI1.getType()}); ClassElementImpl classA = classElement("A"); classA.setInterfaces(new InterfaceType[] {classI2.getType()}); assertSame(methodM1, inheritanceManager.lookupInheritance(classA, methodName1)); assertSame(methodM2, inheritanceManager.lookupInheritance(classA, methodName2)); assertNoErrors(classI1); assertNoErrors(classI2); assertNoErrors(classA); } public void test_lookupInheritance_mixin_getter() throws Exception { ClassElementImpl classA = classElement("A"); String getterName = "g"; PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B"); classB.setMixins(new InterfaceType[] {classA.getType()}); assertSame(getterG, inheritanceManager.lookupInheritance(classB, getterName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_mixin_method() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElement methodM = methodElement(methodName, typeProvider.getIntType()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setMixins(new InterfaceType[] {classA.getType()}); assertSame(methodM, inheritanceManager.lookupInheritance(classB, methodName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_mixin_setter() throws Exception { ClassElementImpl classA = classElement("A"); String setterName = "s"; PropertyAccessorElement setterS = setterElement(setterName, false, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {setterS}); ClassElementImpl classB = classElement("B"); classB.setMixins(new InterfaceType[] {classA.getType()}); assertSame(setterS, inheritanceManager.lookupInheritance(classB, setterName + '=')); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_mixin_staticMember() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElement methodM = methodElement(methodName, typeProvider.getIntType()); ((MethodElementImpl) methodM).setStatic(true); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B"); classB.setMixins(new InterfaceType[] {classA.getType()}); assertNull(inheritanceManager.lookupInheritance(classB, methodName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_noMember() throws Exception { ClassElementImpl classA = classElement("A"); assertNull(inheritanceManager.lookupInheritance(classA, "a")); assertNoErrors(classA); } public void test_lookupInheritance_superclass_getter() throws Exception { ClassElementImpl classA = classElement("A"); String getterName = "g"; PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); ClassElementImpl classB = classElement("B", classA.getType()); assertSame(getterG, inheritanceManager.lookupInheritance(classB, getterName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_superclass_infiniteLoop() throws Exception { ClassElementImpl classA = classElement("A"); classA.setSupertype(classA.getType()); assertNull(inheritanceManager.lookupInheritance(classA, "name")); assertNoErrors(classA); } public void test_lookupInheritance_superclass_infiniteLoop2() throws Exception { ClassElementImpl classA = classElement("A"); ClassElementImpl classB = classElement("B"); classA.setSupertype(classB.getType()); classB.setSupertype(classA.getType()); assertNull(inheritanceManager.lookupInheritance(classA, "name")); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_superclass_method() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElement methodM = methodElement(methodName, typeProvider.getIntType()); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B", classA.getType()); assertSame(methodM, inheritanceManager.lookupInheritance(classB, methodName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_superclass_setter() throws Exception { ClassElementImpl classA = classElement("A"); String setterName = "s"; PropertyAccessorElement setterS = setterElement(setterName, false, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {setterS}); ClassElementImpl classB = classElement("B", classA.getType()); assertSame(setterS, inheritanceManager.lookupInheritance(classB, setterName + '=')); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupInheritance_superclass_staticMember() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElement methodM = methodElement(methodName, typeProvider.getIntType()); ((MethodElementImpl) methodM).setStatic(true); classA.setMethods(new MethodElement[] {methodM}); ClassElementImpl classB = classElement("B", classA.getType()); assertNull(inheritanceManager.lookupInheritance(classB, methodName)); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupMember_getter() throws Exception { ClassElementImpl classA = classElement("A"); String getterName = "g"; PropertyAccessorElement getterG = getterElement(getterName, false, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); assertSame(getterG, inheritanceManager.lookupMember(classA, getterName)); assertNoErrors(classA); } public void test_lookupMember_getter_static() throws Exception { ClassElementImpl classA = classElement("A"); String getterName = "g"; PropertyAccessorElement getterG = getterElement(getterName, true, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {getterG}); assertNull(inheritanceManager.lookupMember(classA, getterName)); assertNoErrors(classA); } public void test_lookupMember_method() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElement methodM = methodElement(methodName, typeProvider.getIntType()); classA.setMethods(new MethodElement[] {methodM}); assertSame(methodM, inheritanceManager.lookupMember(classA, methodName)); assertNoErrors(classA); } public void test_lookupMember_method_static() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElement methodM = methodElement(methodName, typeProvider.getIntType()); ((MethodElementImpl) methodM).setStatic(true); classA.setMethods(new MethodElement[] {methodM}); assertNull(inheritanceManager.lookupMember(classA, methodName)); assertNoErrors(classA); } public void test_lookupMember_noMember() throws Exception { ClassElementImpl classA = classElement("A"); assertNull(inheritanceManager.lookupMember(classA, "a")); assertNoErrors(classA); } public void test_lookupMember_setter() throws Exception { ClassElementImpl classA = classElement("A"); String setterName = "s"; PropertyAccessorElement setterS = setterElement(setterName, false, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {setterS}); assertSame(setterS, inheritanceManager.lookupMember(classA, setterName + '=')); assertNoErrors(classA); } public void test_lookupMember_setter_static() throws Exception { ClassElementImpl classA = classElement("A"); String setterName = "s"; PropertyAccessorElement setterS = setterElement(setterName, true, typeProvider.getIntType()); classA.setAccessors(new PropertyAccessorElement[] {setterS}); assertNull(inheritanceManager.lookupMember(classA, setterName)); assertNoErrors(classA); } public void test_lookupOverrides_noParentClasses() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElementImpl methodM = methodElement(methodName, typeProvider.getIntType()); classA.setMethods(new MethodElement[] {methodM}); assertSizeOfList(0, inheritanceManager.lookupOverrides(classA, methodName)); assertNoErrors(classA); } public void test_lookupOverrides_overrideBaseClass() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElementImpl methodMinA = methodElement(methodName, typeProvider.getIntType()); classA.setMethods(new MethodElement[] {methodMinA}); ClassElementImpl classB = classElement("B", classA.getType()); MethodElementImpl methodMinB = methodElement(methodName, typeProvider.getIntType()); classB.setMethods(new MethodElement[] {methodMinB}); ArrayList<ExecutableElement> overrides = inheritanceManager.lookupOverrides(classB, methodName); assertEqualsIgnoreOrder(new Object[] {methodMinA}, overrides.toArray()); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupOverrides_overrideInterface() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElementImpl methodMinA = methodElement(methodName, typeProvider.getIntType()); classA.setMethods(new MethodElement[] {methodMinA}); ClassElementImpl classB = classElement("B"); classB.setInterfaces(new InterfaceType[] {classA.getType()}); MethodElementImpl methodMinB = methodElement(methodName, typeProvider.getIntType()); classB.setMethods(new MethodElement[] {methodMinB}); ArrayList<ExecutableElement> overrides = inheritanceManager.lookupOverrides(classB, methodName); assertEqualsIgnoreOrder(new Object[] {methodMinA}, overrides.toArray()); assertNoErrors(classA); assertNoErrors(classB); } public void test_lookupOverrides_overrideTwoInterfaces() throws Exception { ClassElementImpl classA = classElement("A"); String methodName = "m"; MethodElementImpl methodMinA = methodElement(methodName, typeProvider.getIntType()); classA.setMethods(new MethodElement[] {methodMinA}); ClassElementImpl classB = classElement("B"); MethodElementImpl methodMinB = methodElement(methodName, typeProvider.getDoubleType()); classB.setMethods(new MethodElement[] {methodMinB}); ClassElementImpl classC = classElement("C"); classC.setInterfaces(new InterfaceType[] {classA.getType(), classB.getType()}); MethodElementImpl methodMinC = methodElement(methodName, typeProvider.getNumType()); classC.setMethods(new MethodElement[] {methodMinC}); ArrayList<ExecutableElement> overrides = inheritanceManager.lookupOverrides(classC, methodName); assertEqualsIgnoreOrder(new Object[] {methodMinA, methodMinB}, overrides.toArray()); assertNoErrors(classA); assertNoErrors(classB); assertNoErrors(classC); } private void assertErrors(ClassElement classElt, ErrorCode... expectedErrorCodes) { GatheringErrorListener errorListener = new GatheringErrorListener(); HashSet<AnalysisError> actualErrors = inheritanceManager.getErrors(classElt); if (actualErrors != null) { for (AnalysisError error : actualErrors) { errorListener.onError(error); } } errorListener.assertErrorsWithCodes(expectedErrorCodes); } private void assertNoErrors(ClassElement classElt) { assertErrors(classElt); } /** * Create the inheritance manager used by the tests. * * @return the inheritance manager that was created */ private InheritanceManager createInheritanceManager() { AnalysisContextImpl context = AnalysisContextFactory.contextWithCore(); FileBasedSource source = new FileBasedSource(FileUtilities2.createFile("/test.dart")); CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("test.dart"); definingCompilationUnit.setSource(source); definingLibrary = library(context, "test"); definingLibrary.setDefiningCompilationUnit(definingCompilationUnit); return new InheritanceManager(definingLibrary); } }