forked from JavaTX/JavaCompilerCore
visitor pattern for grarg smarg
This commit is contained in:
parent
6b709f0198
commit
28e0e8e94d
@ -1,6 +1,11 @@
|
|||||||
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.ExtendsType;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.PlaceholderType;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.SimpleType;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.SuperType;
|
||||||
import de.dhbwstuttgart.typinference.unify.model.Type;
|
import de.dhbwstuttgart.typinference.unify.model.Type;
|
||||||
|
|
||||||
public interface IFiniteClosure {
|
public interface IFiniteClosure {
|
||||||
@ -18,16 +23,19 @@ public interface IFiniteClosure {
|
|||||||
public Set<Type> greater(Type type);
|
public Set<Type> greater(Type type);
|
||||||
|
|
||||||
public Set<Type> grArg(Type type);
|
public Set<Type> grArg(Type type);
|
||||||
|
|
||||||
public Set<Type> smArg(Type type);
|
public Set<Type> smArg(Type type);
|
||||||
|
|
||||||
public boolean isSubtype(Type subT, Type superT);
|
public Set<Type> grArg(SimpleType type);
|
||||||
|
public Set<Type> smArg(SimpleType type);
|
||||||
|
|
||||||
public boolean isSupertype(Type superT, Type subT);
|
public Set<Type> grArg(ExtendsType type);
|
||||||
|
public Set<Type> smArg(ExtendsType type);
|
||||||
|
|
||||||
public boolean isInGrArg(Type grArgT, Type t);
|
public Set<Type> grArg(SuperType type);
|
||||||
|
public Set<Type> smArg(SuperType type);
|
||||||
|
|
||||||
public boolean isInSmArg(Type smArgT, Type t);
|
public Set<Type> grArg(PlaceholderType type);
|
||||||
|
public Set<Type> smArg(PlaceholderType type);
|
||||||
|
|
||||||
public Type getType(String typeName);
|
public Type getType(String typeName);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package de.dhbwstuttgart.typinference.unify.model;
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
|
||||||
public class ExtendsType extends Type {
|
public class ExtendsType extends Type {
|
||||||
private Type extendedType;
|
private Type extendedType;
|
||||||
|
|
||||||
@ -15,4 +19,19 @@ public class ExtendsType extends Type {
|
|||||||
public TypeParams getTypeParams() {
|
public TypeParams getTypeParams() {
|
||||||
return extendedType.getTypeParams();
|
return extendedType.getTypeParams();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "? extends " + extendedType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> smArg(IFiniteClosure fc) {
|
||||||
|
return fc.smArg(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> grArg(IFiniteClosure fc) {
|
||||||
|
return fc.grArg(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,14 +46,12 @@ public class FiniteClosure implements IFiniteClosure {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Set<Type> smaller(Type type) {
|
public Set<Type> smaller(Type type) {
|
||||||
return smaller(type.getName());
|
if(!inheritanceGraph.containsKey(type.getName()))
|
||||||
}
|
|
||||||
|
|
||||||
private Set<Type> smaller(String typeName) {
|
|
||||||
if(!inheritanceGraph.containsKey(typeName))
|
|
||||||
return new HashSet<>();
|
return new HashSet<>();
|
||||||
|
|
||||||
return inheritanceGraph.get(typeName).getContentOfDescendants();
|
Set<Type> result = inheritanceGraph.get(type.getName()).getContentOfDescendants();
|
||||||
|
result.add(type);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -70,53 +68,88 @@ public class FiniteClosure implements IFiniteClosure {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Set<Type> greater(Type type) {
|
public Set<Type> greater(Type type) {
|
||||||
return greater(type.typeName);
|
if(!inheritanceGraph.containsKey(type.getName()))
|
||||||
}
|
|
||||||
|
|
||||||
private Set<Type> greater(String typeName) {
|
|
||||||
if(!inheritanceGraph.containsKey(typeName))
|
|
||||||
return new HashSet<>();
|
return new HashSet<>();
|
||||||
|
|
||||||
return inheritanceGraph.get(typeName).getContentOfPredecessors();
|
Set<Type> result = inheritanceGraph.get(type.getName()).getContentOfPredecessors();
|
||||||
|
result.add(type);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<Type> grArg(Type type) {
|
public Set<Type> grArg(Type type) {
|
||||||
return grArg(type.getName());
|
return type.grArg(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> grArg(SimpleType type) {
|
||||||
|
if(!inheritanceGraph.containsKey(type.getName()))
|
||||||
|
return new HashSet<Type>();
|
||||||
|
|
||||||
|
Set<Type> result = new HashSet<Type>();
|
||||||
|
|
||||||
|
Type t = inheritanceGraph.get(type.getName()).getContent();
|
||||||
|
|
||||||
|
result.add(t);
|
||||||
|
smaller(type).forEach(x -> result.add(new SuperType(x)));
|
||||||
|
greater(type).forEach(x -> result.add(new ExtendsType(x)));
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Type> grArg(String typeName) {
|
@Override
|
||||||
|
public Set<Type> grArg(ExtendsType type) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> grArg(SuperType type) {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> grArg(PlaceholderType type) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<Type> smArg(Type type) {
|
public Set<Type> smArg(Type type) {
|
||||||
return smArg(type.getName());
|
return type.smArg(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Type> smArg(String typeName) {
|
@Override
|
||||||
// TODO Auto-generated method stub
|
public Set<Type> smArg(SimpleType type) {
|
||||||
|
if(!inheritanceGraph.containsKey(type.getName()))
|
||||||
|
return new HashSet<Type>();
|
||||||
|
|
||||||
|
Set<Type> result = new HashSet<Type>();
|
||||||
|
|
||||||
|
Type t = inheritanceGraph.get(type.getName()).getContent();
|
||||||
|
|
||||||
|
result.add(t);
|
||||||
|
smaller(type).forEach(x -> result.add(new ExtendsType(x)));
|
||||||
|
greater(type).forEach(x -> result.add(new ExtendsType(x)));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Type> smArg(ExtendsType type) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSubtype(Type subT, Type superT) {
|
|
||||||
return smaller(superT).contains(subT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSupertype(Type superT, Type subT) {
|
|
||||||
return smaller(superT).contains(subT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInGrArg(Type grArgT, Type t) {
|
public Set<Type> smArg(SuperType type) {
|
||||||
return grArg(grArgT).contains(t);
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInSmArg(Type smArgT, Type t) {
|
public Set<Type> smArg(PlaceholderType type) {
|
||||||
return smArg(smArgT).contains(t);
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,22 @@
|
|||||||
package de.dhbwstuttgart.typinference.unify.model;
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
|
||||||
public class PlaceholderType extends Type{
|
public class PlaceholderType extends Type{
|
||||||
|
|
||||||
public PlaceholderType(String name) {
|
public PlaceholderType(String name) {
|
||||||
typeName = name;
|
typeName = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> smArg(IFiniteClosure fc) {
|
||||||
|
return fc.smArg(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> grArg(IFiniteClosure fc) {
|
||||||
|
return fc.grArg(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,22 @@
|
|||||||
package de.dhbwstuttgart.typinference.unify.model;
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
|
||||||
public class SimpleType extends Type {
|
public class SimpleType extends Type {
|
||||||
public SimpleType(String name, Type... typeParams) {
|
public SimpleType(String name, Type... typeParams) {
|
||||||
this.typeName = name;
|
this.typeName = name;
|
||||||
this.typeParams = new TypeParams(typeParams);
|
this.typeParams = new TypeParams(typeParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> smArg(IFiniteClosure fc) {
|
||||||
|
return fc.smArg(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> grArg(IFiniteClosure fc) {
|
||||||
|
return fc.grArg(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package de.dhbwstuttgart.typinference.unify.model;
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
|
||||||
public class SuperType extends Type {
|
public class SuperType extends Type {
|
||||||
|
|
||||||
private Type superedType;
|
private Type superedType;
|
||||||
@ -21,4 +25,14 @@ public class SuperType extends Type {
|
|||||||
public TypeParams getTypeParams() {
|
public TypeParams getTypeParams() {
|
||||||
return superedType.getTypeParams();
|
return superedType.getTypeParams();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> smArg(IFiniteClosure fc) {
|
||||||
|
return fc.smArg(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Type> grArg(IFiniteClosure fc) {
|
||||||
|
return fc.grArg(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package de.dhbwstuttgart.typinference.unify.model;
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
|
||||||
public abstract class Type {
|
public abstract class Type {
|
||||||
|
|
||||||
@ -34,6 +37,10 @@ public abstract class Type {
|
|||||||
return other.getTypeParams().equals(typeParams);
|
return other.getTypeParams().equals(typeParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract Set<Type> smArg(IFiniteClosure fc);
|
||||||
|
|
||||||
|
public abstract Set<Type> grArg(IFiniteClosure fc);
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
|
Loading…
Reference in New Issue
Block a user