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;
}

default boolean isEnumConstant() {
return false;
}

/**
* Does this declaration represents a method parameter?
*/
Expand Down Expand Up @@ -95,4 +99,8 @@ default ResolvedTypeDeclaration asType() {
default ResolvedMethodDeclaration asMethod() {
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 {

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);
}

Expand Down
Expand Up @@ -19,11 +19,7 @@
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.FieldAccessExpr;
import com.github.javaparser.ast.expr.ThisExpr;
import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
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.declarations.*;
import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
Expand All @@ -37,7 +33,6 @@
import java.util.List;
import java.util.Optional;

import static com.github.javaparser.symbolsolver.javaparser.Navigator.getParentNode;
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);
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 {
return SymbolReference.solved(rrtd.getField(wrappedNode.getName().getId()));
} catch (Throwable t) {
Expand Down
Expand Up @@ -16,14 +16,20 @@

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.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
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.stmt.ReturnStmt;
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.types.ResolvedType;
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.javaparser.Navigator;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
Expand Down Expand Up @@ -58,4 +64,29 @@ public void enumAndStaticInitializer() {
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());
}

@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.