From 06fc58bacedc66aa5e142fec7df576e41ecab388 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 29 Dec 2023 11:36:38 +0000 Subject: Extract isVariantSubtype() --- .../compiler/typechecker/TypeCheckerSubTyping.java | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 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 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) supertypeConstructedType, Sources.NULL); - return superTypeInfo.variants().stream() - .anyMatch(supertypeVariant -> isSubType(subtype, supertypeVariant.type(), context)); + var superTypeInfo = context.sumTypeInfo( + (ConstructedType) 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; -- cgit v1.2.3