Skip to content

Commit

Permalink
Solves issue #1839.
Browse files Browse the repository at this point in the history
  • Loading branch information
malteskoruppa committed Sep 8, 2018
1 parent a996e20 commit 2e8aff0
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 14 deletions.
Expand Up @@ -2,6 +2,7 @@


import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.body.AnnotationDeclaration;
import com.github.javaparser.ast.body.AnnotationMemberDeclaration; import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
import com.github.javaparser.ast.expr.AnnotationExpr;
import com.github.javaparser.resolution.declarations.*; import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.types.ResolvedReferenceType; import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.resolution.types.ResolvedType;
Expand Down Expand Up @@ -56,9 +57,8 @@ public boolean isAssignableBy(ResolvedReferenceTypeDeclaration other) {
} }


@Override @Override
public boolean hasDirectlyAnnotation(String qualifiedName) { public boolean hasDirectlyAnnotation(String canonicalName) {
// TODO #1839 return AstResolutionUtils.hasDirectlyAnnotation(wrappedNode, typeSolver, canonicalName);
throw new UnsupportedOperationException();
} }


@Override @Override
Expand Down
Expand Up @@ -22,6 +22,8 @@
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration; import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import javassist.CtClass; import javassist.CtClass;
import javassist.bytecode.AnnotationsAttribute;
import javassist.bytecode.annotation.Annotation;


import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
Expand All @@ -42,9 +44,9 @@ public class JavassistAnnotationDeclaration extends AbstractTypeDeclaration impl
@Override @Override
public String toString() { public String toString() {
return getClass().getSimpleName() + "{" + return getClass().getSimpleName() + "{" +
"ctClass=" + ctClass.getName() + "ctClass=" + ctClass.getName() +
", typeSolver=" + typeSolver + ", typeSolver=" + typeSolver +
'}'; '}';
} }


public JavassistAnnotationDeclaration(CtClass ctClass, TypeSolver typeSolver) { public JavassistAnnotationDeclaration(CtClass ctClass, TypeSolver typeSolver) {
Expand All @@ -64,7 +66,7 @@ public String getPackageName() {
@Override @Override
public String getClassName() { public String getClassName() {
String qualifiedName = getQualifiedName(); String qualifiedName = getQualifiedName();
if(qualifiedName.contains(".")) { if (qualifiedName.contains(".")) {
return qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1, qualifiedName.length()); return qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1, qualifiedName.length());
} else { } else {
return qualifiedName; return qualifiedName;
Expand Down Expand Up @@ -106,8 +108,7 @@ public Set<ResolvedMethodDeclaration> getDeclaredMethods() {


@Override @Override
public boolean hasDirectlyAnnotation(String canonicalName) { public boolean hasDirectlyAnnotation(String canonicalName) {
// TODO #1839 return ctClass.hasAnnotation(canonicalName);
throw new UnsupportedOperationException();
} }


@Override @Override
Expand Down Expand Up @@ -135,7 +136,7 @@ public List<ResolvedConstructorDeclaration> getConstructors() {
@Override @Override
public List<ResolvedAnnotationMemberDeclaration> getAnnotationMembers() { public List<ResolvedAnnotationMemberDeclaration> getAnnotationMembers() {
return Stream.of(ctClass.getDeclaredMethods()) return Stream.of(ctClass.getDeclaredMethods())
.map(m -> new JavassistAnnotationMemberDeclaration(m, typeSolver)) .map(m -> new JavassistAnnotationMemberDeclaration(m, typeSolver))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
} }
Expand Up @@ -16,12 +16,14 @@


package com.github.javaparser.symbolsolver.reflectionmodel; package com.github.javaparser.symbolsolver.reflectionmodel;


import com.github.javaparser.ast.expr.AnnotationExpr;
import com.github.javaparser.resolution.declarations.*; import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.types.ResolvedReferenceType; import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration; import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;


import java.lang.annotation.Annotation;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
Expand Down Expand Up @@ -117,9 +119,8 @@ public boolean isAssignableBy(ResolvedReferenceTypeDeclaration other) {
} }


@Override @Override
public boolean hasDirectlyAnnotation(String qualifiedName) { public boolean hasDirectlyAnnotation(String canonicalName) {
// TODO #1839 return reflectionClassAdapter.hasDirectlyAnnotation(canonicalName);
throw new UnsupportedOperationException();
} }


@Override @Override
Expand Down
Expand Up @@ -4,12 +4,16 @@
import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.expr.AnnotationExpr;
import com.github.javaparser.ast.expr.MarkerAnnotationExpr; import com.github.javaparser.ast.expr.MarkerAnnotationExpr;
import com.github.javaparser.ast.expr.NormalAnnotationExpr; import com.github.javaparser.ast.expr.NormalAnnotationExpr;
import com.github.javaparser.ast.expr.SingleMemberAnnotationExpr; import com.github.javaparser.ast.expr.SingleMemberAnnotationExpr;
import com.github.javaparser.resolution.declarations.ResolvedAnnotationDeclaration; import com.github.javaparser.resolution.declarations.ResolvedAnnotationDeclaration;
import com.github.javaparser.symbolsolver.JavaSymbolSolver; import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.javaparser.Navigator; import com.github.javaparser.symbolsolver.javaparser.Navigator;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnnotationDeclaration;
import com.github.javaparser.symbolsolver.javassistmodel.JavassistAnnotationDeclaration;
import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionAnnotationDeclaration;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
Expand All @@ -20,6 +24,8 @@
import java.io.IOException; import java.io.IOException;


import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;


/** /**
* Tests resolution of annotation expressions. * Tests resolution of annotation expressions.
Expand Down Expand Up @@ -178,4 +184,57 @@ public void solveJavassistNormalAnnotation() throws IOException {
assertEquals("org.junit", resolved.getPackageName()); assertEquals("org.junit", resolved.getPackageName());
assertEquals("Test", resolved.getName()); assertEquals("Test", resolved.getName());
} }

@Test
public void solveJavaParserMetaAnnotations() {
// parse compilation unit and get annotation expression
CompilationUnit cu = parseSample("Annotations");
ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "CA");
AnnotationExpr annotationExpr = clazz.getAnnotation(0);

// resolve annotation expression @MyAnnotation
JavaParserAnnotationDeclaration resolved = (JavaParserAnnotationDeclaration) annotationExpr.resolve();

// check that the annotation @MyAnnotation has the annotations @Target and @Retention, but not @Documented
assertEquals("foo.bar.MyAnnotation", resolved.getQualifiedName());
assertTrue(resolved.hasDirectlyAnnotation("java.lang.annotation.Target"));
assertTrue(resolved.hasDirectlyAnnotation("java.lang.annotation.Retention"));
assertFalse(resolved.hasDirectlyAnnotation("java.lang.annotation.Documented"));
}

@Test
public void solveReflectionMetaAnnotations() {
// parse compilation unit and get annotation expression
CompilationUnit cu = parseSample("Annotations");
ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "CA");
MethodDeclaration method = Navigator.demandMethod(clazz, "equals");
MarkerAnnotationExpr annotationExpr = (MarkerAnnotationExpr) method.getAnnotation(0);

// resolve annotation expression @Override
ReflectionAnnotationDeclaration resolved = (ReflectionAnnotationDeclaration) annotationExpr.resolve();

// check that the annotation @Override has the annotations @Target and @Retention, but not @Documented
assertEquals("java.lang.Override", resolved.getQualifiedName());
assertTrue(resolved.hasDirectlyAnnotation("java.lang.annotation.Target"));
assertTrue(resolved.hasDirectlyAnnotation("java.lang.annotation.Retention"));
assertFalse(resolved.hasDirectlyAnnotation("java.lang.annotation.Documented"));
}

@Test
public void solveJavassistMetaAnnotation() throws IOException {
// parse compilation unit and get annotation expression
CompilationUnit cu = parseSample("Annotations");
ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "CD");
MethodDeclaration method = Navigator.demandMethod(clazz, "testSomethingElse");
AnnotationExpr annotationExpr = method.getAnnotation(0);

// resolve annotation expression @Test
JavassistAnnotationDeclaration resolved = (JavassistAnnotationDeclaration) annotationExpr.resolve();

// check that the annotation @Test has the annotations @Target and @Retention, but not @Documented
assertEquals("org.junit.Test", resolved.getQualifiedName());
assertTrue(resolved.hasDirectlyAnnotation("java.lang.annotation.Target"));
assertTrue(resolved.hasDirectlyAnnotation("java.lang.annotation.Retention"));
assertFalse(resolved.hasDirectlyAnnotation("java.lang.annotation.Documented"));
}
} }
@@ -1,7 +1,10 @@
package foo.bar; package foo.bar;


import java.lang.annotation.*;
import org.junit.*; import org.junit.*;


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation { public @interface MyAnnotation {
} }


Expand Down

0 comments on commit 2e8aff0

Please sign in to comment.