From 1749e3298c5170e4c754d26e210e6023bd0cf7e9 Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Wed, 6 Feb 2013 18:58:20 +0400 Subject: [PATCH] Method from java overridden in kotlin should have kotlin visibility --- .../resolve/java/JavaDescriptorResolver.java | 18 ++++++++++++++++++ .../jet/lang/descriptors/Visibility.java | 5 +++++ .../jet/lang/resolve/OverrideResolver.java | 6 +++--- .../inheritance/expected.txt | 11 +++++++++++ .../inheritance/java/test/Base.java | 6 ++++++ .../inheritance/kotlin/Derived.kt | 5 +++++ .../{ => simple}/expected.txt | 0 .../{ => simple}/java/awt/Frame.java | 0 .../{ => simple}/java/test/JFrame.java | 0 .../inheritance/expected.txt | 11 +++++++++++ .../inheritance/java/test/Base.java | 6 ++++++ .../inheritance/kotlin/Derived.kt | 5 +++++ .../jet/jvm/compiler/LoadJavaCustomTest.java | 18 +++++++++++++----- .../OverrideImplementMethodsHandler.java | 13 ++----------- 14 files changed, 85 insertions(+), 19 deletions(-) create mode 100644 compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/expected.txt create mode 100644 compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/java/test/Base.java create mode 100644 compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/kotlin/Derived.kt rename compiler/testData/loadJavaCustom/packageLocalVisibility/{ => simple}/expected.txt (100%) rename compiler/testData/loadJavaCustom/packageLocalVisibility/{ => simple}/java/awt/Frame.java (100%) rename compiler/testData/loadJavaCustom/packageLocalVisibility/{ => simple}/java/test/JFrame.java (100%) create mode 100644 compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/expected.txt create mode 100644 compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/java/test/Base.java create mode 100644 compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/kotlin/Derived.kt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 1759bd86f3d..d5f2f26fb9c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -55,6 +55,12 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes public String toString() { return "public/*package*/"; } + + @NotNull + @Override + public Visibility normalize() { + return Visibilities.INTERNAL; + } }; public static final Visibility PROTECTED_STATIC_VISIBILITY = new Visibility("protected_static", false) { @@ -89,6 +95,12 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes public String toString() { return "protected/*protected static*/"; } + + @NotNull + @Override + public Visibility normalize() { + return Visibilities.PROTECTED; + } }; public static final Visibility PROTECTED_AND_PACKAGE = new Visibility("protected_and_package", false) { @@ -122,6 +134,12 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes public String toString() { return "protected/*protected and package*/"; } + + @NotNull + @Override + public Visibility normalize() { + return Visibilities.PROTECTED; + } }; private JavaPropertyResolver propertiesResolver; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java index 11c8be66294..d3f1ff25cda 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java @@ -43,5 +43,10 @@ public abstract class Visibility { return name; } + @NotNull + public Visibility normalize() { + return this; + } + protected abstract boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 812bc2f490a..b9985bbb9c9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -881,17 +881,17 @@ public class OverrideResolver { } if (memberDescriptor instanceof PropertyDescriptorImpl) { - ((PropertyDescriptorImpl)memberDescriptor).setVisibility(visibility); + ((PropertyDescriptorImpl)memberDescriptor).setVisibility(visibility.normalize()); for (PropertyAccessorDescriptor accessor : ((PropertyDescriptor) memberDescriptor).getAccessors()) { resolveUnknownVisibilityForMember(null, accessor, trace); } } else if (memberDescriptor instanceof FunctionDescriptorImpl) { - ((FunctionDescriptorImpl)memberDescriptor).setVisibility(visibility); + ((FunctionDescriptorImpl)memberDescriptor).setVisibility(visibility.normalize()); } else { assert memberDescriptor instanceof PropertyAccessorDescriptorImpl; - ((PropertyAccessorDescriptorImpl) memberDescriptor).setVisibility(visibility); + ((PropertyAccessorDescriptorImpl) memberDescriptor).setVisibility(visibility.normalize()); } } diff --git a/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/expected.txt b/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/expected.txt new file mode 100644 index 00000000000..fb683741e3e --- /dev/null +++ b/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/expected.txt @@ -0,0 +1,11 @@ +package test + +public open class Base : java.lang.Object { + public constructor Base() + public/*package*/ open fun foo() : Unit +} + +internal final class Derived : test.Base { + public constructor Derived() + internal open override /*1*/ fun foo() : Unit +} diff --git a/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/java/test/Base.java b/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/java/test/Base.java new file mode 100644 index 00000000000..c79bd45ed89 --- /dev/null +++ b/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/java/test/Base.java @@ -0,0 +1,6 @@ +package test; + +public class Base { + void foo() {} +} + diff --git a/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/kotlin/Derived.kt b/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/kotlin/Derived.kt new file mode 100644 index 00000000000..a36b9b37948 --- /dev/null +++ b/compiler/testData/loadJavaCustom/packageLocalVisibility/inheritance/kotlin/Derived.kt @@ -0,0 +1,5 @@ +package test + +class Derived(): Base() { + override fun foo() {} +} \ No newline at end of file diff --git a/compiler/testData/loadJavaCustom/packageLocalVisibility/expected.txt b/compiler/testData/loadJavaCustom/packageLocalVisibility/simple/expected.txt similarity index 100% rename from compiler/testData/loadJavaCustom/packageLocalVisibility/expected.txt rename to compiler/testData/loadJavaCustom/packageLocalVisibility/simple/expected.txt diff --git a/compiler/testData/loadJavaCustom/packageLocalVisibility/java/awt/Frame.java b/compiler/testData/loadJavaCustom/packageLocalVisibility/simple/java/awt/Frame.java similarity index 100% rename from compiler/testData/loadJavaCustom/packageLocalVisibility/java/awt/Frame.java rename to compiler/testData/loadJavaCustom/packageLocalVisibility/simple/java/awt/Frame.java diff --git a/compiler/testData/loadJavaCustom/packageLocalVisibility/java/test/JFrame.java b/compiler/testData/loadJavaCustom/packageLocalVisibility/simple/java/test/JFrame.java similarity index 100% rename from compiler/testData/loadJavaCustom/packageLocalVisibility/java/test/JFrame.java rename to compiler/testData/loadJavaCustom/packageLocalVisibility/simple/java/test/JFrame.java diff --git a/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/expected.txt b/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/expected.txt new file mode 100644 index 00000000000..0bf8f8cbb53 --- /dev/null +++ b/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/expected.txt @@ -0,0 +1,11 @@ +package test + +public open class Base : java.lang.Object { + public constructor Base() + protected/*protected and package*/ open fun foo() : Unit +} + +internal final class Derived : test.Base { + public constructor Derived() + protected open override /*1*/ fun foo() : Unit +} diff --git a/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/java/test/Base.java b/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/java/test/Base.java new file mode 100644 index 00000000000..ecce364e021 --- /dev/null +++ b/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/java/test/Base.java @@ -0,0 +1,6 @@ +package test; + +public class Base { + protected void foo() {} +} + diff --git a/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/kotlin/Derived.kt b/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/kotlin/Derived.kt new file mode 100644 index 00000000000..a36b9b37948 --- /dev/null +++ b/compiler/testData/loadJavaCustom/protectedPackageVisibility/inheritance/kotlin/Derived.kt @@ -0,0 +1,5 @@ +package test + +class Derived(): Base() { + override fun foo() {} +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java index 15c1371d4c5..5fda5ccfaea 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaCustomTest.java @@ -83,7 +83,7 @@ public final class LoadJavaCustomTest extends KotlinTestWithEnvironment { } public void testPackageLocalVisibility() throws Exception { - String dir = PATH + "/packageLocalVisibility"; + String dir = PATH + "/packageLocalVisibility/simple/"; String javaDir = dir + "/java"; doTest(dir + "/expected.txt", javaDir + "/test/JFrame.java", @@ -163,15 +163,23 @@ public final class LoadJavaCustomTest extends KotlinTestWithEnvironment { public static class SubclassingKotlinInJavaTest extends KotlinTestWithEnvironmentManagement { public void testSubclassingKotlinInJava() throws Exception { - doTest(); + doTest(PATH + "/" + getTestName(true)); } public void testDeepSubclassingKotlinInJava() throws Exception { - doTest(); + doTest(PATH + "/" + getTestName(true)); } - public void doTest() throws Exception { - File dir = new File(PATH + "/" + getTestName(true)); + public void testPackageInheritance() throws Exception { + doTest(PATH + "/packageLocalVisibility/inheritance"); + } + + public void testProtectedPackageInheritance() throws Exception { + doTest(PATH + "/protectedPackageVisibility/inheritance"); + } + + public void doTest(String path) throws Exception { + File dir = new File(path); CompilerConfiguration configuration = JetTestUtils.compilerConfigurationForTests( ConfigurationKind.JDK_ONLY, TestJdkKind.MOCK_JDK, new File(dir, "java")); diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java index b7df44d6817..cc634ea8868 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -264,17 +264,8 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns } private static String displayableVisibility(MemberDescriptor descriptor) { - Visibility visibility = descriptor.getVisibility(); - if (visibility == Visibilities.INTERNAL) { - return ""; - } - if (visibility == JavaDescriptorResolver.PACKAGE_VISIBILITY) { - return "internal "; - } - if (visibility == JavaDescriptorResolver.PROTECTED_AND_PACKAGE) { - return "protected "; - } - return visibility.toString() + " "; + Visibility visibility = descriptor.getVisibility().normalize(); + return visibility != Visibilities.INTERNAL ? visibility.toString() + " " : ""; } @NotNull