[FIR2IR] Support callables in signature composer
This commit is contained in:
@@ -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
|
||||
}
|
||||
+39
-6
@@ -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("<set-${property.name}>"))
|
||||
} else {
|
||||
propertySignature.declarationFqn.child(Name.special("<get-${property.name}>"))
|
||||
}
|
||||
return IdSignature.PublicSignature(propertySignature.packageFqn, accessorFqName, propertySignature.id, propertySignature.mask)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user