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:
+11
-8
@@ -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?
|
||||||
}
|
}
|
||||||
+13
-5
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user