From b7bad2bd72e9e248fa85ee92c3a1e02a190cf54f Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Fri, 25 May 2018 15:18:32 +0200 Subject: [PATCH] Pass accessorKind into AccessorForCallableDescriptor --- .../codegen/AccessorForCallableDescriptor.kt | 1 + .../AccessorForConstructorDescriptor.kt | 37 +++++++++---------- .../codegen/AccessorForFunctionDescriptor.kt | 5 ++- .../AccessorForPropertyBackingField.kt | 29 ++++++++------- .../codegen/AccessorForPropertyDescriptor.kt | 26 +++++++------ .../kotlin/codegen/MemberCodegen.java | 2 +- .../codegen/context/CodegenContext.java | 17 +++++---- 7 files changed, 63 insertions(+), 54 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForCallableDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForCallableDescriptor.kt index c347de3e3c3..20c58f09ce3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForCallableDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForCallableDescriptor.kt @@ -24,4 +24,5 @@ interface AccessorForCallableDescriptor { val superCallTarget: ClassDescriptor? + val accessorKind: AccessorKind } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt index a28ca812fe2..1e15edd5a76 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt @@ -23,13 +23,13 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeSubstitutor class AccessorForConstructorDescriptor( - private val calleeDescriptor: ClassConstructorDescriptor, - containingDeclaration: DeclarationDescriptor, - private val superCallTarget: ClassDescriptor? + override val calleeDescriptor: ClassConstructorDescriptor, + containingDeclaration: DeclarationDescriptor, + override val superCallTarget: ClassDescriptor?, + override val accessorKind: AccessorKind ) : AbstractAccessorForFunctionDescriptor(containingDeclaration, Name.special("")), - ClassConstructorDescriptor, - AccessorForCallableDescriptor { - override fun getCalleeDescriptor(): ConstructorDescriptor = calleeDescriptor + ClassConstructorDescriptor, + AccessorForCallableDescriptor { override fun getContainingDeclaration(): ClassDescriptor = calleeDescriptor.containingDeclaration @@ -39,16 +39,15 @@ class AccessorForConstructorDescriptor( override fun getReturnType(): KotlinType = super.getReturnType()!! - override fun getSuperCallTarget(): ClassDescriptor? = superCallTarget override fun substitute(substitutor: TypeSubstitutor) = super.substitute(substitutor) as ClassConstructorDescriptor override fun copy( - newOwner: DeclarationDescriptor, - modality: Modality, - visibility: Visibility, - kind: CallableMemberDescriptor.Kind, - copyOverrides: Boolean + newOwner: DeclarationDescriptor, + modality: Modality, + visibility: Visibility, + kind: CallableMemberDescriptor.Kind, + copyOverrides: Boolean ): AccessorForConstructorDescriptor { throw UnsupportedOperationException() } @@ -57,13 +56,13 @@ class AccessorForConstructorDescriptor( init { initialize( - DescriptorUtils.getReceiverParameterType(extensionReceiverParameter), - calleeDescriptor.dispatchReceiverParameter, - copyTypeParameters(calleeDescriptor), - copyValueParameters(calleeDescriptor), - calleeDescriptor.returnType, - Modality.FINAL, - Visibilities.LOCAL + DescriptorUtils.getReceiverParameterType(extensionReceiverParameter), + calleeDescriptor.dispatchReceiverParameter, + copyTypeParameters(calleeDescriptor), + copyValueParameters(calleeDescriptor), + calleeDescriptor.returnType, + Modality.FINAL, + Visibilities.LOCAL ) } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt index 74cb990c59f..04d4282008b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForFunctionDescriptor.kt @@ -29,7 +29,8 @@ class AccessorForFunctionDescriptor( override val calleeDescriptor: FunctionDescriptor, containingDeclaration: DeclarationDescriptor, override val superCallTarget: ClassDescriptor?, - private val nameSuffix: String + private val nameSuffix: String, + override val accessorKind: AccessorKind ) : AbstractAccessorForFunctionDescriptor(containingDeclaration, Name.identifier("access$$nameSuffix")), AccessorForCallableDescriptor { @@ -63,6 +64,6 @@ class AccessorForFunctionDescriptor( annotations: Annotations, source: SourceElement ): FunctionDescriptorImpl { - return AccessorForFunctionDescriptor(calleeDescriptor, newOwner, superCallTarget, nameSuffix) + return AccessorForFunctionDescriptor(calleeDescriptor, newOwner, superCallTarget, nameSuffix, accessorKind) } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyBackingField.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyBackingField.kt index 37f68270f92..99b2090f3f8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyBackingField.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyBackingField.kt @@ -22,19 +22,20 @@ import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.types.KotlinType class AccessorForPropertyBackingField( - property: PropertyDescriptor, - containingDeclaration: DeclarationDescriptor, - delegateType: KotlinType?, - extensionReceiverParameter: ReceiverParameterDescriptor?, - dispatchReceiverParameter: ReceiverParameterDescriptor?, - nameSuffix: String, - val fieldAccessorKind: AccessorKind + property: PropertyDescriptor, + containingDeclaration: DeclarationDescriptor, + delegateType: KotlinType?, + extensionReceiverParameter: ReceiverParameterDescriptor?, + dispatchReceiverParameter: ReceiverParameterDescriptor?, + nameSuffix: String, + fieldAccessorKind: AccessorKind ) : AccessorForPropertyDescriptor( - property, - delegateType ?: property.type, - extensionReceiverParameter?.type, - dispatchReceiverParameter, - containingDeclaration, - null, - nameSuffix + property, + delegateType ?: property.type, + extensionReceiverParameter?.type, + dispatchReceiverParameter, + containingDeclaration, + null, + nameSuffix, + fieldAccessorKind ) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.kt index edb1d1194be..0b78415c7e6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.kt @@ -35,7 +35,8 @@ open class AccessorForPropertyDescriptor private constructor( override val superCallTarget: ClassDescriptor?, val accessorSuffix: String, val isWithSyntheticGetterAccessor: Boolean, - val isWithSyntheticSetterAccessor: Boolean + val isWithSyntheticSetterAccessor: Boolean, + final override val accessorKind: AccessorKind ) : PropertyDescriptorImpl( containingDeclaration, null, @@ -60,13 +61,15 @@ open class AccessorForPropertyDescriptor private constructor( superCallTarget: ClassDescriptor?, nameSuffix: String, getterAccessorRequired: Boolean, - setterAccessorRequired: Boolean + setterAccessorRequired: Boolean, + accessorKind: AccessorKind ) : this( property, property.type, DescriptorUtils.getReceiverParameterType(property.extensionReceiverParameter), /* dispatchReceiverParameter = */ if (property.isJvmStaticInObjectOrClassOrInterface()) null else property.dispatchReceiverParameter, containingDeclaration, superCallTarget, nameSuffix, - getterAccessorRequired, setterAccessorRequired + getterAccessorRequired, setterAccessorRequired, + accessorKind ) protected constructor( @@ -76,7 +79,8 @@ open class AccessorForPropertyDescriptor private constructor( dispatchReceiverParameter: ReceiverParameterDescriptor?, containingDeclaration: DeclarationDescriptor, superCallTarget: ClassDescriptor?, - nameSuffix: String + nameSuffix: String, + accessorKind: AccessorKind ) : this( original, propertyType, @@ -86,20 +90,20 @@ open class AccessorForPropertyDescriptor private constructor( superCallTarget, nameSuffix, true, - true - ) { - } + true, + accessorKind + ) init { setType(propertyType, emptyList(), dispatchReceiverParameter, receiverType) val getterDescriptor = - if (isWithSyntheticGetterAccessor) Getter(this) else calleeDescriptor.getter as PropertyGetterDescriptorImpl? - val setterDescriptor = if (isWithSyntheticSetterAccessor) Setter(this) else calleeDescriptor.setter + if (isWithSyntheticGetterAccessor) Getter(this, accessorKind) else calleeDescriptor.getter as PropertyGetterDescriptorImpl? + val setterDescriptor = if (isWithSyntheticSetterAccessor) Setter(this, accessorKind) else calleeDescriptor.setter initialize(getterDescriptor, setterDescriptor) } - class Getter(property: AccessorForPropertyDescriptor) : PropertyGetterDescriptorImpl( + class Getter(property: AccessorForPropertyDescriptor, override val accessorKind: AccessorKind) : PropertyGetterDescriptorImpl( property, Annotations.EMPTY, Modality.FINAL, @@ -124,7 +128,7 @@ open class AccessorForPropertyDescriptor private constructor( } - class Setter(property: AccessorForPropertyDescriptor) : PropertySetterDescriptorImpl( + class Setter(property: AccessorForPropertyDescriptor, override val accessorKind: AccessorKind) : PropertySetterDescriptorImpl( property, Annotations.EMPTY, Modality.FINAL, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 4ae083724b0..b675adc6158 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -759,7 +759,7 @@ public abstract class MemberCodegen { private final @NotNull DeclarationDescriptor containingDeclaration; private final @Nullable ClassDescriptor superCallTarget; private final @NotNull String nameSuffix; + private final @NotNull AccessorKind accessorKind; private AccessorForPropertyDescriptor withSyntheticGetterAndSetter = null; private AccessorForPropertyDescriptor withSyntheticGetter = null; @@ -97,12 +98,14 @@ public abstract class CodegenContext { @NotNull PropertyDescriptor property, @NotNull DeclarationDescriptor containingDeclaration, @Nullable ClassDescriptor superCallTarget, - @NotNull String nameSuffix + @NotNull String nameSuffix, + @NotNull AccessorKind accessorKind ) { this.property = property; this.containingDeclaration = containingDeclaration; this.superCallTarget = superCallTarget; this.nameSuffix = nameSuffix; + this.accessorKind = accessorKind; } @SuppressWarnings("ConstantConditions") @@ -114,7 +117,7 @@ public abstract class CodegenContext { if (withSyntheticGetter == null) { withSyntheticGetter = new AccessorForPropertyDescriptor( property, containingDeclaration, superCallTarget, nameSuffix, - true, false); + true, false, accessorKind); } return withSyntheticGetter; } @@ -122,7 +125,7 @@ public abstract class CodegenContext { if (withSyntheticSetter == null) { withSyntheticSetter = new AccessorForPropertyDescriptor( property, containingDeclaration, superCallTarget, nameSuffix, - false, true); + false, true, accessorKind); } return withSyntheticSetter; } @@ -136,7 +139,7 @@ public abstract class CodegenContext { if (withSyntheticGetterAndSetter == null) { withSyntheticGetterAndSetter = new AccessorForPropertyDescriptor( property, containingDeclaration, superCallTarget, nameSuffix, - true, true); + true, true, accessorKind); } return withSyntheticGetterAndSetter; } @@ -482,16 +485,16 @@ public abstract class CodegenContext { String nameSuffix = SyntheticAccessorUtilKt.getAccessorNameSuffix(descriptor, key.superCallLabelTarget, accessorKind); AccessorForCallableDescriptor accessor; if (descriptor instanceof SimpleFunctionDescriptor) { - accessor = new AccessorForFunctionDescriptor((FunctionDescriptor) descriptor, contextDescriptor, superCallTarget, nameSuffix); + accessor = new AccessorForFunctionDescriptor((FunctionDescriptor) descriptor, contextDescriptor, superCallTarget, nameSuffix, accessorKind); } else if (descriptor instanceof ClassConstructorDescriptor) { - accessor = new AccessorForConstructorDescriptor((ClassConstructorDescriptor) descriptor, contextDescriptor, superCallTarget); + accessor = new AccessorForConstructorDescriptor((ClassConstructorDescriptor) descriptor, contextDescriptor, superCallTarget, accessorKind); } else if (descriptor instanceof PropertyDescriptor) { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; if (accessorKind == AccessorKind.NORMAL) { AccessorForPropertyDescriptorFactory factory = - new AccessorForPropertyDescriptorFactory(propertyDescriptor, contextDescriptor, superCallTarget, nameSuffix); + new AccessorForPropertyDescriptorFactory(propertyDescriptor, contextDescriptor, superCallTarget, nameSuffix, accessorKind); propertyAccessorFactories.put(key, factory); // Record worst case accessor for accessor methods generation.