From 516484c90523384abe362f25cec8dda9da1f5c27 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 14 Mar 2016 16:14:25 +0300 Subject: [PATCH] Use DFS in isFunctionTypeOrSubtype To prevent exponential working time on weird hierarchies --- .../kotlin/builtins/functionTypes.kt | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt index cb54a82a342..139524d0836 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt @@ -28,10 +28,27 @@ import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.utils.DFS import java.util.* val KotlinType.isFunctionTypeOrSubtype: Boolean - get() = isFunctionType || constructor.supertypes.any(KotlinType::isFunctionTypeOrSubtype) + get() = isFunctionType || DFS.dfsFromNode( + this, + DFS.Neighbors { it.constructor.supertypes }, + DFS.VisitedWithSet(), + object : DFS.AbstractNodeHandler() { + private var result = false + + override fun beforeChildren(current: KotlinType): Boolean { + if (current.isFunctionType) { + result = true + } + return !result + } + + override fun result() = result + } + ) val KotlinType.isFunctionType: Boolean get() {