diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java index 90f3db71..0456317c 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java @@ -9,9 +9,7 @@ import org.shedlang.compiler.types.*; import org.shedlang.compiler.util.P; import org.shedlang.compiler.util.PCollectors; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -81,20 +79,19 @@ public class TypeCheckerSubTyping { // TODO: handle type params that are constrained by other type params // TODO: handle unconstrained types - var map = this.typeBounds.keySet().stream() - .map(typeArg -> { - var inferredType = inferTypeArgType(typeArg); + var map = new HashMap<TypeLevelParam, TypeLevelValue>(); - return Map.<TypeLevelParam, TypeLevelValue>entry(typeArg.param(), inferredType); - }) - .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue())); + for (var typeBoundsEntry : this.typeBounds.entrySet()) { + var typeArg = typeBoundsEntry.getKey(); + var typeBounds = typeBoundsEntry.getValue(); + var inferredType = solveBounds(typeBounds); + map.put(typeArg.param(), inferredType); + } return new TypeSubstitutionMap(map); } - private Type inferTypeArgType(TypeArg typeArg) { - var typeParamBounds = this.typeBounds.getOrDefault(typeArg, TypeBounds.EMPTY); - + private Type solveBounds(TypeBounds typeParamBounds) { var lowerBound = Types.BOTTOM; for (var lower : typeParamBounds.lower) { lowerBound = Types.commonSupertype( @@ -116,10 +113,9 @@ public class TypeCheckerSubTyping { throw new IllegalStateException("Incompatible type bounds"); } - var inferredType = typeParamBounds.lower.isEmpty() && !typeParamBounds.upper.isEmpty() + return typeParamBounds.lower.isEmpty() && !typeParamBounds.upper.isEmpty() ? upperBound : lowerBound; - return inferredType; } } |
