[FIR2IR] Support callables in signature composer

This commit is contained in:
Mikhail Glukhikh
2020-06-01 12:42:54 +03:00
parent 563981808d
commit ecb48b7ed9
2 changed files with 41 additions and 6 deletions
@@ -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
}
@@ -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)
}
}