From 12c0cbee94583f16d887e46bd027a3447432c693 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 13 May 2020 12:48:22 +0300 Subject: [PATCH] [FIR2IR] Don't enter same class twice while override searching This commit fixes 21 unmuted BB tests after previous one --- .../kotlin/fir/backend/ConversionUtils.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index c0677e6485b..d27c72e5437 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -289,12 +289,13 @@ internal tailrec fun FirCallableSymbol<*>.deepestMatchingOverriddenSymbol(root: internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes( irBuiltIns: IrBuiltIns, target: IrDeclaration, - result: MutableList = mutableListOf() + result: MutableList = mutableListOf(), + visited: MutableSet = mutableSetOf() ): List { for (superType in superTypes) { val superTypeClass = superType.classOrNull if (superTypeClass is IrClassSymbolImpl) { - superTypeClass.owner.findMatchingOverriddenSymbolsFromThisAndSupertypes(irBuiltIns, target, result) + superTypeClass.owner.findMatchingOverriddenSymbolsFromThisAndSupertypes(irBuiltIns, target, result, visited) } } return result @@ -303,8 +304,13 @@ internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes( private fun IrClass.findMatchingOverriddenSymbolsFromThisAndSupertypes( irBuiltIns: IrBuiltIns, target: IrDeclaration, - result: MutableList + result: MutableList, + visited: MutableSet ): List { + if (this in visited) { + return result + } + visited += this val targetIsPropertyAccessor = target is IrFunction && target.isPropertyAccessor for (declaration in declarations) { if (declaration.isFakeOverride || declaration is IrConstructor) { @@ -355,7 +361,7 @@ private fun IrClass.findMatchingOverriddenSymbolsFromThisAndSupertypes( if (result.isNotEmpty()) { return result } - return findMatchingOverriddenSymbolsFromSupertypes(irBuiltIns, target, result) + return findMatchingOverriddenSymbolsFromSupertypes(irBuiltIns, target, result, visited) } fun isOverriding(