[fir2ir] Unwrap type aliases in containing 'IrClass' lookup Type aliases may appear in containing 'ClassId's for callables, for instance, if a common class is implemented as a type alias.
diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 0e9c51c..35eacaf 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt
@@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol import org.jetbrains.kotlin.fir.containingClassForLocalAttr import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.* @@ -18,8 +19,7 @@ import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.* -import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.toLookupTag import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -585,16 +585,23 @@ ) } - fun findIrClass(lookupTag: ConeClassLikeLookupTag): IrClass? { + fun findContainingIrClass(lookupTag: ConeClassLikeLookupTag): IrClass? { return if (lookupTag.classId.isLocal) { getCachedLocalClass(lookupTag) } else { val firSymbol = lookupTag.toSymbol(session) if (firSymbol is FirClassSymbol) { - getIrClassSymbol(firSymbol).owner - } else { - null + return getIrClassSymbol(firSymbol).owner } + + if (firSymbol is FirTypeAliasSymbol) { + val expandedClassSymbol = firSymbol.resolvedExpandedTypeRef.toRegularClassSymbol(session) + if (expandedClassSymbol != null) { + return getIrClassSymbol(expandedClassSymbol).owner + } + } + + return null } }
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 2ae262e..6725f6a 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
@@ -278,7 +278,7 @@ firOrigin: FirDeclarationOrigin ): IrDeclarationParent? { if (parentLookupTag != null) { - return classifierStorage.findIrClass(parentLookupTag) + return classifierStorage.findContainingIrClass(parentLookupTag) } val parentPackage = when (firBasedSymbol) { @@ -1815,7 +1815,7 @@ return when (val firDeclaration = firVariableSymbol.fir) { is FirEnumEntry -> { classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol } - val irParentClass = firDeclaration.containingClassLookupTag()?.let { classifierStorage.findIrClass(it) } + val irParentClass = firDeclaration.containingClassLookupTag()?.let { classifierStorage.findContainingIrClass(it) } val firProviderForSymbol = firVariableSymbol.moduleData.session.firProvider val containingFile = firProviderForSymbol.getFirCallableContainerFile(firVariableSymbol)