forked from JavaTX/JavaCompilerCore
rules
This commit is contained in:
parent
931fb01d74
commit
92d81ac097
@ -15,7 +15,7 @@
|
|||||||
* Test b <. a, a <. b
|
* Test b <. a, a <. b
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
|
||||||
- Transitiven Abschluss von FC bilden um schneller Subtypen bestimmen zu können
|
- Transitiven Abschluss von FC bilden um schneller Subtypen bestimmen zu können
|
||||||
@ -23,8 +23,17 @@
|
|||||||
- Equals der Typen schreiben um instanceof Prüfungen zu vermeiden
|
- Equals der Typen schreiben um instanceof Prüfungen zu vermeiden
|
||||||
|
|
||||||
- Refactoring der Klassen Menge und Pair erlaubt?
|
- Refactoring der Klassen Menge und Pair erlaubt?
|
||||||
|
++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
SPEED UP
|
|
||||||
|
Instanceof wird verwendet da:
|
||||||
|
-> Entscheidung für diese Lösung, da 2-Fach-Visitor oder DoubleDispatch Pattern
|
||||||
|
enorm viele überladene Methoden zur folge hätten, nicht intuitiv wären und die rules in die Typen verschoben hätten.
|
||||||
|
|
||||||
|
Gilt reduce für alle Typen oder nur für simple und tphs? (Vermutlich nur s und tph sonst bräuchte man keine upLow regel)
|
||||||
|
|
||||||
|
|
||||||
|
EED UP
|
||||||
- Anwendungsreihenfolge der Regeln (wahrscheinlichste zuerst, evtl ist nach regel 1 regel 2 nie möglich etc...)
|
- Anwendungsreihenfolge der Regeln (wahrscheinlichste zuerst, evtl ist nach regel 1 regel 2 nie möglich etc...)
|
||||||
- Erase vor Reduce
|
- Erase vor Reduce
|
||||||
- Rechenarm vor rechenintensiv
|
- Rechenarm vor rechenintensiv
|
@ -1,5 +0,0 @@
|
|||||||
package de.dhbwstuttgart.typeinference;
|
|
||||||
|
|
||||||
public interface IPair{
|
|
||||||
|
|
||||||
}
|
|
@ -31,7 +31,7 @@ import de.dhbwstuttgart.syntaxtree.type.WildcardType;
|
|||||||
// Klasse, die ein Paar in der Menge Eq speichern kann
|
// Klasse, die ein Paar in der Menge Eq speichern kann
|
||||||
// ino.end
|
// ino.end
|
||||||
// ino.class.Pair.26540.declaration
|
// ino.class.Pair.26540.declaration
|
||||||
public class Pair implements IPair, Serializable, DeepCloneable
|
public class Pair implements Serializable, DeepCloneable
|
||||||
// ino.end
|
// ino.end
|
||||||
// ino.class.Pair.26540.body
|
// ino.class.Pair.26540.body
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,31 @@
|
|||||||
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.IPair;
|
import java.util.Set;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.Type;
|
||||||
|
|
||||||
public interface IFiniteClosure<T extends IPair> {
|
public interface IFiniteClosure {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all types of the finite closure that are subtypes of the argument.
|
||||||
|
* @return The set of subtypes of the argument.
|
||||||
|
*/
|
||||||
|
public Set<Type> smaller(Type type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all types of the finite closure that are supertypes of the argument.
|
||||||
|
* @return The set of supertypes of the argument.
|
||||||
|
*/
|
||||||
|
public Set<Type> greater(Type type);
|
||||||
|
|
||||||
|
public Set<Type> grArg(Type type);
|
||||||
|
|
||||||
|
public Set<Type> smArg(Type type);
|
||||||
|
|
||||||
|
public boolean isSubtype(Type subT, Type superT);
|
||||||
|
|
||||||
|
public boolean isSupertype(Type superT, Type subT);
|
||||||
|
|
||||||
|
public boolean isInGrArg(Type grArgT, Type t);
|
||||||
|
|
||||||
|
public boolean isInSmArg(Type smArgT, Type t);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.MPair;
|
||||||
|
|
||||||
|
public interface IRuleSet {
|
||||||
|
|
||||||
|
public boolean reduceUp(MPair pair);
|
||||||
|
public boolean reduceLow(MPair pair);
|
||||||
|
public boolean reduceUpLow(MPair pair);
|
||||||
|
public boolean reduceExt(MPair pair);
|
||||||
|
public boolean reduceSup(MPair pair);
|
||||||
|
public boolean reduceEq(MPair pair);
|
||||||
|
public boolean reduce1(MPair pair);
|
||||||
|
public boolean reduce2(MPair pair);
|
||||||
|
|
||||||
|
public boolean erase1(MPair pair);
|
||||||
|
public boolean erase2(MPair pair);
|
||||||
|
public boolean erase3(MPair pair);
|
||||||
|
|
||||||
|
public MPair swap(MPair pair);
|
||||||
|
|
||||||
|
public MPair adapt(MPair pair);
|
||||||
|
public MPair adaptExt(MPair pair);
|
||||||
|
public MPair adaptSup(MPair pair);
|
||||||
|
}
|
69
src/de/dhbwstuttgart/typeinference/unifynew/Mapping.java
Normal file
69
src/de/dhbwstuttgart/typeinference/unifynew/Mapping.java
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unifynew;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.FunN;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.Type;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
import de.dhbwstuttgart.typeinference.exceptions.NotImplementedException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First three bits indicate the meta type:
|
||||||
|
* 000b = 0 = Simpletype
|
||||||
|
* 001b = 1 = Extends
|
||||||
|
* 010b = 2 = Super
|
||||||
|
* 011b = 3 = Type Placeholder
|
||||||
|
* 100b = 4 = Function
|
||||||
|
*
|
||||||
|
* @author DH10STF
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Mapping {
|
||||||
|
|
||||||
|
private static final int ST_MASK = 0;
|
||||||
|
private static final int EXTENDS_MASK = 536870912;
|
||||||
|
private static final int SUPER_MASK = 1073741824;
|
||||||
|
private static final int TPH_MASK = 1610612736;
|
||||||
|
private static final int FUN_MASK = -2147483648;
|
||||||
|
|
||||||
|
private static HashMap<Type, Type> mapping;
|
||||||
|
|
||||||
|
public Set<Type> createMapping(Iterable<Type> types) {
|
||||||
|
mapping = new HashMap<>();
|
||||||
|
|
||||||
|
Iterator<Type> iterator = types.iterator();
|
||||||
|
while(iterator.hasNext() && mapping.size() <= 536870911)
|
||||||
|
createMapping(iterator.next());
|
||||||
|
|
||||||
|
return mapping.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createMapping(Type type) {
|
||||||
|
/*if(type instanceof RefType) {
|
||||||
|
Set<Type> params = ((RefType) type).get_ParaList();
|
||||||
|
params.stream().forEach(x -> createMapping(x));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
int typeId = mapping.size();
|
||||||
|
|
||||||
|
if(type instanceof RefType)
|
||||||
|
typeId |= ST_MASK;
|
||||||
|
else if(type instanceof SuperWildcardType)
|
||||||
|
typeId |= SUPER_MASK;
|
||||||
|
else if(type instanceof ExtendsWildcardType)
|
||||||
|
typeId |= EXTENDS_MASK;
|
||||||
|
else if(type instanceof TypePlaceholder)
|
||||||
|
typeId |= TPH_MASK;
|
||||||
|
else if(type instanceof FunN)
|
||||||
|
typeId |= FUN_MASK;
|
||||||
|
|
||||||
|
//mapping.put(new MType())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
167
src/de/dhbwstuttgart/typeinference/unifynew/RuleSet.java
Normal file
167
src/de/dhbwstuttgart/typeinference/unifynew/RuleSet.java
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unifynew;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IRuleSet;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.ExtendsType;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.MPair;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.MPair.PairOperator;
|
||||||
|
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;
|
||||||
|
|
||||||
|
public class RuleSet implements IRuleSet{
|
||||||
|
|
||||||
|
protected IFiniteClosure finiteClosure;
|
||||||
|
|
||||||
|
public RuleSet(IFiniteClosure fc) {
|
||||||
|
finiteClosure = fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean reduceUp(MPair pair) {
|
||||||
|
if(pair.getPairOp() != PairOperator.SMALLERDOT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type rhsType = pair.getRhsType();
|
||||||
|
if(!(rhsType instanceof SuperType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type lhsType = pair.getLhsType();
|
||||||
|
if(!(lhsType instanceof SimpleType) && !(lhsType instanceof PlaceholderType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pair.setRhsType(((SuperType) rhsType).GetSuperedType());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean reduceLow(MPair pair) {
|
||||||
|
if(pair.getPairOp() != PairOperator.SMALLERDOT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type lhsType = pair.getLhsType();
|
||||||
|
if(!(lhsType instanceof ExtendsType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type rhsType = pair.getRhsType();
|
||||||
|
if(!(rhsType instanceof SimpleType) && !(rhsType instanceof PlaceholderType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pair.setLhsType(((ExtendsType) lhsType).GetExtendedType());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean reduceUpLow(MPair pair) {
|
||||||
|
if(pair.getPairOp() != PairOperator.SMALLERDOT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type lhsType = pair.getLhsType();
|
||||||
|
if(!(lhsType instanceof ExtendsType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type rhsType = pair.getRhsType();
|
||||||
|
if(!(rhsType instanceof SuperType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pair.setLhsType(((ExtendsType) lhsType).GetExtendedType());
|
||||||
|
pair.setRhsType(((SuperType) rhsType).GetSuperedType());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean reduceExt(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean reduceSup(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean reduceEq(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean reduce1(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean reduce2(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean erase1(MPair pair) {
|
||||||
|
if(pair.getPairOp() != PairOperator.SMALLERDOT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type lhsType = pair.getLhsType();
|
||||||
|
if(!(lhsType instanceof SimpleType) && !(lhsType instanceof PlaceholderType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type rhsType = pair.getRhsType();
|
||||||
|
if(!(rhsType instanceof SimpleType) && !(rhsType instanceof PlaceholderType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return finiteClosure.isSubtype(lhsType, rhsType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean erase2(MPair pair) {
|
||||||
|
if(pair.getPairOp() != PairOperator.SMALLERDOTWC)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type lhsType = pair.getLhsType();
|
||||||
|
if(!(lhsType instanceof SimpleType) && !(lhsType instanceof PlaceholderType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type rhsType = pair.getRhsType();
|
||||||
|
if(!(rhsType instanceof ExtendsType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return finiteClosure.isInGrArg(lhsType, ((ExtendsType) rhsType).GetExtendedType());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean erase3(MPair pair) {
|
||||||
|
if(pair.getPairOp() != PairOperator.EQUALSDOT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return pair.getLhsType().equals(pair.getRhsType());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MPair swap(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MPair adapt(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MPair adaptExt(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MPair adaptSup(MPair pair) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,31 +0,0 @@
|
|||||||
package de.dhbwstuttgart.typeinference.unifynew;
|
|
||||||
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.Type;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: Ist es möglich das Mapping austauschbar zu machen indem man ein IMapper Interface erstellt?
|
|
||||||
* Zu einem späteren Zeitpunkt prüfen.
|
|
||||||
*
|
|
||||||
* interface IMapper<T>
|
|
||||||
* Menge<T> createMapping(Menge<Type>)
|
|
||||||
* Menge<Type> resolveMapping(Menge<T>)
|
|
||||||
* bool isTPH(T)
|
|
||||||
* bool isSimpleType(T)
|
|
||||||
* ...
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Mapping Pair To long
|
|
||||||
*
|
|
||||||
* 0-1 Pair Operator
|
|
||||||
* 2-3 LHS type (00 = Simple, 01 = extends, 02 = super, 03 = function)
|
|
||||||
* 4-5 RHS type (00 = Simple, 01 = extends, 02 = super, 03 = function)
|
|
||||||
* 6-35 LHS Simple Type (500.000.000 possible simple types)
|
|
||||||
* 36-64 RHS Simple Type (500.000.000 possible simple types)
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class TypeMapper {
|
|
||||||
public int[] createMapping(Iterable<Type> types) {
|
|
||||||
return new int[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -69,8 +69,10 @@ public class Unify {
|
|||||||
* 2.1 Apply all rules repeatedly except for erase rules. If
|
* 2.1 Apply all rules repeatedly except for erase rules. If
|
||||||
* the application of a rule creates new pairs, check immediately
|
* the application of a rule creates new pairs, check immediately
|
||||||
* against the erase rules.
|
* against the erase rules.
|
||||||
* 2.2 Always use the ordering (IComparable) of the mapped types as the permutation.
|
*
|
||||||
* This is saving the time to generate and test permutations.
|
* Regel funktioniert so nicht
|
||||||
|
* 2.2 Always use the ordering (IComparable) of the mapped types as the permutation.
|
||||||
|
* This is saving the time to generate and test permutations.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
public class ExtendsType extends Type {
|
||||||
|
|
||||||
|
public Type GetExtendedType() {
|
||||||
|
return null;
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
@ -4,32 +4,32 @@ import java.util.HashMap;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.Pair.PairOperator;
|
|
||||||
import de.dhbwstuttgart.typeinference.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.typeinference.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.MPair.PairOperator;
|
||||||
|
|
||||||
public class FiniteClosure<T extends MPair> implements IFiniteClosure<T> {
|
public class FiniteClosure implements IFiniteClosure {
|
||||||
|
|
||||||
private HashMap<MType, Node<MType>> inheritanceGraph;
|
private HashMap<Type, Node<Type>> inheritanceGraph;
|
||||||
|
|
||||||
public FiniteClosure(Set<T> pairs) {
|
public FiniteClosure(Set<MPair> pairs) {
|
||||||
|
|
||||||
inheritanceGraph = new HashMap<MType, Node<MType>>();
|
inheritanceGraph = new HashMap<Type, Node<Type>>();
|
||||||
|
|
||||||
// Build the transitive closure of the inheritance tree
|
// Build the transitive closure of the inheritance tree
|
||||||
for(T pair : pairs) {
|
for(MPair pair : pairs) {
|
||||||
// TODO smaller oder smallerExtends?
|
// TODO smaller oder smallerExtends?
|
||||||
if(pair.GetPairOp() != PairOperator.SmallerExtends)
|
if(pair.getPairOp() != PairOperator.SMALLER)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Add nodes if not already in the graph
|
// Add nodes if not already in the graph
|
||||||
if(!inheritanceGraph.containsKey(pair.GetType1()))
|
if(!inheritanceGraph.containsKey(pair.getLhsType()))
|
||||||
inheritanceGraph.put(pair.GetType1(), new Node<MType>(pair.GetType1()));
|
inheritanceGraph.put(pair.getLhsType(), new Node<Type>(pair.getLhsType()));
|
||||||
if(!inheritanceGraph.containsKey(pair.GetType2()))
|
if(!inheritanceGraph.containsKey(pair.getRhsType()))
|
||||||
inheritanceGraph.put(pair.GetType2(), new Node<MType>(pair.GetType2()));
|
inheritanceGraph.put(pair.getRhsType(), new Node<Type>(pair.getRhsType()));
|
||||||
|
|
||||||
Node<MType> childNode = inheritanceGraph.get(pair.GetType2());
|
Node<Type> childNode = inheritanceGraph.get(pair.getRhsType());
|
||||||
Node<MType> parentNode = inheritanceGraph.get(pair.GetType1());
|
Node<Type> parentNode = inheritanceGraph.get(pair.getLhsType());
|
||||||
|
|
||||||
// Add edge
|
// Add edge
|
||||||
parentNode.AddDescendant(childNode);
|
parentNode.AddDescendant(childNode);
|
||||||
@ -43,7 +43,8 @@ public class FiniteClosure<T extends MPair> implements IFiniteClosure<T> {
|
|||||||
* Returns all types of the finite closure that are subtypes of the argument.
|
* Returns all types of the finite closure that are subtypes of the argument.
|
||||||
* @return The set of subtypes of the argument.
|
* @return The set of subtypes of the argument.
|
||||||
*/
|
*/
|
||||||
public Set<MType> smaller(MType type) {
|
@Override
|
||||||
|
public Set<Type> smaller(Type type) {
|
||||||
if(!inheritanceGraph.containsKey(type))
|
if(!inheritanceGraph.containsKey(type))
|
||||||
return new HashSet<>();
|
return new HashSet<>();
|
||||||
|
|
||||||
@ -54,18 +55,41 @@ public class FiniteClosure<T extends MPair> implements IFiniteClosure<T> {
|
|||||||
* Returns all types of the finite closure that are supertypes of the argument.
|
* Returns all types of the finite closure that are supertypes of the argument.
|
||||||
* @return The set of supertypes of the argument.
|
* @return The set of supertypes of the argument.
|
||||||
*/
|
*/
|
||||||
public Set<MType> greater(MType type) {
|
@Override
|
||||||
|
public Set<Type> greater(Type type) {
|
||||||
if(!inheritanceGraph.containsKey(type))
|
if(!inheritanceGraph.containsKey(type))
|
||||||
return new HashSet<>();
|
return new HashSet<>();
|
||||||
|
|
||||||
return inheritanceGraph.get(type).getContentOfPredecessors();
|
return inheritanceGraph.get(type).getContentOfPredecessors();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<MType> grArg(MType type) {
|
@Override
|
||||||
|
public Set<Type> grArg(Type type) {
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<MType> smArg(MType type) {
|
@Override
|
||||||
|
public Set<Type> smArg(Type type) {
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
||||||
|
public boolean isInGrArg(Type grArgT, Type t) {
|
||||||
|
return grArg(grArgT).contains(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInSmArg(Type smArgT, Type t) {
|
||||||
|
return smArg(smArgT).contains(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,35 +1,48 @@
|
|||||||
package de.dhbwstuttgart.typinference.unify.model;
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
import de.dhbwstuttgart.typeinference.IPair;
|
public class MPair {
|
||||||
import de.dhbwstuttgart.typeinference.Pair.PairOperator;
|
|
||||||
|
|
||||||
public class MPair implements IPair {
|
public enum PairOperator {
|
||||||
|
SMALLER,
|
||||||
private MType type1;
|
SMALLERDOT,
|
||||||
private MType type2;
|
SMALLERDOTWC,
|
||||||
private PairOperator pairOp;
|
EQUALS,
|
||||||
|
EQUALSDOT
|
||||||
public MPair(MType t1, MType t2) {
|
|
||||||
type1 = t1;
|
|
||||||
type2 = t2;
|
|
||||||
pairOp = PairOperator.Smaller;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MPair(MType t1, MType t2, PairOperator op) {
|
private Type type1;
|
||||||
|
private Type type2;
|
||||||
|
private PairOperator pairOp;
|
||||||
|
|
||||||
|
public MPair(Type t1, Type t2) {
|
||||||
|
type1 = t1;
|
||||||
|
type2 = t2;
|
||||||
|
pairOp = PairOperator.SMALLER;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MPair(Type t1, Type t2, PairOperator op) {
|
||||||
type1 = t1;
|
type1 = t1;
|
||||||
type2 = t2;
|
type2 = t2;
|
||||||
pairOp = op;
|
pairOp = op;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MType GetType1() {
|
public Type getLhsType() {
|
||||||
return type1;
|
return type1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MType GetType2() {
|
public Type getRhsType() {
|
||||||
return type2;
|
return type2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PairOperator GetPairOp() {
|
public void setLhsType(Type newLhs) {
|
||||||
|
type1 = newLhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRhsType(Type newRhs) {
|
||||||
|
type2 = newRhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PairOperator getPairOp() {
|
||||||
return pairOp;
|
return pairOp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,9 +55,9 @@ public class MPair implements IPair {
|
|||||||
|
|
||||||
MPair other = (MPair) obj;
|
MPair other = (MPair) obj;
|
||||||
|
|
||||||
return other.GetPairOp() == pairOp
|
return other.getPairOp() == pairOp
|
||||||
&& other.GetType1().equals(type1)
|
&& other.getLhsType().equals(type1)
|
||||||
&& other.GetType2().equals(type2);
|
&& other.getRhsType().equals(type2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,115 +0,0 @@
|
|||||||
package de.dhbwstuttgart.typinference.unify.model;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author DH10STF
|
|
||||||
*
|
|
||||||
* TODO SPEEDUP
|
|
||||||
* - Caching of the results
|
|
||||||
* - Global map from int to mtype und mtype[] array mit int[] austauschen und wenn nötig nachschlagen
|
|
||||||
* - Vorteil: Jeder Typ wäre globally unique -> Memory effizient
|
|
||||||
* - Nachteil: Nachschlagen kostet zeit, Dictionary muss gemanaged werden
|
|
||||||
* - TypeArgs in HashCode berechnung stärker / weniger einbeziehen
|
|
||||||
*/
|
|
||||||
public class MType implements Comparable<MType>{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* First three bits indicate the meta type:
|
|
||||||
* 000b = 0 = Simpletype
|
|
||||||
* 001b = 1 = Extends
|
|
||||||
* 010b = 2 = Super
|
|
||||||
* 011b = 3 = Type Placeholder
|
|
||||||
* 100b = 4 = Function
|
|
||||||
*
|
|
||||||
* Advantages of using a unique identifier for mapping:
|
|
||||||
* - Fast checks (Equality and Membership)
|
|
||||||
* - Easy Hashing
|
|
||||||
* - Memory efficient
|
|
||||||
*/
|
|
||||||
private int identifier = 0;
|
|
||||||
|
|
||||||
private MType[] typeArgs = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to mask the first three bits of an integer.
|
|
||||||
* -53870912d == 1110000...00b
|
|
||||||
*/
|
|
||||||
private final int mask = -53870912;
|
|
||||||
|
|
||||||
public MType(int identifier, MType... typeArgs) {
|
|
||||||
this.identifier = identifier;
|
|
||||||
this.typeArgs = Arrays.copyOf(typeArgs, typeArgs.length);
|
|
||||||
Arrays.sort(typeArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSimpleType() {
|
|
||||||
return (identifier & mask) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isExtendsType() {
|
|
||||||
return (identifier & mask) == 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSuperType() {
|
|
||||||
return (identifier & mask) == 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isTypePlaceholder() {
|
|
||||||
return (identifier & mask) == 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isFunctionType() {
|
|
||||||
return (identifier & mask) == 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getIdentifier() {
|
|
||||||
return identifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MType[] getTypeArgs() {
|
|
||||||
return typeArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if(!(obj instanceof MType))
|
|
||||||
return false;
|
|
||||||
if(obj.hashCode() != hashCode())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
MType other = (MType) obj;
|
|
||||||
|
|
||||||
if(other.getIdentifier() != identifier)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
MType[] otherTypeArgs = other.getTypeArgs();
|
|
||||||
|
|
||||||
if(otherTypeArgs.length != typeArgs.length)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for(int i = 0; i < typeArgs.length; i++)
|
|
||||||
if(!typeArgs[i].equals(otherTypeArgs[i]))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return 17 + 31 * identifier + 31 * typeArgs.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(MType o) {
|
|
||||||
|
|
||||||
// Comparison is insensitive to type arguments.
|
|
||||||
|
|
||||||
if(o.getIdentifier() > identifier)
|
|
||||||
return -1;
|
|
||||||
if(o.getIdentifier() < identifier)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,5 @@
|
|||||||
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
public class PlaceholderType extends Type{
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
public class SimpleType extends Type {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
public class SuperType extends Type {
|
||||||
|
|
||||||
|
public Type GetSuperedType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
57
src/de/dhbwstuttgart/typinference/unify/model/Type.java
Normal file
57
src/de/dhbwstuttgart/typinference/unify/model/Type.java
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
public abstract class Type implements Comparable<Type> {
|
||||||
|
|
||||||
|
protected int identifier = 0;
|
||||||
|
protected Type[] typeArgs = null;
|
||||||
|
|
||||||
|
public int getIdentifier() {
|
||||||
|
return identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type[] getTypeArgs() {
|
||||||
|
return typeArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if(!(obj instanceof Type))
|
||||||
|
return false;
|
||||||
|
if(obj.hashCode() != hashCode())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type other = (Type) obj;
|
||||||
|
|
||||||
|
if(other.getIdentifier() != identifier)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Type[] otherTypeArgs = other.getTypeArgs();
|
||||||
|
|
||||||
|
if(otherTypeArgs.length != typeArgs.length)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for(int i = 0; i < typeArgs.length; i++)
|
||||||
|
if(!typeArgs[i].equals(otherTypeArgs[i]))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return 17 + 31 * identifier + 31 * typeArgs.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Type o) {
|
||||||
|
|
||||||
|
// Comparison is insensitive to type arguments.
|
||||||
|
|
||||||
|
if(o.getIdentifier() > identifier)
|
||||||
|
return -1;
|
||||||
|
if(o.getIdentifier() < identifier)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user