Put 'thisReceiver' declaration in class

Interfaces also have 'thisReceiver'
This commit is contained in:
Dmitry Petrov
2017-05-02 10:54:56 +03:00
parent 90ec53b3b0
commit fa4dc26814
103 changed files with 439 additions and 205 deletions
@@ -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()
}