Skip to content

Commit

Permalink
#1910 Generified MethodResolutionLogic#solveMethodInType(...)
Browse files Browse the repository at this point in the history
  • Loading branch information
Johann Beleites committed Nov 6, 2018
1 parent 8209c03 commit 360f369
Show file tree
Hide file tree
Showing 14 changed files with 114 additions and 45 deletions.
Expand Up @@ -11,6 +11,7 @@
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.logic.AbstractClassDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
import com.google.common.collect.ImmutableList;
Expand Down Expand Up @@ -61,6 +62,12 @@ public Context getContext() {
return JavaParserFactory.getContext(wrappedNode, typeSolver);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return getContext().solveMethod(name, argumentsTypes, staticOnly, typeSolver);
}

@Override
protected ResolvedReferenceType object() {
return new ReferenceTypeImpl(typeSolver.solveType(Object.class.getCanonicalName()), typeSolver);
Expand Down
Expand Up @@ -269,6 +269,12 @@ public SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolve
return getContext().getParent().solveType(name, typeSolver);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return getContext().solveMethod(name, argumentsTypes, staticOnly, typeSolver);
}

@Override
public List<ResolvedReferenceType> getAncestors(boolean acceptIncompleteList) {
List<ResolvedReferenceType> ancestors = new ArrayList<>();
Expand Down
Expand Up @@ -33,6 +33,7 @@
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabalities;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
Expand All @@ -46,7 +47,8 @@
/**
* @author Federico Tomassetti
*/
public class JavaParserEnumDeclaration extends AbstractTypeDeclaration implements ResolvedEnumDeclaration {
public class JavaParserEnumDeclaration extends AbstractTypeDeclaration
implements ResolvedEnumDeclaration, TypeDeclarationWithResolutionCapabalities {

private TypeSolver typeSolver;
private com.github.javaparser.ast.body.EnumDeclaration wrappedNode;
Expand Down Expand Up @@ -195,6 +197,15 @@ public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType>
return getContext().solveMethodAsUsage(name, parameterTypes, typeSolver);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
if (name.equals("values") && argumentsTypes.isEmpty()) {
return SymbolReference.solved(new JavaParserEnumDeclaration.ValuesMethod(this, typeSolver));
}
return getContext().solveMethod(name, argumentsTypes, staticOnly, typeSolver);
}

@Override
public List<ResolvedFieldDeclaration> getAllFields() {
List<ResolvedFieldDeclaration> fields = javaParserTypeAdapter.getFieldsForDeclaredVariables();
Expand Down
Expand Up @@ -29,6 +29,7 @@
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabalities;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.LazyType;
Expand All @@ -41,7 +42,8 @@
/**
* @author Federico Tomassetti
*/
public class JavaParserInterfaceDeclaration extends AbstractTypeDeclaration implements ResolvedInterfaceDeclaration {
public class JavaParserInterfaceDeclaration extends AbstractTypeDeclaration
implements ResolvedInterfaceDeclaration, TypeDeclarationWithResolutionCapabalities {

private TypeSolver typeSolver;
private ClassOrInterfaceDeclaration wrappedNode;
Expand Down Expand Up @@ -241,6 +243,12 @@ public SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolve
return getContext().getParent().solveType(name, typeSolver);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return getContext().solveMethod(name, argumentsTypes, staticOnly, typeSolver);
}

@Override
public List<ResolvedReferenceType> getAncestors(boolean acceptIncompleteList) {
List<ResolvedReferenceType> ancestors = new ArrayList<>();
Expand Down
Expand Up @@ -223,6 +223,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
return MethodResolutionLogic.findMostApplicable(candidates, name, argumentsTypes, typeSolver);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return solveMethod(name, argumentsTypes, staticOnly);
}

public ResolvedType getUsage(Node node) {
return new ReferenceTypeImpl(this, typeSolver);
}
Expand Down
Expand Up @@ -25,6 +25,7 @@
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabalities;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
Expand All @@ -45,7 +46,8 @@
/**
* @author Federico Tomassetti
*/
public class JavassistEnumDeclaration extends AbstractTypeDeclaration implements ResolvedEnumDeclaration {
public class JavassistEnumDeclaration extends AbstractTypeDeclaration
implements ResolvedEnumDeclaration, TypeDeclarationWithResolutionCapabalities {

private CtClass ctClass;
private TypeSolver typeSolver;
Expand Down Expand Up @@ -198,6 +200,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
return MethodResolutionLogic.findMostApplicable(candidates, name, argumentsTypes, typeSolver);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return solveMethod(name, argumentsTypes, staticOnly);
}

public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType> argumentsTypes, TypeSolver typeSolver,
Context invokationContext, List<ResolvedType> typeParameterValues) {
return JavassistUtils.getMethodUsage(ctClass, name, argumentsTypes, typeSolver, invokationContext);
Expand Down
Expand Up @@ -25,6 +25,7 @@
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabalities;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
Expand All @@ -45,7 +46,8 @@
/**
* @author Federico Tomassetti
*/
public class JavassistInterfaceDeclaration extends AbstractTypeDeclaration implements ResolvedInterfaceDeclaration {
public class JavassistInterfaceDeclaration extends AbstractTypeDeclaration
implements ResolvedInterfaceDeclaration, TypeDeclarationWithResolutionCapabalities {

private CtClass ctClass;
private TypeSolver typeSolver;
Expand Down Expand Up @@ -138,6 +140,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
return MethodResolutionLogic.findMostApplicable(candidates, name, argumentsTypes, typeSolver);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return solveMethod(name, argumentsTypes, staticOnly);
}

@Override
public boolean isAssignableBy(ResolvedType type) {
throw new UnsupportedOperationException();
Expand Down
Expand Up @@ -166,6 +166,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
return MethodResolutionLogic.findMostApplicable(methods, name, argumentsTypes, typeSolver);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return solveMethod(name, argumentsTypes, staticOnly);
}

@Override
public String toString() {
return "ReflectionClassDeclaration{" +
Expand Down Expand Up @@ -354,5 +360,4 @@ public Optional<Node> toAst() {
protected ResolvedReferenceType object() {
return new ReferenceTypeImpl(typeSolver.solveType(Object.class.getCanonicalName()), typeSolver);
}

}
Expand Up @@ -23,6 +23,7 @@
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.logic.ConfilictingGenericTypesException;
import com.github.javaparser.symbolsolver.logic.InferenceContext;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabalities;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
Expand All @@ -34,7 +35,8 @@
/**
* @author Federico Tomassetti
*/
public class ReflectionEnumDeclaration extends AbstractTypeDeclaration implements ResolvedEnumDeclaration {
public class ReflectionEnumDeclaration extends AbstractTypeDeclaration
implements ResolvedEnumDeclaration, TypeDeclarationWithResolutionCapabalities {

///
/// Fields
Expand Down Expand Up @@ -194,6 +196,12 @@ public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType>
}
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return solveMethod(name, argumentsTypes, staticOnly);
}

@Override
public List<ResolvedEnumConstantDeclaration> getEnumConstants() {
return Arrays.stream(clazz.getFields())
Expand Down
Expand Up @@ -28,6 +28,7 @@
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.logic.ConfilictingGenericTypesException;
import com.github.javaparser.symbolsolver.logic.InferenceContext;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabalities;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.NullType;
Expand All @@ -40,7 +41,8 @@
/**
* @author Federico Tomassetti
*/
public class ReflectionInterfaceDeclaration extends AbstractTypeDeclaration implements ResolvedInterfaceDeclaration {
public class ReflectionInterfaceDeclaration extends AbstractTypeDeclaration
implements ResolvedInterfaceDeclaration, TypeDeclarationWithResolutionCapabalities {

///
/// Fields
Expand Down Expand Up @@ -101,6 +103,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
typeSolver,this, clazz);
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver) {
return solveMethod(name, argumentsTypes, staticOnly);
}

@Override
public String toString() {
return "ReflectionInterfaceDeclaration{" +
Expand Down
Expand Up @@ -28,6 +28,7 @@
import com.github.javaparser.symbolsolver.javassistmodel.JavassistClassDeclaration;
import com.github.javaparser.symbolsolver.javassistmodel.JavassistEnumDeclaration;
import com.github.javaparser.symbolsolver.javassistmodel.JavassistInterfaceDeclaration;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabalities;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl;
Expand Down Expand Up @@ -578,44 +579,13 @@ public static SymbolReference<ResolvedMethodDeclaration> solveMethodInType(Resol
public static SymbolReference<ResolvedMethodDeclaration> solveMethodInType(ResolvedTypeDeclaration typeDeclaration,
String name, List<ResolvedType> argumentsTypes, boolean staticOnly,
TypeSolver typeSolver) {
if (typeDeclaration instanceof JavaParserClassDeclaration) {
Context ctx = ((JavaParserClassDeclaration) typeDeclaration).getContext();
return ctx.solveMethod(name, argumentsTypes, staticOnly, typeSolver);
}
if (typeDeclaration instanceof JavaParserInterfaceDeclaration) {
Context ctx = ((JavaParserInterfaceDeclaration) typeDeclaration).getContext();
return ctx.solveMethod(name, argumentsTypes, staticOnly, typeSolver);
}
if (typeDeclaration instanceof JavaParserEnumDeclaration) {
if (name.equals("values") && argumentsTypes.isEmpty()) {
return SymbolReference.solved(new JavaParserEnumDeclaration.ValuesMethod((JavaParserEnumDeclaration) typeDeclaration, typeSolver));
}
Context ctx = ((JavaParserEnumDeclaration) typeDeclaration).getContext();
return ctx.solveMethod(name, argumentsTypes, staticOnly, typeSolver);
}
if (typeDeclaration instanceof JavaParserAnonymousClassDeclaration) {
Context ctx = ((JavaParserAnonymousClassDeclaration) typeDeclaration).getContext();
return ctx.solveMethod(name, argumentsTypes, staticOnly, typeSolver);
}
if (typeDeclaration instanceof ReflectionClassDeclaration) {
return ((ReflectionClassDeclaration) typeDeclaration).solveMethod(name, argumentsTypes, staticOnly);
}
if (typeDeclaration instanceof ReflectionInterfaceDeclaration) {
return ((ReflectionInterfaceDeclaration) typeDeclaration).solveMethod(name, argumentsTypes, staticOnly);
}
if (typeDeclaration instanceof ReflectionEnumDeclaration) {
return ((ReflectionEnumDeclaration) typeDeclaration).solveMethod(name, argumentsTypes, staticOnly);
}
if (typeDeclaration instanceof JavassistInterfaceDeclaration) {
return ((JavassistInterfaceDeclaration) typeDeclaration).solveMethod(name, argumentsTypes, staticOnly);
}
if (typeDeclaration instanceof JavassistClassDeclaration) {
return ((JavassistClassDeclaration) typeDeclaration).solveMethod(name, argumentsTypes, staticOnly);
}
if (typeDeclaration instanceof JavassistEnumDeclaration) {
return ((JavassistEnumDeclaration) typeDeclaration).solveMethod(name, argumentsTypes, staticOnly);

if (typeDeclaration instanceof TypeDeclarationWithResolutionCapabalities) {
return ((TypeDeclarationWithResolutionCapabalities) typeDeclaration).solveMethod(name, argumentsTypes,
staticOnly, typeSolver);
} else {
throw new UnsupportedOperationException(typeDeclaration.getClass().getCanonicalName());
}
throw new UnsupportedOperationException(typeDeclaration.getClass().getCanonicalName());
}

private static void inferTypes(ResolvedType source, ResolvedType target, Map<ResolvedTypeParameterDeclaration, ResolvedType> mappings) {
Expand Down
Expand Up @@ -27,7 +27,8 @@
*
* @author Federico Tomassetti
*/
public abstract class AbstractClassDeclaration extends AbstractTypeDeclaration implements ResolvedClassDeclaration {
public abstract class AbstractClassDeclaration extends AbstractTypeDeclaration
implements ResolvedClassDeclaration, TypeDeclarationWithResolutionCapabalities {

///
/// Public
Expand Down
@@ -0,0 +1,16 @@
package com.github.javaparser.symbolsolver.logic;

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

import java.util.List;

public interface TypeDeclarationWithResolutionCapabalities {

SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes,
boolean staticOnly, TypeSolver typeSolver);


}
Expand Up @@ -9,6 +9,8 @@
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.logic.AbstractClassDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.MemoryTypeSolver;
import org.junit.Test;

Expand Down Expand Up @@ -122,6 +124,11 @@ public String getQualifiedName() {
public Optional<ResolvedReferenceTypeDeclaration> containerType() {
throw new UnsupportedOperationException();
}

@Override
public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<ResolvedType> argumentsTypes, boolean staticOnly, TypeSolver typeSolver) {
throw new UnsupportedOperationException();
}
}

@Test
Expand Down

0 comments on commit 360f369

Please sign in to comment.