@Override public ResolvedType visit(SuperExpr node, Boolean solveLambdas) { ResolvedTypeDeclaration typeOfNode = facade.getTypeDeclaration(facade.findContainingTypeDecl(node)); if (typeOfNode instanceof ResolvedClassDeclaration) { return ((ResolvedClassDeclaration) typeOfNode).getSuperClass(); } else { throw new UnsupportedOperationException(node.getClass().getCanonicalName()); } }
@Override public ResolvedType visit(SuperExpr node, Boolean solveLambdas) { ResolvedTypeDeclaration typeOfNode = facade.getTypeDeclaration(facade.findContainingTypeDecl(node)); if (typeOfNode instanceof ResolvedClassDeclaration) { return ((ResolvedClassDeclaration) typeOfNode).getSuperClass(); } else { throw new UnsupportedOperationException(node.getClass().getCanonicalName()); } }
@Override public ResolvedType visit(SuperExpr node, Boolean solveLambdas) { ResolvedTypeDeclaration typeOfNode = facade.getTypeDeclaration(facade.findContainingTypeDecl(node)); if (typeOfNode instanceof ResolvedClassDeclaration) { return ((ResolvedClassDeclaration) typeOfNode).getSuperClass(); } else { throw new UnsupportedOperationException(node.getClass().getCanonicalName()); } }
public List<ResolvedReferenceType> getDirectAncestors() { // We need to go through the inheritance line and propagate the type parametes List<ResolvedReferenceType> ancestors = typeDeclaration.getAncestors(); ancestors = ancestors.stream() .map(a -> typeParametersMap().replaceAll(a).asReferenceType()) .collect(Collectors.toList()); // Avoid repetitions of Object ancestors.removeIf(a -> a.getQualifiedName().equals(Object.class.getCanonicalName())); boolean isClassWithSuperClassOrObject = this.getTypeDeclaration().isClass() && (this.getTypeDeclaration().asClass().getSuperClass() == null || !this.getTypeDeclaration().asClass().getSuperClass().getQualifiedName().equals(Object.class.getCanonicalName())); if (!isClassWithSuperClassOrObject) { ResolvedReferenceTypeDeclaration objectType = typeSolver.solveType(Object.class.getCanonicalName()); ResolvedReferenceType objectRef = create(objectType); ancestors.add(objectRef); } return ancestors; }
@Test public void testGetSuperclassSimpleImplicit() { class Foo<E> { E field; } TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver); assertEquals(Object.class.getCanonicalName(), foo.getSuperClass().getQualifiedName()); assertEquals(Collections.emptyList(), foo.getSuperClass().typeParametersValues()); }
@Test public void testGetSuperclassSimple() { class Bar { } class Foo<E> extends Bar { E field; } TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver); assertEquals("Bar", foo.getSuperClass().getTypeDeclaration().getName()); assertEquals(Collections.emptyList(), foo.getSuperClass().typeParametersValues()); }
@Test public void testGetSuperclassWithGenericSimple() { class Foo<E> { E field; } class Bar extends Foo<String> { } TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver); ResolvedClassDeclaration bar = new ReflectionClassDeclaration(Bar.class, typeResolver); assertEquals("Foo", bar.getSuperClass().getTypeDeclaration().getName()); assertEquals(1, bar.getSuperClass().typeParametersValues().size()); assertEquals(String.class.getCanonicalName(), bar.getSuperClass().typeParametersValues().get(0).asReferenceType().getQualifiedName()); }
@Test public void testGetSuperclassWithGenericInheritanceSameName() { class Foo<E> { E field; } class Bar<E> extends Foo<E> { } TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedClassDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver); ResolvedClassDeclaration bar = new ReflectionClassDeclaration(Bar.class, typeResolver); assertEquals("Foo", bar.getSuperClass().getTypeDeclaration().getName()); assertEquals(1, bar.getSuperClass().typeParametersValues().size()); assertEquals(true, bar.getSuperClass().typeParametersValues().get(0).isTypeVariable()); assertEquals("E", bar.getSuperClass().typeParametersValues().get(0).asTypeParameter().getName()); assertEquals(true, bar.getSuperClass().typeParametersValues().get(0).asTypeParameter().declaredOnType()); assertEquals(false, bar.getSuperClass().typeParametersValues().get(0).asTypeParameter().declaredOnMethod()); assertTrue(bar.getSuperClass().typeParametersValues().get(0).asTypeParameter().getQualifiedName().endsWith("Bar.E")); }
@Test public void typeDeclarationSuperClassImplicitlyIncludeObject() throws ParseException { CompilationUnit cu = parseSample("Generics"); ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "Generics"); ResolvedTypeDeclaration typeDeclaration = JavaParserFacade.get(new ReflectionTypeSolver()).getTypeDeclaration(clazz); ResolvedReferenceType superclass = typeDeclaration.asClass().getSuperClass(); assertEquals(Object.class.getCanonicalName(), superclass.getQualifiedName()); }