diff --git a/src/de/dhbwstuttgart/typinference/unify/model/ExtendsType.java b/src/de/dhbwstuttgart/typinference/unify/model/ExtendsType.java index e9dbc7c07..763f3107e 100644 --- a/src/de/dhbwstuttgart/typinference/unify/model/ExtendsType.java +++ b/src/de/dhbwstuttgart/typinference/unify/model/ExtendsType.java @@ -3,6 +3,7 @@ package de.dhbwstuttgart.typinference.unify.model; import java.util.Set; import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; +import de.dhbwstuttgart.typeinference.unifynew.Unifier; public final class ExtendsType extends Type { private Type extendedType; @@ -49,4 +50,9 @@ public final class ExtendsType extends Type { ExtendsType other = (ExtendsType) obj; return other.getExtendedType().equals(extendedType); } + + @Override + public Type applyToTypeParams(Unifier unif) { + return new ExtendsType(extendedType.applyToTypeParams(unif)); + } } diff --git a/src/de/dhbwstuttgart/typinference/unify/model/PlaceholderType.java b/src/de/dhbwstuttgart/typinference/unify/model/PlaceholderType.java index dd40ab23b..53d5eab3f 100644 --- a/src/de/dhbwstuttgart/typinference/unify/model/PlaceholderType.java +++ b/src/de/dhbwstuttgart/typinference/unify/model/PlaceholderType.java @@ -3,6 +3,7 @@ package de.dhbwstuttgart.typinference.unify.model; import java.util.Set; import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; +import de.dhbwstuttgart.typeinference.unifynew.Unifier; public final class PlaceholderType extends Type{ @@ -32,4 +33,9 @@ public final class PlaceholderType extends Type{ return ((PlaceholderType) obj).getName().equals(typeName); } + + @Override + public Type applyToTypeParams(Unifier unif) { + return this; + } } diff --git a/src/de/dhbwstuttgart/typinference/unify/model/SimpleType.java b/src/de/dhbwstuttgart/typinference/unify/model/SimpleType.java index 292289779..370f472bd 100644 --- a/src/de/dhbwstuttgart/typinference/unify/model/SimpleType.java +++ b/src/de/dhbwstuttgart/typinference/unify/model/SimpleType.java @@ -3,11 +3,16 @@ package de.dhbwstuttgart.typinference.unify.model; import java.util.Set; import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; +import de.dhbwstuttgart.typeinference.unifynew.Unifier; public final class SimpleType extends Type { public SimpleType(String name, Type... typeParams) { super(name, new TypeParams(typeParams)); } + + private SimpleType(String name, TypeParams params) { + super(name, params); + } @Override public Set smArg(IFiniteClosure fc) { @@ -36,4 +41,9 @@ public final class SimpleType extends Type { return other.getTypeParams().equals(typeParams); } + + @Override + public Type applyToTypeParams(Unifier unif) { + return new SimpleType(typeName, typeParams.apply(unif)); + } } diff --git a/src/de/dhbwstuttgart/typinference/unify/model/SuperType.java b/src/de/dhbwstuttgart/typinference/unify/model/SuperType.java index 2148e0dfa..6e55a9f33 100644 --- a/src/de/dhbwstuttgart/typinference/unify/model/SuperType.java +++ b/src/de/dhbwstuttgart/typinference/unify/model/SuperType.java @@ -3,6 +3,7 @@ package de.dhbwstuttgart.typinference.unify.model; import java.util.Set; import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; +import de.dhbwstuttgart.typeinference.unifynew.Unifier; public final class SuperType extends Type { @@ -50,4 +51,9 @@ public final class SuperType extends Type { SuperType other = (SuperType) obj; return other.getSuperedType().equals(superedType); } + + @Override + public Type applyToTypeParams(Unifier unif) { + return new SuperType(superedType.applyToTypeParams(unif)); + } } diff --git a/src/de/dhbwstuttgart/typinference/unify/model/Type.java b/src/de/dhbwstuttgart/typinference/unify/model/Type.java index 3da9dbcd0..b929d3c13 100644 --- a/src/de/dhbwstuttgart/typinference/unify/model/Type.java +++ b/src/de/dhbwstuttgart/typinference/unify/model/Type.java @@ -3,6 +3,7 @@ package de.dhbwstuttgart.typinference.unify.model; import java.util.Set; import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; +import de.dhbwstuttgart.typeinference.unifynew.Unifier; public abstract class Type { @@ -31,6 +32,8 @@ public abstract class Type { public abstract Set grArg(IFiniteClosure fc); + public abstract Type applyToTypeParams(Unifier unif); + @Override public String toString() { String params = ""; diff --git a/src/de/dhbwstuttgart/typinference/unify/model/TypeParams.java b/src/de/dhbwstuttgart/typinference/unify/model/TypeParams.java index fe8dff83f..fb8fcb53a 100644 --- a/src/de/dhbwstuttgart/typinference/unify/model/TypeParams.java +++ b/src/de/dhbwstuttgart/typinference/unify/model/TypeParams.java @@ -28,9 +28,11 @@ public final class TypeParams implements Iterable{ return typeParams.length == 0; } - public void apply(Unifier u) { + public TypeParams apply(Unifier unif) { + Type[] newParams = new Type[typeParams.length]; for(int i = 0; i < typeParams.length; i++) - typeParams[i] = u.apply(typeParams[i]); + newParams[i] = typeParams[i].applyToTypeParams(unif); + return new TypeParams(newParams); } public boolean contains(Type t) {