[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 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.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
interface Fir2IrSignatureComposer { interface Fir2IrSignatureComposer {
fun composeSignature(declaration: FirDeclaration): IdSignature 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.FirElement
import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
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.Name
class FirBasedSignatureComposer : Fir2IrSignatureComposer { class FirBasedSignatureComposer : Fir2IrSignatureComposer {
class SignatureBuilder : FirVisitorVoid() { class SignatureBuilder : FirVisitorVoid() {
var hashId: Long? = null var hashId: Long? = null
var mask = 0L var mask = 0L
@@ -24,22 +26,53 @@ class FirBasedSignatureComposer : Fir2IrSignatureComposer {
} }
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement) {
TODO("Not yet implemented") TODO("Should not be here")
} }
override fun visitRegularClass(regularClass: FirRegularClass) { override fun visitRegularClass(regularClass: FirRegularClass) {
setExpected(regularClass.isExpect) setExpected(regularClass.isExpect)
//platformSpecificClass(descriptor) //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 { override fun composeSignature(declaration: FirDeclaration): IdSignature {
val builder = SignatureBuilder() val builder = SignatureBuilder()
declaration.accept(builder) declaration.accept(builder)
if (declaration is FirRegularClass && declaration.visibility != Visibilities.LOCAL) { return when {
val classId = declaration.classId declaration is FirRegularClass && declaration.visibility != Visibilities.LOCAL -> {
return IdSignature.PublicSignature(classId.packageFqName, classId.relativeClassName, builder.hashId, builder.mask) 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)
} }
} }