Don't generate private members in interface

This commit is contained in:
Michael Bogdanov
2015-09-22 17:28:11 +03:00
parent 2e6b56691c
commit cf57d56ab3
10 changed files with 98 additions and 18 deletions
@@ -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;
@@ -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()
}
@@ -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()
}
@@ -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");
@@ -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")