From 2a9f6c224c78772a1fd625c150933d7a3ea9e809 Mon Sep 17 00:00:00 2001 From: Alex Costea Date: Mon, 5 Feb 2024 17:52:49 +0200 Subject: [PATCH] getTypeMinusType refactoring --- .../wiles/checker/inferrers/InferFromWhen.kt | 3 ++- .../wiles/checker/statics/InferrerUtils.kt | 3 ++- .../java/wiles/shared/constants/TypeUtils.kt | 19 ++++++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Wiles Base/src/main/java/wiles/checker/inferrers/InferFromWhen.kt b/Wiles Base/src/main/java/wiles/checker/inferrers/InferFromWhen.kt index eec7ce2e..e557b1a0 100644 --- a/Wiles Base/src/main/java/wiles/checker/inferrers/InferFromWhen.kt +++ b/Wiles Base/src/main/java/wiles/checker/inferrers/InferFromWhen.kt @@ -11,6 +11,7 @@ import wiles.shared.TokenLocation import wiles.shared.constants.Predicates.IS_IDENTIFIER import wiles.shared.constants.Tokens.ELSE_ID import wiles.shared.constants.TypeUtils +import wiles.shared.constants.TypeUtils.getTypeMinusType import wiles.shared.constants.TypeUtils.isFormerSuperTypeOfLatter import wiles.shared.constants.Types.EITHER_ID @@ -25,7 +26,7 @@ class InferFromWhen(details: InferrerDetails) : InferFromStatement(details) { if (former.name == EITHER_ID && former.components.size == 0) throw TypesExhaustedException(newLocation) val result = former.copyRemovingLocation() - isFormerSuperTypeOfLatter(latter, result, getMinus = true) + getTypeMinusType(latter, result) return TypeUtils.removeEmptyEither(result) } diff --git a/Wiles Base/src/main/java/wiles/checker/statics/InferrerUtils.kt b/Wiles Base/src/main/java/wiles/checker/statics/InferrerUtils.kt index 9e4e0b4d..53201988 100644 --- a/Wiles Base/src/main/java/wiles/checker/statics/InferrerUtils.kt +++ b/Wiles Base/src/main/java/wiles/checker/statics/InferrerUtils.kt @@ -28,6 +28,7 @@ import wiles.shared.constants.Tokens.MUTABLE_ID import wiles.shared.constants.Tokens.NOTHING_ID import wiles.shared.constants.Tokens.TYPEDEF_ID import wiles.shared.constants.TypeConstants.NOTHING_TYPE +import wiles.shared.constants.TypeUtils import wiles.shared.constants.TypeUtils.isFormerSuperTypeOfLatter import wiles.shared.constants.TypeUtils.makeEither import wiles.shared.constants.TypeUtils.makeMutable @@ -402,7 +403,7 @@ object InferrerUtils { if(shouldGetType) { val typeToRemove = map[variable.key]!!.type.copy() - isFormerSuperTypeOfLatter(typeToRemove, type, getMinus = true) + TypeUtils.getTypeMinusType(typeToRemove, type) type = removeEmptyEither(type) } continue diff --git a/Wiles Base/src/main/java/wiles/shared/constants/TypeUtils.kt b/Wiles Base/src/main/java/wiles/shared/constants/TypeUtils.kt index 884997b5..5a52e928 100644 --- a/Wiles Base/src/main/java/wiles/shared/constants/TypeUtils.kt +++ b/Wiles Base/src/main/java/wiles/shared/constants/TypeUtils.kt @@ -48,6 +48,22 @@ object TypeUtils { supertype : JSONStatement, subtype : JSONStatement, unboxGenerics : Boolean = true, //should generics match? genericTypes : GenericTypesMap? = null, + ): Boolean + { + return isFormerSuperTypeOfLatter(supertype,subtype,unboxGenerics,genericTypes,getMinus = false) + } + + fun getTypeMinusType(supertype : JSONStatement, subtype : JSONStatement, + unboxGenerics : Boolean = true, //should generics match? + genericTypes : GenericTypesMap? = null) : Boolean + { + return isFormerSuperTypeOfLatter(supertype,subtype,unboxGenerics,genericTypes,getMinus = true) + } + + private fun isFormerSuperTypeOfLatter( + supertype : JSONStatement, subtype : JSONStatement, + unboxGenerics : Boolean = true, //should generics match? + genericTypes : GenericTypesMap? = null, getMinus : Boolean = false, ): Boolean { assert(supertype.syntaxType == SyntaxType.TYPE) @@ -79,7 +95,8 @@ object TypeUtils { return if(isFormerSuperTypeOfLatter(genericTypes[genName]!!.statement, subtype, unboxGenerics = false, genericTypes = genericTypes) && !isDeclaration) { genericTypes[genName] = GenericTypeValue(genericTypes[genName]!!.statement, - true, false) + occurredMultipleTimes = true, declarationReached = false + ) true } else if(genericTypes[genName]?.declarationReached != true && isFormerSuperTypeOfLatter(subtype,