Pass accessorKind into AccessorForCallableDescriptor

This commit is contained in:
Mikhael Bogdanov
2018-05-25 15:18:32 +02:00
parent 7a649e0e74
commit b7bad2bd72
7 changed files with 63 additions and 54 deletions
@@ -24,4 +24,5 @@ interface AccessorForCallableDescriptor<T : CallableMemberDescriptor> {
val superCallTarget: ClassDescriptor? val superCallTarget: ClassDescriptor?
val accessorKind: AccessorKind
} }
@@ -23,13 +23,13 @@ import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeSubstitutor
class AccessorForConstructorDescriptor( class AccessorForConstructorDescriptor(
private val calleeDescriptor: ClassConstructorDescriptor, override val calleeDescriptor: ClassConstructorDescriptor,
containingDeclaration: DeclarationDescriptor, containingDeclaration: DeclarationDescriptor,
private val superCallTarget: ClassDescriptor? override val superCallTarget: ClassDescriptor?,
override val accessorKind: AccessorKind
) : AbstractAccessorForFunctionDescriptor(containingDeclaration, Name.special("<init>")), ) : AbstractAccessorForFunctionDescriptor(containingDeclaration, Name.special("<init>")),
ClassConstructorDescriptor, ClassConstructorDescriptor,
AccessorForCallableDescriptor<ConstructorDescriptor> { AccessorForCallableDescriptor<ConstructorDescriptor> {
override fun getCalleeDescriptor(): ConstructorDescriptor = calleeDescriptor
override fun getContainingDeclaration(): ClassDescriptor = calleeDescriptor.containingDeclaration override fun getContainingDeclaration(): ClassDescriptor = calleeDescriptor.containingDeclaration
@@ -39,16 +39,15 @@ class AccessorForConstructorDescriptor(
override fun getReturnType(): KotlinType = super.getReturnType()!! override fun getReturnType(): KotlinType = super.getReturnType()!!
override fun getSuperCallTarget(): ClassDescriptor? = superCallTarget
override fun substitute(substitutor: TypeSubstitutor) = super.substitute(substitutor) as ClassConstructorDescriptor override fun substitute(substitutor: TypeSubstitutor) = super.substitute(substitutor) as ClassConstructorDescriptor
override fun copy( override fun copy(
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
modality: Modality, modality: Modality,
visibility: Visibility, visibility: Visibility,
kind: CallableMemberDescriptor.Kind, kind: CallableMemberDescriptor.Kind,
copyOverrides: Boolean copyOverrides: Boolean
): AccessorForConstructorDescriptor { ): AccessorForConstructorDescriptor {
throw UnsupportedOperationException() throw UnsupportedOperationException()
} }
@@ -57,13 +56,13 @@ class AccessorForConstructorDescriptor(
init { init {
initialize( initialize(
DescriptorUtils.getReceiverParameterType(extensionReceiverParameter), DescriptorUtils.getReceiverParameterType(extensionReceiverParameter),
calleeDescriptor.dispatchReceiverParameter, calleeDescriptor.dispatchReceiverParameter,
copyTypeParameters(calleeDescriptor), copyTypeParameters(calleeDescriptor),
copyValueParameters(calleeDescriptor), copyValueParameters(calleeDescriptor),
calleeDescriptor.returnType, calleeDescriptor.returnType,
Modality.FINAL, Modality.FINAL,
Visibilities.LOCAL Visibilities.LOCAL
) )
} }
} }
@@ -29,7 +29,8 @@ class AccessorForFunctionDescriptor(
override val calleeDescriptor: FunctionDescriptor, override val calleeDescriptor: FunctionDescriptor,
containingDeclaration: DeclarationDescriptor, containingDeclaration: DeclarationDescriptor,
override val superCallTarget: ClassDescriptor?, override val superCallTarget: ClassDescriptor?,
private val nameSuffix: String private val nameSuffix: String,
override val accessorKind: AccessorKind
) : AbstractAccessorForFunctionDescriptor(containingDeclaration, Name.identifier("access$$nameSuffix")), ) : AbstractAccessorForFunctionDescriptor(containingDeclaration, Name.identifier("access$$nameSuffix")),
AccessorForCallableDescriptor<FunctionDescriptor> { AccessorForCallableDescriptor<FunctionDescriptor> {
@@ -63,6 +64,6 @@ class AccessorForFunctionDescriptor(
annotations: Annotations, annotations: Annotations,
source: SourceElement source: SourceElement
): FunctionDescriptorImpl { ): FunctionDescriptorImpl {
return AccessorForFunctionDescriptor(calleeDescriptor, newOwner, superCallTarget, nameSuffix) return AccessorForFunctionDescriptor(calleeDescriptor, newOwner, superCallTarget, nameSuffix, accessorKind)
} }
} }
@@ -22,19 +22,20 @@ import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
class AccessorForPropertyBackingField( class AccessorForPropertyBackingField(
property: PropertyDescriptor, property: PropertyDescriptor,
containingDeclaration: DeclarationDescriptor, containingDeclaration: DeclarationDescriptor,
delegateType: KotlinType?, delegateType: KotlinType?,
extensionReceiverParameter: ReceiverParameterDescriptor?, extensionReceiverParameter: ReceiverParameterDescriptor?,
dispatchReceiverParameter: ReceiverParameterDescriptor?, dispatchReceiverParameter: ReceiverParameterDescriptor?,
nameSuffix: String, nameSuffix: String,
val fieldAccessorKind: AccessorKind fieldAccessorKind: AccessorKind
) : AccessorForPropertyDescriptor( ) : AccessorForPropertyDescriptor(
property, property,
delegateType ?: property.type, delegateType ?: property.type,
extensionReceiverParameter?.type, extensionReceiverParameter?.type,
dispatchReceiverParameter, dispatchReceiverParameter,
containingDeclaration, containingDeclaration,
null, null,
nameSuffix nameSuffix,
fieldAccessorKind
) )
@@ -35,7 +35,8 @@ open class AccessorForPropertyDescriptor private constructor(
override val superCallTarget: ClassDescriptor?, override val superCallTarget: ClassDescriptor?,
val accessorSuffix: String, val accessorSuffix: String,
val isWithSyntheticGetterAccessor: Boolean, val isWithSyntheticGetterAccessor: Boolean,
val isWithSyntheticSetterAccessor: Boolean val isWithSyntheticSetterAccessor: Boolean,
final override val accessorKind: AccessorKind
) : PropertyDescriptorImpl( ) : PropertyDescriptorImpl(
containingDeclaration, containingDeclaration,
null, null,
@@ -60,13 +61,15 @@ open class AccessorForPropertyDescriptor private constructor(
superCallTarget: ClassDescriptor?, superCallTarget: ClassDescriptor?,
nameSuffix: String, nameSuffix: String,
getterAccessorRequired: Boolean, getterAccessorRequired: Boolean,
setterAccessorRequired: Boolean setterAccessorRequired: Boolean,
accessorKind: AccessorKind
) : this( ) : this(
property, property.type, DescriptorUtils.getReceiverParameterType(property.extensionReceiverParameter), property, property.type, DescriptorUtils.getReceiverParameterType(property.extensionReceiverParameter),
/* dispatchReceiverParameter = */ /* dispatchReceiverParameter = */
if (property.isJvmStaticInObjectOrClassOrInterface()) null else property.dispatchReceiverParameter, if (property.isJvmStaticInObjectOrClassOrInterface()) null else property.dispatchReceiverParameter,
containingDeclaration, superCallTarget, nameSuffix, containingDeclaration, superCallTarget, nameSuffix,
getterAccessorRequired, setterAccessorRequired getterAccessorRequired, setterAccessorRequired,
accessorKind
) )
protected constructor( protected constructor(
@@ -76,7 +79,8 @@ open class AccessorForPropertyDescriptor private constructor(
dispatchReceiverParameter: ReceiverParameterDescriptor?, dispatchReceiverParameter: ReceiverParameterDescriptor?,
containingDeclaration: DeclarationDescriptor, containingDeclaration: DeclarationDescriptor,
superCallTarget: ClassDescriptor?, superCallTarget: ClassDescriptor?,
nameSuffix: String nameSuffix: String,
accessorKind: AccessorKind
) : this( ) : this(
original, original,
propertyType, propertyType,
@@ -86,20 +90,20 @@ open class AccessorForPropertyDescriptor private constructor(
superCallTarget, superCallTarget,
nameSuffix, nameSuffix,
true, true,
true true,
) { accessorKind
} )
init { init {
setType(propertyType, emptyList<TypeParameterDescriptorImpl>(), dispatchReceiverParameter, receiverType) setType(propertyType, emptyList<TypeParameterDescriptorImpl>(), dispatchReceiverParameter, receiverType)
val getterDescriptor = val getterDescriptor =
if (isWithSyntheticGetterAccessor) Getter(this) else calleeDescriptor.getter as PropertyGetterDescriptorImpl? if (isWithSyntheticGetterAccessor) Getter(this, accessorKind) else calleeDescriptor.getter as PropertyGetterDescriptorImpl?
val setterDescriptor = if (isWithSyntheticSetterAccessor) Setter(this) else calleeDescriptor.setter val setterDescriptor = if (isWithSyntheticSetterAccessor) Setter(this, accessorKind) else calleeDescriptor.setter
initialize(getterDescriptor, setterDescriptor) initialize(getterDescriptor, setterDescriptor)
} }
class Getter(property: AccessorForPropertyDescriptor) : PropertyGetterDescriptorImpl( class Getter(property: AccessorForPropertyDescriptor, override val accessorKind: AccessorKind) : PropertyGetterDescriptorImpl(
property, property,
Annotations.EMPTY, Annotations.EMPTY,
Modality.FINAL, 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, property,
Annotations.EMPTY, Annotations.EMPTY,
Modality.FINAL, Modality.FINAL,
@@ -759,7 +759,7 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
@Override @Override
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) { public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
AccessorKind fieldAccessorKind = accessor instanceof AccessorForPropertyBackingField AccessorKind fieldAccessorKind = accessor instanceof AccessorForPropertyBackingField
? ((AccessorForPropertyBackingField) accessor).getFieldAccessorKind() : null; ? accessor.getAccessorKind() : null;
boolean syntheticBackingField = fieldAccessorKind == AccessorKind.FIELD_FROM_LOCAL; boolean syntheticBackingField = fieldAccessorKind == AccessorKind.FIELD_FROM_LOCAL;
boolean forceFieldForCompanionProperty = JvmAbi.isPropertyWithBackingFieldInOuterClass(original) && boolean forceFieldForCompanionProperty = JvmAbi.isPropertyWithBackingFieldInOuterClass(original) &&
!isCompanionObject(accessor.getContainingDeclaration()); !isCompanionObject(accessor.getContainingDeclaration());
@@ -88,6 +88,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
private final @NotNull DeclarationDescriptor containingDeclaration; private final @NotNull DeclarationDescriptor containingDeclaration;
private final @Nullable ClassDescriptor superCallTarget; private final @Nullable ClassDescriptor superCallTarget;
private final @NotNull String nameSuffix; private final @NotNull String nameSuffix;
private final @NotNull AccessorKind accessorKind;
private AccessorForPropertyDescriptor withSyntheticGetterAndSetter = null; private AccessorForPropertyDescriptor withSyntheticGetterAndSetter = null;
private AccessorForPropertyDescriptor withSyntheticGetter = null; private AccessorForPropertyDescriptor withSyntheticGetter = null;
@@ -97,12 +98,14 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
@NotNull PropertyDescriptor property, @NotNull PropertyDescriptor property,
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@Nullable ClassDescriptor superCallTarget, @Nullable ClassDescriptor superCallTarget,
@NotNull String nameSuffix @NotNull String nameSuffix,
@NotNull AccessorKind accessorKind
) { ) {
this.property = property; this.property = property;
this.containingDeclaration = containingDeclaration; this.containingDeclaration = containingDeclaration;
this.superCallTarget = superCallTarget; this.superCallTarget = superCallTarget;
this.nameSuffix = nameSuffix; this.nameSuffix = nameSuffix;
this.accessorKind = accessorKind;
} }
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
@@ -114,7 +117,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
if (withSyntheticGetter == null) { if (withSyntheticGetter == null) {
withSyntheticGetter = new AccessorForPropertyDescriptor( withSyntheticGetter = new AccessorForPropertyDescriptor(
property, containingDeclaration, superCallTarget, nameSuffix, property, containingDeclaration, superCallTarget, nameSuffix,
true, false); true, false, accessorKind);
} }
return withSyntheticGetter; return withSyntheticGetter;
} }
@@ -122,7 +125,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
if (withSyntheticSetter == null) { if (withSyntheticSetter == null) {
withSyntheticSetter = new AccessorForPropertyDescriptor( withSyntheticSetter = new AccessorForPropertyDescriptor(
property, containingDeclaration, superCallTarget, nameSuffix, property, containingDeclaration, superCallTarget, nameSuffix,
false, true); false, true, accessorKind);
} }
return withSyntheticSetter; return withSyntheticSetter;
} }
@@ -136,7 +139,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
if (withSyntheticGetterAndSetter == null) { if (withSyntheticGetterAndSetter == null) {
withSyntheticGetterAndSetter = new AccessorForPropertyDescriptor( withSyntheticGetterAndSetter = new AccessorForPropertyDescriptor(
property, containingDeclaration, superCallTarget, nameSuffix, property, containingDeclaration, superCallTarget, nameSuffix,
true, true); true, true, accessorKind);
} }
return withSyntheticGetterAndSetter; return withSyntheticGetterAndSetter;
} }
@@ -482,16 +485,16 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
String nameSuffix = SyntheticAccessorUtilKt.getAccessorNameSuffix(descriptor, key.superCallLabelTarget, accessorKind); String nameSuffix = SyntheticAccessorUtilKt.getAccessorNameSuffix(descriptor, key.superCallLabelTarget, accessorKind);
AccessorForCallableDescriptor<?> accessor; AccessorForCallableDescriptor<?> accessor;
if (descriptor instanceof SimpleFunctionDescriptor) { 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) { 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) { else if (descriptor instanceof PropertyDescriptor) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
if (accessorKind == AccessorKind.NORMAL) { if (accessorKind == AccessorKind.NORMAL) {
AccessorForPropertyDescriptorFactory factory = AccessorForPropertyDescriptorFactory factory =
new AccessorForPropertyDescriptorFactory(propertyDescriptor, contextDescriptor, superCallTarget, nameSuffix); new AccessorForPropertyDescriptorFactory(propertyDescriptor, contextDescriptor, superCallTarget, nameSuffix, accessorKind);
propertyAccessorFactories.put(key, factory); propertyAccessorFactories.put(key, factory);
// Record worst case accessor for accessor methods generation. // Record worst case accessor for accessor methods generation.