KT-3257 Bad diagnostics when trying to instantiate a private class
#KT-3257 Fixed
This commit is contained in:
committed by
Nikolay Krasko
parent
d645fcaaa7
commit
4b656d8c8d
@@ -105,17 +105,21 @@ public class Visibilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isVisible(@Nullable DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public static boolean isVisible(@Nullable DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
||||||
|
return findInvisibleMember(what, from) == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DeclarationDescriptorWithVisibility findInvisibleMember(
|
||||||
|
@Nullable DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from
|
||||||
|
) {
|
||||||
DeclarationDescriptorWithVisibility parent = what;
|
DeclarationDescriptorWithVisibility parent = what;
|
||||||
while (parent != null) {
|
while (parent != null && parent.getVisibility() != LOCAL) {
|
||||||
if (parent.getVisibility() == LOCAL) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!parent.getVisibility().isVisible(parent, from)) {
|
if (!parent.getVisibility().isVisible(parent, from)) {
|
||||||
return false;
|
return parent;
|
||||||
}
|
}
|
||||||
parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
|
parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
|
||||||
}
|
}
|
||||||
return true;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Map<Visibility, Integer> ORDERED_VISIBILITIES = Maps.newHashMap();
|
private static final Map<Visibility, Integer> ORDERED_VISIBILITIES = Maps.newHashMap();
|
||||||
|
|||||||
@@ -93,9 +93,12 @@ public class CandidateResolver {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Visibilities.isVisible(candidate, context.scope.getContainingDeclaration())) {
|
|
||||||
|
DeclarationDescriptorWithVisibility invisibleMember =
|
||||||
|
Visibilities.findInvisibleMember(candidate, context.scope.getContainingDeclaration());
|
||||||
|
if (invisibleMember != null) {
|
||||||
candidateCall.addStatus(OTHER_ERROR);
|
candidateCall.addStatus(OTHER_ERROR);
|
||||||
context.tracing.invisibleMember(context.trace, candidate);
|
context.tracing.invisibleMember(context.trace, invisibleMember);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package foo.bar
|
||||||
|
|
||||||
|
class A {
|
||||||
|
private class B
|
||||||
|
public class C private()
|
||||||
|
|
||||||
|
private fun bar() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
A.B() // ERROR 1: Cannot access 'B': it is 'private' in 'A'
|
||||||
|
A.C() // ERROR 2: Cannot access '' : it is 'private' in 'C'
|
||||||
|
|
||||||
|
A().bar() // ERROR 3: Cannot access 'bar' : it is 'private' in 'A'
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<!-- invisibleMember1 -->
|
||||||
|
Cannot access 'B': it is 'private' in 'A'
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<!-- invisibleMember2 -->
|
||||||
|
Cannot access '<init>': it is 'private' in 'C'
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<!-- invisibleMember3 -->
|
||||||
|
Cannot access 'bar': it is 'private' in 'A'
|
||||||
@@ -34,7 +34,6 @@ import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
|
|||||||
import org.jetbrains.jet.plugin.PluginTestCaseBase;
|
import org.jetbrains.jet.plugin.PluginTestCaseBase;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -110,4 +109,8 @@ public class DiagnosticMessageTest extends JetLiteFixture {
|
|||||||
public void testTypeMismatchWithNothing() throws Exception {
|
public void testTypeMismatchWithNothing() throws Exception {
|
||||||
doTest("typeMismatchWithNothing", 1, Errors.TYPE_MISMATCH);
|
doTest("typeMismatchWithNothing", 1, Errors.TYPE_MISMATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testInvisibleMember() throws Exception {
|
||||||
|
doTest("invisibleMember", 3, Errors.INVISIBLE_MEMBER, Errors.INVISIBLE_MEMBER, Errors.INVISIBLE_MEMBER);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user