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 96d11aca8e3..8a3e20e5017 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 @@ -24,6 +24,8 @@ import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolved import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol import org.jetbrains.kotlin.fir.resolve.providers.FirProvider +import org.jetbrains.kotlin.fir.scopes.ProcessorAction +import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.AccessorSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.* @@ -37,10 +39,8 @@ import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.impl.* -import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol -import org.jetbrains.kotlin.ir.symbols.IrSymbol -import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol -import org.jetbrains.kotlin.ir.symbols.IrValueSymbol +import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl +import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.impl.IrClassPublicSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl import org.jetbrains.kotlin.ir.types.* @@ -293,6 +293,26 @@ internal tailrec fun FirCallableSymbol<*>.deepestMatchingOverriddenSymbol(root: return overriddenSymbol.deepestMatchingOverriddenSymbol(this) } +internal fun FirSimpleFunction.generateOverriddenFunctionSymbols( + containingClass: FirClass<*>, + session: FirSession, + scopeSession: ScopeSession, + declarationStorage: Fir2IrDeclarationStorage +): List { + val scope = containingClass.unsubstitutedScope(session, scopeSession) + scope.processFunctionsByName(name) {} + val overriddenSet = mutableSetOf() + scope.processDirectlyOverriddenFunctions(symbol) { + if ((it.fir as FirSimpleFunction).visibility == Visibilities.PRIVATE) { + return@processDirectlyOverriddenFunctions ProcessorAction.NEXT + } + val overridden = declarationStorage.getIrFunctionSymbol(it) + overriddenSet += overridden as IrSimpleFunctionSymbol + ProcessorAction.NEXT + } + return overriddenSet.toList() +} + internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes( irBuiltIns: IrBuiltIns, target: IrDeclaration, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index fd79b29805f..b67b0022c6c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -927,7 +927,7 @@ class Fir2IrDeclarationStorage( firFunctionSymbol is FirNamedFunctionSymbol && firFunctionSymbol.isFakeOverride && firFunctionSymbol.callableId != firFunctionSymbol.overriddenSymbol?.callableId Fir2IrLazySimpleFunction( - components, startOffset, endOffset, parentOrigin, firDeclaration, symbol, isFakeOverride + components, startOffset, endOffset, parentOrigin, firDeclaration, irParent.fir, symbol, isFakeOverride ).apply { parent = irParent } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt index 865d5b83fc0..9b8b36dd48c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt @@ -174,19 +174,10 @@ internal class ClassMemberGenerator( // Scope for primary constructor should be left after class declaration declarationStorage.leaveScope(irFunction) } - if (irFunction is IrSimpleFunction && firFunction != null && containingClass != null) { - val scope = containingClass.unsubstitutedScope(session, scopeSession) - scope.processFunctionsByName(name) {} - val overriddenSet = mutableSetOf() - scope.processDirectlyOverriddenFunctions(firFunction.symbol) { - if ((it.fir as FirSimpleFunction).visibility == Visibilities.PRIVATE) { - return@processDirectlyOverriddenFunctions ProcessorAction.NEXT - } - val overridden = declarationStorage.getIrFunctionSymbol(it) - overriddenSet += overridden as IrSimpleFunctionSymbol - ProcessorAction.NEXT - } - irFunction.overriddenSymbols = overriddenSet.toList() + if (irFunction is IrSimpleFunction && firFunction is FirSimpleFunction && containingClass != null) { + irFunction.overriddenSymbols = firFunction.generateOverriddenFunctionSymbols( + containingClass, session, scopeSession, declarationStorage + ) } } return irFunction diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt index 1e7ecdcde9e..0d6b7c9213b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt @@ -7,12 +7,15 @@ package org.jetbrains.kotlin.fir.lazy import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter -import org.jetbrains.kotlin.fir.backend.findMatchingOverriddenSymbolsFromSupertypes +import org.jetbrains.kotlin.fir.backend.generateOverriddenFunctionSymbols import org.jetbrains.kotlin.fir.backend.toIrType import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.scopes.ProcessorAction +import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* @@ -29,6 +32,7 @@ class Fir2IrLazySimpleFunction( endOffset: Int, origin: IrDeclarationOrigin, fir: FirSimpleFunction, + firParent: FirRegularClass, symbol: Fir2IrSimpleFunctionSymbol, override val isFakeOverride: Boolean ) : AbstractFir2IrLazyDeclaration( @@ -130,9 +134,7 @@ class Fir2IrLazySimpleFunction( } override var overriddenSymbols: List by lazyVar { - val containingClass = parent as? IrClass - containingClass?.findMatchingOverriddenSymbolsFromSupertypes(irBuiltIns, this) - ?.filterIsInstance().orEmpty() + fir.generateOverriddenFunctionSymbols(firParent, session, scopeSession, declarationStorage) } override var metadata: MetadataSource? diff --git a/compiler/testData/codegen/box/builtinStubMethods/SubstitutedList.kt b/compiler/testData/codegen/box/builtinStubMethods/SubstitutedList.kt index 233f1aa399f..1ff2647b030 100644 --- a/compiler/testData/codegen/box/builtinStubMethods/SubstitutedList.kt +++ b/compiler/testData/codegen/box/builtinStubMethods/SubstitutedList.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM class MyList: List { diff --git a/compiler/testData/codegen/box/builtinStubMethods/delegationToArrayList.kt b/compiler/testData/codegen/box/builtinStubMethods/delegationToArrayList.kt index 86a0a7f5a35..b9436fab469 100644 --- a/compiler/testData/codegen/box/builtinStubMethods/delegationToArrayList.kt +++ b/compiler/testData/codegen/box/builtinStubMethods/delegationToArrayList.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM import java.util.ArrayList diff --git a/compiler/testData/codegen/box/coroutines/suspendReturningPlatformType.kt b/compiler/testData/codegen/box/coroutines/suspendReturningPlatformType.kt index b58820c139b..6006b265324 100644 --- a/compiler/testData/codegen/box/coroutines/suspendReturningPlatformType.kt +++ b/compiler/testData/codegen/box/coroutines/suspendReturningPlatformType.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME // WITH_COROUTINES diff --git a/compiler/testData/codegen/box/fullJdk/charBuffer.kt b/compiler/testData/codegen/box/fullJdk/charBuffer.kt index 932871ff9f4..7d7f2702e91 100644 --- a/compiler/testData/codegen/box/fullJdk/charBuffer.kt +++ b/compiler/testData/codegen/box/fullJdk/charBuffer.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FULL_JDK diff --git a/compiler/testData/codegen/box/jvm8/treeMapBridge.kt b/compiler/testData/codegen/box/jvm8/treeMapBridge.kt index 215b930c53b..852cfb7774c 100644 --- a/compiler/testData/codegen/box/jvm8/treeMapBridge.kt +++ b/compiler/testData/codegen/box/jvm8/treeMapBridge.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_FIR: JVM_IR // java.lang.NoSuchMethodError: java.util.TreeMap.remove // IGNORE_BACKEND: ANDROID