Make inline class wrapper constructor private

This commit is contained in:
Dmitry Petrov
2018-09-05 14:42:28 +03:00
parent c094b3a5a2
commit 0bd1c4d1b7
8 changed files with 29 additions and 12 deletions
@@ -222,7 +222,7 @@ public class AsmUtil {
} }
public static int getMethodAsmFlags(FunctionDescriptor functionDescriptor, OwnerKind kind, GenerationState state) { public static int getMethodAsmFlags(FunctionDescriptor functionDescriptor, OwnerKind kind, GenerationState state) {
int flags = getCommonCallableFlags(functionDescriptor, state); int flags = getCommonCallableFlags(functionDescriptor, kind, state);
for (AnnotationCodegen.JvmFlagAnnotation flagAnnotation : AnnotationCodegen.METHOD_FLAGS) { for (AnnotationCodegen.JvmFlagAnnotation flagAnnotation : AnnotationCodegen.METHOD_FLAGS) {
flags |= flagAnnotation.getJvmFlag(functionDescriptor.getOriginal()); flags |= flagAnnotation.getJvmFlag(functionDescriptor.getOriginal());
@@ -263,14 +263,22 @@ public class AsmUtil {
return flags; return flags;
} }
private static boolean isInlineClassWrapperConstructor(@NotNull FunctionDescriptor functionDescriptor, @NotNull OwnerKind kind) { private static boolean isInlineClassWrapperConstructor(@NotNull FunctionDescriptor functionDescriptor, @Nullable OwnerKind kind) {
if (!(functionDescriptor instanceof ConstructorDescriptor)) return false; if (!(functionDescriptor instanceof ConstructorDescriptor)) return false;
ClassDescriptor classDescriptor = ((ConstructorDescriptor) functionDescriptor).getConstructedClass(); ClassDescriptor classDescriptor = ((ConstructorDescriptor) functionDescriptor).getConstructedClass();
return classDescriptor.isInline() && kind == OwnerKind.IMPLEMENTATION; return classDescriptor.isInline() && kind == OwnerKind.IMPLEMENTATION;
} }
public static int getCommonCallableFlags(FunctionDescriptor functionDescriptor, @NotNull GenerationState state) { public static int getCommonCallableFlags(FunctionDescriptor functionDescriptor, @NotNull GenerationState state) {
int flags = getVisibilityAccessFlag(functionDescriptor); return getCommonCallableFlags(functionDescriptor, null, state);
}
private static int getCommonCallableFlags(
FunctionDescriptor functionDescriptor,
@Nullable OwnerKind kind,
@NotNull GenerationState state
) {
int flags = getVisibilityAccessFlag(functionDescriptor, kind);
flags |= getVarargsFlag(functionDescriptor); flags |= getVarargsFlag(functionDescriptor);
flags |= getDeprecatedAccessFlag(functionDescriptor); flags |= getDeprecatedAccessFlag(functionDescriptor);
if (state.getDeprecationProvider().isDeprecatedHidden(functionDescriptor) || if (state.getDeprecationProvider().isDeprecatedHidden(functionDescriptor) ||
@@ -281,7 +289,11 @@ public class AsmUtil {
} }
public static int getVisibilityAccessFlag(@NotNull MemberDescriptor descriptor) { public static int getVisibilityAccessFlag(@NotNull MemberDescriptor descriptor) {
Integer specialCase = specialCaseVisibility(descriptor); return getVisibilityAccessFlag(descriptor, null);
}
private static int getVisibilityAccessFlag(@NotNull MemberDescriptor descriptor, @Nullable OwnerKind kind) {
Integer specialCase = specialCaseVisibility(descriptor, kind);
if (specialCase != null) { if (specialCase != null) {
return specialCase; return specialCase;
} }
@@ -378,10 +390,15 @@ public class AsmUtil {
} }
@Nullable @Nullable
private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) { private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor, @Nullable OwnerKind kind) {
DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration();
Visibility memberVisibility = memberDescriptor.getVisibility(); Visibility memberVisibility = memberDescriptor.getVisibility();
if (memberDescriptor instanceof FunctionDescriptor &&
isInlineClassWrapperConstructor((FunctionDescriptor) memberDescriptor, kind)) {
return ACC_PRIVATE;
}
if (isEffectivelyInlineOnly(memberDescriptor)) { if (isEffectivelyInlineOnly(memberDescriptor)) {
return ACC_PRIVATE; return ACC_PRIVATE;
} }
@@ -13,7 +13,7 @@ public final class Foo {
private final field x: int private final field x: int
inner class Foo$Companion inner class Foo$Companion
static method <clinit>(): void static method <clinit>(): void
public synthetic method <init>(p0: int): void private synthetic method <init>(p0: int): void
public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo
public static method constructor(p0: int): int public static method constructor(p0: int): int
public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
@@ -1,7 +1,7 @@
@kotlin.Metadata @kotlin.Metadata
public final class Foo { public final class Foo {
private final field x: int private final field x: int
public synthetic method <init>(p0: int): void private synthetic method <init>(p0: int): void
public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo
public static method constructor(p0: int): int public static method constructor(p0: int): int
public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
@@ -1,7 +1,7 @@
@kotlin.Metadata @kotlin.Metadata
public final class Foo { public final class Foo {
private final field x: int private final field x: int
public synthetic method <init>(p0: int): void private synthetic method <init>(p0: int): void
public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo
public static method constructor(p0: int): int public static method constructor(p0: int): int
public static method constructor(p0: long): int public static method constructor(p0: long): int
@@ -48,7 +48,7 @@ public interface IFoo {
@kotlin.Metadata @kotlin.Metadata
public final class Z { public final class Z {
private final field x: int private final field x: int
public synthetic method <init>(p0: int): void private synthetic method <init>(p0: int): void
public final static @org.jetbrains.annotations.NotNull method box(p0: int): Z public final static @org.jetbrains.annotations.NotNull method box(p0: int): Z
public static method constructor(p0: int): int public static method constructor(p0: int): int
public static method constructor(p0: long): int public static method constructor(p0: long): int
@@ -6,7 +6,7 @@ public interface A {
@kotlin.Metadata @kotlin.Metadata
public final class Foo { public final class Foo {
private final field x: long private final field x: long
public synthetic method <init>(p0: long): void private synthetic method <init>(p0: long): void
public final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo public final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo
public static method constructor(p0: long): long public static method constructor(p0: long): long
public method equals(p0: java.lang.Object): boolean public method equals(p0: java.lang.Object): boolean
@@ -1,7 +1,7 @@
@kotlin.Metadata @kotlin.Metadata
public final class Foo { public final class Foo {
private final field l: long private final field l: long
public synthetic method <init>(p0: long): void private synthetic method <init>(p0: long): void
public final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo public final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo
public static method constructor(p0: long): long public static method constructor(p0: long): long
public final static method empty(p0: long): void public final static method empty(p0: long): void
@@ -2,5 +2,5 @@
inline class Z(val x: Int) inline class Z(val x: Int)
// 1 public synthetic <init>\(I\)V // 1 private synthetic <init>\(I\)V
// 1 public static constructor\(I\)I // 1 public static constructor\(I\)I