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 accessorKind: AccessorKind
}
@@ -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("<init>")),
ClassConstructorDescriptor,
AccessorForCallableDescriptor<ConstructorDescriptor> {
override fun getCalleeDescriptor(): ConstructorDescriptor = calleeDescriptor
ClassConstructorDescriptor,
AccessorForCallableDescriptor<ConstructorDescriptor> {
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
)
}
}
@@ -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<FunctionDescriptor> {
@@ -63,6 +64,6 @@ class AccessorForFunctionDescriptor(
annotations: Annotations,
source: SourceElement
): 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
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
)
@@ -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<TypeParameterDescriptorImpl>(), 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,
@@ -759,7 +759,7 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
@Override
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
AccessorKind fieldAccessorKind = accessor instanceof AccessorForPropertyBackingField
? ((AccessorForPropertyBackingField) accessor).getFieldAccessorKind() : null;
? accessor.getAccessorKind() : null;
boolean syntheticBackingField = fieldAccessorKind == AccessorKind.FIELD_FROM_LOCAL;
boolean forceFieldForCompanionProperty = JvmAbi.isPropertyWithBackingFieldInOuterClass(original) &&
!isCompanionObject(accessor.getContainingDeclaration());
@@ -88,6 +88,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
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<T extends DeclarationDescriptor> {
@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<T extends DeclarationDescriptor> {
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<T extends DeclarationDescriptor> {
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<T extends DeclarationDescriptor> {
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<T extends DeclarationDescriptor> {
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.