Prohibit implicit overrides with lesser visibility
A non-abstract super-declaration is allowed to stand as 'an implementation' of a fake override only if its visibility is not less than visibilities of all other super-declarations #KT-2491 Fixed
This commit is contained in:
+1
-1
@@ -8,7 +8,7 @@ class SimpleSubclass : JavaInterface {
|
||||
// Class extends both Java and Kotlin traits. Checks that there's no DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES warning
|
||||
|
||||
trait KotlinTrait {
|
||||
fun foo(someOtherName: Int) {}
|
||||
public fun foo(someOtherName: Int) {}
|
||||
}
|
||||
|
||||
class BothTraitsSubclass : JavaInterface, KotlinTrait
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
trait T {
|
||||
public fun foo()
|
||||
}
|
||||
|
||||
open class C {
|
||||
protected fun foo() {}
|
||||
}
|
||||
|
||||
class <!CANNOT_INFER_VISIBILITY!>D<!> : C(), T
|
||||
|
||||
val obj: C = <!CANNOT_INFER_VISIBILITY!>object<!> : C(), T {}
|
||||
+1
-1
@@ -7,7 +7,7 @@ interface JavaInterface {
|
||||
// FILE: kotlin.kt
|
||||
|
||||
trait KotlinTrait {
|
||||
fun foo(someOtherName: Int) {}
|
||||
public fun foo(someOtherName: Int) {}
|
||||
}
|
||||
|
||||
class BothTraitsSubclass : JavaInterface, KotlinTrait
|
||||
|
||||
@@ -5342,6 +5342,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
||||
doTest("compiler/testData/diagnostics/tests/override/kt2052.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt2491.kt")
|
||||
public void testKt2491() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/override/kt2491.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt4763.kt")
|
||||
public void testKt4763() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/override/kt4763.kt");
|
||||
|
||||
@@ -379,8 +379,18 @@ public class OverridingUtil {
|
||||
return;
|
||||
}
|
||||
|
||||
Visibility maxVisibility = computeVisibilityToInherit(memberDescriptor, cannotInferVisibility);
|
||||
Visibility visibilityToInherit = maxVisibility == null ? Visibilities.PUBLIC : maxVisibility;
|
||||
Visibility maxVisibility = computeVisibilityToInherit(memberDescriptor);
|
||||
Visibility visibilityToInherit;
|
||||
if (maxVisibility == null) {
|
||||
if (cannotInferVisibility != null) {
|
||||
cannotInferVisibility.invoke(memberDescriptor);
|
||||
}
|
||||
visibilityToInherit = Visibilities.PUBLIC;
|
||||
}
|
||||
else {
|
||||
visibilityToInherit = maxVisibility;
|
||||
}
|
||||
|
||||
if (memberDescriptor instanceof PropertyDescriptorImpl) {
|
||||
((PropertyDescriptorImpl) memberDescriptor).setVisibility(visibilityToInherit);
|
||||
for (PropertyAccessorDescriptor accessor : ((PropertyDescriptor) memberDescriptor).getAccessors()) {
|
||||
@@ -398,18 +408,19 @@ public class OverridingUtil {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Visibility computeVisibilityToInherit(
|
||||
@NotNull CallableMemberDescriptor memberDescriptor,
|
||||
@Nullable Function1<CallableMemberDescriptor, Unit> cannotInferVisibility
|
||||
) {
|
||||
Visibility maxVisibility = findMaxVisibility(memberDescriptor.getOverriddenDescriptors());
|
||||
private static Visibility computeVisibilityToInherit(@NotNull CallableMemberDescriptor memberDescriptor) {
|
||||
Set<? extends CallableMemberDescriptor> overriddenDescriptors = memberDescriptor.getOverriddenDescriptors();
|
||||
Visibility maxVisibility = findMaxVisibility(overriddenDescriptors);
|
||||
if (maxVisibility == null) {
|
||||
if (cannotInferVisibility != null) {
|
||||
cannotInferVisibility.invoke(memberDescriptor);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
if (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||
for (CallableMemberDescriptor overridden : overriddenDescriptors) {
|
||||
// An implementation (a non-abstract overridden member) of a fake override should have the maximum possible visibility
|
||||
if (overridden.getModality() != Modality.ABSTRACT && !overridden.getVisibility().equals(maxVisibility)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return maxVisibility;
|
||||
}
|
||||
return maxVisibility.normalize();
|
||||
@@ -423,7 +434,7 @@ public class OverridingUtil {
|
||||
Visibility maxVisibility = null;
|
||||
for (CallableMemberDescriptor descriptor : descriptors) {
|
||||
Visibility visibility = descriptor.getVisibility();
|
||||
assert visibility != Visibilities.INHERITED;
|
||||
assert visibility != Visibilities.INHERITED : "Visibility should have been computed for " + descriptor;
|
||||
if (maxVisibility == null) {
|
||||
maxVisibility = visibility;
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user