[FIR2IR] Support callables in signature composer
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
+39
-6
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user