Skip to content

Commit

Permalink
resolving references to enum constant as EnumConstants and not Fields #…
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Aug 5, 2018
1 parent 913a9fb commit ec92dbf
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 33 deletions.
Expand Up @@ -47,6 +47,10 @@ default boolean isField() {
return false; return false;
} }


default boolean isEnumConstant() {
return false;
}

/** /**
* Does this declaration represents a method parameter? * Does this declaration represents a method parameter?
*/ */
Expand Down Expand Up @@ -95,4 +99,8 @@ default ResolvedTypeDeclaration asType() {
default ResolvedMethodDeclaration asMethod() { default ResolvedMethodDeclaration asMethod() {
throw new UnsupportedOperationException(String.format("%s is not a MethodDeclaration", this)); throw new UnsupportedOperationException(String.format("%s is not a MethodDeclaration", this));
} }

default ResolvedEnumConstantDeclaration asEnumConstant() {
throw new UnsupportedOperationException(String.format("%s is not an EnumConstantDeclaration", this));
}
} }
Expand Up @@ -27,4 +27,14 @@
public interface ResolvedEnumConstantDeclaration extends ResolvedValueDeclaration { public interface ResolvedEnumConstantDeclaration extends ResolvedValueDeclaration {


String getName(); String getName();

@Override
default boolean isEnumConstant() {
return true;
}

@Override
default ResolvedEnumConstantDeclaration asEnumConstant() {
return this;
}
} }
Expand Up @@ -260,7 +260,7 @@ public SymbolReference<ResolvedAnnotationDeclaration> solve(AnnotationExpr annot
} }
} }


public SymbolReference<ResolvedFieldDeclaration> solve(FieldAccessExpr fieldAccessExpr) { public SymbolReference<ResolvedValueDeclaration> solve(FieldAccessExpr fieldAccessExpr) {
return ((FieldAccessContext) JavaParserFactory.getContext(fieldAccessExpr, typeSolver)).solveField(fieldAccessExpr.getName().getId(), typeSolver); return ((FieldAccessContext) JavaParserFactory.getContext(fieldAccessExpr, typeSolver)).solveField(fieldAccessExpr.getName().getId(), typeSolver);
} }


Expand Down
Expand Up @@ -19,11 +19,7 @@
import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.FieldAccessExpr; import com.github.javaparser.ast.expr.FieldAccessExpr;
import com.github.javaparser.ast.expr.ThisExpr; import com.github.javaparser.ast.expr.ThisExpr;
import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedFieldDeclaration;
import com.github.javaparser.resolution.types.ResolvedPrimitiveType; import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
Expand All @@ -37,7 +33,6 @@
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;


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


/** /**
Expand Down Expand Up @@ -91,9 +86,15 @@ public Optional<Value> solveSymbolAsValue(String name, TypeSolver typeSolver) {
} }
} }


public SymbolReference<ResolvedFieldDeclaration> solveField(String name, TypeSolver typeSolver) { public SymbolReference<ResolvedValueDeclaration> solveField(String name, TypeSolver typeSolver) {
Collection<ResolvedReferenceTypeDeclaration> rrtds = findTypeDeclarations(Optional.of(wrappedNode.getScope()), typeSolver); Collection<ResolvedReferenceTypeDeclaration> rrtds = findTypeDeclarations(Optional.of(wrappedNode.getScope()), typeSolver);
for (ResolvedReferenceTypeDeclaration rrtd : rrtds) { for (ResolvedReferenceTypeDeclaration rrtd : rrtds) {
if (rrtd.isEnum()) {
Optional<ResolvedEnumConstantDeclaration> enumConstant = rrtd.asEnum().getEnumConstants().stream().filter(c -> c.getName().equals(name)).findFirst();
if (enumConstant.isPresent()) {
return SymbolReference.solved(enumConstant.get());
}
}
try { try {
return SymbolReference.solved(rrtd.getField(wrappedNode.getName().getId())); return SymbolReference.solved(rrtd.getField(wrappedNode.getName().getId()));
} catch (Throwable t) { } catch (Throwable t) {
Expand Down
Expand Up @@ -16,14 +16,20 @@


package com.github.javaparser.symbolsolver.resolution; package com.github.javaparser.symbolsolver.resolution;


import com.github.javaparser.ParseException; import com.github.javaparser.JavaParser;
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.MethodDeclaration; import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.FieldAccessExpr;
import com.github.javaparser.ast.expr.MethodCallExpr; import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.stmt.ReturnStmt;
import com.github.javaparser.ast.stmt.SwitchStmt; import com.github.javaparser.ast.stmt.SwitchStmt;
import com.github.javaparser.resolution.declarations.ResolvedEnumConstantDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedFieldDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration; import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.resolution.types.ResolvedType;
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.JavaParserFacade; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
Expand Down Expand Up @@ -58,4 +64,29 @@ public void enumAndStaticInitializer() {
assertEquals("MyClass.Primitive", ref.describe()); assertEquals("MyClass.Primitive", ref.describe());
} }


// Related to issue 1699
@Test
public void resolveEnumConstantAccess() {
// configure symbol solver before parsing
JavaParser.getStaticConfiguration().setSymbolResolver(new JavaSymbolSolver(new ReflectionTypeSolver()));

// parse compilation unit and get field access expression
CompilationUnit cu = parseSample("EnumFieldAccess");
ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "EnumFieldAccess");
MethodDeclaration method = Navigator.demandMethod(clazz, "accessField");
ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0);
FieldAccessExpr expression = returnStmt.getExpression().get().asFieldAccessExpr();

// resolve field access expression
ResolvedValueDeclaration resolvedValueDeclaration = expression.resolve();

assertEquals(resolvedValueDeclaration.isField(), false);
assertEquals(resolvedValueDeclaration.isEnumConstant(), true);

ResolvedEnumConstantDeclaration resolvedEnumConstantDeclaration = resolvedValueDeclaration.asEnumConstant();
assertEquals("SOME", resolvedEnumConstantDeclaration.getName());
assertEquals(true, resolvedEnumConstantDeclaration.isEnumConstant());
assertEquals(true, resolvedEnumConstantDeclaration.hasName());
}

} }
Expand Up @@ -200,27 +200,4 @@ public void resolveClassFieldOfClassExtendingUnknownClass2() {
assertEquals(variableDeclarator, ((JavaParserFieldDeclaration) resolvedValueDeclaration).getVariableDeclarator()); assertEquals(variableDeclarator, ((JavaParserFieldDeclaration) resolvedValueDeclaration).getVariableDeclarator());
} }


@Test }
public void resolveEnumFieldAccess() {
// configure symbol solver before parsing
JavaParser.getStaticConfiguration().setSymbolResolver(new JavaSymbolSolver(new ReflectionTypeSolver()));

// parse compilation unit and get field access expression
CompilationUnit cu = parseSample("EnumFieldAccess");
ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "EnumFieldAccess");
MethodDeclaration method = Navigator.demandMethod(clazz, "accessField");
ReturnStmt returnStmt = (ReturnStmt) method.getBody().get().getStatements().get(0);
FieldAccessExpr expression = returnStmt.getExpression().get().asFieldAccessExpr();

// resolve field access expression
ResolvedValueDeclaration resolvedValueDeclaration = expression.resolve();

assertEquals(resolvedValueDeclaration.isField(), true);



ResolvedFieldDeclaration resolvedFieldDeclaration = (ResolvedFieldDeclaration) resolvedValueDeclaration;
assertEquals(resolvedFieldDeclaration.isStatic(), true);

}
}

0 comments on commit ec92dbf

Please sign in to comment.