Skip to content

Commit

Permalink
consider method values of Enum
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Aug 24, 2015
1 parent 283204d commit 1ae290f
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,11 @@ private TypeUsage getTypeConcrete(Node node, boolean solveLambdas) {
}
}

private ClassOrInterfaceDeclaration findContainingTypeDecl(Node node){
private com.github.javaparser.ast.body.TypeDeclaration findContainingTypeDecl(Node node){
if (node instanceof ClassOrInterfaceDeclaration) {
return (ClassOrInterfaceDeclaration)node;
return (ClassOrInterfaceDeclaration) node;
} else if (node instanceof EnumDeclaration) {
return (EnumDeclaration)node;
} else if (node.getParentNode() == null) {
throw new IllegalArgumentException();
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/me/tomassetti/symbolsolver/ProjectResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ private static void solve(Node node) {
if (upe.getMessage() != null && upe.getMessage().contains("FOO")){
throw upe;
}
throw upe;
//throw upe;
} catch (RuntimeException re){
String line;
if (re.getStackTrace().length == 0) {
Expand All @@ -110,7 +110,7 @@ private static void solve(Node node) {
if (re.getMessage() != null && re.getMessage().contains("FOO")){
throw re;
}
throw re;
// throw re;
}
} else {
//System.out.println(node + " ? from " + node.getParentNode().getClass().getCanonicalName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ default SymbolReference<MethodDeclaration> solveMethod(String name, List<TypeUsa
return getContext().solveMethod(name, parameterTypes, typeSolver);
}

default Optional<MethodUsage> solveMethodAsUsage(String name, List<TypeUsage> parameterTypes, TypeSolver typeSolver, Context invokationContext, List<TypeUsage> typeParameterValues) {
return getContext().solveMethodAsUsage(name, parameterTypes, typeSolver);
}

/**
* Get how the type is used in the given context.
* @param node
Expand All @@ -42,10 +46,6 @@ default boolean canBeAssignedTo(TypeDeclaration other, TypeSolver typeSolver) {

boolean hasField(String name, TypeSolver typeSolver);

default Optional<MethodUsage> solveMethodAsUsage(String name, List<TypeUsage> parameterTypes, TypeSolver typeSolver, Context invokationContext, List<TypeUsage> typeParameterValues) {
return getContext().solveMethodAsUsage(name, parameterTypes, typeSolver);
}

default boolean isAssignableBy(TypeDeclaration other, TypeSolver typeSolver) {
return isAssignableBy(new TypeUsageOfTypeDeclaration(other), typeSolver);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public Optional<MethodUsage> solveMethodAsUsage(String name, List<TypeUsage> par
if (m.isSolved()) {
return Optional.of(new MethodUsage(m.getCorrespondingDeclaration(), typeSolver));
} else {
throw new UnsolvedSymbolException(ref.getCorrespondingDeclaration().toString(), "Method "+name+" with parameterTypes "+parameterTypes);
throw new UnsolvedSymbolException(ref.getCorrespondingDeclaration().toString(), "Method '"+name+"' with parameterTypes "+parameterTypes);
}
} else {
throw e;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,24 @@ public Context getContext() {
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

JavaParserClassDeclaration that = (JavaParserClassDeclaration) o;

if (!wrappedNode.equals(that.wrappedNode)) return false;

return true;
}

@Override
public int hashCode() {
return wrappedNode.hashCode();
}

@Override

public TypeUsage getUsage(Node node) {
throw new UnsupportedOperationException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.javaparser.JavaParserFactory;
import me.tomassetti.symbolsolver.model.javaparser.UnsolvedSymbolException;
import me.tomassetti.symbolsolver.model.usages.ArrayTypeUsage;
import me.tomassetti.symbolsolver.model.usages.MethodUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

/**
* Created by federico on 30/07/15.
Expand Down Expand Up @@ -171,6 +175,89 @@ public FieldDeclaration getField(String name, TypeSolver typeSolver) {
throw new UnsolvedSymbolException("Field "+name);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

JavaParserEnumDeclaration that = (JavaParserEnumDeclaration) o;

if (!wrappedNode.equals(that.wrappedNode)) return false;

return true;
}

@Override
public int hashCode() {
return wrappedNode.hashCode();
}

private class ValuesMethod implements MethodDeclaration {

@Override
public TypeDeclaration declaringType() {
throw new UnsupportedOperationException();
}

@Override
public TypeUsage getReturnType(TypeSolver typeSolver) {
return new ArrayTypeUsage(new TypeUsageOfTypeDeclaration(JavaParserEnumDeclaration.this));
}

@Override
public int getNoParams() {
return 0;
}

@Override
public ParameterDeclaration getParam(int i) {
throw new UnsupportedOperationException();
}

@Override
public MethodUsage getUsage(Node node) {
throw new UnsupportedOperationException();
}

@Override
public MethodUsage resolveTypeVariables(Context context, TypeSolver typeSolver) {
return new MethodUsage(this, typeSolver);
}

@Override
public Context getContext() {
throw new UnsupportedOperationException();
}

@Override
public String getName() {
return "values";
}

@Override
public List<TypeParameter> getTypeParameters() {
return Collections.emptyList();
}
}

@Override
public SymbolReference<MethodDeclaration> solveMethod(String name, List<TypeUsage> parameterTypes, TypeSolver typeSolver) {
if (name.equals("values") && parameterTypes.size() == 0) {
return SymbolReference.solved(new ValuesMethod());
}
// TODO add methods inherited from Enum
return getContext().solveMethod(name, parameterTypes, typeSolver);
}

@Override
public Optional<MethodUsage> solveMethodAsUsage(String name, List<TypeUsage> parameterTypes, TypeSolver typeSolver, Context invokationContext, List<TypeUsage> typeParameterValues) {
if (name.equals("values") && parameterTypes.size() == 0) {
return Optional.of(new ValuesMethod().getUsage(null));
}
// TODO add methods inherited from Enum
return getContext().solveMethodAsUsage(name, parameterTypes, typeSolver);
}

@Override
public boolean hasField(String name, TypeSolver typeSolver) {
if (this.wrappedNode.getMembers() != null) {
Expand All @@ -184,6 +271,7 @@ public boolean hasField(String name, TypeSolver typeSolver) {
}
}
}

}

if (this.wrappedNode.getEntries() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,23 @@ public TypeUsage getUsage(Node node) {
throw new UnsupportedOperationException();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

JavaParserInterfaceDeclaration that = (JavaParserInterfaceDeclaration) o;

if (!wrappedNode.equals(that.wrappedNode)) return false;

return true;
}

@Override
public int hashCode() {
return wrappedNode.hashCode();
}

@Override
public String getName() {
return wrappedNode.getName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,24 @@ public JavassistClassDeclaration(CtClass ctClass) {
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

JavassistClassDeclaration that = (JavassistClassDeclaration) o;

if (!ctClass.equals(that.ctClass)) return false;

return true;
}

@Override
public int hashCode() {
return ctClass.hashCode();
}

@Override

public String getQualifiedName() {
return ctClass.getName();
}
Expand Down

0 comments on commit 1ae290f

Please sign in to comment.