Skip to content

Commit

Permalink
add AnnotationDeclaration
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Nov 6, 2016
1 parent 2e3f0d7 commit 6bc2c7c
Show file tree
Hide file tree
Showing 10 changed files with 191 additions and 96 deletions.
Expand Up @@ -17,11 +17,13 @@
package com.github.javaparser.symbolsolver.javaparsermodel.contexts;

import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.AnnotationDeclaration;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.TypeDeclaration;
import com.github.javaparser.ast.imports.*;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnnotationDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.MethodDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.ValueDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
Expand Down Expand Up @@ -109,8 +111,10 @@ public SymbolReference<com.github.javaparser.symbolsolver.model.declarations.Typ
if (type.getName().equals(name)) {
if (type instanceof ClassOrInterfaceDeclaration) {
return SymbolReference.solved(JavaParserFacade.get(typeSolver).getTypeDeclaration((ClassOrInterfaceDeclaration) type));
} else if (type instanceof AnnotationDeclaration) {
return SymbolReference.solved(new JavaParserAnnotationDeclaration((AnnotationDeclaration)type, typeSolver));
} else {
throw new UnsupportedOperationException();
throw new UnsupportedOperationException(type.getClass().getCanonicalName());
}
}
}
Expand Down
Expand Up @@ -16,10 +16,16 @@

package com.github.javaparser.symbolsolver.javaparsermodel.declarations;

import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.PackageDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.AccessLevel;

import java.util.EnumSet;
import java.util.Optional;

import static com.github.javaparser.symbolsolver.javaparser.Navigator.getParentNode;

/**
* @author Federico Tomassetti
Expand All @@ -37,4 +43,32 @@ public static AccessLevel toAccessLevel(EnumSet<Modifier> modifiers) {
return AccessLevel.PACKAGE_PROTECTED;
}
}

public static String containerName(String base, Node container) {
if (container instanceof com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) {
String b = containerName(base, getParentNode(container));
String cn = ((com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) container).getName();
if (b.isEmpty()) {
return cn;
} else {
return b + "." + cn;
}
} else if (container instanceof CompilationUnit) {
Optional<PackageDeclaration> p = ((CompilationUnit) container).getPackage();
if (p.isPresent()) {
String b = p.get().getName().toString();
if (base.isEmpty()) {
return b;
} else {
return b + "." + base;
}
} else {
return base;
}
} else if (container != null) {
return containerName(base, getParentNode(container));
} else {
return base;
}
}
}
@@ -0,0 +1,76 @@
package com.github.javaparser.symbolsolver.javaparsermodel.declarations;

import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.*;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceType;
import com.github.javaparser.symbolsolver.model.typesystem.Type;

import java.util.List;
import java.util.Set;

import static com.github.javaparser.symbolsolver.javaparser.Navigator.getParentNode;

/**
* @author Federico Tomassetti
*/
public class JavaParserAnnotationDeclaration extends AbstractTypeDeclaration implements AnnotationDeclaration {

private com.github.javaparser.ast.body.AnnotationDeclaration wrappedNode;
private TypeSolver typeSolver;

public JavaParserAnnotationDeclaration(com.github.javaparser.ast.body.AnnotationDeclaration wrappedNode, TypeSolver typeSolver) {
this.wrappedNode = wrappedNode;
this.typeSolver = typeSolver;
}

@Override
public List<ReferenceType> getAncestors() {
throw new UnsupportedOperationException();
}

@Override
public List<FieldDeclaration> getAllFields() {
throw new UnsupportedOperationException();
}

@Override
public Set<MethodDeclaration> getDeclaredMethods() {
throw new UnsupportedOperationException();
}

@Override
public boolean isAssignableBy(Type type) {
throw new UnsupportedOperationException();
}

@Override
public boolean isAssignableBy(ReferenceTypeDeclaration other) {
throw new UnsupportedOperationException();
}

@Override
public boolean hasDirectlyAnnotation(String qualifiedName) {
throw new UnsupportedOperationException();
}

@Override
public String getQualifiedName() {
String containerName = Helper.containerName("", getParentNode(wrappedNode));
if (containerName.isEmpty()) {
return wrappedNode.getName();
} else {
return containerName + "." + wrappedNode.getName();
}
}

@Override
public String getName() {
return wrappedNode.getName();
}

@Override
public List<TypeParameterDeclaration> getTypeParameters() {
throw new UnsupportedOperationException();
}
}
Expand Up @@ -16,14 +16,13 @@

package com.github.javaparser.symbolsolver.javaparsermodel.declarations;

import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.PackageDeclaration;
import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.expr.AnnotationExpr;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
Expand Down Expand Up @@ -149,7 +148,7 @@ public String getName() {
@Override
public ReferenceTypeImpl getSuperClass() {
if (wrappedNode.getExtends().isEmpty()) {
return new ReferenceTypeImpl(typeSolver.getRoot().solveType("java.lang.Object").asType().asClass(), typeSolver);
return new ReferenceTypeImpl(typeSolver.getRoot().solveType(Object.class.getCanonicalName()).asType().asClass(), typeSolver);
} else {
SymbolReference<TypeDeclaration> ref = solveType(wrappedNode.getExtends().get(0).getName(), typeSolver);
if (!ref.isSolved()) {
Expand Down Expand Up @@ -198,7 +197,12 @@ public List<ConstructorDeclaration> getConstructors() {

@Override
public boolean hasDirectlyAnnotation(String canonicalName) {
throw new UnsupportedOperationException();
for (AnnotationExpr annotationExpr : wrappedNode.getAnnotations()) {
if (solveType(annotationExpr.getName().getName(), typeSolver).getCorrespondingDeclaration().getQualifiedName().equals(canonicalName)) {
return true;
}
}
return false;
}

@Override
Expand All @@ -208,7 +212,7 @@ public boolean isInterface() {

@Override
public String getQualifiedName() {
String containerName = containerName("", getParentNode(wrappedNode));
String containerName = Helper.containerName("", getParentNode(wrappedNode));
if (containerName.isEmpty()) {
return wrappedNode.getName();
} else {
Expand Down Expand Up @@ -376,34 +380,6 @@ protected ReferenceType object() {
/// Private methods
///

private String containerName(String base, Node container) {
if (container instanceof com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) {
String b = containerName(base, getParentNode(container));
String cn = ((com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) container).getName();
if (b.isEmpty()) {
return cn;
} else {
return b + "." + cn;
}
} else if (container instanceof CompilationUnit) {
Optional<PackageDeclaration> p = ((CompilationUnit) container).getPackage();
if (p.isPresent()) {
String b = p.get().getName().toString();
if (base.isEmpty()) {
return b;
} else {
return b + "." + base;
}
} else {
return base;
}
} else if (container != null) {
return containerName(base, getParentNode(container));
} else {
return base;
}
}

private ReferenceTypeImpl toTypeUsage(ClassOrInterfaceType type, TypeSolver typeSolver) {
SymbolReference<TypeDeclaration> ancestor = solveType(type.getName(), typeSolver.getRoot());
if (!ancestor.isSolved()) {
Expand Down
Expand Up @@ -16,9 +16,7 @@

package com.github.javaparser.symbolsolver.javaparsermodel.declarations;

import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.PackageDeclaration;
import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.EnumConstantDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
Expand Down Expand Up @@ -143,42 +141,14 @@ public boolean isInterface() {

@Override
public String getQualifiedName() {
String containerName = containerName("", getParentNode(wrappedNode));
String containerName = Helper.containerName("", getParentNode(wrappedNode));
if (containerName.isEmpty()) {
return wrappedNode.getName();
} else {
return containerName + "." + wrappedNode.getName();
}
}

private String containerName(String base, Node container) {
if (container instanceof com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) {
String b = containerName(base, getParentNode(container));
String cn = ((com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) container).getName();
if (b.isEmpty()) {
return cn;
} else {
return b + "." + cn;
}
} else if (container instanceof CompilationUnit) {
Optional<PackageDeclaration> p = ((CompilationUnit) container).getPackage();
if (p.isPresent()) {
String b = p.get().getName().toString();
if (base.isEmpty()) {
return b;
} else {
return b + "." + base;
}
} else {
return base;
}
} else if (container != null) {
return containerName(base, getParentNode(container));
} else {
return base;
}
}

@Override
public boolean isAssignableBy(Type type) {
if (type.isNull()) {
Expand Down
Expand Up @@ -16,9 +16,7 @@

package com.github.javaparser.symbolsolver.javaparsermodel.declarations;

import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.PackageDeclaration;
import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.EnumDeclaration;
Expand Down Expand Up @@ -126,7 +124,7 @@ public List<ReferenceType> getInterfacesExtended() {

@Override
public String getQualifiedName() {
String containerName = containerName("", getParentNode(wrappedNode));
String containerName = Helper.containerName("", getParentNode(wrappedNode));
if (containerName.isEmpty()) {
return wrappedNode.getName();
} else {
Expand All @@ -146,34 +144,6 @@ public boolean isAssignableBy(ReferenceTypeDeclaration other) {
return false;
}

private String containerName(String base, Node container) {
if (container instanceof ClassOrInterfaceDeclaration) {
String b = containerName(base, getParentNode(container));
String cn = ((ClassOrInterfaceDeclaration) container).getName();
if (b.isEmpty()) {
return cn;
} else {
return b + "." + cn;
}
} else if (container instanceof CompilationUnit) {
Optional<PackageDeclaration> p = ((CompilationUnit) container).getPackage();
if (p.isPresent()) {
String b = p.get().getName().toString();
if (base.isEmpty()) {
return b;
} else {
return b + "." + base;
}
} else {
return base;
}
} else if (container != null) {
return containerName(base, getParentNode(container));
} else {
return base;
}
}

@Override
public boolean isAssignableBy(Type type) {
if (type.isNull()) {
Expand Down
Expand Up @@ -823,8 +823,46 @@ public void testSolveMethodNotExistingBecauseOfTypeParameters() {

// hasDirectlyAnnotation

@Test
public void testHasDirectlyAnnotation() throws FileNotFoundException {
TypeSolver typeSolver = new ReflectionTypeSolver();

CompilationUnit cu = JavaParser.parse(adaptPath(new File("src/test/resources/Annotations.java.txt")));

JavaParserClassDeclaration ca = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CA"), typeSolver);
assertEquals(true, ca.hasDirectlyAnnotation("foo.bar.MyAnnotation"));
assertEquals(false, ca.hasDirectlyAnnotation("foo.bar.MyAnnotation2"));
assertEquals(false, ca.hasDirectlyAnnotation("MyAnnotation"));
assertEquals(false, ca.hasDirectlyAnnotation("foo.bar.MyUnexistingAnnotation"));

JavaParserClassDeclaration cb = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CB"), typeSolver);
assertEquals(false, cb.hasDirectlyAnnotation("foo.bar.MyAnnotation"));
assertEquals(true, cb.hasDirectlyAnnotation("foo.bar.MyAnnotation2"));
assertEquals(false, cb.hasDirectlyAnnotation("MyAnnotation"));
assertEquals(false, cb.hasDirectlyAnnotation("foo.bar.MyUnexistingAnnotation"));
}

// hasAnnotation

@Test
public void testHasAnnotation() throws FileNotFoundException {
TypeSolver typeSolver = new ReflectionTypeSolver();

CompilationUnit cu = JavaParser.parse(adaptPath(new File("src/test/resources/Annotations.java.txt")));

JavaParserClassDeclaration ca = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CA"), typeSolver);
assertEquals(true, ca.hasAnnotation("foo.bar.MyAnnotation"));
assertEquals(false, ca.hasAnnotation("foo.bar.MyAnnotation2"));
assertEquals(false, ca.hasAnnotation("MyAnnotation"));
assertEquals(false, ca.hasAnnotation("foo.bar.MyUnexistingAnnotation"));

JavaParserClassDeclaration cb = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CB"), typeSolver);
assertEquals(true, cb.hasAnnotation("foo.bar.MyAnnotation"));
assertEquals(true, cb.hasAnnotation("foo.bar.MyAnnotation2"));
assertEquals(false, cb.hasAnnotation("MyAnnotation"));
assertEquals(false, cb.hasAnnotation("foo.bar.MyUnexistingAnnotation"));
}

///
///
///
Expand Down

0 comments on commit 6bc2c7c

Please sign in to comment.