Skip to content

Commit

Permalink
add AbstractMethodLikeDeclarationContext
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Nov 6, 2016
1 parent 27f0f20 commit 03055f9
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 40 deletions.
Expand Up @@ -44,7 +44,7 @@ public abstract class AbstractJavaParserContext<N extends Node> implements Conte
/// Static methods
///

protected static final SymbolReference<ValueDeclaration> solveWith(SymbolDeclarator symbolDeclarator, String name) {
public static final SymbolReference<ValueDeclaration> solveWith(SymbolDeclarator symbolDeclarator, String name) {
for (ValueDeclaration decl : symbolDeclarator.getSymbolDeclarations()) {
if (decl.getName().equals(name)) {
return SymbolReference.solved(decl);
Expand Down
@@ -0,0 +1,33 @@
package com.github.javaparser.symbolsolver.javaparsermodel.contexts;

import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.Parameter;
import com.github.javaparser.ast.nodeTypes.NodeWithParameters;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.model.declarations.ValueDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.resolution.SymbolDeclarator;

/**
* @author Federico Tomassetti
*/
public abstract class AbstractMethodLikeDeclarationContext<T extends Node & NodeWithParameters<T>> extends AbstractJavaParserContext<T> {

public AbstractMethodLikeDeclarationContext(T wrappedNode, TypeSolver typeSolver) {
super(wrappedNode, typeSolver);
}

public final SymbolReference<? extends ValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) {
for (Parameter parameter : wrappedNode.getParameters()) {
SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver);
SymbolReference symbolReference = AbstractJavaParserContext.solveWith(sb, name);
if (symbolReference.isSolved()) {
return symbolReference;
}
}

// if nothing is found we should ask the parent context
return getParent().solveSymbol(name, typeSolver);
}
}
Expand Up @@ -22,7 +22,6 @@
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter;
import com.github.javaparser.symbolsolver.model.declarations.MethodDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.TypeDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.ValueDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.resolution.Value;
Expand All @@ -36,7 +35,7 @@
/**
* @author Federico Tomassetti
*/
public class ConstructorContext extends AbstractJavaParserContext<ConstructorDeclaration> {
public class ConstructorContext extends AbstractMethodLikeDeclarationContext<ConstructorDeclaration> {

///
/// Constructors
Expand All @@ -50,20 +49,6 @@ public ConstructorContext(ConstructorDeclaration wrappedNode, TypeSolver typeSol
/// Public methods
///

@Override
public SymbolReference<? extends ValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) {
for (Parameter parameter : wrappedNode.getParameters()) {
SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver);
SymbolReference symbolReference = solveWith(sb, name);
if (symbolReference.isSolved()) {
return symbolReference;
}
}

// if nothing is found we should ask the parent context
return getParent().solveSymbol(name, typeSolver);
}

@Override
public Optional<Type> solveGenericType(String name, TypeSolver typeSolver) {
for (com.github.javaparser.ast.type.TypeParameter tp : wrappedNode.getTypeParameters()) {
Expand Down
Expand Up @@ -20,11 +20,11 @@
import com.github.javaparser.ast.expr.NameExpr;
import com.github.javaparser.symbolsolver.core.resolution.Context;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.UnsolvedSymbolException;
import com.github.javaparser.symbolsolver.model.declarations.*;
import com.github.javaparser.symbolsolver.model.methods.MethodUsage;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.resolution.UnsolvedSymbolException;
import com.github.javaparser.symbolsolver.model.resolution.Value;
import com.github.javaparser.symbolsolver.model.typesystem.*;
import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
Expand Down Expand Up @@ -64,9 +64,9 @@ public String toString() {

@Override
public Optional<MethodUsage> solveMethodAsUsage(String name, List<Type> argumentsTypes, TypeSolver typeSolver) {
// TODO consider call of static methods
if (wrappedNode.getScope().isPresent()) {

// Consider static method calls
if (wrappedNode.getScope().get() instanceof NameExpr) {
String className = ((NameExpr) wrappedNode.getScope().get()).getName();
SymbolReference<TypeDeclaration> ref = solveType(className, typeSolver);
Expand All @@ -77,7 +77,8 @@ public Optional<MethodUsage> solveMethodAsUsage(String name, List<Type> argument
methodUsage = resolveMethodTypeParameters(methodUsage, argumentsTypes);
return Optional.of(methodUsage);
} else {
throw new UnsolvedSymbolException(ref.getCorrespondingDeclaration().toString(), "Method '" + name + "' with parameterTypes " + argumentsTypes);
throw new UnsolvedSymbolException(ref.getCorrespondingDeclaration().toString(),
"Method '" + name + "' with parameterTypes " + argumentsTypes);
}
}
}
Expand Down Expand Up @@ -122,6 +123,7 @@ public Optional<Value> solveSymbolAsValue(String name, TypeSolver typeSolver) {
@Override
public SymbolReference<MethodDeclaration> solveMethod(String name, List<Type> argumentsTypes, TypeSolver typeSolver) {
if (wrappedNode.getScope().isPresent()) {

// consider static methods
if (wrappedNode.getScope().get() instanceof NameExpr) {
NameExpr scopeAsName = (NameExpr) wrappedNode.getScope().get();
Expand Down Expand Up @@ -272,11 +274,7 @@ private MethodUsage resolveMethodTypeParameters(MethodUsage methodUsage, List<Ty
expectedType, actualType, methodUsage.getDeclaration(), methodUsage));
}
} else {
// TODO fix
return methodUsage;
// ok, then it needs to be wrapped
//throw new UnsupportedOperationException(String.format("Unable to resolve the type typeParametersValues in a MethodUsage. Actual params: %s, Method Declaration: %s. MethodUsage: %s",
// actualParamTypes, methodUsage.getDeclaration(), methodUsage));
}
}
Map<TypeParameterDeclaration, Type> matchedTypeParameters = new HashMap<>();
Expand Down
Expand Up @@ -22,7 +22,6 @@
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter;
import com.github.javaparser.symbolsolver.model.declarations.TypeDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.ValueDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.resolution.Value;
Expand All @@ -33,26 +32,15 @@
import java.util.List;
import java.util.Optional;

public class MethodContext extends AbstractJavaParserContext<MethodDeclaration> {
/**
* @author Federico Tomassetti
*/
public class MethodContext extends AbstractMethodLikeDeclarationContext<MethodDeclaration> {

public MethodContext(MethodDeclaration wrappedNode, TypeSolver typeSolver) {
super(wrappedNode, typeSolver);
}

@Override
public SymbolReference<? extends ValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) {
for (Parameter parameter : wrappedNode.getParameters()) {
SymbolDeclarator sb = JavaParserFactory.getSymbolDeclarator(parameter, typeSolver);
SymbolReference symbolReference = solveWith(sb, name);
if (symbolReference.isSolved()) {
return symbolReference;
}
}

// if nothing is found we should ask the parent context
return getParent().solveSymbol(name, typeSolver);
}

@Override
public Optional<Type> solveGenericType(String name, TypeSolver typeSolver) {
for (com.github.javaparser.ast.type.TypeParameter tp : wrappedNode.getTypeParameters()) {
Expand Down

0 comments on commit 03055f9

Please sign in to comment.