Skip to content

Commit

Permalink
modules: extraction of the model module
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Nov 13, 2015
1 parent f4b07b1 commit 4a18b1e
Show file tree
Hide file tree
Showing 104 changed files with 532 additions and 451 deletions.
5 changes: 5 additions & 0 deletions java-symbol-solver-core/pom.xml
Expand Up @@ -57,6 +57,11 @@
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>me.tomassetti</groupId>
<artifactId>java-symbol-solver-model</artifactId>
<version>0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
Expand Up @@ -13,8 +13,9 @@
import com.github.javaparser.ast.stmt.Statement;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsageImpl;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
import me.tomassetti.symbolsolver.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.resolution.javaparser.JavaParserFacade;

import java.io.File;
Expand Down
Expand Up @@ -3,8 +3,9 @@
import me.tomassetti.symbolsolver.model.declarations.ClassDeclaration;
import me.tomassetti.symbolsolver.model.declarations.InterfaceDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsage;
import me.tomassetti.symbolsolver.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsageImpl;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -33,7 +34,7 @@ public final List<ReferenceTypeUsage> getAllSuperClasses() {
}
}
TypeDeclaration objectType = typeSolver().solveType(Object.class.getCanonicalName());
ReferenceTypeUsage objectRef = new ReferenceTypeUsage(objectType, typeSolver());
ReferenceTypeUsage objectRef = new ReferenceTypeUsageImpl(objectType, typeSolver());
superclasses.add(objectRef);
return superclasses.stream().filter((s) -> s.getTypeDeclaration().isClass()).collect(Collectors.toList());
}
Expand Down
Expand Up @@ -2,9 +2,9 @@

import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.resolution.SymbolReference;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
import me.tomassetti.symbolsolver.resolution.SymbolReference;
import me.tomassetti.symbolsolver.resolution.TypeSolver;

import java.util.List;

Expand Down
Expand Up @@ -3,11 +3,12 @@
import me.tomassetti.symbolsolver.model.declarations.MethodAmbiguityException;
import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
import me.tomassetti.symbolsolver.model.invokations.MethodUsage;
import me.tomassetti.symbolsolver.model.resolution.SymbolReference;
import me.tomassetti.symbolsolver.model.resolution.TypeParameter;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsageImpl;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
import me.tomassetti.symbolsolver.resolution.SymbolReference;
import me.tomassetti.symbolsolver.resolution.TypeParameter;
import me.tomassetti.symbolsolver.resolution.TypeSolver;
import me.tomassetti.symbolsolver.reflectionmodel.ReflectionClassDeclaration;

import java.util.HashMap;
Expand Down Expand Up @@ -110,7 +111,7 @@ private static TypeUsage replaceTypeParam(TypeUsage typeUsage, TypeParameter tp,
} else if (bounds.size() == 1) {
return bounds.get(0).getType();
} else {
return new ReferenceTypeUsage(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
return new ReferenceTypeUsageImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
}
}
}
Expand Down
@@ -0,0 +1,79 @@
package me.tomassetti.symbolsolver.model.typesystem;

import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.resolution.TypeParameter;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.resolution.javaparser.LambdaArgumentTypeUsagePlaceholder;
import me.tomassetti.symbolsolver.resolution.javaparser.declarations.JavaParserTypeVariableDeclaration;

import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;

// TODO Remove references to typeSolver: it is needed to instantiate other instances of ReferenceTypeUsage
// and to get the Object type declaration
public class ReferenceTypeUsageImpl extends ReferenceTypeUsage {

@Override
protected ReferenceTypeUsage create(TypeDeclaration typeDeclaration, List<TypeUsage> typeParametersCorrected, TypeSolver typeSolver) {
return new ReferenceTypeUsageImpl(typeDeclaration, typeParametersCorrected, typeSolver);
}

@Override
protected ReferenceTypeUsage create(TypeDeclaration typeDeclaration, TypeSolver typeSolver) {
return new ReferenceTypeUsageImpl(typeDeclaration, typeSolver);
}

public ReferenceTypeUsageImpl(TypeDeclaration typeDeclaration, TypeSolver typeSolver) {
super(typeDeclaration, typeSolver);
}

public ReferenceTypeUsageImpl(TypeDeclaration typeDeclaration, List<TypeUsage> typeParameters, TypeSolver typeSolver) {
super(typeDeclaration, typeParameters, typeSolver);
}

@Override
public TypeParameter asTypeParameter() {
if (this.typeDeclaration instanceof JavaParserTypeVariableDeclaration) {
JavaParserTypeVariableDeclaration javaParserTypeVariableDeclaration = (JavaParserTypeVariableDeclaration) this.typeDeclaration;
return javaParserTypeVariableDeclaration.asTypeParameter();
}
throw new UnsupportedOperationException(this.typeDeclaration.getClass().getCanonicalName());
}

@Override
public boolean isAssignableBy(TypeUsage other) {
if (other instanceof NullTypeUsage) {
return !this.isPrimitive();
}
// consider boxing
if (other.isPrimitive()) {
if (this.getQualifiedName().equals(Object.class.getCanonicalName())) {
return true;
} else {
return isCorrespondingBoxingType(other.describe());
}
}
if (other instanceof LambdaArgumentTypeUsagePlaceholder) {
return this.getQualifiedName().equals(Predicate.class.getCanonicalName()) || this.getQualifiedName().equals(Function.class.getCanonicalName());
} else if (other instanceof ReferenceTypeUsageImpl) {
ReferenceTypeUsageImpl otherRef = (ReferenceTypeUsageImpl) other;
if (compareConsideringTypeParameters(otherRef)) {
return true;
}
for (ReferenceTypeUsage otherAncestor : otherRef.getAllAncestors()) {
if (compareConsideringTypeParameters(otherAncestor)) {
return true;
}
}
return false;
} else if (other.isTypeVariable()) {
// TODO look bounds...
return true;
} else {
return false;
}
}


}
Expand Up @@ -3,10 +3,10 @@
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.resolution.Context;
import me.tomassetti.symbolsolver.model.resolution.SymbolReference;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
import me.tomassetti.symbolsolver.resolution.Context;
import me.tomassetti.symbolsolver.resolution.SymbolReference;
import me.tomassetti.symbolsolver.resolution.TypeSolver;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
Expand Down
Expand Up @@ -5,13 +5,14 @@
import me.tomassetti.symbolsolver.logic.MethodResolutionLogic;
import me.tomassetti.symbolsolver.model.declarations.*;
import me.tomassetti.symbolsolver.model.invokations.MethodUsage;
import me.tomassetti.symbolsolver.model.resolution.Context;
import me.tomassetti.symbolsolver.model.resolution.SymbolReference;
import me.tomassetti.symbolsolver.model.resolution.TypeParameter;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.NullTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsageImpl;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
import me.tomassetti.symbolsolver.resolution.Context;
import me.tomassetti.symbolsolver.resolution.SymbolReference;
import me.tomassetti.symbolsolver.resolution.TypeParameter;
import me.tomassetti.symbolsolver.resolution.TypeSolver;
import me.tomassetti.symbolsolver.resolution.javaparser.LambdaArgumentTypeUsagePlaceholder;
import me.tomassetti.symbolsolver.resolution.javaparser.UnsolvedSymbolException;

Expand Down Expand Up @@ -52,19 +53,19 @@ protected TypeSolver typeSolver() {
public List<ReferenceTypeUsage> getAllAncestors() {
List<ReferenceTypeUsage> ancestors = new LinkedList<>();
if (getSuperClass() != null) {
ReferenceTypeUsage superClass = getSuperClass();
ReferenceTypeUsageImpl superClass = getSuperClass();
ancestors.add(superClass);
ancestors.addAll(getSuperClass().getAllAncestors());
}
ancestors.addAll(getAllInterfaces().stream().map((i) -> new ReferenceTypeUsage(i, typeSolver)).collect(Collectors.<ReferenceTypeUsage>toList()));
ancestors.addAll(getAllInterfaces().stream().map((i) -> new ReferenceTypeUsageImpl(i, typeSolver)).collect(Collectors.<ReferenceTypeUsageImpl>toList()));
for (int i = 0; i < ancestors.size(); i++) {
ReferenceTypeUsage ancestor = ancestors.get(i);
if (ancestor.hasName() && ancestor.getQualifiedName().equals(Object.class.getCanonicalName())) {
ancestors.remove(i);
i--;
}
}
ReferenceTypeUsage object = new ReferenceTypeUsage(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
ReferenceTypeUsageImpl object = new ReferenceTypeUsageImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
ancestors.add(object);
return ancestors;
}
Expand Down Expand Up @@ -129,7 +130,7 @@ public String toString() {

public TypeUsage getUsage(Node node) {

return new ReferenceTypeUsage(this, typeSolver);
return new ReferenceTypeUsageImpl(this, typeSolver);
}

@Override
Expand Down Expand Up @@ -204,8 +205,8 @@ public boolean isAssignableBy(TypeUsage typeUsage) {
if (typeUsage.describe().equals(getQualifiedName())) {
return true;
}
if (typeUsage instanceof ReferenceTypeUsage) {
ReferenceTypeUsage otherTypeDeclaration = (ReferenceTypeUsage) typeUsage;
if (typeUsage instanceof ReferenceTypeUsageImpl) {
ReferenceTypeUsageImpl otherTypeDeclaration = (ReferenceTypeUsageImpl) typeUsage;
return otherTypeDeclaration.getTypeDeclaration().canBeAssignedTo(this);
}

Expand Down Expand Up @@ -277,7 +278,7 @@ public boolean hasField(String name) {
return true;
}
}
ReferenceTypeUsage superclass = getSuperClass();
ReferenceTypeUsageImpl superclass = getSuperClass();
if (superclass == null) {
return false;
} else {
Expand All @@ -287,7 +288,7 @@ public boolean hasField(String name) {

@Override
public boolean isAssignableBy(TypeDeclaration other) {
return isAssignableBy(new ReferenceTypeUsage(other, typeSolver));
return isAssignableBy(new ReferenceTypeUsageImpl(other, typeSolver));
}

@Override
Expand Down Expand Up @@ -321,7 +322,7 @@ public boolean isClass() {
}

@Override
public ReferenceTypeUsage getSuperClass() {
public ReferenceTypeUsageImpl getSuperClass() {
if (clazz.getGenericSuperclass() == null) {
return null;
}
Expand All @@ -331,9 +332,9 @@ public ReferenceTypeUsage getSuperClass() {
List<TypeUsage> typeParameters = Arrays.stream(parameterizedType.getActualTypeArguments())
.map((t) -> ReflectionFactory.typeUsageFor(t, typeSolver))
.collect(Collectors.toList());
return new ReferenceTypeUsage(new ReflectionClassDeclaration(clazz.getSuperclass(), typeSolver), typeParameters, typeSolver);
return new ReferenceTypeUsageImpl(new ReflectionClassDeclaration(clazz.getSuperclass(), typeSolver), typeParameters, typeSolver);
}
return new ReferenceTypeUsage(new ReflectionClassDeclaration(clazz.getSuperclass(), typeSolver), typeSolver);
return new ReferenceTypeUsageImpl(new ReflectionClassDeclaration(clazz.getSuperclass(), typeSolver), typeSolver);
}

@Override
Expand Down
@@ -1,13 +1,10 @@
package me.tomassetti.symbolsolver.reflectionmodel;

import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.*;
import me.tomassetti.symbolsolver.resolution.TypeSolver;

import java.lang.reflect.*;

/**
* Created by federico on 02/08/15.
*/
public class ReflectionFactory {
public static TypeUsage typeUsageFor(Class<?> clazz, TypeSolver typeSolver) {
if (clazz.isArray()) {
Expand All @@ -19,17 +16,17 @@ public static TypeUsage typeUsageFor(Class<?> clazz, TypeSolver typeSolver) {
return PrimitiveTypeUsage.byName(clazz.getName());
}
} else if (clazz.isInterface()) {
return new ReferenceTypeUsage(new ReflectionInterfaceDeclaration(clazz, typeSolver), typeSolver);
return new ReferenceTypeUsageImpl(new ReflectionInterfaceDeclaration(clazz, typeSolver), typeSolver);
} else {
return new ReferenceTypeUsage(new ReflectionClassDeclaration(clazz, typeSolver), typeSolver);
return new ReferenceTypeUsageImpl(new ReflectionClassDeclaration(clazz, typeSolver), typeSolver);
}
}

public static TypeUsage typeUsageFor(Type type, TypeSolver typeSolver) {
if (type instanceof TypeVariable) {
TypeVariable tv = (TypeVariable) type;
// TODO the false value is arbitrary...
me.tomassetti.symbolsolver.resolution.TypeParameter typeParameter = new ReflectionTypeParameter(tv, true);
me.tomassetti.symbolsolver.model.resolution.TypeParameter typeParameter = new ReflectionTypeParameter(tv, true);
return new TypeParameterUsage(typeParameter);
} else if (type instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) type;
Expand All @@ -51,9 +48,9 @@ public static TypeUsage typeUsageFor(Type type, TypeSolver typeSolver) {
} else if (c.isArray()) {
return new ArrayTypeUsage(typeUsageFor(c.getComponentType(), typeSolver));
} else if (c.isInterface()) {
return new ReferenceTypeUsage(new ReflectionInterfaceDeclaration(c, typeSolver), typeSolver);
return new ReferenceTypeUsageImpl(new ReflectionInterfaceDeclaration(c, typeSolver), typeSolver);
} else {
return new ReferenceTypeUsage(new ReflectionClassDeclaration(c, typeSolver), typeSolver);
return new ReferenceTypeUsageImpl(new ReflectionClassDeclaration(c, typeSolver), typeSolver);
}
} else if (type instanceof GenericArrayType) {
GenericArrayType genericArrayType = (GenericArrayType) type;
Expand Down
@@ -1,8 +1,8 @@
package me.tomassetti.symbolsolver.reflectionmodel;

import me.tomassetti.symbolsolver.model.declarations.FieldDeclaration;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
import me.tomassetti.symbolsolver.resolution.TypeSolver;

import java.lang.reflect.Field;

Expand Down

0 comments on commit 4a18b1e

Please sign in to comment.