Skip to content

Commit

Permalink
make constructors for enums resolvable
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Aug 29, 2018
1 parent d3ec38a commit e1afc73
Show file tree
Hide file tree
Showing 17 changed files with 96 additions and 43 deletions.
Expand Up @@ -80,6 +80,7 @@ default boolean isClass() {
* List of constructors available for the class. * List of constructors available for the class.
* This list should also include the default constructor. * This list should also include the default constructor.
*/ */
@Override
List<ResolvedConstructorDeclaration> getConstructors(); List<ResolvedConstructorDeclaration> getConstructors();


} }
Expand Up @@ -22,6 +22,7 @@
package com.github.javaparser.resolution.declarations; package com.github.javaparser.resolution.declarations;


import com.github.javaparser.ast.AccessSpecifier; import com.github.javaparser.ast.AccessSpecifier;
import com.github.javaparser.ast.Node;
import com.github.javaparser.resolution.MethodUsage; import com.github.javaparser.resolution.MethodUsage;
import com.github.javaparser.resolution.UnsolvedSymbolException; import com.github.javaparser.resolution.UnsolvedSymbolException;
import com.github.javaparser.resolution.types.ResolvedReferenceType; import com.github.javaparser.resolution.types.ResolvedReferenceType;
Expand Down Expand Up @@ -244,4 +245,6 @@ default Optional<ResolvedTypeParameterDeclaration> findTypeParameter(String name
} }
return Optional.empty(); return Optional.empty();
} }

List<ResolvedConstructorDeclaration> getConstructors();
} }
Expand Up @@ -89,9 +89,9 @@ public <T> T resolveDeclaration(Node node, Class<T> resultClass) {
} }
if (node instanceof ConstructorDeclaration) { if (node instanceof ConstructorDeclaration) {
ConstructorDeclaration constructorDeclaration = (ConstructorDeclaration) node; ConstructorDeclaration constructorDeclaration = (ConstructorDeclaration) node;
ClassOrInterfaceDeclaration classOrInterfaceDeclaration = (ClassOrInterfaceDeclaration) node.getParentNode().get(); TypeDeclaration<?> typeDeclaration = (TypeDeclaration<?>) node.getParentNode().get();
ResolvedClassDeclaration resolvedClass = resolveDeclaration(classOrInterfaceDeclaration, ResolvedClassDeclaration.class).asClass(); ResolvedReferenceTypeDeclaration resolvedTypeDeclaration = resolveDeclaration(typeDeclaration, ResolvedReferenceTypeDeclaration.class);
ResolvedConstructorDeclaration resolved = resolvedClass.getConstructors().stream().filter(c -> ((JavaParserConstructorDeclaration) c).getWrappedNode() == constructorDeclaration).findFirst().get(); ResolvedConstructorDeclaration resolved = resolvedTypeDeclaration.getConstructors().stream().filter(c -> ((JavaParserConstructorDeclaration) c).getWrappedNode() == constructorDeclaration).findFirst().get();
if (resultClass.isInstance(resolved)) { if (resultClass.isInstance(resolved)) {
return resultClass.cast(resolved); return resultClass.cast(resolved);
} }
Expand Down
Expand Up @@ -19,14 +19,20 @@
import com.github.javaparser.ast.*; import com.github.javaparser.ast.*;
import com.github.javaparser.ast.expr.AnnotationExpr; import com.github.javaparser.ast.expr.AnnotationExpr;
import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations; import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations;
import com.github.javaparser.ast.nodeTypes.NodeWithConstructors;
import com.github.javaparser.resolution.UnsolvedSymbolException; import com.github.javaparser.resolution.UnsolvedSymbolException;
import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration; import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.google.common.collect.ImmutableList;


import java.util.EnumSet; import java.util.EnumSet;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;


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


Expand Down Expand Up @@ -97,4 +103,18 @@ static boolean hasDirectlyAnnotation(NodeWithAnnotations<?> nodeWithAnnotations,
} }
return false; return false;
} }

static <N extends ResolvedReferenceTypeDeclaration> List<ResolvedConstructorDeclaration> getConstructors(NodeWithConstructors<?> wrappedNode,
TypeSolver typeSolver,
N container) {
List<ResolvedConstructorDeclaration> declared = wrappedNode.getConstructors().stream()
.map(c -> new JavaParserConstructorDeclaration<N>(container, c, typeSolver))
.collect(Collectors.toList());
if (declared.isEmpty()) {
// If there are no constructors insert the default constructor
return ImmutableList.of(new DefaultConstructorDeclaration<N>(container));
} else {
return declared;
}
}
} }
Expand Up @@ -17,10 +17,7 @@
package com.github.javaparser.symbolsolver.javaparsermodel.declarations; package com.github.javaparser.symbolsolver.javaparsermodel.declarations;


import com.github.javaparser.ast.AccessSpecifier; import com.github.javaparser.ast.AccessSpecifier;
import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration; import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedParameterDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.resolution.types.ResolvedType;


import java.util.Collections; import java.util.Collections;
Expand All @@ -32,17 +29,17 @@
* *
* @author Federico Tomassetti * @author Federico Tomassetti
*/ */
public class DefaultConstructorDeclaration implements ResolvedConstructorDeclaration { public class DefaultConstructorDeclaration<N extends ResolvedReferenceTypeDeclaration> implements ResolvedConstructorDeclaration {


private ResolvedClassDeclaration classDeclaration; private N declaringType;


DefaultConstructorDeclaration(ResolvedClassDeclaration classDeclaration) { DefaultConstructorDeclaration(N declaringType) {
this.classDeclaration = classDeclaration; this.declaringType = declaringType;
} }


@Override @Override
public ResolvedClassDeclaration declaringType() { public N declaringType() {
return classDeclaration; return declaringType;
} }


@Override @Override
Expand All @@ -57,7 +54,7 @@ public ResolvedParameterDeclaration getParam(int i) {


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


@Override @Override
Expand Down
Expand Up @@ -8,6 +8,7 @@
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.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
Expand Down Expand Up @@ -98,4 +99,9 @@ public List<ResolvedAnnotationMemberDeclaration> getAnnotationMembers() {
.map(m -> new JavaParserAnnotationMemberDeclaration((AnnotationMemberDeclaration)m, typeSolver)) .map(m -> new JavaParserAnnotationMemberDeclaration((AnnotationMemberDeclaration)m, typeSolver))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
return Collections.emptyList();
}
} }
Expand Up @@ -179,19 +179,7 @@ public List<ResolvedReferenceType> getInterfaces() {


@Override @Override
public List<ResolvedConstructorDeclaration> getConstructors() { public List<ResolvedConstructorDeclaration> getConstructors() {
List<ResolvedConstructorDeclaration> declared = new LinkedList<>(); return AstResolutionUtils.getConstructors(this.wrappedNode, typeSolver, this);
for (BodyDeclaration<?> member : wrappedNode.getMembers()) {
if (member instanceof com.github.javaparser.ast.body.ConstructorDeclaration) {
com.github.javaparser.ast.body.ConstructorDeclaration constructorDeclaration = (com.github.javaparser.ast.body.ConstructorDeclaration) member;
declared.add(new JavaParserConstructorDeclaration(this, constructorDeclaration, typeSolver));
}
}
if (declared.isEmpty()) {
// If there are no constructors insert the default constructor
return ImmutableList.of(new DefaultConstructorDeclaration(this));
} else {
return declared;
}
} }


@Override @Override
Expand Down
Expand Up @@ -17,10 +17,7 @@
package com.github.javaparser.symbolsolver.javaparsermodel.declarations; package com.github.javaparser.symbolsolver.javaparsermodel.declarations;


import com.github.javaparser.ast.AccessSpecifier; import com.github.javaparser.ast.AccessSpecifier;
import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration; import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedParameterDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
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;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
Expand All @@ -31,22 +28,22 @@
/** /**
* @author Federico Tomassetti * @author Federico Tomassetti
*/ */
public class JavaParserConstructorDeclaration implements ResolvedConstructorDeclaration { public class JavaParserConstructorDeclaration<N extends ResolvedReferenceTypeDeclaration> implements ResolvedConstructorDeclaration {


private ResolvedClassDeclaration classDeclaration; private N declaringType;
private com.github.javaparser.ast.body.ConstructorDeclaration wrappedNode; private com.github.javaparser.ast.body.ConstructorDeclaration wrappedNode;
private TypeSolver typeSolver; private TypeSolver typeSolver;


JavaParserConstructorDeclaration(ResolvedClassDeclaration classDeclaration, com.github.javaparser.ast.body.ConstructorDeclaration wrappedNode, JavaParserConstructorDeclaration(N declaringType, com.github.javaparser.ast.body.ConstructorDeclaration wrappedNode,
TypeSolver typeSolver) { TypeSolver typeSolver) {
this.classDeclaration = classDeclaration; this.declaringType = declaringType;
this.wrappedNode = wrappedNode; this.wrappedNode = wrappedNode;
this.typeSolver = typeSolver; this.typeSolver = typeSolver;
} }


@Override @Override
public ResolvedClassDeclaration declaringType() { public N declaringType() {
return classDeclaration; return declaringType;
} }


@Override @Override
Expand All @@ -64,7 +61,7 @@ public ResolvedParameterDeclaration getParam(int i) {


@Override @Override
public String getName() { public String getName() {
return this.classDeclaration.getName(); return this.declaringType.getName();
} }


/** /**
Expand Down
Expand Up @@ -348,4 +348,9 @@ public Set<ResolvedReferenceTypeDeclaration> internalTypes() {
public Optional<ResolvedReferenceTypeDeclaration> containerType() { public Optional<ResolvedReferenceTypeDeclaration> containerType() {
return javaParserTypeAdapter.containerType(); return javaParserTypeAdapter.containerType();
} }

@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
return AstResolutionUtils.getConstructors(this.wrappedNode, typeSolver, this);
}
} }
Expand Up @@ -298,6 +298,11 @@ public Optional<ResolvedReferenceTypeDeclaration> containerType() {
return javaParserTypeAdapter.containerType(); return javaParserTypeAdapter.containerType();
} }


@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
return Collections.emptyList();
}

/// ///
/// Private methods /// Private methods
/// ///
Expand Down
Expand Up @@ -220,4 +220,9 @@ public Optional<ResolvedReferenceTypeDeclaration> containerType() {
} }
return Optional.empty(); return Optional.empty();
} }

@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
return Collections.emptyList();
}
} }
Expand Up @@ -18,10 +18,7 @@


import com.github.javaparser.ast.Node; import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.type.TypeParameter; import com.github.javaparser.ast.type.TypeParameter;
import com.github.javaparser.resolution.declarations.ResolvedFieldDeclaration; import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
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.core.resolution.Context; import com.github.javaparser.symbolsolver.core.resolution.Context;
Expand Down Expand Up @@ -184,4 +181,9 @@ public TypeParameter getWrappedNode() {
public Optional<ResolvedReferenceTypeDeclaration> containerType() { public Optional<ResolvedReferenceTypeDeclaration> containerType() {
return asTypeParameter().containerType(); return asTypeParameter().containerType();
} }

@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
return Collections.emptyList();
}
} }
Expand Up @@ -261,4 +261,9 @@ public List<ResolvedEnumConstantDeclaration> getEnumConstants() {
.map(f -> new JavassistEnumConstantDeclaration(f, typeSolver)) .map(f -> new JavassistEnumConstantDeclaration(f, typeSolver))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
throw new UnsupportedOperationException("To be implemented");
}
} }
Expand Up @@ -273,4 +273,9 @@ public boolean hasInternalType(String name) {
*/ */
return this.internalTypes().stream().anyMatch(f -> f.getName().endsWith(name)); return this.internalTypes().stream().anyMatch(f -> f.getName().endsWith(name));
} }

@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
return Collections.emptyList();
}
} }
Expand Up @@ -206,4 +206,9 @@ public Set<ResolvedReferenceTypeDeclaration> internalTypes() {
.map(ic -> ReflectionFactory.typeDeclarationFor(ic, typeSolver)) .map(ic -> ReflectionFactory.typeDeclarationFor(ic, typeSolver))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }

@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
throw new UnsupportedOperationException("To be implemented");
}
} }
Expand Up @@ -304,4 +304,9 @@ public List<ResolvedTypeParameterDeclaration> getTypeParameters() {
public AccessSpecifier accessSpecifier() { public AccessSpecifier accessSpecifier() {
return ReflectionFactory.modifiersToAccessLevel(this.clazz.getModifiers()); return ReflectionFactory.modifiersToAccessLevel(this.clazz.getModifiers());
} }

@Override
public List<ResolvedConstructorDeclaration> getConstructors() {
return Collections.emptyList();
}
} }
Expand Up @@ -8,6 +8,7 @@
import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.expr.ObjectCreationExpr; import com.github.javaparser.ast.expr.ObjectCreationExpr;
import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration; import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration;
import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
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.JavaParserFacade; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
Expand Down Expand Up @@ -107,6 +108,9 @@ public void solveEnumConstructor() {


ResolvedConstructorDeclaration resolvedConstructor = constructor.resolve(); ResolvedConstructorDeclaration resolvedConstructor = constructor.resolve();


// TODO: check if resolved constructor is the expected one. assertEquals("ConstructorCallsEnum", resolvedConstructor.declaringType().getName());
assertEquals(1, resolvedConstructor.getNumberOfParams());
assertEquals("i", resolvedConstructor.getParam(0).getName());
assertEquals(ResolvedPrimitiveType.INT, resolvedConstructor.getParam(0).getType());
} }
} }

0 comments on commit e1afc73

Please sign in to comment.