diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-29 11:36:38 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-29 11:36:38 +0000 |
| commit | 06fc58bacedc66aa5e142fec7df576e41ecab388 (patch) | |
| tree | 1feb691d8e4f19377b027886249f673cdf4b9c63 /src/main/java | |
| parent | 30d0819e32a4ba7bdd9f694a8b965d3122dbdd1b (diff) | |
Extract isVariantSubtype()
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java index 49560f38..8e0fb017 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java @@ -24,18 +24,18 @@ public class TypeCheckerSubTyping { if (supertype instanceof SumType supertypeSum) { var superTypeInfo = context.sumTypeInfo(supertypeSum, Sources.NULL); - return superTypeInfo.variants().stream() - .anyMatch(supertypeVariant -> isSubType(subtype, supertypeVariant.type(), context)); + return isVariantSubtype(subtype, superTypeInfo, context); } if ( supertype instanceof ConstructedType<?> supertypeConstructedType && supertypeConstructedType.genericType() instanceof SumType ) { - // TODO: merge with logic for plain sum types - var superTypeInfo = context.sumTypeInfo((ConstructedType<SumType>) supertypeConstructedType, Sources.NULL); - return superTypeInfo.variants().stream() - .anyMatch(supertypeVariant -> isSubType(subtype, supertypeVariant.type(), context)); + var superTypeInfo = context.sumTypeInfo( + (ConstructedType<SumType>) supertypeConstructedType, + Sources.NULL + ); + return isVariantSubtype(subtype, superTypeInfo, context); } if ( @@ -85,6 +85,15 @@ public class TypeCheckerSubTyping { return false; } + private static boolean isVariantSubtype( + Type subtype, + SumTypeInfo superTypeInfo, + TypeCheckerContext context + ) { + return superTypeInfo.variants().stream() + .anyMatch(supertypeVariant -> isSubType(subtype, supertypeVariant.type(), context)); + } + static boolean isSubEffect(Effect subEffect, Effect superEffect, TypeCheckerContext context) { if (subEffect == Effects.NONE) { return true; |
