From 20bf238c27791152196f7e8b7160ebb52caad69e Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 23 Sep 2020 12:23:23 +0300 Subject: [PATCH] FIR2IR: Fix signature computed for fake-overrides Take into account _new owner_ of the function Namely, if there's a substitution override from a class A in its subtype B, it will refer `B` as its owner in the signature --- .../fir/backend/Fir2IrDeclarationStorage.kt | 19 +++++++++++-------- .../fir/backend/Fir2IrSignatureComposer.kt | 7 ++++--- .../signaturer/FirBasedSignatureComposer.kt | 18 +++++++++++++----- 3 files changed, 28 insertions(+), 16 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 49930d3e924..63de0b58b4e 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 @@ -394,7 +394,8 @@ class Fir2IrDeclarationStorage( irParent: IrDeclarationParent?, thisReceiverOwner: IrClass? = irParent as? IrClass, origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED, - isLocal: Boolean = false + isLocal: Boolean = false, + containingClass: ConeClassLikeLookupTag? = null, ): IrSimpleFunction { val simpleFunction = function as? FirSimpleFunction val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL @@ -411,7 +412,7 @@ class Fir2IrDeclarationStorage( val isSuspend = if (isLambda) ((function as FirAnonymousFunction).typeRef as? FirResolvedTypeRef)?.type?.isSuspendFunctionType(session) == true else simpleFunction?.isSuspend == true - val signature = if (isLocal) null else signatureComposer.composeSignature(function) + val signature = if (isLocal) null else signatureComposer.composeSignature(function, containingClass) val created = function.convertWithOffsets { startOffset, endOffset -> val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol -> irFactory.createFunction( @@ -534,10 +535,11 @@ class Fir2IrDeclarationStorage( origin: IrDeclarationOrigin, startOffset: Int, endOffset: Int, - isLocal: Boolean = false + isLocal: Boolean = false, + containingClass: ConeClassLikeLookupTag? = null, ): IrSimpleFunction { val prefix = if (isSetter) "set" else "get" - val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter) + val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter, containingClass) val containerSource = (correspondingProperty as? IrProperty)?.containerSource return declareIrAccessor( signature, @@ -655,10 +657,11 @@ class Fir2IrDeclarationStorage( irParent: IrDeclarationParent?, thisReceiverOwner: IrClass? = irParent as? IrClass, origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED, - isLocal: Boolean = false + isLocal: Boolean = false, + containingClass: ConeClassLikeLookupTag? = null, ): IrProperty { classifierStorage.preCacheTypeParameters(property) - val signature = if (isLocal) null else signatureComposer.composeSignature(property) + val signature = if (isLocal) null else signatureComposer.composeSignature(property, containingClass) return property.convertWithOffsets { startOffset, endOffset -> val result = declareIrProperty(signature, property.containerSource) { symbol -> irFactory.createProperty( @@ -719,7 +722,7 @@ class Fir2IrDeclarationStorage( getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR else -> origin }, - startOffset, endOffset, isLocal + startOffset, endOffset, isLocal, containingClass ) if (property.isVar) { this.setter = createIrPropertyAccessor( @@ -729,7 +732,7 @@ class Fir2IrDeclarationStorage( setter is FirDefaultPropertySetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR else -> origin }, - startOffset, endOffset, isLocal + startOffset, endOffset, isLocal, containingClass ) } leaveScope(this) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt index b8979590d37..1e3789030a6 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrSignatureComposer.kt @@ -7,9 +7,10 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.ir.util.IdSignature interface Fir2IrSignatureComposer { - fun composeSignature(declaration: FirDeclaration): IdSignature? - fun composeAccessorSignature(property: FirProperty, isSetter: Boolean): IdSignature? -} \ No newline at end of file + fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag? = null): IdSignature? + fun composeAccessorSignature(property: FirProperty, isSetter: Boolean, containingClass: ConeClassLikeLookupTag? = null): IdSignature? +} diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt index 5b375c75883..10fb4f5abb9 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.symbols.CallableId +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.name.FqName @@ -62,11 +63,11 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu private val CallableId.relativeCallableName: FqName get() = className?.child(callableName) ?: FqName.topLevel(callableName) - override fun composeSignature(declaration: FirDeclaration): IdSignature? { + override fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag?): IdSignature? { if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirCallableMemberDeclaration<*>) { - if (declaration.visibility == Visibilities.Local || declaration.symbol.callableId.classId?.isLocal == true) return null + if (declaration.visibility == Visibilities.Local || declaration.symbol.callableId.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null } val builder = SignatureBuilder() try { @@ -91,7 +92,10 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu } is FirCallableMemberDeclaration<*> -> { if (declaration.visibility == Visibilities.Private) return null - val callableId = declaration.symbol.callableId + val containingClassId = containingClass?.classId + val baseCallableId = declaration.symbol.callableId + val callableId = + if (containingClassId != null) CallableId(containingClassId, baseCallableId.callableName) else baseCallableId IdSignature.PublicSignature( callableId.packageName.asString(), callableId.relativeCallableName.asString(), builder.hashId, builder.mask ) @@ -100,8 +104,12 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu } } - override fun composeAccessorSignature(property: FirProperty, isSetter: Boolean): IdSignature? { - val propertySignature = composeSignature(property) as? IdSignature.PublicSignature ?: return null + override fun composeAccessorSignature( + property: FirProperty, + isSetter: Boolean, + containingClass: ConeClassLikeLookupTag? + ): IdSignature? { + val propertySignature = composeSignature(property, containingClass) as? IdSignature.PublicSignature ?: return null val accessorFqName = if (isSetter) { propertySignature.declarationFqName + "." } else {