Generate private interface companion object as package-private synthetic
This commit is contained in:
@@ -482,6 +482,10 @@ public class AsmUtil {
|
||||
DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration();
|
||||
Visibility memberVisibility = memberDescriptor.getVisibility();
|
||||
|
||||
if (JvmCodegenUtil.isNonIntrinsicPrivateCompanionObjectInInterface(memberDescriptor)) {
|
||||
return ACC_PUBLIC;
|
||||
}
|
||||
|
||||
if (memberDescriptor instanceof FunctionDescriptor &&
|
||||
isInlineClassWrapperConstructor((FunctionDescriptor) memberDescriptor, kind)) {
|
||||
return ACC_PRIVATE;
|
||||
|
||||
@@ -786,12 +786,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
state.getLanguageVersionSettings().supportsFeature(LanguageFeature.DeprecatedFieldForInvisibleCompanionObject);
|
||||
boolean properVisibilityForCompanionObjectInstanceField =
|
||||
state.getLanguageVersionSettings().supportsFeature(LanguageFeature.ProperVisibilityForCompanionObjectInstanceField);
|
||||
boolean hasPrivateOrProtectedProperVisibility = (properFieldVisibilityFlag & (ACC_PRIVATE | ACC_PROTECTED)) != 0;
|
||||
boolean hasPackagePrivateProperVisibility = (properFieldVisibilityFlag & (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED)) == 0;
|
||||
boolean fieldShouldBeDeprecated =
|
||||
deprecatedFieldForInvisibleCompanionObject &&
|
||||
!properVisibilityForCompanionObjectInstanceField &&
|
||||
(properFieldVisibilityFlag & (ACC_PRIVATE | ACC_PROTECTED)) != 0;
|
||||
(hasPrivateOrProtectedProperVisibility || hasPackagePrivateProperVisibility ||
|
||||
isNonIntrinsicPrivateCompanionObjectInInterface(companionObjectDescriptor));
|
||||
boolean doNotGeneratePublic =
|
||||
properVisibilityForCompanionObjectInstanceField && (properFieldVisibilityFlag & (ACC_PRIVATE | ACC_PROTECTED)) != 0;
|
||||
properVisibilityForCompanionObjectInstanceField && hasPrivateOrProtectedProperVisibility;
|
||||
int fieldAccessFlags;
|
||||
if (doNotGeneratePublic) {
|
||||
fieldAccessFlags = ACC_STATIC | ACC_FINAL;
|
||||
@@ -805,6 +808,11 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
if (fieldShouldBeDeprecated) {
|
||||
fieldAccessFlags |= ACC_DEPRECATED;
|
||||
}
|
||||
if (properVisibilityForCompanionObjectInstanceField &&
|
||||
JvmCodegenUtil.isCompanionObjectInInterfaceNotIntrinsic(companionObjectDescriptor) &&
|
||||
Visibilities.isPrivate(companionObjectDescriptor.getVisibility())) {
|
||||
fieldAccessFlags |= ACC_SYNTHETIC;
|
||||
}
|
||||
StackValue.Field field = StackValue.singleton(companionObjectDescriptor, typeMapper);
|
||||
FieldVisitor fv = v.newField(JvmDeclarationOriginKt.OtherOrigin(companionObject == null ? myClass.getPsiOrParent() : companionObject),
|
||||
fieldAccessFlags, field.name, field.type.getDescriptor(), null, null);
|
||||
|
||||
@@ -348,6 +348,11 @@ public class JvmCodegenUtil {
|
||||
!JvmAbi.isMappedIntrinsicCompanionObject((ClassDescriptor) companionObject);
|
||||
}
|
||||
|
||||
public static boolean isNonIntrinsicPrivateCompanionObjectInInterface(@NotNull DeclarationDescriptorWithVisibility companionObject) {
|
||||
return isCompanionObjectInInterfaceNotIntrinsic(companionObject) &&
|
||||
Visibilities.isPrivate(companionObject.getVisibility());
|
||||
}
|
||||
|
||||
public static boolean isDeclarationOfBigArityFunctionInvoke(@Nullable DeclarationDescriptor descriptor) {
|
||||
return descriptor instanceof FunctionInvokeDescriptor && ((FunctionInvokeDescriptor) descriptor).hasBigArity();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user