提交 e364fe42 编写于 作者: S Svetlana Isakova

public methods in private classes visibility check

上级 ffbce7fe
......@@ -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);
}
......@@ -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;
......
//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
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册