[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 render(): String = "${container.render()}:$id"
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean =
|
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
|
// Used to reference local variable and value parameters in function
|
||||||
|
|||||||
+1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.backend.common.serialization.signature
|
package org.jetbrains.kotlin.backend.common.serialization.signature
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.ir.descriptors.WrappedDeclarationDescriptor
|
import org.jetbrains.kotlin.ir.descriptors.WrappedDeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||||
import org.jetbrains.kotlin.ir.util.IdSignatureComposer
|
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.backend.common.serialization.DeclarationTable
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
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.IdSignature
|
||||||
import org.jetbrains.kotlin.ir.util.KotlinMangler
|
import org.jetbrains.kotlin.ir.util.KotlinMangler
|
||||||
import org.jetbrains.kotlin.ir.util.render
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
@@ -22,7 +24,7 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna
|
|||||||
} else null
|
} else null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature {
|
fun composeSignatureForDeclaration(declaration: IrDeclaration): IdSignature {
|
||||||
return if (mangler.run { declaration.isExported() }) {
|
return if (mangler.run { declaration.isExported() }) {
|
||||||
composePublicIdSignature(declaration)
|
composePublicIdSignature(declaration)
|
||||||
} else composeFileLocalIdSignature(declaration)
|
} else composeFileLocalIdSignature(declaration)
|
||||||
@@ -30,6 +32,8 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna
|
|||||||
|
|
||||||
private var localIndex: Long = 0
|
private var localIndex: Long = 0
|
||||||
private var scopeIndex: Int = 0
|
private var scopeIndex: Int = 0
|
||||||
|
|
||||||
|
// TODO: we need to disentangle signature construction with declaration tables.
|
||||||
lateinit var table: DeclarationTable
|
lateinit var table: DeclarationTable
|
||||||
|
|
||||||
fun reset() {
|
fun reset() {
|
||||||
@@ -122,9 +126,28 @@ open class IdSignatureSerializer(val mangler: KotlinMangler.IrMangler) : IdSigna
|
|||||||
IdSignature.FileLocalSignature(p, ++localIndex)
|
IdSignature.FileLocalSignature(p, ++localIndex)
|
||||||
}
|
}
|
||||||
is IrSimpleFunction -> {
|
is IrSimpleFunction -> {
|
||||||
|
val parent = declaration.parent
|
||||||
val p = declaration.correspondingPropertySymbol?.let { composeSignatureForDeclaration(it.owner) }
|
val p = declaration.correspondingPropertySymbol?.let { composeSignatureForDeclaration(it.owner) }
|
||||||
?: composeContainerIdSignature(declaration.parent)
|
?: composeContainerIdSignature(parent)
|
||||||
IdSignature.FileLocalSignature(p, ++localIndex)
|
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)
|
else -> IdSignature.FileLocalSignature(composeContainerIdSignature(declaration.parent), ++localIndex)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user