Skip to content

Commit

Permalink
first step
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Aug 21, 2015
1 parent f3b8a01 commit 09ceccd
Show file tree
Hide file tree
Showing 33 changed files with 312 additions and 266 deletions.
24 changes: 11 additions & 13 deletions src/main/java/me/tomassetti/symbolsolver/JavaParserFacade.java
Expand Up @@ -7,20 +7,17 @@
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.expr.*;
import com.github.javaparser.ast.type.*;
import jdk.nashorn.internal.ir.Symbol;
import com.github.javaparser.ast.type.PrimitiveType;
import com.github.javaparser.ast.type.ReferenceType;
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.javaparser.declarations.JavaParserClassDeclaration;
import me.tomassetti.symbolsolver.model.usages.MethodUsage;
import me.tomassetti.symbolsolver.model.usages.NullTypeUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;
import me.tomassetti.symbolsolver.model.usages.*;
import me.tomassetti.symbolsolver.model.javaparser.JavaParserFactory;
import me.tomassetti.symbolsolver.model.javaparser.UnsolvedSymbolException;
import me.tomassetti.symbolsolver.model.javaparser.contexts.MethodCallExprContext;
import me.tomassetti.symbolsolver.model.javaparser.declarations.JavaParserSymbolDeclaration;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;

import java.lang.reflect.Method;
import java.util.*;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
Expand Down Expand Up @@ -148,12 +145,12 @@ private TypeUsage getTypeConcrete(Node node, boolean solveLambdas) {
logger.finest("getType on lambda expr " + refMethod.getCorrespondingDeclaration().getName());
//logger.finest("Method param " + refMethod.getCorrespondingDeclaration().getParam(pos));
if (solveLambdas) {
TypeUsage result = refMethod.getCorrespondingDeclaration().getParam(pos).getType(typeSolver).getUsage(node);
TypeUsage result = refMethod.getCorrespondingDeclaration().getParam(pos).getType(typeSolver);
// We need to replace the type variables
result = result.solveGenericTypes(JavaParserFactory.getContext(node), typeSolver);
return result;
} else {
return new TypeUsageOfTypeDeclaration(refMethod.getCorrespondingDeclaration().getParam(pos).getType(typeSolver));
return refMethod.getCorrespondingDeclaration().getParam(pos).getType(typeSolver);
}
//System.out.println("LAMBDA " + node.getParentNode());
//System.out.println("LAMBDA CLASS " + node.getParentNode().getClass().getCanonicalName());
Expand Down Expand Up @@ -238,11 +235,11 @@ private SymbolReference<MethodDeclaration> solveMethod(MethodCallExpr methodCall
return new MethodCallExprContext(methodCallExpr).solveMethod(methodCallExpr.getName(), params, typeSolver);
}

public TypeDeclaration convert(Type type, Node node) {
public TypeUsage convert(Type type, Node node) {
return convert(type, JavaParserFactory.getContext(node));
}

public TypeDeclaration convert(Type type, Context context) {
public TypeUsage convert(Type type, Context context) {
if (type instanceof ReferenceType) {
ReferenceType referenceType = (ReferenceType) type;
// TODO consider array modifiers
Expand All @@ -253,11 +250,12 @@ public TypeDeclaration convert(Type type, Context context) {
if (!ref.isSolved()) {
throw new UnsolvedSymbolException(null, classOrInterfaceType.getName());
}
return ref.getCorrespondingDeclaration();
return new TypeUsageOfTypeDeclaration(ref.getCorrespondingDeclaration());
} else if (type instanceof VoidType) {
return new VoidTypeDeclaration();
return new VoidTypeUsage();
} else if (type instanceof PrimitiveType) {
return new PrimitiveTypeDeclaration((PrimitiveType)type);
PrimitiveType primitiveType = (PrimitiveType)type;
return PrimitiveTypeUsage.byName(primitiveType.getType().name());
} else {
throw new UnsupportedOperationException(type.getClass().getCanonicalName());
}
Expand Down
Expand Up @@ -67,8 +67,8 @@ public static SymbolReference<MethodDeclaration> findMostApplicable(List<MethodD
private static boolean isMoreSpecific(MethodDeclaration methodA, MethodDeclaration methodB, TypeSolver typeSolver) {
boolean oneMoreSpecificFound = false;
for (int i=0; i < methodA.getNoParams(); i++){
TypeDeclaration tdA = methodA.getParam(i).getType(typeSolver);
TypeDeclaration tdB = methodB.getParam(i).getType(typeSolver);
TypeUsage tdA = methodA.getParam(i).getType(typeSolver);
TypeUsage tdB = methodB.getParam(i).getType(typeSolver);
// B is more specific
if (tdB.isAssignableBy(tdA, typeSolver) && !tdA.isAssignableBy(tdB, typeSolver)) {
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/me/tomassetti/symbolsolver/model/Value.java
Expand Up @@ -33,7 +33,7 @@ public TypeUsage getUsage() {
}

public static Value from(ValueDeclaration decl, TypeSolver typeSolver) {
return new Value(decl.getTypeUsage(typeSolver), decl.getName(), decl.isField());
return new Value(decl.getType(typeSolver), decl.getName(), decl.isField());
}

}

This file was deleted.

Expand Up @@ -4,6 +4,7 @@
import me.tomassetti.symbolsolver.model.Context;
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.usages.MethodUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;

/**
* A declaration of a method (either in an interface, a class or an enum).
Expand All @@ -16,7 +17,7 @@ public interface MethodDeclaration extends Declaration, TypeParametrized {
*/
TypeDeclaration declaringType();

TypeDeclaration getReturnType(TypeSolver typeSolver);
TypeUsage getReturnType(TypeSolver typeSolver);

int getNoParams();

Expand Down
Expand Up @@ -9,9 +9,6 @@
*/
public interface ValueDeclaration extends Declaration {

TypeDeclaration getType(TypeSolver typeSolver);
TypeUsage getType(TypeSolver typeSolver);

default TypeUsage getTypeUsage(TypeSolver typeSolver) {
return new TypeUsageOfTypeDeclaration(getType(typeSolver));
}
}
Expand Up @@ -4,6 +4,8 @@
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.declarations.ValueDeclaration;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;

/**
* Created by federico on 21/08/15.
Expand All @@ -17,33 +19,13 @@ public JavaParserEnumConstantDeclaration(com.github.javaparser.ast.body.EnumCons
private com.github.javaparser.ast.body.EnumConstantDeclaration wrappedNode;

@Override
public TypeDeclaration getType(TypeSolver typeSolver) {
return new JavaParserEnumDeclaration((EnumDeclaration) wrappedNode.getParentNode());
public TypeUsage getType(TypeSolver typeSolver) {
return new TypeUsageOfTypeDeclaration(new JavaParserEnumDeclaration((EnumDeclaration) wrappedNode.getParentNode()));
}

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

@Override
public boolean isField() {
return false;
}

@Override
public boolean isParameter() {
return false;
}

@Override
public boolean isVariable() {
return false;
}

@Override
public boolean isType() {
return false;
}

}
Expand Up @@ -24,12 +24,7 @@ public JavaParserFieldDeclaration(VariableDeclarator variableDeclarator) {
}

@Override
public TypeUsage getTypeUsage(TypeSolver typeSolver) {
return JavaParserFacade.get(typeSolver).convertToUsage(fieldDeclaration.getType(), fieldDeclaration);
}

@Override
public TypeDeclaration getType(TypeSolver typeSolver) {
public TypeUsage getType(TypeSolver typeSolver) {
return JavaParserFacade.get(typeSolver).convert(fieldDeclaration.getType(), fieldDeclaration);
}

Expand All @@ -43,19 +38,5 @@ public boolean isField() {
return true;
}

@Override
public boolean isParameter() {
return false;
}

@Override
public boolean isVariable() {
return false;
}

@Override
public boolean isType() {
return false;
}

}
Expand Up @@ -39,7 +39,7 @@ public TypeDeclaration declaringType() {
}

@Override
public TypeDeclaration getReturnType(TypeSolver typeSolver) {
public TypeUsage getReturnType(TypeSolver typeSolver) {
return JavaParserFacade.get(typeSolver).convert(wrappedNode.getType(), getContext());
}

Expand All @@ -63,10 +63,10 @@ public MethodUsage getUsage(Node node) {

@Override
public MethodUsage resolveTypeVariables(Context context, TypeSolver typeSolver) {
TypeUsage returnType = replaceTypeParams(new TypeUsageOfTypeDeclaration(new JavaParserMethodDeclaration(wrappedNode).getReturnType(typeSolver)), typeSolver, context);
TypeUsage returnType = replaceTypeParams(new JavaParserMethodDeclaration(wrappedNode).getReturnType(typeSolver), typeSolver, context);
List<TypeUsage> params = new ArrayList<>();
for (int i=0;i<wrappedNode.getParameters().size();i++){
TypeUsage replaced = replaceTypeParams(new TypeUsageOfTypeDeclaration(new JavaParserMethodDeclaration(wrappedNode).getParam(i).getType(typeSolver)), typeSolver, context);
TypeUsage replaced = replaceTypeParams(new JavaParserMethodDeclaration(wrappedNode).getParam(i).getType(typeSolver), typeSolver, context);
params.add(replaced);
}
return new MethodUsage(new JavaParserMethodDeclaration(wrappedNode), params, returnType);
Expand Down
Expand Up @@ -5,6 +5,7 @@
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.declarations.ParameterDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;

/**
* Created by federico on 02/08/15.
Expand Down Expand Up @@ -38,7 +39,7 @@ public boolean isType() {
}

@Override
public TypeDeclaration getType(TypeSolver typeSolver) {
public TypeUsage getType(TypeSolver typeSolver) {
return JavaParserFacade.get(typeSolver).convert(wrappedNode.getType(), wrappedNode);
}
}
Expand Up @@ -13,6 +13,7 @@
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.javaparser.JavaParserFactory;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;

/**
* Created by federico on 28/07/15.
Expand Down Expand Up @@ -77,7 +78,7 @@ public boolean isType() {
}

@Override
public TypeDeclaration getType(TypeSolver typeSolver) {
public TypeUsage getType(TypeSolver typeSolver) {
if (wrappedNode instanceof Parameter) {
Parameter parameter = (Parameter) wrappedNode;
if (wrappedNode.getParentNode() instanceof LambdaExpr) {
Expand All @@ -89,7 +90,7 @@ public TypeDeclaration getType(TypeSolver typeSolver) {
//MethodDeclaration methodCalled = JavaParserFacade.get(typeSolver).solve()
throw new UnsupportedOperationException(wrappedNode.getClass().getCanonicalName());
} else {
return new SymbolSolver(typeSolver).solveType(parameter.getType());
return new TypeUsageOfTypeDeclaration(new SymbolSolver(typeSolver).solveType(parameter.getType()));
}
} else if (wrappedNode instanceof VariableDeclarator) {
VariableDeclarator variableDeclarator = (VariableDeclarator)wrappedNode;
Expand Down Expand Up @@ -131,8 +132,8 @@ public static int getParamPos(Node node) {
}
}

@Override
/*@Override
public TypeUsage getTypeUsage(TypeSolver typeSolver) {
return JavaParserFacade.get(typeSolver).getType(wrappedNode);
}
}*/
}
Expand Up @@ -10,6 +10,7 @@
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.javassist.contexts.JavassistMethodContext;
import me.tomassetti.symbolsolver.model.usages.LambdaTypeUsagePlaceholder;
import me.tomassetti.symbolsolver.model.usages.MethodUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;
Expand Down

0 comments on commit 09ceccd

Please sign in to comment.