KT-3257 Bad diagnostics when trying to instantiate a private class

#KT-3257 Fixed
This commit is contained in:
Mohammad Shamsi
2013-05-05 19:15:46 +08:00
committed by Nikolay Krasko
parent d645fcaaa7
commit 4b656d8c8d
7 changed files with 40 additions and 9 deletions
@@ -105,17 +105,21 @@ public class Visibilities {
}
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;
while (parent != null) {
if (parent.getVisibility() == LOCAL) {
return true;
}
while (parent != null && parent.getVisibility() != LOCAL) {
if (!parent.getVisibility().isVisible(parent, from)) {
return false;
return parent;
}
parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
}
return true;
return null;
}
private static final Map<Visibility, Integer> ORDERED_VISIBILITIES = Maps.newHashMap();
@@ -93,9 +93,12 @@ public class CandidateResolver {
return;
}
if (!Visibilities.isVisible(candidate, context.scope.getContainingDeclaration())) {
DeclarationDescriptorWithVisibility invisibleMember =
Visibilities.findInvisibleMember(candidate, context.scope.getContainingDeclaration());
if (invisibleMember != null) {
candidateCall.addStatus(OTHER_ERROR);
context.tracing.invisibleMember(context.trace, candidate);
context.tracing.invisibleMember(context.trace, invisibleMember);
return;
}