Do not normalize visibilities for fake overrides
#KT-4525 Fixed
This commit is contained in:
@@ -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().<!INVISIBLE_MEMBER!>m<!>
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
+2
-2
@@ -2,7 +2,7 @@ package test
|
||||
|
||||
public open class ModalityOfFakeOverrides : java.util.AbstractList<jet.String> {
|
||||
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.String>): jet.Boolean
|
||||
@@ -20,7 +20,7 @@ public open class ModalityOfFakeOverrides : java.util.AbstractList<jet.String> {
|
||||
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.Any?>): 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.Any?>): 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
|
||||
|
||||
+2
-2
@@ -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<out jet.Any?>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): jet.Int
|
||||
public final override /*1*/ /*fake_override*/ fun notify(): jet.Unit
|
||||
|
||||
+4
-4
@@ -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 {
|
||||
|
||||
+2
-2
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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<? extends CallableMemberDescriptor> descriptors) {
|
||||
if (descriptors.isEmpty()) {
|
||||
|
||||
Reference in New Issue
Block a user