Put 'thisReceiver' declaration in class
Interfaces also have 'thisReceiver'
This commit is contained in:
@@ -48,13 +48,11 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe
|
||||
IrDeclarationOrigin.DEFINED,
|
||||
descriptor
|
||||
).buildWithScope { irClass ->
|
||||
if (irClass.descriptor.canHaveInitializersWithInstanceReference()) {
|
||||
irClass.newInstanceReceiver = context.symbolTable.declareValueParameter(
|
||||
ktClassOrObject.startOffset, ktClassOrObject.endOffset,
|
||||
IrDeclarationOrigin.NEW_INSTANCE_RECEIVER,
|
||||
irClass.descriptor.thisAsReceiverParameter
|
||||
)
|
||||
}
|
||||
irClass.thisReceiver = context.symbolTable.declareValueParameter(
|
||||
ktClassOrObject.startOffset, ktClassOrObject.endOffset,
|
||||
IrDeclarationOrigin.NEW_INSTANCE_RECEIVER,
|
||||
irClass.descriptor.thisAsReceiverParameter
|
||||
)
|
||||
|
||||
declarationGenerator.generateTypeParameterDeclarations(irClass, descriptor.declaredTypeParameters)
|
||||
|
||||
@@ -79,9 +77,6 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe
|
||||
}
|
||||
}
|
||||
|
||||
private fun ClassDescriptor.canHaveInitializersWithInstanceReference(): Boolean =
|
||||
kind != ClassKind.INTERFACE
|
||||
|
||||
private fun generateFakeOverrideMemberDeclarations(irClass: IrClass) {
|
||||
irClass.descriptor.unsubstitutedMemberScope.getContributedDescriptors()
|
||||
.mapNotNull {
|
||||
|
||||
@@ -27,7 +27,7 @@ interface IrClass : IrSymbolDeclaration<IrClassSymbol>, IrDeclarationContainer,
|
||||
|
||||
override val descriptor: ClassDescriptor
|
||||
|
||||
var newInstanceReceiver: IrValueParameter?
|
||||
var thisReceiver: IrValueParameter?
|
||||
}
|
||||
|
||||
fun IrClass.addMember(member: IrDeclaration) {
|
||||
|
||||
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.util.transform
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.utils.SmartList
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
class IrClassImpl(
|
||||
@@ -49,7 +48,7 @@ class IrClassImpl(
|
||||
|
||||
override val descriptor: ClassDescriptor get() = symbol.descriptor
|
||||
|
||||
override var newInstanceReceiver: IrValueParameter? = null
|
||||
override var thisReceiver: IrValueParameter? = null
|
||||
|
||||
override val declarations: MutableList<IrDeclaration> = ArrayList()
|
||||
|
||||
@@ -59,13 +58,13 @@ class IrClassImpl(
|
||||
visitor.visitClass(this, data)
|
||||
|
||||
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||
newInstanceReceiver?.accept(visitor, data)
|
||||
thisReceiver?.accept(visitor, data)
|
||||
typeParameters.forEach { it.accept(visitor, data) }
|
||||
declarations.forEach { it.accept(visitor, data) }
|
||||
}
|
||||
|
||||
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
|
||||
newInstanceReceiver = newInstanceReceiver?.transform(transformer, data)
|
||||
thisReceiver = thisReceiver?.transform(transformer, data)
|
||||
typeParameters.transform { it.transform(transformer, data) }
|
||||
declarations.transform { it.transform(transformer, data) }
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
|
||||
mapDeclarationOrigin(declaration.origin),
|
||||
symbolsRemapper.getDeclaredClass(declaration.symbol)
|
||||
).apply {
|
||||
newInstanceReceiver = declaration.newInstanceReceiver?.transform()
|
||||
thisReceiver = declaration.thisReceiver?.transform()
|
||||
declaration.typeParameters.transformTo(typeParameters)
|
||||
declaration.transformDeclarationsTo(this)
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ class DumpIrTreeVisitor(out: Appendable): IrElementVisitor<Unit, String> {
|
||||
|
||||
override fun visitClass(declaration: IrClass, data: String) {
|
||||
declaration.dumpLabeledElementWith(data) {
|
||||
declaration.newInstanceReceiver?.accept(this, "\$new")
|
||||
declaration.thisReceiver?.accept(this, "\$this")
|
||||
declaration.typeParameters.dumpElements()
|
||||
declaration.declarations.dumpElements()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user