From ea3378566d3390b5a452d2646a4166340f42f909 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 18 Aug 2023 13:09:14 +0300 Subject: [PATCH] [FIR2IR] Get rid of all usages of IrSymbol.owner from ClassMemberGenerator ^KT-60924 --- .../fir/backend/Fir2IrDeclarationStorage.kt | 41 +++++++++++-------- .../generators/ClassMemberGenerator.kt | 12 ++---- 2 files changed, 29 insertions(+), 24 deletions(-) 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 04aef3cd8c3..b0342609040 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 @@ -244,29 +244,37 @@ class Fir2IrDeclarationStorage( } fun enterScope(declaration: IrDeclaration) { - symbolTable.enterScope(declaration) - if (declaration is IrSimpleFunction || - declaration is IrConstructor || - declaration is IrAnonymousInitializer || - declaration is IrProperty || - declaration is IrEnumEntry || - declaration is IrScript + enterScope(declaration.symbol) + } + + fun leaveScope(declaration: IrDeclaration) { + leaveScope(declaration.symbol) + } + + fun enterScope(symbol: IrSymbol) { + symbolTable.enterScope(symbol) + if (symbol is IrSimpleFunctionSymbol || + symbol is IrConstructorSymbol || + symbol is IrAnonymousInitializerSymbol || + symbol is IrPropertySymbol || + symbol is IrEnumEntrySymbol || + symbol is IrScriptSymbol ) { localStorage.enterCallable() } } - fun leaveScope(declaration: IrDeclaration) { - if (declaration is IrSimpleFunction || - declaration is IrConstructor || - declaration is IrAnonymousInitializer || - declaration is IrProperty || - declaration is IrEnumEntry || - declaration is IrScript + fun leaveScope(symbol: IrSymbol) { + if (symbol is IrSimpleFunctionSymbol || + symbol is IrConstructorSymbol || + symbol is IrAnonymousInitializerSymbol || + symbol is IrPropertySymbol || + symbol is IrEnumEntrySymbol || + symbol is IrScriptSymbol ) { localStorage.leaveCallable() } - symbolTable.leaveScope(declaration) + symbolTable.leaveScope(symbol) } private fun FirTypeRef.toIrType(typeOrigin: ConversionTypeOrigin = ConversionTypeOrigin.DEFAULT): IrType = @@ -2017,7 +2025,8 @@ class Fir2IrDeclarationStorage( internal val ENUM_SYNTHETIC_NAMES = mapOf( Name.identifier("values") to IrSyntheticBodyKind.ENUM_VALUES, Name.identifier("valueOf") to IrSyntheticBodyKind.ENUM_VALUEOF, - Name.identifier("entries") to IrSyntheticBodyKind.ENUM_ENTRIES + Name.identifier("entries") to IrSyntheticBodyKind.ENUM_ENTRIES, + Name.special("") to IrSyntheticBodyKind.ENUM_ENTRIES ) } 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 378b6d4fc77..ddeea8872e9 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 @@ -35,7 +35,6 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFieldAccessExpression import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol -import org.jetbrains.kotlin.ir.symbols.IrSymbolInternals import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.constructedClassType import org.jetbrains.kotlin.ir.util.isSetter @@ -99,7 +98,6 @@ internal class ClassMemberGenerator( declarationStorage.leaveScope(irClass) } - @OptIn(IrSymbolInternals::class) fun convertFunctionContent(irFunction: T, firFunction: FirFunction?, containingClass: FirClass?): T { conversionScope.withParent(irFunction) { if (firFunction != null) { @@ -173,8 +171,7 @@ internal class ClassMemberGenerator( when { // Create fake bodies for Enum.values/Enum.valueOf irFunction.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER -> { - val name = (irFunction as? IrSimpleFunction)?.correspondingPropertySymbol?.owner?.name ?: irFunction.name - val kind = Fir2IrDeclarationStorage.ENUM_SYNTHETIC_NAMES.getValue(name) + val kind = Fir2IrDeclarationStorage.ENUM_SYNTHETIC_NAMES.getValue(irFunction.name) irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind) } irFunction.parent is IrClass && irFunction.parentAsClass.isData -> { @@ -341,7 +338,6 @@ internal class ClassMemberGenerator( return this } - @OptIn(IrSymbolInternals::class) internal fun FirDelegatedConstructorCall.toIrDelegatingConstructorCall(): IrExpression { val constructedIrType = constructedTypeRef.toIrType() val referencedSymbol = calleeReference.toResolvedConstructorSymbol() @@ -389,7 +385,7 @@ internal class ClassMemberGenerator( irBuiltIns.unitType, irConstructorSymbol, typeArgumentsCount = constructor.typeParameters.size, - valueArgumentsCount = irConstructorSymbol.owner.valueParameters.size + valueArgumentsCount = constructor.valueParameters.size + constructor.contextReceivers.size ) }.let { if (constructor.typeParameters.isNotEmpty()) { @@ -405,9 +401,9 @@ internal class ClassMemberGenerator( it.dispatchReceiver = visitor.convertToIrExpression(firDispatchReceiver) } with(callGenerator) { - declarationStorage.enterScope(irConstructorSymbol.owner) + declarationStorage.enterScope(irConstructorSymbol) val result = it.applyCallArguments(this@toIrDelegatingConstructorCall) - declarationStorage.leaveScope(irConstructorSymbol.owner) + declarationStorage.leaveScope(irConstructorSymbol) result } }