Don't generate private members in interface
This commit is contained in:
@@ -310,11 +310,11 @@ public class AsmUtil {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) {
|
private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) {
|
||||||
DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration();
|
DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration();
|
||||||
|
Visibility memberVisibility = memberDescriptor.getVisibility();
|
||||||
if (isInterface(containingDeclaration)) {
|
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) {
|
if (memberVisibility == Visibilities.LOCAL && memberDescriptor instanceof CallableMemberDescriptor) {
|
||||||
return ACC_PUBLIC;
|
return ACC_PUBLIC;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,6 +142,12 @@ public class FunctionCodegen {
|
|||||||
@NotNull FunctionGenerationStrategy strategy
|
@NotNull FunctionGenerationStrategy strategy
|
||||||
) {
|
) {
|
||||||
OwnerKind contextKind = methodContext.getContextKind();
|
OwnerKind contextKind = methodContext.getContextKind();
|
||||||
|
if (isTrait(functionDescriptor.getContainingDeclaration()) &&
|
||||||
|
functionDescriptor.getVisibility() == Visibilities.PRIVATE &&
|
||||||
|
contextKind != OwnerKind.TRAIT_IMPL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
JvmMethodSignature jvmSignature = typeMapper.mapSignature(functionDescriptor, contextKind);
|
JvmMethodSignature jvmSignature = typeMapper.mapSignature(functionDescriptor, contextKind);
|
||||||
Method asmMethod = jvmSignature.getAsmMethod();
|
Method asmMethod = jvmSignature.getAsmMethod();
|
||||||
|
|
||||||
@@ -577,9 +583,7 @@ public class FunctionCodegen {
|
|||||||
) {
|
) {
|
||||||
DeclarationDescriptor contextClass = owner.getContextDescriptor().getContainingDeclaration();
|
DeclarationDescriptor contextClass = owner.getContextDescriptor().getContainingDeclaration();
|
||||||
|
|
||||||
if (kind != OwnerKind.TRAIT_IMPL &&
|
if (kind != OwnerKind.TRAIT_IMPL && isTrait(contextClass)) {
|
||||||
contextClass instanceof ClassDescriptor &&
|
|
||||||
((ClassDescriptor) contextClass).getKind() == ClassKind.INTERFACE) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ import java.io.File;
|
|||||||
|
|
||||||
import static org.jetbrains.kotlin.descriptors.Modality.ABSTRACT;
|
import static org.jetbrains.kotlin.descriptors.Modality.ABSTRACT;
|
||||||
import static org.jetbrains.kotlin.descriptors.Modality.FINAL;
|
import static org.jetbrains.kotlin.descriptors.Modality.FINAL;
|
||||||
|
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isTrait;
|
||||||
|
|
||||||
public class JvmCodegenUtil {
|
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.JvmMethodParameterSignature;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature;
|
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.AbstractScopeAdapter;
|
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.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializedType;
|
import org.jetbrains.kotlin.serialization.deserialization.DeserializedType;
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor;
|
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.*;
|
||||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions;
|
import org.jetbrains.kotlin.types.expressions.OperatorConventions;
|
||||||
import org.jetbrains.org.objectweb.asm.Type;
|
import org.jetbrains.org.objectweb.asm.Type;
|
||||||
@@ -625,7 +623,7 @@ public class JetTypeMapper {
|
|||||||
ownerForDefaultParam = mapClass(ownerForDefault);
|
ownerForDefaultParam = mapClass(ownerForDefault);
|
||||||
ownerForDefaultImpl = isInterface(ownerForDefault) ? mapTraitImpl(ownerForDefault) : ownerForDefaultParam;
|
ownerForDefaultImpl = isInterface(ownerForDefault) ? mapTraitImpl(ownerForDefault) : ownerForDefaultParam;
|
||||||
|
|
||||||
if (isInterface && superCall) {
|
if (isInterface && (superCall || descriptor.getVisibility() == Visibilities.PRIVATE)) {
|
||||||
thisClass = mapClass(currentOwner);
|
thisClass = mapClass(currentOwner);
|
||||||
if (declarationOwner instanceof JavaClassDescriptor) {
|
if (declarationOwner instanceof JavaClassDescriptor) {
|
||||||
invokeOpcode = INVOKESPECIAL;
|
invokeOpcode = INVOKESPECIAL;
|
||||||
|
|||||||
-10
@@ -1,12 +1,2 @@
|
|||||||
public interface PrivateInTrait {
|
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);
|
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")
|
@TestMetadata("traitImplGeneratedOnce.kt")
|
||||||
public void testTraitImplGeneratedOnce() throws Exception {
|
public void testTraitImplGeneratedOnce() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/interfaces/traitImplGeneratedOnce.kt");
|
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");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/traits/traitWithPrivateExtension.kt");
|
||||||
doTest(fileName);
|
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")
|
@TestMetadata("compiler/testData/codegen/box/typeInfo")
|
||||||
|
|||||||
Reference in New Issue
Block a user