Don't generate private members in interface
This commit is contained in:
@@ -310,11 +310,11 @@ public class AsmUtil {
|
||||
@Nullable
|
||||
private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) {
|
||||
DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration();
|
||||
Visibility memberVisibility = memberDescriptor.getVisibility();
|
||||
if (isInterface(containingDeclaration)) {
|
||||
return ACC_PUBLIC;
|
||||
return memberVisibility == Visibilities.PRIVATE ? NO_FLAG_PACKAGE_PRIVATE : ACC_PUBLIC;
|
||||
}
|
||||
|
||||
Visibility memberVisibility = memberDescriptor.getVisibility();
|
||||
if (memberVisibility == Visibilities.LOCAL && memberDescriptor instanceof CallableMemberDescriptor) {
|
||||
return ACC_PUBLIC;
|
||||
}
|
||||
|
||||
@@ -142,6 +142,12 @@ public class FunctionCodegen {
|
||||
@NotNull FunctionGenerationStrategy strategy
|
||||
) {
|
||||
OwnerKind contextKind = methodContext.getContextKind();
|
||||
if (isTrait(functionDescriptor.getContainingDeclaration()) &&
|
||||
functionDescriptor.getVisibility() == Visibilities.PRIVATE &&
|
||||
contextKind != OwnerKind.TRAIT_IMPL) {
|
||||
return;
|
||||
}
|
||||
|
||||
JvmMethodSignature jvmSignature = typeMapper.mapSignature(functionDescriptor, contextKind);
|
||||
Method asmMethod = jvmSignature.getAsmMethod();
|
||||
|
||||
@@ -577,9 +583,7 @@ public class FunctionCodegen {
|
||||
) {
|
||||
DeclarationDescriptor contextClass = owner.getContextDescriptor().getContainingDeclaration();
|
||||
|
||||
if (kind != OwnerKind.TRAIT_IMPL &&
|
||||
contextClass instanceof ClassDescriptor &&
|
||||
((ClassDescriptor) contextClass).getKind() == ClassKind.INTERFACE) {
|
||||
if (kind != OwnerKind.TRAIT_IMPL && isTrait(contextClass)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@ import java.io.File;
|
||||
|
||||
import static org.jetbrains.kotlin.descriptors.Modality.ABSTRACT;
|
||||
import static org.jetbrains.kotlin.descriptors.Modality.FINAL;
|
||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isTrait;
|
||||
|
||||
public class JvmCodegenUtil {
|
||||
|
||||
|
||||
@@ -58,11 +58,9 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind;
|
||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature;
|
||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature;
|
||||
import org.jetbrains.kotlin.resolve.scopes.AbstractScopeAdapter;
|
||||
import org.jetbrains.kotlin.resolve.scopes.ChainedScope;
|
||||
import org.jetbrains.kotlin.resolve.scopes.JetScope;
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializedType;
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor;
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope;
|
||||
import org.jetbrains.kotlin.types.*;
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions;
|
||||
import org.jetbrains.org.objectweb.asm.Type;
|
||||
@@ -625,7 +623,7 @@ public class JetTypeMapper {
|
||||
ownerForDefaultParam = mapClass(ownerForDefault);
|
||||
ownerForDefaultImpl = isInterface(ownerForDefault) ? mapTraitImpl(ownerForDefault) : ownerForDefaultParam;
|
||||
|
||||
if (isInterface && superCall) {
|
||||
if (isInterface && (superCall || descriptor.getVisibility() == Visibilities.PRIVATE)) {
|
||||
thisClass = mapClass(currentOwner);
|
||||
if (declarationOwner instanceof JavaClassDescriptor) {
|
||||
invokeOpcode = INVOKESPECIAL;
|
||||
|
||||
-10
@@ -1,12 +1,2 @@
|
||||
public interface PrivateInTrait {
|
||||
@org.jetbrains.annotations.NotNull
|
||||
java.lang.String getNn();
|
||||
|
||||
void setNn(@org.jetbrains.annotations.NotNull java.lang.String value);
|
||||
|
||||
@org.jetbrains.annotations.Nullable
|
||||
java.lang.String getN();
|
||||
|
||||
@org.jetbrains.annotations.Nullable
|
||||
java.lang.String bar(@org.jetbrains.annotations.NotNull java.lang.String a, @org.jetbrains.annotations.Nullable java.lang.String b);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
interface Z {
|
||||
|
||||
fun testFun() : String {
|
||||
return privateFun()
|
||||
}
|
||||
|
||||
fun testProperty() : String {
|
||||
return privateProp
|
||||
}
|
||||
|
||||
private fun privateFun(): String {
|
||||
return "O"
|
||||
}
|
||||
|
||||
private val privateProp: String
|
||||
get() = "K"
|
||||
}
|
||||
|
||||
object Z2 : Z {
|
||||
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
return Z2.testFun() + Z2.testProperty()
|
||||
}
|
||||
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
interface Z {
|
||||
|
||||
fun testFun(): String {
|
||||
return { privateFun() } ()
|
||||
}
|
||||
|
||||
fun testProperty(): String {
|
||||
return { privateProp } ()
|
||||
}
|
||||
|
||||
private fun privateFun(): String {
|
||||
return "O"
|
||||
}
|
||||
|
||||
private val privateProp: String
|
||||
get() = "K"
|
||||
}
|
||||
|
||||
object Z2 : Z {
|
||||
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
return Z2.testFun() + Z2.testProperty()
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
interface A {
|
||||
|
||||
private val prop: String
|
||||
get() = "1"
|
||||
|
||||
private fun foo() {
|
||||
|
||||
}
|
||||
|
||||
private fun defaultFun(p: String = "OK") {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 1 foo
|
||||
// 1 getProp
|
||||
// 1 defaultFun\$
|
||||
@@ -544,6 +544,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("noPrivateMemberInJavaInterface.kt")
|
||||
public void testNoPrivateMemberInJavaInterface() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/interfaces/noPrivateMemberInJavaInterface.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("traitImplGeneratedOnce.kt")
|
||||
public void testTraitImplGeneratedOnce() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/interfaces/traitImplGeneratedOnce.kt");
|
||||
|
||||
+12
@@ -7593,6 +7593,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/traits/traitWithPrivateExtension.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("traitWithPrivateMember.kt")
|
||||
public void testTraitWithPrivateMember() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/traits/traitWithPrivateMember.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("traitWithPrivateMemberAccessFromLambda.kt")
|
||||
public void testTraitWithPrivateMemberAccessFromLambda() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/traits/traitWithPrivateMemberAccessFromLambda.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/codegen/box/typeInfo")
|
||||
|
||||
Reference in New Issue
Block a user