Skip to content

Commit

Permalink
start testing EnumDeclarationContext
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Aug 20, 2015
1 parent 84bbe03 commit 535dd70
Show file tree
Hide file tree
Showing 20 changed files with 542 additions and 58 deletions.
11 changes: 11 additions & 0 deletions src/main/java/me/tomassetti/symbolsolver/javaparser/Navigator.java
Expand Up @@ -37,6 +37,17 @@ public static ClassOrInterfaceDeclaration demandClass(CompilationUnit cu, String
return cd;
}

public static EnumDeclaration demandEnum(CompilationUnit cu, String name) {
Optional<TypeDeclaration> res = findType(cu, name);
if (!res.isPresent()) {
throw new IllegalStateException("No type found");
}
if (!(res.get() instanceof EnumDeclaration)){
throw new IllegalStateException("Type is not an enum");
}
return (EnumDeclaration) res.get();
}

public static MethodDeclaration demandMethod(ClassOrInterfaceDeclaration cd, String name) {
MethodDeclaration found = null;
for (BodyDeclaration bd : cd.getMembers()) {
Expand Down
@@ -1,4 +1,4 @@
package me.tomassetti.symbolsolver.model;
package me.tomassetti.symbolsolver.model.declarations;

import me.tomassetti.symbolsolver.model.declarations.ValueDeclaration;

Expand Down
Expand Up @@ -2,7 +2,6 @@

import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.type.PrimitiveType;
import com.github.javaparser.ast.type.Type;
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;

Expand Down
@@ -1,17 +1,13 @@
package me.tomassetti.symbolsolver.model.declarations;

import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.*;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import me.tomassetti.symbolsolver.model.Context;
import me.tomassetti.symbolsolver.model.FieldDeclaration;
import me.tomassetti.symbolsolver.model.SymbolReference;
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.usages.MethodUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Optional;

Expand Down
Expand Up @@ -4,7 +4,6 @@
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;

import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;

Expand Down
Expand Up @@ -33,7 +33,7 @@ public static Context getContext(Node node){
} else if (node instanceof MethodCallExpr) {
return new MethodCallExprContext((MethodCallExpr)node);
} else if (node instanceof EnumDeclaration) {
throw new UnsupportedOperationException();
return new EnumDeclarationContext((EnumDeclaration)node);
} else if (node instanceof FieldAccessExpr) {
return new FieldAccessContext((FieldAccessExpr)node);
} else {
Expand Down
Expand Up @@ -5,6 +5,7 @@
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.declarations.ValueDeclaration;
import me.tomassetti.symbolsolver.model.javaparser.JavaParserFactory;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;

import java.util.Optional;

Expand Down Expand Up @@ -32,6 +33,16 @@ public int hashCode() {
return wrappedNode != null ? wrappedNode.hashCode() : 0;
}

@Override
public Optional<TypeUsage> solveGenericType(String name, TypeSolver typeSolver) {
Context parent = getParent();
if (parent == null) {
return Optional.empty();
} else {
return parent.solveGenericType(name, typeSolver);
}
}

public AbstractJavaParserContext(N wrappedNode) {
if (wrappedNode == null) {
throw new NullPointerException();
Expand Down
Expand Up @@ -100,7 +100,7 @@ public Optional<TypeUsage> solveGenericType(String name, TypeSolver typeSolver)
return Optional.of(new TypeUsageOfTypeParameter(new JavaParserTypeParameter(tp)));
}
}
return Optional.empty();
return getParent().solveGenericType(name, typeSolver);
}

@Override
Expand Down
@@ -1,18 +1,15 @@
package me.tomassetti.symbolsolver.model.javaparser.contexts;

import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.*;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.EnumConstantDeclaration;
import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.ast.body.FieldDeclaration;
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.declarations.ValueDeclaration;
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.javaparser.JavaParserFactory;
import me.tomassetti.symbolsolver.model.javaparser.UnsolvedTypeException;
import me.tomassetti.symbolsolver.model.javaparser.declarations.*;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeParameter;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -31,7 +28,14 @@ public EnumDeclarationContext(EnumDeclaration wrappedNode) {
public SymbolReference<? extends ValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) {
if (typeSolver == null) throw new IllegalArgumentException();

// first among declared fields
// among constants
for (EnumConstantDeclaration constant : wrappedNode.getEntries()) {
if (constant.getName().equals(name)) {
return SymbolReference.solved(new JavaParserEnumConstantDeclaration(constant));
}
}

// among declared fields
for (BodyDeclaration member : wrappedNode.getMembers()){
if (member instanceof FieldDeclaration) {
SymbolDeclarator symbolDeclarator = JavaParserFactory.getSymbolDeclarator(member, typeSolver);
Expand Down Expand Up @@ -66,12 +70,7 @@ public Optional<Value> solveSymbolAsValue(String name, TypeSolver typeSolver) {
}

@Override
public Optional<TypeUsage> solveGenericType(String name, TypeSolver typeSolver) {
return Optional.empty();
}

@Override
public SymbolReference<TypeDeclaration> solveType(String name, TypeSolver typeSolver) {
public SymbolReference<me.tomassetti.symbolsolver.model.declarations.TypeDeclaration> solveType(String name, TypeSolver typeSolver) {
if (this.wrappedNode.getName().equals(name)){
return SymbolReference.solved(new JavaParserEnumDeclaration(this.wrappedNode));
}
Expand All @@ -94,8 +93,8 @@ public SymbolReference<TypeDeclaration> solveType(String name, TypeSolver typeSo
}

@Override
public SymbolReference<MethodDeclaration> solveMethod(String name, List<TypeUsage> parameterTypes, TypeSolver typeSolver) {
List<MethodDeclaration> candidateMethods = new ArrayList<>();
public SymbolReference<me.tomassetti.symbolsolver.model.declarations.MethodDeclaration> solveMethod(String name, List<TypeUsage> parameterTypes, TypeSolver typeSolver) {
List<me.tomassetti.symbolsolver.model.declarations.MethodDeclaration> candidateMethods = new ArrayList<>();
for (BodyDeclaration member : this.wrappedNode.getMembers()) {
if (member instanceof com.github.javaparser.ast.body.MethodDeclaration) {
com.github.javaparser.ast.body.MethodDeclaration method = (com.github.javaparser.ast.body.MethodDeclaration)member;
Expand Down
Expand Up @@ -7,9 +7,8 @@
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import jdk.nashorn.internal.ir.Symbol;
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.FieldDeclaration;
import me.tomassetti.symbolsolver.model.declarations.FieldDeclaration;
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.javaparser.JavaParserFactory;
Expand Down
@@ -0,0 +1,58 @@
package me.tomassetti.symbolsolver.model.javaparser.declarations;

import com.github.javaparser.ast.body.EnumDeclaration;
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.declarations.ValueDeclaration;

/**
* Created by federico on 21/08/15.
*/
public class JavaParserEnumConstantDeclaration implements ValueDeclaration {

public JavaParserEnumConstantDeclaration(com.github.javaparser.ast.body.EnumConstantDeclaration wrappedNode) {
this.wrappedNode = wrappedNode;
}

private com.github.javaparser.ast.body.EnumConstantDeclaration wrappedNode;

@Override
public TypeDeclaration getType(TypeSolver typeSolver) {
return 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;
}

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

@Override
public boolean isInterface() {
return false;
}
}
Expand Up @@ -6,16 +6,12 @@
import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.declarations.ClassOrInterfaceDeclaration;
import me.tomassetti.symbolsolver.model.declarations.EnumDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.declarations.ValueDeclaration;
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.javaparser.JavaParserFactory;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
* Created by federico on 30/07/15.
Expand Down
Expand Up @@ -2,14 +2,10 @@

import com.github.javaparser.ast.body.VariableDeclarator;
import me.tomassetti.symbolsolver.JavaParserFacade;
import me.tomassetti.symbolsolver.model.FieldDeclaration;
import me.tomassetti.symbolsolver.model.TypeParameter;
import me.tomassetti.symbolsolver.model.declarations.FieldDeclaration;
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.usages.TypeUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;

import java.util.Optional;

/**
* Created by federico on 04/08/15.
Expand Down
Expand Up @@ -3,7 +3,7 @@
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.TypeParameter;
import me.tomassetti.symbolsolver.model.Context;
import me.tomassetti.symbolsolver.model.FieldDeclaration;
import me.tomassetti.symbolsolver.model.declarations.FieldDeclaration;
import me.tomassetti.symbolsolver.model.SymbolReference;
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
Expand Down
Expand Up @@ -8,10 +8,7 @@
import javassist.bytecode.BadBytecode;
import javassist.bytecode.SignatureAttribute;
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.declarations.ClassOrInterfaceDeclaration;
import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.declarations.ValueDeclaration;
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.javassist.contexts.JavassistMethodContext;
import me.tomassetti.symbolsolver.model.usages.MethodUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;
Expand Down
@@ -1,24 +1,13 @@
package me.tomassetti.symbolsolver.model.javassist;

import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.FieldDeclaration;
import javassist.CtField;
import javassist.CtMethod;
import javassist.NotFoundException;
import me.tomassetti.symbolsolver.model.Context;
import me.tomassetti.symbolsolver.model.TypeParameter;
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
import me.tomassetti.symbolsolver.model.declarations.ParameterDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.usages.MethodUsage;

import java.util.List;

/**
* Created by federico on 01/08/15.
*/
public class JavassistFieldDeclaration implements me.tomassetti.symbolsolver.model.FieldDeclaration {
public class JavassistFieldDeclaration implements me.tomassetti.symbolsolver.model.declarations.FieldDeclaration {
public JavassistFieldDeclaration(CtField ctField, TypeSolver typeSolver) {
this.ctField = ctField;
this.typeSolver = typeSolver;
Expand Down
Expand Up @@ -3,10 +3,7 @@
import com.github.javaparser.ast.Node;
import me.tomassetti.symbolsolver.JavaParserFacade;
import me.tomassetti.symbolsolver.model.*;
import me.tomassetti.symbolsolver.model.declarations.ClassOrInterfaceDeclaration;
import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.declarations.ValueDeclaration;
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.usages.MethodUsage;
import me.tomassetti.symbolsolver.model.usages.NullTypeUsage;
import me.tomassetti.symbolsolver.model.usages.TypeUsageOfTypeDeclaration;
Expand Down
@@ -1,6 +1,6 @@
package me.tomassetti.symbolsolver.model.reflection;

import me.tomassetti.symbolsolver.model.FieldDeclaration;
import me.tomassetti.symbolsolver.model.declarations.FieldDeclaration;
import me.tomassetti.symbolsolver.model.TypeSolver;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;

Expand Down

0 comments on commit 535dd70

Please sign in to comment.