aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-03-02 14:18:26 +0000
committerMichael Williamson <mike@zwobble.org>2024-03-02 14:18:26 +0000
commit933913f816ea34d10a3c2904c46c7e59498f00fa (patch)
tree00a094dd6b5f937bafc0826bffcab3e005c20dfa /src/main/java
parentdaf4e4df6d06a2ec498e266f83cc9441c8075387 (diff)
Convert to imperative loop
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java24
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;
}
}