Skip to content

Commit

Permalink
add support for ResolvedEnumConstantDeclaration
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Nov 13, 2017
1 parent 999ba88 commit a908cdb
Show file tree
Hide file tree
Showing 9 changed files with 161 additions and 3 deletions.
@@ -1,5 +1,7 @@
package com.github.javaparser.symbolsolver.javaparsermodel.declarations;

import com.github.javaparser.ast.body.AnnotationDeclaration;
import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
Expand All @@ -9,6 +11,7 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

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

Expand All @@ -20,7 +23,7 @@ public class JavaParserAnnotationDeclaration extends AbstractTypeDeclaration imp
private com.github.javaparser.ast.body.AnnotationDeclaration wrappedNode;
private TypeSolver typeSolver;

public JavaParserAnnotationDeclaration(com.github.javaparser.ast.body.AnnotationDeclaration wrappedNode, TypeSolver typeSolver) {
public JavaParserAnnotationDeclaration(AnnotationDeclaration wrappedNode, TypeSolver typeSolver) {
this.wrappedNode = wrappedNode;
this.typeSolver = typeSolver;
}
Expand Down Expand Up @@ -89,4 +92,12 @@ public List<ResolvedTypeParameterDeclaration> getTypeParameters() {
public Optional<ResolvedReferenceTypeDeclaration> containerType() {
throw new UnsupportedOperationException("containerType is not supported for " + this.getClass().getCanonicalName());
}

@Override
public List<ResolvedAnnotationMemberDeclaration> getAnnotationMembers() {
return wrappedNode.getMembers().stream()
.filter(m -> m instanceof AnnotationMemberDeclaration)
.map(m -> new JavaParserAnnotationMemberDeclaration((AnnotationMemberDeclaration)m, typeSolver))
.collect(Collectors.toList());
}
}
@@ -0,0 +1,36 @@
package com.github.javaparser.symbolsolver.javaparsermodel.declarations;

import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.resolution.declarations.ResolvedAnnotationMemberDeclaration;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;

/**
* @author Federico Tomassetti
*/
public class JavaParserAnnotationMemberDeclaration implements ResolvedAnnotationMemberDeclaration {

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

public JavaParserAnnotationMemberDeclaration(AnnotationMemberDeclaration wrappedNode, TypeSolver typeSolver) {
this.wrappedNode = wrappedNode;
this.typeSolver = typeSolver;
}

@Override
public Expression getDefaultValue() {
throw new UnsupportedOperationException();
}

@Override
public ResolvedType getType() {
throw new UnsupportedOperationException();
}

@Override
public String getName() {
return wrappedNode.getNameAsString();
}
}
Expand Up @@ -17,7 +17,7 @@
package com.github.javaparser.symbolsolver.javaparsermodel.declarations;

import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedEnumConstantDeclaration;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
Expand All @@ -27,7 +27,7 @@
/**
* @author Federico Tomassetti
*/
public class JavaParserEnumConstantDeclaration implements ResolvedValueDeclaration {
public class JavaParserEnumConstantDeclaration implements ResolvedEnumConstantDeclaration {

private TypeSolver typeSolver;
private com.github.javaparser.ast.body.EnumConstantDeclaration wrappedNode;
Expand Down
Expand Up @@ -40,6 +40,7 @@

import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

/**
* @author Federico Tomassetti
Expand Down Expand Up @@ -238,6 +239,13 @@ public com.github.javaparser.ast.body.EnumDeclaration getWrappedNode() {
return wrappedNode;
}

@Override
public List<ResolvedEnumConstantDeclaration> getEnumConstants() {
return wrappedNode.getEntries().stream()
.map(entry -> new JavaParserEnumConstantDeclaration(entry, typeSolver))
.collect(Collectors.toList());
}

// Needed by ContextHelper
public static class ValuesMethod implements ResolvedMethodDeclaration {

Expand Down
Expand Up @@ -50,6 +50,8 @@
*/
public class JavassistClassDeclaration extends AbstractClassDeclaration {



private CtClass ctClass;
private TypeSolver typeSolver;
private JavassistTypeDeclarationAdapter javassistTypeDeclarationAdapter;
Expand Down
@@ -0,0 +1,54 @@
/*
* Copyright 2016 Federico Tomassetti
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.github.javaparser.symbolsolver.javassistmodel;

import com.github.javaparser.resolution.declarations.ResolvedEnumConstantDeclaration;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import javassist.CtField;
import javassist.bytecode.AccessFlag;

/**
* @author Federico Tomassetti
*/
public class JavassistEnumConstantDeclaration implements ResolvedEnumConstantDeclaration {

private CtField ctField;
private TypeSolver typeSolver;

public JavassistEnumConstantDeclaration(CtField ctField, TypeSolver typeSolver) {
if (ctField == null) {
throw new IllegalArgumentException();
}
if ((ctField.getFieldInfo2().getAccessFlags() & AccessFlag.ENUM) != 0) {
throw new IllegalArgumentException("Trying to instantiate a JavassistEnumConstantDeclaration with something which is not an enum field: " + ctField.toString());
}
this.ctField = ctField;
this.typeSolver = typeSolver;
}


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

@Override
public ResolvedType getType() {
throw new UnsupportedOperationException();
}
}
Expand Up @@ -264,4 +264,12 @@ private SymbolReference<? extends ResolvedValueDeclaration> solveSymbolForFQN(St
private String[] getInterfaceFQNs() {
return ctClass.getClassFile().getInterfaces();
}

@Override
public List<ResolvedEnumConstantDeclaration> getEnumConstants() {
return Arrays.stream(ctClass.getFields())
.filter(f -> (f.getFieldInfo2().getAccessFlags() & AccessFlag.ENUM) != 0)
.map(f -> new JavassistEnumConstantDeclaration(f, typeSolver))
.collect(Collectors.toList());
}
}
@@ -0,0 +1,31 @@
package com.github.javaparser.symbolsolver.reflectionmodel;

import com.github.javaparser.resolution.declarations.ResolvedEnumConstantDeclaration;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;

import java.lang.reflect.Field;

public class ReflectionEnumConstantDeclaration implements ResolvedEnumConstantDeclaration {

private Field enumConstant;
private TypeSolver typeSolver;

public ReflectionEnumConstantDeclaration(Field enumConstant, TypeSolver typeSolver) {
if (!enumConstant.isEnumConstant()) {
throw new IllegalArgumentException("The given field does not represent an enum constant");
}
this.enumConstant = enumConstant;
this.typeSolver = typeSolver;
}

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

@Override
public ResolvedType getType() {
throw new UnsupportedOperationException();
}
}
Expand Up @@ -28,6 +28,7 @@
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;

import java.util.*;
import java.util.stream.Collectors;

/**
* @author Federico Tomassetti
Expand Down Expand Up @@ -190,4 +191,11 @@ public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType>
}
}

@Override
public List<ResolvedEnumConstantDeclaration> getEnumConstants() {
return Arrays.stream(clazz.getFields())
.filter(f -> f.isEnumConstant())
.map(c -> new ReflectionEnumConstantDeclaration(c, typeSolver))
.collect(Collectors.toList());
}
}

0 comments on commit a908cdb

Please sign in to comment.