From 9546c36c3c073cf8f5438ed26ff8210af9a37ef9 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 9 May 2018 12:21:10 +0200 Subject: [PATCH] Get rid of 'descriptor.isInner()' call --- .../common/lower/AbstractClosureAnnotator.kt | 2 +- .../common/lower/InnerClassesLowering.kt | 20 +++++++++---------- .../common/lower/LocalDeclarationsLowering.kt | 12 +++++++---- .../ir/backend/js/JsDescriptorsFactory.kt | 4 ++-- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 2 +- .../jvm/descriptors/JvmDescriptorsFactory.kt | 4 ++-- 6 files changed, 23 insertions(+), 21 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractClosureAnnotator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractClosureAnnotator.kt index 8cbdc82c32c..6ce9890e07d 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractClosureAnnotator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractClosureAnnotator.kt @@ -119,7 +119,7 @@ class ClosureAnnotator { closureBuilders[declaration.descriptor] = closureBuilder closureBuilder.declareVariable(classDescriptor.thisAsReceiverParameter) - if (classDescriptor.isInner) { + if (declaration.isInner) { closureBuilder.declareVariable((classDescriptor.containingDeclaration as ClassDescriptor).thisAsReceiverParameter) includeInParent(closureBuilder) } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt index aaadc09c65a..f817dbf3386 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt @@ -20,9 +20,7 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol -import org.jetbrains.kotlin.ir.util.createParameterDeclarations -import org.jetbrains.kotlin.ir.util.dump -import org.jetbrains.kotlin.ir.util.transformFlat +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver import java.util.* @@ -41,7 +39,7 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { val class2Symbol = HashMap() fun lowerInnerClass() { - if (!irClass.descriptor.isInner) return + if (!irClass.isInner) return rememberClassSymbols() createOuterThisField() @@ -161,7 +159,7 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { var innerClass = irClass while (innerClass != implicitThisClass) { - if (!innerClass.descriptor.isInner) { + if (!innerClass.isInner) { // Captured 'this' unrelated to inner classes nesting hierarchy, leave it as is - // should be transformed by closures conversion. return expression @@ -202,7 +200,7 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLowe val dispatchReceiver = expression.dispatchReceiver ?: return expression val callee = expression.symbol as? IrConstructorSymbol ?: return expression val parent = callee.owner.parent as? IrClass ?: return expression - if (!parent.descriptor.isInner) return expression + if (!parent.isInner) return expression val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner) val newCall = IrCallImpl( @@ -223,14 +221,14 @@ class InnerClassConstructorCallsLowering(val context: BackendContext) : BodyLowe expression.transformChildrenVoid(this) val dispatchReceiver = expression.dispatchReceiver ?: return expression - val callee = expression.symbol - if (!callee.descriptor.containingDeclaration.isInner) return expression + val classConstructor = expression.symbol.owner + if (!(classConstructor.parent as IrClass).isInner) return expression - val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(callee.owner) + val newCallee = context.descriptorsFactory.getInnerClassConstructorWithOuterThisParameter(classConstructor) val newCall = IrDelegatingConstructorCallImpl( expression.startOffset, expression.endOffset, newCallee, newCallee.descriptor, - null // TODO type arguments map - ) + classConstructor.typeParameters.size + ).apply { copyTypeArgumentsFrom(expression) } newCall.putValueArgument(0, dispatchReceiver) for (i in 1..newCallee.descriptor.valueParameters.lastIndex) { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index defefbda095..5f04dc2415e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -513,6 +513,7 @@ class LocalDeclarationsLowering(val context: BackendContext, val localNameProvid localFunctionContext.transformedDeclaration = with(localFunctionContext.declaration) { IrFunctionImpl(startOffset, endOffset, origin, newDescriptor) }.apply { + parent = localFunctionContext.declaration.parent createParameterDeclarations() recordTransformedValueParameters(localFunctionContext) transformedDeclarations[oldDescriptor] = this.symbol @@ -600,6 +601,7 @@ class LocalDeclarationsLowering(val context: BackendContext, val localNameProvid constructorContext.transformedDeclaration = with(constructorContext.declaration) { IrConstructorImpl(startOffset, endOffset, origin, newDescriptor) }.apply { + parent = constructorContext.declaration.parent createParameterDeclarations() recordTransformedValueParameters(constructorContext) transformedDeclarations[oldDescriptor] = this.symbol @@ -642,7 +644,9 @@ class LocalDeclarationsLowering(val context: BackendContext, val localNameProvid localClassContext.declaration.startOffset, localClassContext.declaration.endOffset, DECLARATION_ORIGIN_FIELD_FOR_CAPTURED_VALUE, fieldDescriptor - ) + ).apply { + parent = localClassContext.declaration + } } } @@ -728,9 +732,9 @@ class LocalDeclarationsLowering(val context: BackendContext, val localNameProvid declaration.acceptChildrenVoid(this) val descriptor = declaration.descriptor - assert(descriptor.visibility != Visibilities.LOCAL) + assert(declaration.visibility != Visibilities.LOCAL) - if (descriptor.constructedClass.isInner) return + if ((declaration.parent as IrClass).isInner) return localClassConstructors[descriptor] = LocalClassConstructorContext(declaration) } @@ -740,7 +744,7 @@ class LocalDeclarationsLowering(val context: BackendContext, val localNameProvid val descriptor = declaration.descriptor - if (descriptor.isInner) return + if (declaration.isInner) return // Local nested classes can only be inner. assert(descriptor.declaredInFunction()) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt index 9247a3a355b..8177b962eb0 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt @@ -44,7 +44,7 @@ class JsDescriptorsFactory( override fun getSymbolForEnumEntry(enumEntry: IrEnumEntrySymbol): IrFieldSymbol = TODO() override fun getOuterThisFieldSymbol(innerClass: IrClass): IrFieldSymbol = - if (!innerClass.descriptor.isInner) throw AssertionError("Class is not inner: ${innerClass.dump()}") + if (!innerClass.isInner) throw AssertionError("Class is not inner: ${innerClass.dump()}") else outerThisFieldSymbols.getOrPut(innerClass) { val outerClass = innerClass.parent as? IrClass ?: throw AssertionError("No containing class for inner class ${innerClass.dump()}") @@ -78,7 +78,7 @@ class JsDescriptorsFactory( override fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: IrConstructor): IrConstructorSymbol { val innerClass = innerClassConstructor.parent as IrClass - assert(innerClass.descriptor.isInner) { "Class is not inner: $innerClass" } + assert(innerClass.isInner) { "Class is not inner: $innerClass" } return innerClassConstructors.getOrPut(innerClassConstructor.symbol) { createInnerClassConstructorWithOuterThisParameter(innerClassConstructor.descriptor) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 3f4867a8554..405bc56dff0 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -47,6 +47,7 @@ class JvmLower(val context: JvmBackendContext) { InnerClassesLowering(context).runOnFilePostfix(irFile) InnerClassConstructorCallsLowering(context).runOnFilePostfix(irFile) + irFile.acceptVoid(PatchDeclarationParentsVisitor()) LocalDeclarationsLowering( context, object : LocalNameProvider { @@ -55,7 +56,6 @@ class JvmLower(val context: JvmBackendContext) { } ).runOnFilePostfix(irFile) - irFile.acceptVoid(PatchDeclarationParentsVisitor()) EnumClassLowering(context).runOnFilePostfix(irFile) //Should be before SyntheticAccessorLowering cause of synthetic accessor for companion constructor ObjectClassLowering(context).lower(irFile) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt index ddc9d8f16c5..44141842df5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt @@ -67,7 +67,7 @@ class JvmDescriptorsFactory( } override fun getOuterThisFieldSymbol(innerClass: IrClass): IrFieldSymbol = - if (!innerClass.descriptor.isInner) throw AssertionError("Class is not inner: ${innerClass.dump()}") + if (!innerClass.isInner) throw AssertionError("Class is not inner: ${innerClass.dump()}") else outerThisDescriptors.getOrPut(innerClass) { val outerClass = innerClass.parent as? IrClass ?: throw AssertionError("No containing class for inner class ${innerClass.dump()}") @@ -81,7 +81,7 @@ class JvmDescriptorsFactory( } override fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: IrConstructor): IrConstructorSymbol { - assert((innerClassConstructor.parent as IrClass).descriptor.isInner) { "Class is not inner: ${(innerClassConstructor.parent as IrClass).dump()}" } + assert((innerClassConstructor.parent as IrClass).isInner) { "Class is not inner: ${(innerClassConstructor.parent as IrClass).dump()}" } return innerClassConstructors.getOrPut(innerClassConstructor.symbol) { createInnerClassConstructorWithOuterThisParameter(innerClassConstructor)