diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index 46deae70101..34020514702 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -32,7 +32,6 @@ import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.PropertyImportedFromObject import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny -import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes.* import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature @@ -46,14 +45,14 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.org.objectweb.asm.commons.Method class PropertyReferenceCodegen( - state: GenerationState, - parentCodegen: MemberCodegen<*>, - context: ClassContext, - expression: KtElement, - classBuilder: ClassBuilder, - private val localVariableDescriptorForReference: VariableDescriptor, - private val target: VariableDescriptor, - private val receiverType: Type? + state: GenerationState, + parentCodegen: MemberCodegen<*>, + context: ClassContext, + expression: KtElement, + classBuilder: ClassBuilder, + private val localVariableDescriptorForReference: VariableDescriptor, + private val target: VariableDescriptor, + private val receiverType: Type? ) : MemberCodegen(state, parentCodegen, context, expression, classBuilder) { private val classDescriptor = context.contextDescriptor private val asmType = typeMapper.mapClass(classDescriptor) @@ -64,10 +63,10 @@ class PropertyReferenceCodegen( private val isLocalDelegatedProperty = target is LocalVariableDescriptor private val getFunction = - if (isLocalDelegatedProperty) - (localVariableDescriptorForReference as VariableDescriptorWithAccessors).getter!! - else - findGetFunction(localVariableDescriptorForReference).original + if (isLocalDelegatedProperty) + (localVariableDescriptorForReference as VariableDescriptorWithAccessors).getter!! + else + findGetFunction(localVariableDescriptorForReference).original // e.g. mutableProperty0(Lkotlin/jvm/internal/MutablePropertyReference0;)Lkotlin/reflect/KMutableProperty0; private val wrapperMethod = getWrapperMethodForPropertyReference(target, getFunction.valueParameters.size) @@ -75,7 +74,7 @@ class PropertyReferenceCodegen( private val closure = bindingContext.get(CodegenBinding.CLOSURE, classDescriptor)!!.apply { assert((captureReceiverType != null) == (receiverType != null)) { "Bound property reference can only be generated with the type of the receiver. " + - "Captured type = $captureReceiverType, actual type = $receiverType" + "Captured type = $captureReceiverType, actual type = $receiverType" } } @@ -86,13 +85,13 @@ class PropertyReferenceCodegen( override fun generateDeclaration() { v.defineClass( - element, - state.classFileVersion, - ACC_FINAL or ACC_SUPER or AsmUtil.getVisibilityAccessFlagForClass(classDescriptor), - asmType.internalName, - null, - superAsmType.internalName, - emptyArray() + element, + state.classFileVersion, + ACC_FINAL or ACC_SUPER or AsmUtil.getVisibilityAccessFlagForClass(classDescriptor), + asmType.internalName, + null, + superAsmType.internalName, + emptyArray() ) v.visitSource(element.containingFile.name, null) @@ -102,8 +101,7 @@ class PropertyReferenceCodegen( override fun generateBody() { if (JvmCodegenUtil.isConst(closure)) { generateConstInstance(asmType, wrapperMethod.returnType) - } - else { + } else { AsmUtil.genClosureFields(closure, v, typeMapper) } @@ -135,8 +133,7 @@ class PropertyReferenceCodegen( assert(!shouldHaveBoundReferenceReceiver) { "No bound reference receiver in constructor parameters: $constructorArgs" } load(0, OBJECT_TYPE) invokespecial(superAsmType.internalName, "", "()V", false) - } - else { + } else { val (receiverIndex, receiverType) = receiverIndexAndType load(0, OBJECT_TYPE) loadBoundReferenceReceiverParameter(receiverIndex, receiverType) @@ -148,16 +145,44 @@ class PropertyReferenceCodegen( private fun generateAccessors() { val getFunction = findGetFunction(localVariableDescriptorForReference) val getImpl = createFakeOpenDescriptor(getFunction, classDescriptor) - functionCodegen.generateMethod(JvmDeclarationOrigin.NO_ORIGIN, getImpl, PropertyReferenceGenerationStrategy(true, getFunction, target, asmType, receiverType, element, state, false)) + functionCodegen.generateMethod( + JvmDeclarationOrigin.NO_ORIGIN, + getImpl, + PropertyReferenceGenerationStrategy( + true, + getFunction, + target, + asmType, + receiverType, + element, + state, + false + ) + ) if (!ReflectionTypes.isNumberedKMutablePropertyType(localVariableDescriptorForReference.type)) return - val setFunction = localVariableDescriptorForReference.type.memberScope.getContributedFunctions(OperatorNameConventions.SET, NoLookupLocation.FROM_BACKEND).single() + val setFunction = localVariableDescriptorForReference.type.memberScope.getContributedFunctions( + OperatorNameConventions.SET, + NoLookupLocation.FROM_BACKEND + ).single() val setImpl = createFakeOpenDescriptor(setFunction, classDescriptor) - functionCodegen.generateMethod(JvmDeclarationOrigin.NO_ORIGIN, setImpl, PropertyReferenceGenerationStrategy(false, setFunction, target, asmType, receiverType, element, state, false)) + functionCodegen.generateMethod( + JvmDeclarationOrigin.NO_ORIGIN, + setImpl, + PropertyReferenceGenerationStrategy( + false, + setFunction, + target, + asmType, + receiverType, + element, + state, + false + ) + ) } - private fun generateMethod(debugString: String, access: Int, method: Method, generate: InstructionAdapter.() -> Unit) { v.generateMethod(debugString, access, method, element, JvmDeclarationOrigin.NO_ORIGIN, state, generate) } @@ -171,8 +196,7 @@ class PropertyReferenceCodegen( if (JvmCodegenUtil.isConst(closure)) { assert(receiverValue == null) { "No receiver expected for unbound property reference: $classDescriptor" } iv.getstatic(asmType.internalName, JvmAbi.INSTANCE_FIELD, wrapperMethod.returnType.descriptor) - } - else { + } else { assert(receiverValue != null) { "Receiver expected for bound property reference: $classDescriptor" } iv.anew(asmType) iv.dup() @@ -203,7 +227,7 @@ class PropertyReferenceCodegen( fun getSignatureString(callable: CallableDescriptor, state: GenerationState): String { if (callable is LocalVariableDescriptor) { val asmType = state.bindingContext.get(CodegenBinding.DELEGATED_PROPERTY_METADATA_OWNER, callable) - ?: throw AssertionError("No delegated property metadata owner for $callable") + ?: throw AssertionError("No delegated property metadata owner for $callable") val localDelegatedProperties = CodegenBinding.getLocalDelegatedProperties(state.bindingContext, asmType) val index = localDelegatedProperties?.indexOf(callable) ?: -1 if (index < 0) { @@ -215,8 +239,7 @@ class PropertyReferenceCodegen( val accessor = when (callable) { is FunctionDescriptor -> callable is VariableDescriptorWithAccessors -> - callable.getter ?: - DescriptorFactory.createDefaultGetter(callable as PropertyDescriptor, Annotations.EMPTY).apply { + callable.getter ?: DescriptorFactory.createDefaultGetter(callable as PropertyDescriptor, Annotations.EMPTY).apply { initialize(callable.type) } else -> error("Unsupported callable reference: $callable") @@ -251,20 +274,24 @@ class PropertyReferenceCodegen( } @JvmStatic - fun findGetFunction(localVariableDescriptorForReference: VariableDescriptor) = localVariableDescriptorForReference.type.memberScope.getContributedFunctions(OperatorNameConventions.GET, NoLookupLocation.FROM_BACKEND).single() + fun findGetFunction(localVariableDescriptorForReference: VariableDescriptor) = + localVariableDescriptorForReference.type.memberScope.getContributedFunctions( + OperatorNameConventions.GET, + NoLookupLocation.FROM_BACKEND + ).single() } class PropertyReferenceGenerationStrategy( - val isGetter: Boolean, - private val originalFunctionDesc: FunctionDescriptor, - val target: VariableDescriptor, - val asmType: Type, - val receiverType: Type?, - val expression: KtElement, - state: GenerationState, - private val isInliningStrategy: Boolean + val isGetter: Boolean, + private val originalFunctionDesc: FunctionDescriptor, + val target: VariableDescriptor, + val asmType: Type, + val receiverType: Type?, + val expression: KtElement, + state: GenerationState, + private val isInliningStrategy: Boolean ) : - FunctionGenerationStrategy.CodegenBased(state) { + FunctionGenerationStrategy.CodegenBased(state) { override fun doGenerateBody(codegen: ExpressionCodegen, signature: JvmMethodSignature) { val v = codegen.v val typeMapper = state.typeMapper @@ -276,11 +303,11 @@ class PropertyReferenceCodegen( } if (receiverType != null) { - val expectedReceiver = target.extensionReceiverParameter?.type ?: (target.containingDeclaration as? ClassDescriptor)?.defaultType + val expectedReceiver = + target.extensionReceiverParameter?.type ?: (target.containingDeclaration as? ClassDescriptor)?.defaultType val expectedReceiverType = if (expectedReceiver != null) typeMapper.mapType(expectedReceiver) else receiverType capturedBoundReferenceReceiver(asmType, expectedReceiverType, isInliningStrategy).put(expectedReceiverType, v) - } - else { + } else { val receivers = originalFunctionDesc.valueParameters.dropLast(if (isGetter) 0 else 1) receivers.forEachIndexed { i, valueParameterDescriptor -> StackValue.local(i + 1, OBJECT_TYPE).put(typeMapper.mapType(valueParameterDescriptor), valueParameterDescriptor.type, v) @@ -289,15 +316,14 @@ class PropertyReferenceCodegen( val value = if (target is LocalVariableDescriptor) { codegen.findLocalOrCapturedValue(target)!! - } - else + } else { codegen.intermediateValueForProperty(target as PropertyDescriptor, false, null, StackValue.none()) + } codegen.markStartLineNumber(expression) if (isGetter) { value.put(OBJECT_TYPE, v) - } - else { + } else { val functionDescriptor = codegen.context.functionDescriptor value.store(StackValue.local(codegen.frameMap.getIndex(functionDescriptor.valueParameters.last()), OBJECT_TYPE), v) }