public methods in private classes visibility check
This commit is contained in:
+1
@@ -446,6 +446,7 @@ public class JavaDescriptorResolver {
|
||||
classData.classDescriptor.setSupertypes(getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData.classDescriptor, new ArrayList<TypeParameterDescriptor>(0)));
|
||||
classData.classDescriptor.setName(JetPsiUtil.NO_NAME_PROVIDED); // TODO
|
||||
classData.classDescriptor.setModality(Modality.FINAL);
|
||||
classData.classDescriptor.setVisibility(containing.getVisibility());
|
||||
classData.classDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
|
||||
classData.classDescriptor.createTypeConstructor();
|
||||
classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, classObjectPsiClass, semanticServices, false));
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.jet.lang.descriptors;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
|
||||
import java.util.Set;
|
||||
@@ -27,7 +28,7 @@ import java.util.Set;
|
||||
public class Visibilities {
|
||||
public static final Visibility PRIVATE = new Visibility(false) {
|
||||
@Override
|
||||
public boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
DeclarationDescriptor parent = what;
|
||||
while (parent != null) {
|
||||
parent = parent.getContainingDeclaration();
|
||||
@@ -41,6 +42,9 @@ public class Visibilities {
|
||||
if (parent == fromParent) {
|
||||
return true;
|
||||
}
|
||||
if (fromParent instanceof NamespaceDescriptor) {
|
||||
break; //'private' package members are not visible for subpackages, so when we reach a package, we should stop
|
||||
}
|
||||
fromParent = fromParent.getContainingDeclaration();
|
||||
}
|
||||
return false;
|
||||
@@ -49,7 +53,7 @@ public class Visibilities {
|
||||
|
||||
public static final Visibility PROTECTED = new Visibility(true) {
|
||||
@Override
|
||||
public boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
ClassDescriptor classDescriptor = DescriptorUtils.getParentOfType(what, ClassDescriptor.class);
|
||||
if (classDescriptor == null) return false;
|
||||
|
||||
@@ -64,7 +68,7 @@ public class Visibilities {
|
||||
|
||||
public static final Visibility INTERNAL = new Visibility(false) {
|
||||
@Override
|
||||
public boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
ModuleDescriptor parentModule = DescriptorUtils.getParentOfType(what, ModuleDescriptor.class, false);
|
||||
ModuleDescriptor fromModule = DescriptorUtils.getParentOfType(from, ModuleDescriptor.class, false);
|
||||
return parentModule == fromModule;
|
||||
@@ -73,24 +77,35 @@ public class Visibilities {
|
||||
|
||||
public static final Visibility PUBLIC = new Visibility(true) {
|
||||
@Override
|
||||
public boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
public static final Visibility INTERNAL_PROTECTED = new Visibility(false) {
|
||||
@Override
|
||||
public boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
return PROTECTED.isVisible(what, from) && INTERNAL.isVisible(what, from);
|
||||
}
|
||||
};
|
||||
|
||||
public static final Visibility LOCAL = new Visibility(false) {
|
||||
@Override
|
||||
public boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
public static final Set<Visibility> INTERNAL_VISIBILITIES = Sets.newHashSet(PRIVATE, INTERNAL, INTERNAL_PROTECTED, LOCAL);
|
||||
|
||||
public static boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) {
|
||||
DeclarationDescriptorWithVisibility parent = what;
|
||||
while (parent != null) {
|
||||
if (!parent.getVisibility().isVisible(parent, from)) {
|
||||
return false;
|
||||
}
|
||||
parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,5 +30,5 @@ public abstract class Visibility {
|
||||
return isPublicAPI;
|
||||
}
|
||||
|
||||
public abstract boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from);
|
||||
protected abstract boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from);
|
||||
}
|
||||
|
||||
+24
-41
@@ -40,17 +40,15 @@ public class QualifiedExpressionResolver {
|
||||
|
||||
@NotNull
|
||||
public Collection<? extends DeclarationDescriptor> analyseImportReference(@NotNull JetImportDirective importDirective,
|
||||
@NotNull JetScope scope,
|
||||
@NotNull BindingTrace trace) {
|
||||
@NotNull JetScope scope, @NotNull BindingTrace trace) {
|
||||
|
||||
return processImportReference(importDirective, scope, Importer.DO_NOTHING, trace, false);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Collection<? extends DeclarationDescriptor> processImportReference(@NotNull JetImportDirective importDirective,
|
||||
@NotNull JetScope scope,
|
||||
@NotNull Importer importer,
|
||||
@NotNull BindingTrace trace,
|
||||
boolean onlyClasses) {
|
||||
@NotNull JetScope scope, @NotNull Importer importer, @NotNull BindingTrace trace, boolean onlyClasses) {
|
||||
|
||||
if (importDirective.isAbsoluteInRootNamespace()) {
|
||||
trace.report(UNSUPPORTED.on(importDirective, "TypeHierarchyResolver")); // TODO
|
||||
return Collections.emptyList();
|
||||
@@ -95,9 +93,8 @@ public class QualifiedExpressionResolver {
|
||||
}
|
||||
|
||||
private boolean canImportMembersFrom(@NotNull Collection<? extends DeclarationDescriptor> descriptors,
|
||||
@NotNull JetSimpleNameExpression reference,
|
||||
@NotNull BindingTrace trace,
|
||||
boolean onlyClasses) {
|
||||
@NotNull JetSimpleNameExpression reference, @NotNull BindingTrace trace, boolean onlyClasses) {
|
||||
|
||||
if (onlyClasses) {
|
||||
return true;
|
||||
}
|
||||
@@ -116,9 +113,8 @@ public class QualifiedExpressionResolver {
|
||||
}
|
||||
|
||||
private boolean canImportMembersFrom(@NotNull DeclarationDescriptor descriptor,
|
||||
@NotNull JetSimpleNameExpression reference,
|
||||
@NotNull BindingTrace trace,
|
||||
boolean onlyClasses) {
|
||||
@NotNull JetSimpleNameExpression reference, @NotNull BindingTrace trace, boolean onlyClasses) {
|
||||
|
||||
assert !onlyClasses;
|
||||
if (descriptor instanceof NamespaceDescriptor) {
|
||||
return true;
|
||||
@@ -132,8 +128,8 @@ public class QualifiedExpressionResolver {
|
||||
|
||||
@NotNull
|
||||
public Collection<? extends DeclarationDescriptor> lookupDescriptorsForUserType(@NotNull JetUserType userType,
|
||||
@NotNull JetScope outerScope,
|
||||
@NotNull BindingTrace trace) {
|
||||
@NotNull JetScope outerScope, @NotNull BindingTrace trace) {
|
||||
|
||||
if (userType.isAbsoluteInRootNamespace()) {
|
||||
trace.report(Errors.UNSUPPORTED.on(userType, "package"));
|
||||
return Collections.emptyList();
|
||||
@@ -152,10 +148,8 @@ public class QualifiedExpressionResolver {
|
||||
|
||||
@NotNull
|
||||
public Collection<? extends DeclarationDescriptor> lookupDescriptorsForQualifiedExpression(@NotNull JetQualifiedExpression importedReference,
|
||||
@NotNull JetScope outerScope,
|
||||
@NotNull BindingTrace trace,
|
||||
boolean onlyClasses,
|
||||
boolean storeResult) {
|
||||
@NotNull JetScope outerScope, @NotNull BindingTrace trace, boolean onlyClasses, boolean storeResult) {
|
||||
|
||||
JetExpression receiverExpression = importedReference.getReceiverExpression();
|
||||
Collection<? extends DeclarationDescriptor> declarationDescriptors;
|
||||
if (receiverExpression instanceof JetQualifiedExpression) {
|
||||
@@ -182,10 +176,8 @@ public class QualifiedExpressionResolver {
|
||||
|
||||
@NotNull
|
||||
private Collection<? extends DeclarationDescriptor> lookupSelectorDescriptors(@NotNull JetSimpleNameExpression selector,
|
||||
@NotNull Collection<? extends DeclarationDescriptor> declarationDescriptors,
|
||||
@NotNull BindingTrace trace,
|
||||
boolean onlyClasses,
|
||||
boolean storeResult) {
|
||||
@NotNull Collection<? extends DeclarationDescriptor> declarationDescriptors, @NotNull BindingTrace trace, boolean onlyClasses, boolean storeResult) {
|
||||
|
||||
Set<SuccessfulLookupResult> results = Sets.newHashSet();
|
||||
for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) {
|
||||
if (declarationDescriptor instanceof NamespaceDescriptor) {
|
||||
@@ -215,11 +207,8 @@ public class QualifiedExpressionResolver {
|
||||
|
||||
@NotNull
|
||||
public Collection<? extends DeclarationDescriptor> lookupDescriptorsForSimpleNameReference(@NotNull JetSimpleNameExpression referenceExpression,
|
||||
@NotNull JetScope outerScope,
|
||||
@NotNull BindingTrace trace,
|
||||
boolean onlyClasses,
|
||||
boolean namespaceLevel,
|
||||
boolean storeResult) {
|
||||
@NotNull JetScope outerScope, @NotNull BindingTrace trace, boolean onlyClasses, boolean namespaceLevel, boolean storeResult) {
|
||||
|
||||
LookupResult lookupResult = lookupSimpleNameReference(referenceExpression, outerScope, onlyClasses, namespaceLevel);
|
||||
if (lookupResult == LookupResult.EMPTY) return Collections.emptyList();
|
||||
return filterAndStoreResolutionResult(Collections.singletonList((SuccessfulLookupResult)lookupResult), referenceExpression, trace,
|
||||
@@ -228,9 +217,7 @@ public class QualifiedExpressionResolver {
|
||||
|
||||
@NotNull
|
||||
private LookupResult lookupSimpleNameReference(@NotNull JetSimpleNameExpression referenceExpression,
|
||||
@NotNull JetScope outerScope,
|
||||
boolean onlyClasses,
|
||||
boolean namespaceLevel) {
|
||||
@NotNull JetScope outerScope, boolean onlyClasses, boolean namespaceLevel) {
|
||||
|
||||
String referencedName = referenceExpression.getReferencedName();
|
||||
if (referencedName == null) {
|
||||
@@ -269,10 +256,8 @@ public class QualifiedExpressionResolver {
|
||||
|
||||
@NotNull
|
||||
private Collection<? extends DeclarationDescriptor> filterAndStoreResolutionResult(@NotNull Collection<SuccessfulLookupResult> lookupResults,
|
||||
@NotNull JetSimpleNameExpression referenceExpression,
|
||||
@NotNull BindingTrace trace,
|
||||
boolean onlyClasses,
|
||||
boolean storeResult) {
|
||||
@NotNull JetSimpleNameExpression referenceExpression, @NotNull BindingTrace trace, boolean onlyClasses, boolean storeResult) {
|
||||
|
||||
if (lookupResults.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
@@ -328,10 +313,10 @@ public class QualifiedExpressionResolver {
|
||||
}
|
||||
|
||||
private void storeResolutionResult(@NotNull Collection<? extends DeclarationDescriptor> descriptors,
|
||||
@NotNull Collection<? extends DeclarationDescriptor> canBeImportedDescriptors,
|
||||
@NotNull JetSimpleNameExpression referenceExpression,
|
||||
@NotNull Collection<JetScope> possibleResolutionScopes,
|
||||
@NotNull BindingTrace trace) {
|
||||
@NotNull Collection<? extends DeclarationDescriptor> canBeImportedDescriptors,
|
||||
@NotNull JetSimpleNameExpression referenceExpression,
|
||||
@NotNull Collection<JetScope> possibleResolutionScopes,
|
||||
@NotNull BindingTrace trace) {
|
||||
|
||||
assert canBeImportedDescriptors.size() <= descriptors.size();
|
||||
assert !possibleResolutionScopes.isEmpty();
|
||||
@@ -378,9 +363,7 @@ public class QualifiedExpressionResolver {
|
||||
* @return <code>true</code> if method has successfully resolved ambiguity
|
||||
*/
|
||||
private boolean resolveClassNamespaceAmbiguity(@NotNull Collection<? extends DeclarationDescriptor> filteredDescriptors,
|
||||
@NotNull JetSimpleNameExpression referenceExpression,
|
||||
@NotNull JetScope resolutionScope,
|
||||
@NotNull BindingTrace trace) {
|
||||
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetScope resolutionScope, @NotNull BindingTrace trace) {
|
||||
|
||||
if (filteredDescriptors.size() == 2) {
|
||||
NamespaceDescriptor namespaceDescriptor = null;
|
||||
|
||||
@@ -222,8 +222,7 @@ import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor
|
||||
if (call == null) return false;
|
||||
D candidateDescriptor = call.getCandidateDescriptor();
|
||||
if (ErrorUtils.isError(candidateDescriptor)) return true;
|
||||
Visibility visibility = candidateDescriptor.getVisibility();
|
||||
return visibility.isVisible(candidateDescriptor, context.scope.getContainingDeclaration());
|
||||
return Visibilities.isVisible(candidateDescriptor, context.scope.getContainingDeclaration());
|
||||
}
|
||||
});
|
||||
if (visibleCandidates.isEmpty()) return;
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
//FILE:a.kt
|
||||
package a
|
||||
|
||||
private class A {
|
||||
fun bar() {}
|
||||
}
|
||||
|
||||
private fun foo() {}
|
||||
|
||||
fun makeA() = A()
|
||||
|
||||
//FILE:b.kt
|
||||
package a.b
|
||||
|
||||
import a.*
|
||||
|
||||
fun test() {
|
||||
val y = makeA()
|
||||
y.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
<!UNRESOLVED_REFERENCE!>foo<!>()
|
||||
}
|
||||
|
||||
class A {
|
||||
class B {
|
||||
fun foo() {
|
||||
val y = makeA() //assure that 'makeA' is visible
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user