[Private fake overrides] Prepare IdSignature for private fake override construction
This commit is contained in:
@@ -745,3 +745,18 @@ class IrOverridingUtil(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun IrSimpleFunction.isOverridableFunction(): Boolean =
|
||||
this.visibility != DescriptorVisibilities.PRIVATE &&
|
||||
this.dispatchReceiverParameter != null
|
||||
|
||||
fun IrProperty.isOverridableProperty(): Boolean =
|
||||
this.visibility != DescriptorVisibilities.PRIVATE &&
|
||||
(this.getter?.dispatchReceiverParameter != null ||
|
||||
this.setter?.dispatchReceiverParameter != null)
|
||||
|
||||
fun IrDeclaration.isOverridableMemberOrAccessor(): Boolean = when(this) {
|
||||
is IrSimpleFunction -> isOverridableFunction()
|
||||
is IrProperty -> isOverridableProperty()
|
||||
else -> false
|
||||
}
|
||||
@@ -135,9 +135,9 @@ sealed class IdSignature {
|
||||
override fun render(): String = "${container.render()}:$id"
|
||||
|
||||
override fun equals(other: Any?): Boolean =
|
||||
other is FileLocalSignature && id == other.id
|
||||
other is FileLocalSignature && id == other.id && container == other.container
|
||||
|
||||
override fun hashCode(): Int = id.toInt()
|
||||
override fun hashCode(): Int = container.hashCode() * 31 + id.hashCode()
|
||||
}
|
||||
|
||||
// Used to reference local variable and value parameters in function
|
||||
|
||||
+1
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.backend.common.serialization.signature
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.descriptors.WrappedDeclarationDescriptor
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.ir.util.IdSignatureComposer
|
||||
|
||||
+26
-3
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.common.serialization.signature
|
||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.overrides.isOverridableFunction
|
||||
import org.jetbrains.kotlin.ir.overrides.isOverridableProperty
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.ir.util.KotlinMangler
|
||||
import org.jetbrains.kotlin.ir.util.render
|
||||
@@ -22,7 +24,7 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna
|
||||
} else null
|
||||
}
|
||||
|
||||
private fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature {
|
||||
fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature {
|
||||
return if (mangler.run { declaration.isExported() }) {
|
||||
composePublicIdSignature(declaration)
|
||||
} else composeFileLocalIdSignature(declaration)
|
||||
@@ -30,6 +32,8 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna
|
||||
|
||||
private var localIndex: Long = 0
|
||||
private var scopeIndex: Int = 0
|
||||
|
||||
// TODO: we need to disentangle signature construction with declaration tables.
|
||||
lateinit var table: DeclarationTable
|
||||
|
||||
fun reset() {
|
||||
@@ -122,9 +126,28 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna
|
||||
IdSignature.FileLocalSignature(p, ++localIndex)
|
||||
}
|
||||
is IrSimpleFunction -> {
|
||||
val parent = declaration.parent
|
||||
val p = declaration.correspondingPropertySymbol?.let { composeSignatureForDeclaration(it.owner) }
|
||||
?: composeContainerIdSignature(declaration.parent)
|
||||
IdSignature.FileLocalSignature(p, ++localIndex)
|
||||
?: composeContainerIdSignature(parent)
|
||||
IdSignature.FileLocalSignature(
|
||||
p,
|
||||
if (declaration.isOverridableFunction()) {
|
||||
mangler.run { declaration.signatureMangle }
|
||||
} else {
|
||||
++localIndex
|
||||
}
|
||||
)
|
||||
}
|
||||
is IrProperty -> {
|
||||
val parent = declaration.parent
|
||||
IdSignature.FileLocalSignature(
|
||||
composeContainerIdSignature(parent),
|
||||
if (declaration.isOverridableProperty()) {
|
||||
mangler.run { declaration.signatureMangle }
|
||||
} else {
|
||||
++localIndex
|
||||
}
|
||||
)
|
||||
}
|
||||
else -> IdSignature.FileLocalSignature(composeContainerIdSignature(declaration.parent), ++localIndex)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user