From bf4f5524785b4f67de80b48c552a2e741a9ea085 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 22 Oct 2018 17:16:55 +0300 Subject: [PATCH] IR. Remove descriptors from KCallableNamePropertyLowering --- .../lower/KCallableNamePropertyLowering.kt | 49 +++++++++++-------- .../ir/util/DeclarationStubGenerator.kt | 4 ++ 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt index e02365ef3b5..e3e6fe82961 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt @@ -26,13 +26,17 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.IrGeneratorContextBase import org.jetbrains.kotlin.ir.builders.Scope +import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.IrProperty +import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCallableReference import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.symbols.IrSymbol +import org.jetbrains.kotlin.ir.util.isSubclassOf import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -47,36 +51,39 @@ class KCallableNamePropertyLowering(val context: BackendContext) : FileLoweringP private class KCallableNamePropertyTransformer(val lower: KCallableNamePropertyLowering) : IrElementTransformerVoid() { override fun visitCall(expression: IrCall): IrExpression { + val callableReference = expression.dispatchReceiver as? IrCallableReference ?: return expression //TODO rewrite checking - val directMember = DescriptorUtils.getDirectMember(expression.descriptor) - val classDescriptor = directMember.containingDeclaration as? ClassDescriptor ?: return expression - if (!classDescriptor.defaultType.isKFunctionType) return expression - if (directMember.name.asString() != "name") return expression + val directMember = expression.symbol.owner.let { + (it as? IrSimpleFunction)?.correspondingProperty ?: it + } + val irClass = directMember.parent as? IrClass ?: return expression + if (irClass.isSubclassOf(lower.context.irBuiltIns.kCallableClass.owner)) return expression + val name = when (directMember) { + is IrSimpleFunction -> directMember.name + is IrProperty -> directMember.name + else -> throw AssertionError("Should be IrSimpleFunction or IrProperty, ${directMember}") + } + if (name.asString() != "name") return expression val receiver = callableReference.dispatchReceiver ?: callableReference.extensionReceiver - return lower.context.createIrBuilder(expression.symbol, expression.startOffset, expression.endOffset).run { - - IrCompositeImpl(startOffset, endOffset, context.irBuiltIns.stringType).apply { - receiver?.let { - //put receiver for bound callable reference - statements.add(it) - } - - statements.add( - IrConstImpl.string( - expression.startOffset, - expression.endOffset, - context.irBuiltIns.stringType, - callableReference.descriptor.name.asString() - ) - ) + return IrCompositeImpl(expression.startOffset, expression.endOffset, lower.context.irBuiltIns.stringType).apply { + receiver?.let { + //put receiver for bound callable reference + statements.add(it) } + statements.add( + IrConstImpl.string( + expression.startOffset, + expression.endOffset, + lower.context.irBuiltIns.stringType, + callableReference.descriptor.name.asString() + ) + ) } - } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 94feea84cbc..25ed42434c0 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -94,6 +94,10 @@ class DeclarationStubGenerator( irProperty.setter = descriptor.setter?.let { generateFunctionStub(it, createPropertyIfNeeded = false) }?.apply { correspondingProperty = irProperty } + // Do we ever generate stubs for file-level properties? + (descriptor.containingDeclaration as? ClassDescriptor)?.let { + irProperty.parent = generateClassStub(it) + } } private fun generateFieldStub(descriptor: PropertyDescriptor): IrField {