Pass accessorKind into AccessorForCallableDescriptor
This commit is contained in:
@@ -24,4 +24,5 @@ interface AccessorForCallableDescriptor<T : CallableMemberDescriptor> {
|
|||||||
|
|
||||||
val superCallTarget: ClassDescriptor?
|
val superCallTarget: ClassDescriptor?
|
||||||
|
|
||||||
|
val accessorKind: AccessorKind
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-19
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-14
@@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
+15
-11
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user