From 933913f816ea34d10a3c2904c46c7e59498f00fa Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Mar 2024 14:18:26 +0000 Subject: Convert to imperative loop --- .../compiler/typechecker/TypeCheckerSubTyping.java | 24 +++++++++------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'src/main/java') 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(); - return Map.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; } } -- cgit v1.2.3