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<T> in its subtype B,
it will refer `B` as its owner in the signature
This commit is contained in:
Denis Zharkov
2020-09-23 12:23:23 +03:00
parent 9914b487b7
commit 20bf238c27
3 changed files with 28 additions and 16 deletions
@@ -394,7 +394,8 @@ class Fir2IrDeclarationStorage(
irParent: IrDeclarationParent?, irParent: IrDeclarationParent?,
thisReceiverOwner: IrClass? = irParent as? IrClass, thisReceiverOwner: IrClass? = irParent as? IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED, origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
isLocal: Boolean = false isLocal: Boolean = false,
containingClass: ConeClassLikeLookupTag? = null,
): IrSimpleFunction { ): IrSimpleFunction {
val simpleFunction = function as? FirSimpleFunction val simpleFunction = function as? FirSimpleFunction
val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL
@@ -411,7 +412,7 @@ class Fir2IrDeclarationStorage(
val isSuspend = val isSuspend =
if (isLambda) ((function as FirAnonymousFunction).typeRef as? FirResolvedTypeRef)?.type?.isSuspendFunctionType(session) == true if (isLambda) ((function as FirAnonymousFunction).typeRef as? FirResolvedTypeRef)?.type?.isSuspendFunctionType(session) == true
else simpleFunction?.isSuspend == 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 created = function.convertWithOffsets { startOffset, endOffset ->
val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol -> val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol ->
irFactory.createFunction( irFactory.createFunction(
@@ -534,10 +535,11 @@ class Fir2IrDeclarationStorage(
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
isLocal: Boolean = false isLocal: Boolean = false,
containingClass: ConeClassLikeLookupTag? = null,
): IrSimpleFunction { ): IrSimpleFunction {
val prefix = if (isSetter) "set" else "get" 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 val containerSource = (correspondingProperty as? IrProperty)?.containerSource
return declareIrAccessor( return declareIrAccessor(
signature, signature,
@@ -655,10 +657,11 @@ class Fir2IrDeclarationStorage(
irParent: IrDeclarationParent?, irParent: IrDeclarationParent?,
thisReceiverOwner: IrClass? = irParent as? IrClass, thisReceiverOwner: IrClass? = irParent as? IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED, origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
isLocal: Boolean = false isLocal: Boolean = false,
containingClass: ConeClassLikeLookupTag? = null,
): IrProperty { ): IrProperty {
classifierStorage.preCacheTypeParameters(property) 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 -> return property.convertWithOffsets { startOffset, endOffset ->
val result = declareIrProperty(signature, property.containerSource) { symbol -> val result = declareIrProperty(signature, property.containerSource) { symbol ->
irFactory.createProperty( irFactory.createProperty(
@@ -719,7 +722,7 @@ class Fir2IrDeclarationStorage(
getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
else -> origin else -> origin
}, },
startOffset, endOffset, isLocal startOffset, endOffset, isLocal, containingClass
) )
if (property.isVar) { if (property.isVar) {
this.setter = createIrPropertyAccessor( this.setter = createIrPropertyAccessor(
@@ -729,7 +732,7 @@ class Fir2IrDeclarationStorage(
setter is FirDefaultPropertySetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR setter is FirDefaultPropertySetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
else -> origin else -> origin
}, },
startOffset, endOffset, isLocal startOffset, endOffset, isLocal, containingClass
) )
} }
leaveScope(this) leaveScope(this)
@@ -7,9 +7,10 @@ package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
interface Fir2IrSignatureComposer { interface Fir2IrSignatureComposer {
fun composeSignature(declaration: FirDeclaration): IdSignature? fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag? = null): IdSignature?
fun composeAccessorSignature(property: FirProperty, isSetter: Boolean): IdSignature? fun composeAccessorSignature(property: FirProperty, isSetter: Boolean, containingClass: ConeClassLikeLookupTag? = null): IdSignature?
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.symbols.CallableId 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.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -62,11 +63,11 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
private val CallableId.relativeCallableName: FqName private val CallableId.relativeCallableName: FqName
get() = className?.child(callableName) ?: FqName.topLevel(callableName) 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 FirAnonymousObject || declaration is FirAnonymousFunction) return null
if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirRegularClass && declaration.classId.isLocal) return null
if (declaration is FirCallableMemberDeclaration<*>) { 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() val builder = SignatureBuilder()
try { try {
@@ -91,7 +92,10 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
} }
is FirCallableMemberDeclaration<*> -> { is FirCallableMemberDeclaration<*> -> {
if (declaration.visibility == Visibilities.Private) return null 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( IdSignature.PublicSignature(
callableId.packageName.asString(), callableId.relativeCallableName.asString(), builder.hashId, builder.mask 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? { override fun composeAccessorSignature(
val propertySignature = composeSignature(property) as? IdSignature.PublicSignature ?: return null property: FirProperty,
isSetter: Boolean,
containingClass: ConeClassLikeLookupTag?
): IdSignature? {
val propertySignature = composeSignature(property, containingClass) as? IdSignature.PublicSignature ?: return null
val accessorFqName = if (isSetter) { val accessorFqName = if (isSetter) {
propertySignature.declarationFqName + ".<set-${property.name.asString()}>" propertySignature.declarationFqName + ".<set-${property.name.asString()}>"
} else { } else {