From 80183c88cfbea126a55a1b9f78235f50cbef94d9 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 11 Feb 2014 20:11:07 +0400 Subject: [PATCH] Do not normalize visibilities for fake overrides #KT-4525 Fixed --- .../invisiblePackagePrivateInheritedMember.kt | 23 +++++++++++++++ .../loadJava/compiledJava/OverrideMethod.txt | 6 ++-- .../modality/ModalityOfFakeOverrides.txt | 4 +-- .../ClassWithObjectMethod.txt | 4 +-- .../InheritAmbguousSamAdaptersInKotlin.txt | 8 ++--- .../samAdapters/InheritSamAdapterInKotlin.txt | 4 +-- .../OverrideSamAdapterInKotlin.txt | 2 +- .../checkers/JetDiagnosticsTestGenerated.java | 5 ++++ .../jet/lang/resolve/OverridingUtil.java | 29 +++++++++++++------ 9 files changed, 62 insertions(+), 23 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/j+k/invisiblePackagePrivateInheritedMember.kt diff --git a/compiler/testData/diagnostics/tests/j+k/invisiblePackagePrivateInheritedMember.kt b/compiler/testData/diagnostics/tests/j+k/invisiblePackagePrivateInheritedMember.kt new file mode 100644 index 00000000000..c319b79043d --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/invisiblePackagePrivateInheritedMember.kt @@ -0,0 +1,23 @@ +// FILE: a/M.java +package a; + +public class M { + int m; +} + +// FILE: b/F.java +package b; + +import a.M; + +public class F extends M { +} + +// FILE: c.kt +package c + +import b.F + +fun f() { + F().m +} \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledJava/OverrideMethod.txt b/compiler/testData/loadJava/compiledJava/OverrideMethod.txt index b76e7238555..38b9c47a9bc 100644 --- a/compiler/testData/loadJava/compiledJava/OverrideMethod.txt +++ b/compiler/testData/loadJava/compiledJava/OverrideMethod.txt @@ -7,15 +7,15 @@ public open class OverrideMethod : java.lang.Object { public/*package*/ constructor Base() public/*package*/ open fun bar(): jet.Unit public/*package*/ open fun foo(/*0*/ p0: jet.String?): jet.String? - internal open override /*1*/ /*fake_override*/ fun quux(/*0*/ p0: jet.Int): jet.Unit + public/*package*/ open override /*1*/ /*fake_override*/ fun quux(/*0*/ p0: jet.Int): jet.Unit } public/*package*/ open inner class Derived : test.OverrideMethod.Base { public/*package*/ constructor Derived() - internal open override /*1*/ /*fake_override*/ fun bar(): jet.Unit + public/*package*/ open override /*1*/ /*fake_override*/ fun bar(): jet.Unit public/*package*/ open fun baz(): jet.Unit public/*package*/ open override /*1*/ fun foo(/*0*/ p0: jet.String?): jet.String? - internal open override /*1*/ /*fake_override*/ fun quux(/*0*/ p0: jet.Int): jet.Unit + public/*package*/ open override /*1*/ /*fake_override*/ fun quux(/*0*/ p0: jet.Int): jet.Unit } public/*package*/ open inner class SuperBase : java.lang.Object { diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/modality/ModalityOfFakeOverrides.txt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/modality/ModalityOfFakeOverrides.txt index 624c700c37f..0015e593846 100644 --- a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/modality/ModalityOfFakeOverrides.txt +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/modality/ModalityOfFakeOverrides.txt @@ -2,7 +2,7 @@ package test public open class ModalityOfFakeOverrides : java.util.AbstractList { public constructor ModalityOfFakeOverrides() - protected final override /*1*/ /*fake_override*/ var modCount: jet.Int + protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: jet.Int public open override /*1*/ /*fake_override*/ fun add(/*0*/ p0: jet.Int, /*1*/ p1: jet.String): jet.Unit public open override /*1*/ /*fake_override*/ fun add(/*0*/ p0: jet.String): jet.Boolean public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ c: jet.Collection): jet.Boolean @@ -20,7 +20,7 @@ public open class ModalityOfFakeOverrides : java.util.AbstractList { public open override /*1*/ /*fake_override*/ fun remove(/*0*/ o: jet.Any?): jet.Boolean public open override /*1*/ /*fake_override*/ fun remove(/*0*/ p0: jet.Int): jet.String public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ c: jet.Collection): jet.Boolean - protected open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: jet.Int, /*1*/ p1: jet.Int): jet.Unit + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: jet.Int, /*1*/ p1: jet.Int): jet.Unit public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ c: jet.Collection): jet.Boolean public open override /*1*/ /*fake_override*/ fun set(/*0*/ p0: jet.Int, /*1*/ p1: jet.String): jet.String public open override /*1*/ fun size(): jet.Int diff --git a/compiler/testData/loadJava/compiledJavaIncludeObjectMethods/ClassWithObjectMethod.txt b/compiler/testData/loadJava/compiledJavaIncludeObjectMethods/ClassWithObjectMethod.txt index aa7593a1b17..5c3598d178b 100644 --- a/compiler/testData/loadJava/compiledJavaIncludeObjectMethods/ClassWithObjectMethod.txt +++ b/compiler/testData/loadJava/compiledJavaIncludeObjectMethods/ClassWithObjectMethod.txt @@ -2,9 +2,9 @@ package test public final class ClassWithObjectMethod : java.lang.Object { public constructor ClassWithObjectMethod() - protected open override /*1*/ /*fake_override*/ fun clone(): jet.Any + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): jet.Any public open override /*1*/ /*fake_override*/ fun equals(/*0*/ p0: jet.Any?): jet.Boolean - protected open override /*1*/ /*fake_override*/ fun finalize(): jet.Unit + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun finalize(): jet.Unit public final override /*1*/ /*fake_override*/ fun getClass(): java.lang.Class public open override /*1*/ /*fake_override*/ fun hashCode(): jet.Int public final override /*1*/ /*fake_override*/ fun notify(): jet.Unit diff --git a/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/InheritAmbguousSamAdaptersInKotlin.txt b/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/InheritAmbguousSamAdaptersInKotlin.txt index d3edaac6e68..61892db0918 100644 --- a/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/InheritAmbguousSamAdaptersInKotlin.txt +++ b/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/InheritAmbguousSamAdaptersInKotlin.txt @@ -2,10 +2,10 @@ package test public final class Sub : test.Super { public constructor Sub() - internal final override /*1*/ /*fake_override*/ fun foo(/*0*/ r: (() -> jet.Unit)?): jet.Unit - internal final override /*1*/ /*fake_override*/ fun foo(/*0*/ r: (() -> jet.Unit)?): jet.Unit - internal open override /*1*/ /*fake_override*/ fun foo(/*0*/ r: java.io.Closeable?): jet.Unit - internal open override /*1*/ /*fake_override*/ fun foo(/*0*/ r: java.lang.Runnable?): jet.Unit + public/*package*/ final override /*1*/ /*fake_override*/ fun foo(/*0*/ r: (() -> jet.Unit)?): jet.Unit + public/*package*/ final override /*1*/ /*fake_override*/ fun foo(/*0*/ r: (() -> jet.Unit)?): jet.Unit + public/*package*/ open override /*1*/ /*fake_override*/ fun foo(/*0*/ r: java.io.Closeable?): jet.Unit + public/*package*/ open override /*1*/ /*fake_override*/ fun foo(/*0*/ r: java.lang.Runnable?): jet.Unit } public open class Super : java.lang.Object { diff --git a/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/InheritSamAdapterInKotlin.txt b/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/InheritSamAdapterInKotlin.txt index 6be8b56bd1c..1852e062096 100644 --- a/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/InheritSamAdapterInKotlin.txt +++ b/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/InheritSamAdapterInKotlin.txt @@ -2,8 +2,8 @@ package test public final class Sub : test.Super { public constructor Sub() - internal final override /*1*/ /*fake_override*/ fun foo(/*0*/ r: (() -> jet.Unit)?): jet.Unit - internal open override /*1*/ /*fake_override*/ fun foo(/*0*/ r: java.lang.Runnable?): jet.Unit + public/*package*/ final override /*1*/ /*fake_override*/ fun foo(/*0*/ r: (() -> jet.Unit)?): jet.Unit + public/*package*/ open override /*1*/ /*fake_override*/ fun foo(/*0*/ r: java.lang.Runnable?): jet.Unit } public open class Super : java.lang.Object { diff --git a/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/OverrideSamAdapterInKotlin.txt b/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/OverrideSamAdapterInKotlin.txt index 9cbea61baee..6b150dab673 100644 --- a/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/OverrideSamAdapterInKotlin.txt +++ b/compiler/testData/loadJava/javaAgainstKotlin/samAdapters/OverrideSamAdapterInKotlin.txt @@ -3,7 +3,7 @@ package test public final class Sub : test.Super { public constructor Sub() internal open override /*1*/ fun foo(/*0*/ r: (() -> jet.Unit)?): jet.Unit - internal open override /*1*/ /*fake_override*/ fun foo(/*0*/ r: java.lang.Runnable?): jet.Unit + public/*package*/ open override /*1*/ /*fake_override*/ fun foo(/*0*/ r: java.lang.Runnable?): jet.Unit } public open class Super : java.lang.Object { diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 1f8227a5c4d..3df6192e1a7 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -4498,6 +4498,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/j+k/innerNestedClassFromJava.kt"); } + @TestMetadata("invisiblePackagePrivateInheritedMember.kt") + public void testInvisiblePackagePrivateInheritedMember() throws Exception { + doTest("compiler/testData/diagnostics/tests/j+k/invisiblePackagePrivateInheritedMember.kt"); + } + @TestMetadata("KJKInheritance.kt") public void testKJKInheritance() throws Exception { doTest("compiler/testData/diagnostics/tests/j+k/KJKInheritance.kt"); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java index 4bfdbbe58a0..66110ae9702 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java @@ -534,27 +534,38 @@ public class OverridingUtil { return; } - Visibility visibility = findMaxVisibility(memberDescriptor.getOverriddenDescriptors()); - if (visibility == null) { - sink.cannotInferVisibility(memberDescriptor); - visibility = Visibilities.PUBLIC; - } - + Visibility visibilityToInherit = computeVisibilityToInherit(memberDescriptor, sink); if (memberDescriptor instanceof PropertyDescriptorImpl) { - ((PropertyDescriptorImpl) memberDescriptor).setVisibility(visibility.normalize()); + ((PropertyDescriptorImpl) memberDescriptor).setVisibility(visibilityToInherit); for (PropertyAccessorDescriptor accessor : ((PropertyDescriptor) memberDescriptor).getAccessors()) { resolveUnknownVisibilityForMember(accessor, sink); } } else if (memberDescriptor instanceof FunctionDescriptorImpl) { - ((FunctionDescriptorImpl) memberDescriptor).setVisibility(visibility.normalize()); + ((FunctionDescriptorImpl) memberDescriptor).setVisibility(visibilityToInherit); } else { assert memberDescriptor instanceof PropertyAccessorDescriptorImpl; - ((PropertyAccessorDescriptorImpl) memberDescriptor).setVisibility(visibility.normalize()); + ((PropertyAccessorDescriptorImpl) memberDescriptor).setVisibility(visibilityToInherit); } } + @NotNull + private static Visibility computeVisibilityToInherit( + @NotNull CallableMemberDescriptor memberDescriptor, + @NotNull NotInferredVisibilitySink sink + ) { + Visibility maxVisibility = findMaxVisibility(memberDescriptor.getOverriddenDescriptors()); + if (maxVisibility == null) { + sink.cannotInferVisibility(memberDescriptor); + return Visibilities.PUBLIC; + } + if (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { + return maxVisibility; + } + return maxVisibility.normalize(); + } + @Nullable private static Visibility findMaxVisibility(@NotNull Collection descriptors) { if (descriptors.isEmpty()) {