Skip to content

Commit

Permalink
Generalized method usage resolution API. Removed typesolver parameter…
Browse files Browse the repository at this point in the history
… from a couple of method calls.
  • Loading branch information
Johann Beleites committed Nov 27, 2018
1 parent b5b486a commit 06d7e13
Show file tree
Hide file tree
Showing 16 changed files with 82 additions and 71 deletions.
@@ -0,0 +1,12 @@
package com.github.javaparser.symbolsolver.core.resolution;

import com.github.javaparser.resolution.MethodUsage;
import com.github.javaparser.resolution.types.ResolvedType;

import java.util.List;
import java.util.Optional;

public interface MethodUsageResolutionCapability {
Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType> argumentTypes, Context invocationContext,
List<ResolvedType> typeParameters);
}
Expand Up @@ -20,17 +20,7 @@
import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnonymousClassDeclaration;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserEnumDeclaration;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserInterfaceDeclaration;
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.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionEnumDeclaration;
import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;

import java.util.List;
import java.util.Optional;
Expand All @@ -45,30 +35,14 @@ private ContextHelper() {
}

public static Optional<MethodUsage> solveMethodAsUsage(ResolvedTypeDeclaration typeDeclaration, String name,
List<ResolvedType> argumentsTypes, TypeSolver typeSolver,
Context invokationContext, List<ResolvedType> typeParameters) {
if (typeDeclaration instanceof JavassistClassDeclaration) {
return ((JavassistClassDeclaration) typeDeclaration).solveMethodAsUsage(name, argumentsTypes, invokationContext, typeParameters);
} else if (typeDeclaration instanceof JavassistInterfaceDeclaration) {
return ((JavassistInterfaceDeclaration) typeDeclaration).solveMethodAsUsage(name, argumentsTypes, invokationContext, typeParameters);
} else if (typeDeclaration instanceof JavassistEnumDeclaration) {
return ((JavassistEnumDeclaration) typeDeclaration).solveMethodAsUsage(name, argumentsTypes, invokationContext, typeParameters);
} else if (typeDeclaration instanceof ReflectionClassDeclaration) {
return ((ReflectionClassDeclaration) typeDeclaration).solveMethodAsUsage(name, argumentsTypes, invokationContext, typeParameters);
} else if (typeDeclaration instanceof ReflectionInterfaceDeclaration) {
return ((ReflectionInterfaceDeclaration) typeDeclaration).solveMethodAsUsage(name, argumentsTypes, invokationContext, typeParameters);
} else if (typeDeclaration instanceof ReflectionEnumDeclaration) {
return ((ReflectionEnumDeclaration) typeDeclaration).solveMethodAsUsage(name, argumentsTypes, invokationContext, typeParameters);
} else if (typeDeclaration instanceof JavaParserClassDeclaration) {
return ((JavaParserClassDeclaration) typeDeclaration).getContext().solveMethodAsUsage(name, argumentsTypes);
} else if (typeDeclaration instanceof JavaParserInterfaceDeclaration) {
return ((JavaParserInterfaceDeclaration) typeDeclaration).getContext().solveMethodAsUsage(name, argumentsTypes);
} else if (typeDeclaration instanceof JavaParserEnumDeclaration) {
return ((JavaParserEnumDeclaration) typeDeclaration).getContext().solveMethodAsUsage(name, argumentsTypes);
} else if (typeDeclaration instanceof JavaParserAnonymousClassDeclaration) {
return ((JavaParserAnonymousClassDeclaration) typeDeclaration).getContext().solveMethodAsUsage(name, argumentsTypes);
List<ResolvedType> argumentsTypes, Context invokationContext,
List<ResolvedType> typeParameters) {

if (typeDeclaration instanceof MethodUsageResolutionCapability) {
return ((MethodUsageResolutionCapability) typeDeclaration)
.solveMethodAsUsage(name, argumentsTypes, invokationContext, typeParameters);
} else {
throw new UnsupportedOperationException(typeDeclaration.toString());
}
throw new UnsupportedOperationException(typeDeclaration.toString());
}

}
Expand Up @@ -166,7 +166,7 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
private Optional<MethodUsage> solveMethodAsUsage(ResolvedReferenceType refType, String name,
List<ResolvedType> argumentsTypes,
Context invokationContext) {
Optional<MethodUsage> ref = ContextHelper.solveMethodAsUsage(refType.getTypeDeclaration(), name, argumentsTypes, typeSolver, invokationContext, refType.typeParametersValues());
Optional<MethodUsage> ref = ContextHelper.solveMethodAsUsage(refType.getTypeDeclaration(), name, argumentsTypes, invokationContext, refType.typeParametersValues());
if (ref.isPresent()) {
MethodUsage methodUsage = ref.get();

Expand Down
Expand Up @@ -4,10 +4,12 @@
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.AnnotationDeclaration;
import com.github.javaparser.ast.expr.ObjectCreationExpr;
import com.github.javaparser.resolution.MethodUsage;
import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.logic.AbstractClassDeclaration;
Expand All @@ -23,7 +25,8 @@
/**
* An anonymous class declaration representation.
*/
public class JavaParserAnonymousClassDeclaration extends AbstractClassDeclaration {
public class JavaParserAnonymousClassDeclaration extends AbstractClassDeclaration
implements MethodUsageResolutionCapability {

private final TypeSolver typeSolver;
private final ObjectCreationExpr wrappedNode;
Expand Down Expand Up @@ -68,6 +71,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
return getContext().solveMethod(name, argumentsTypes, staticOnly);
}

@Override
public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType> argumentTypes,
Context invocationContext, List<ResolvedType> typeParameters) {
return getContext().solveMethodAsUsage(name, argumentTypes);
}

@Override
protected ResolvedReferenceType object() {
return new ReferenceTypeImpl(typeSolver.solveType(Object.class.getCanonicalName()), typeSolver);
Expand Down
Expand Up @@ -20,11 +20,13 @@
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.*;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.resolution.MethodUsage;
import com.github.javaparser.resolution.UnsolvedSymbolException;
import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.logic.AbstractClassDeclaration;
Expand All @@ -40,7 +42,7 @@
/**
* @author Federico Tomassetti
*/
public class JavaParserClassDeclaration extends AbstractClassDeclaration {
public class JavaParserClassDeclaration extends AbstractClassDeclaration implements MethodUsageResolutionCapability {

///
/// Fields
Expand Down Expand Up @@ -142,6 +144,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
return ctx.solveMethod(name, parameterTypes, false);
}

@Override
public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType> argumentTypes,
Context invocationContext, List<ResolvedType> typeParameters) {
return getContext().solveMethodAsUsage(name, argumentTypes);
}

/**
* This method is deprecated because the context is an implementation detail that should not be exposed.
* Ideally this method should become private. For this reason all further usages of this method are discouraged.
Expand Down
Expand Up @@ -30,10 +30,11 @@
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.resolution.types.parametrization.ResolvedTypeParametersMap;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;
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.TypeDeclarationWithResolutionCapabilities;
import com.github.javaparser.symbolsolver.logic.MethodResolutionCapability;
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 @@ -48,7 +49,7 @@
* @author Federico Tomassetti
*/
public class JavaParserEnumDeclaration extends AbstractTypeDeclaration
implements ResolvedEnumDeclaration, TypeDeclarationWithResolutionCapabilities {
implements ResolvedEnumDeclaration, MethodResolutionCapability, MethodUsageResolutionCapability {

private TypeSolver typeSolver;
private com.github.javaparser.ast.body.EnumDeclaration wrappedNode;
Expand Down Expand Up @@ -187,14 +188,10 @@ public int hashCode() {
return wrappedNode.hashCode();
}

@Deprecated
public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType> parameterTypes,
Context invokationContext, List<ResolvedType> typeParameterValues) {
if (name.equals("values") && parameterTypes.isEmpty()) {
return Optional.of(new ValuesMethod(this, typeSolver).getUsage(null));
}
// TODO add methods inherited from Enum
return getContext().solveMethodAsUsage(name, parameterTypes);
@Override
public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType> argumentTypes,
Context invokationContext, List<ResolvedType> typeParameters) {
return getContext().solveMethodAsUsage(name, argumentTypes);
}

@Override
Expand Down
Expand Up @@ -21,15 +21,17 @@
import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.resolution.MethodUsage;
import com.github.javaparser.resolution.UnsolvedSymbolException;
import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;
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.TypeDeclarationWithResolutionCapabilities;
import com.github.javaparser.symbolsolver.logic.MethodResolutionCapability;
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 @@ -43,7 +45,7 @@
* @author Federico Tomassetti
*/
public class JavaParserInterfaceDeclaration extends AbstractTypeDeclaration
implements ResolvedInterfaceDeclaration, TypeDeclarationWithResolutionCapabilities {
implements ResolvedInterfaceDeclaration, MethodResolutionCapability, MethodUsageResolutionCapability {

private TypeSolver typeSolver;
private ClassOrInterfaceDeclaration wrappedNode;
Expand Down Expand Up @@ -258,6 +260,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
return getContext().solveMethod(name, argumentsTypes, staticOnly);
}

@Override
public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType> argumentTypes,
Context invocationContext, List<ResolvedType> typeParameters) {
return getContext().solveMethodAsUsage(name, argumentTypes);
}

@Override
public List<ResolvedReferenceType> getAncestors(boolean acceptIncompleteList) {
List<ResolvedReferenceType> ancestors = new ArrayList<>();
Expand Down
Expand Up @@ -24,6 +24,7 @@
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;
import com.github.javaparser.symbolsolver.javaparsermodel.LambdaArgumentTypePlaceholder;
import com.github.javaparser.symbolsolver.logic.AbstractClassDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
Expand All @@ -48,7 +49,7 @@
/**
* @author Federico Tomassetti
*/
public class JavassistClassDeclaration extends AbstractClassDeclaration {
public class JavassistClassDeclaration extends AbstractClassDeclaration implements MethodUsageResolutionCapability {

private CtClass ctClass;
private TypeSolver typeSolver;
Expand Down
Expand Up @@ -23,8 +23,9 @@
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabilities;
import com.github.javaparser.symbolsolver.logic.MethodResolutionCapability;
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,7 @@
* @author Federico Tomassetti
*/
public class JavassistEnumDeclaration extends AbstractTypeDeclaration
implements ResolvedEnumDeclaration, TypeDeclarationWithResolutionCapabilities {
implements ResolvedEnumDeclaration, MethodResolutionCapability, MethodUsageResolutionCapability {

private CtClass ctClass;
private TypeSolver typeSolver;
Expand Down
Expand Up @@ -24,8 +24,9 @@
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;
import com.github.javaparser.symbolsolver.logic.AbstractTypeDeclaration;
import com.github.javaparser.symbolsolver.logic.TypeDeclarationWithResolutionCapabilities;
import com.github.javaparser.symbolsolver.logic.MethodResolutionCapability;
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 @@ -47,7 +48,7 @@
* @author Federico Tomassetti
*/
public class JavassistInterfaceDeclaration extends AbstractTypeDeclaration
implements ResolvedInterfaceDeclaration, TypeDeclarationWithResolutionCapabilities {
implements ResolvedInterfaceDeclaration, MethodResolutionCapability, MethodUsageResolutionCapability {

private CtClass ctClass;
private TypeSolver typeSolver;
Expand Down
Expand Up @@ -23,6 +23,7 @@
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.core.resolution.MethodUsageResolutionCapability;
import com.github.javaparser.symbolsolver.javaparsermodel.LambdaArgumentTypePlaceholder;
import com.github.javaparser.symbolsolver.javaparsermodel.contexts.ContextHelper;
import com.github.javaparser.symbolsolver.logic.AbstractClassDeclaration;
Expand All @@ -42,7 +43,7 @@
/**
* @author Federico Tomassetti
*/
public class ReflectionClassDeclaration extends AbstractClassDeclaration {
public class ReflectionClassDeclaration extends AbstractClassDeclaration implements MethodUsageResolutionCapability {

///
/// Fields
Expand Down Expand Up @@ -194,13 +195,13 @@ public Optional<MethodUsage> solveMethodAsUsage(String name, List<ResolvedType>
}
if (getSuperClass() != null) {
ResolvedClassDeclaration superClass = (ResolvedClassDeclaration) getSuperClass().getTypeDeclaration();
Optional<MethodUsage> ref = ContextHelper.solveMethodAsUsage(superClass, name, argumentsTypes, typeSolver, invokationContext, typeParameterValues);
Optional<MethodUsage> ref = ContextHelper.solveMethodAsUsage(superClass, name, argumentsTypes, invokationContext, typeParameterValues);
if (ref.isPresent()) {
methods.add(ref.get());
}
}
for (ResolvedReferenceType interfaceDeclaration : getInterfaces()) {
Optional<MethodUsage> ref = ContextHelper.solveMethodAsUsage(interfaceDeclaration.getTypeDeclaration(), name, argumentsTypes, typeSolver, invokationContext, typeParameterValues);
Optional<MethodUsage> ref = ContextHelper.solveMethodAsUsage(interfaceDeclaration.getTypeDeclaration(), name, argumentsTypes, invokationContext, typeParameterValues);
if (ref.isPresent()) {
methods.add(ref.get());
}
Expand Down

0 comments on commit 06d7e13

Please sign in to comment.