modified: src/de/dhbwstuttgart/typeinference/unify/freshPlaceholder.java

modified:   src/de/dhbwstuttgart/typeinference/unify/interfaces/UnifyTypeVisitor.java
	modified:   src/de/dhbwstuttgart/typeinference/unify/model/ExtendsType.java
	modified:   src/de/dhbwstuttgart/typeinference/unify/model/FunNType.java
	modified:   src/de/dhbwstuttgart/typeinference/unify/model/PlaceholderType.java
	modified:   src/de/dhbwstuttgart/typeinference/unify/model/ReferenceType.java
	modified:   src/de/dhbwstuttgart/typeinference/unify/model/SuperType.java
	modified:   src/de/dhbwstuttgart/typeinference/unify/model/UnifyType.java

Visitors verallgemeinert
This commit is contained in:
Martin Plümicke 2018-03-28 12:06:23 +02:00
parent 0b680f831d
commit fae26a8f26
8 changed files with 17 additions and 49 deletions

View File

@ -1,47 +1,15 @@
package de.dhbwstuttgart.typeinference.unify; package de.dhbwstuttgart.typeinference.unify;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType; import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
public class freshPlaceholder implements UnifyTypeVisitor {
public ReferenceType visit(ReferenceType refty, HashMap<PlaceholderType,PlaceholderType> ht) { public class freshPlaceholder extends visitUnifyTypeVisitor<HashMap<PlaceholderType,PlaceholderType>> {
return new ReferenceType(refty.getName(),
new TypeParams( @Override
Arrays.stream(refty.getTypeParams().get())
.map(x -> x.accept(this, ht))
.collect(Collectors.toCollection(ArrayList::new))));
}
public PlaceholderType visit(PlaceholderType phty, HashMap<PlaceholderType,PlaceholderType> ht) { public PlaceholderType visit(PlaceholderType phty, HashMap<PlaceholderType,PlaceholderType> ht) {
return ht.get(phty); return ht.get(phty);
} }
public FunNType visit(FunNType funnty, HashMap<PlaceholderType,PlaceholderType> ht) {
return FunNType.getFunNType(
new TypeParams(
Arrays.stream(funnty.getTypeParams().get())
.map(x -> x.accept(this, ht))
.collect(Collectors.toCollection(ArrayList::new)))
);
}
public SuperType visit(SuperType suty, HashMap<PlaceholderType,PlaceholderType> ht) {
return new SuperType(suty.getWildcardedType().accept(this, ht));
}
public ExtendsType visit(ExtendsType extty, HashMap<PlaceholderType,PlaceholderType> ht) {
return new ExtendsType(extty.getWildcardedType().accept(this, ht));
}
} }

View File

@ -8,16 +8,16 @@ import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType; import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
import de.dhbwstuttgart.typeinference.unify.model.SuperType; import de.dhbwstuttgart.typeinference.unify.model.SuperType;
public interface UnifyTypeVisitor { public interface UnifyTypeVisitor<T> {
public ReferenceType visit(ReferenceType refty, HashMap<PlaceholderType,PlaceholderType> ht); public ReferenceType visit(ReferenceType refty, T ht);
public PlaceholderType visit(PlaceholderType phty, HashMap<PlaceholderType,PlaceholderType> ht); public PlaceholderType visit(PlaceholderType phty, T ht);
public FunNType visit(FunNType funnty, HashMap<PlaceholderType,PlaceholderType> ht); public FunNType visit(FunNType funnty, T ht);
public SuperType visit(SuperType suty, HashMap<PlaceholderType,PlaceholderType> ht); public SuperType visit(SuperType suty, T ht);
public ExtendsType visit(ExtendsType extty, HashMap<PlaceholderType,PlaceholderType> ht); public ExtendsType visit(ExtendsType extty, T ht);
} }

View File

@ -13,7 +13,7 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
*/ */
public final class ExtendsType extends WildcardType { public final class ExtendsType extends WildcardType {
public UnifyType accept(UnifyTypeVisitor visitor, HashMap<PlaceholderType,PlaceholderType> ht) { public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht); return visitor.visit(this, ht);
} }

View File

@ -12,7 +12,7 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
*/ */
public class FunNType extends UnifyType { public class FunNType extends UnifyType {
public UnifyType accept(UnifyTypeVisitor visitor, HashMap<PlaceholderType,PlaceholderType> ht) { public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht); return visitor.visit(this, ht);
} }

View File

@ -65,7 +65,7 @@ public final class PlaceholderType extends UnifyType{
IsGenerated = isGenerated; IsGenerated = isGenerated;
} }
public UnifyType accept(UnifyTypeVisitor visitor, HashMap<PlaceholderType,PlaceholderType> ht) { public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht); return visitor.visit(this, ht);
} }

View File

@ -19,7 +19,7 @@ public final class ReferenceType extends UnifyType {
private final int hashCode; private final int hashCode;
public UnifyType accept(UnifyTypeVisitor visitor, HashMap<PlaceholderType,PlaceholderType> ht) { public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht); return visitor.visit(this, ht);
} }

View File

@ -12,7 +12,7 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
*/ */
public final class SuperType extends WildcardType { public final class SuperType extends WildcardType {
public UnifyType accept(UnifyTypeVisitor visitor, HashMap<PlaceholderType,PlaceholderType> ht) { public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht); return visitor.visit(this, ht);
} }

View File

@ -37,7 +37,7 @@ public abstract class UnifyType {
} }
abstract public UnifyType accept(UnifyTypeVisitor visitor, HashMap<PlaceholderType,PlaceholderType> ht); abstract public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht);
/** /**
* Returns the name of the type. * Returns the name of the type.