diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-03-02 14:18:26 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-03-02 14:18:26 +0000 |
| commit | 933913f816ea34d10a3c2904c46c7e59498f00fa (patch) | |
| tree | 00a094dd6b5f937bafc0826bffcab3e005c20dfa /src/main/java | |
| parent | daf4e4df6d06a2ec498e266f83cc9441c8075387 (diff) | |
Convert to imperative loop
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; } } |
