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 75e8b6c6bb6..60b07b01bb4 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 @@ -6,8 +6,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.ir.util.IdSignature interface Fir2IrSignatureComposer { fun composeSignature(declaration: FirDeclaration): IdSignature + fun composeAccessorSignature(property: FirProperty, isSetter: Boolean): IdSignature } \ No newline at end of file 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 20a737acefd..50491be30cc 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 @@ -9,12 +9,14 @@ import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.ir.util.IdSignature +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name class FirBasedSignatureComposer : Fir2IrSignatureComposer { - class SignatureBuilder : FirVisitorVoid() { var hashId: Long? = null var mask = 0L @@ -24,22 +26,53 @@ class FirBasedSignatureComposer : Fir2IrSignatureComposer { } override fun visitElement(element: FirElement) { - TODO("Not yet implemented") + TODO("Should not be here") } override fun visitRegularClass(regularClass: FirRegularClass) { setExpected(regularClass.isExpect) //platformSpecificClass(descriptor) } + + override fun visitConstructor(constructor: FirConstructor) { + setExpected(constructor.isExpect) + } + + override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) { + setExpected(simpleFunction.isExpect) + } + + override fun visitProperty(property: FirProperty) { + setExpected(property.isExpect) + } } + private val CallableId.relativeCallableName: FqName + get() = className?.child(callableName) ?: FqName.topLevel(callableName) + override fun composeSignature(declaration: FirDeclaration): IdSignature { val builder = SignatureBuilder() declaration.accept(builder) - if (declaration is FirRegularClass && declaration.visibility != Visibilities.LOCAL) { - val classId = declaration.classId - return IdSignature.PublicSignature(classId.packageFqName, classId.relativeClassName, builder.hashId, builder.mask) + return when { + declaration is FirRegularClass && declaration.visibility != Visibilities.LOCAL -> { + val classId = declaration.classId + IdSignature.PublicSignature(classId.packageFqName, classId.relativeClassName, builder.hashId, builder.mask) + } + declaration is FirCallableMemberDeclaration<*> -> { + val callableId = declaration.symbol.callableId + IdSignature.PublicSignature(callableId.packageName, callableId.relativeCallableName, builder.hashId, builder.mask) + } + else -> throw AssertionError("Unsupported FIR declaration in signature composer: ${declaration.render()}") } - throw AssertionError("Unsupported FIR declaration in signature composer: ${declaration.render()}") + } + + override fun composeAccessorSignature(property: FirProperty, isSetter: Boolean): IdSignature { + val propertySignature = composeSignature(property) as IdSignature.PublicSignature + val accessorFqName = if (isSetter) { + propertySignature.declarationFqn.child(Name.special("")) + } else { + propertySignature.declarationFqn.child(Name.special("")) + } + return IdSignature.PublicSignature(propertySignature.packageFqn, accessorFqName, propertySignature.id, propertySignature.mask) } } \ No newline at end of file