diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 261421309ff..2cc4e9cc3a9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -446,6 +446,7 @@ public class JavaDescriptorResolver { classData.classDescriptor.setSupertypes(getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData.classDescriptor, new ArrayList(0))); classData.classDescriptor.setName(JetPsiUtil.NO_NAME_PROVIDED); // TODO classData.classDescriptor.setModality(Modality.FINAL); + classData.classDescriptor.setVisibility(containing.getVisibility()); classData.classDescriptor.setTypeParameterDescriptors(new ArrayList(0)); classData.classDescriptor.createTypeConstructor(); classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, classObjectPsiClass, semanticServices, false)); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java index e7fc1613e73..510d4caabbc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java @@ -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 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; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java index 9b08bfb951a..13a75de556e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java @@ -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); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/QualifiedExpressionResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/QualifiedExpressionResolver.java index 25ce6c398f7..54312aac3d0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/QualifiedExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/QualifiedExpressionResolver.java @@ -40,17 +40,15 @@ public class QualifiedExpressionResolver { @NotNull public Collection 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 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 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 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 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 declarationDescriptors; if (receiverExpression instanceof JetQualifiedExpression) { @@ -182,10 +176,8 @@ public class QualifiedExpressionResolver { @NotNull private Collection lookupSelectorDescriptors(@NotNull JetSimpleNameExpression selector, - @NotNull Collection declarationDescriptors, - @NotNull BindingTrace trace, - boolean onlyClasses, - boolean storeResult) { + @NotNull Collection declarationDescriptors, @NotNull BindingTrace trace, boolean onlyClasses, boolean storeResult) { + Set results = Sets.newHashSet(); for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) { if (declarationDescriptor instanceof NamespaceDescriptor) { @@ -215,11 +207,8 @@ public class QualifiedExpressionResolver { @NotNull public Collection 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 filterAndStoreResolutionResult(@NotNull Collection 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 descriptors, - @NotNull Collection canBeImportedDescriptors, - @NotNull JetSimpleNameExpression referenceExpression, - @NotNull Collection possibleResolutionScopes, - @NotNull BindingTrace trace) { + @NotNull Collection canBeImportedDescriptors, + @NotNull JetSimpleNameExpression referenceExpression, + @NotNull Collection possibleResolutionScopes, + @NotNull BindingTrace trace) { assert canBeImportedDescriptors.size() <= descriptors.size(); assert !possibleResolutionScopes.isEmpty(); @@ -378,9 +363,7 @@ public class QualifiedExpressionResolver { * @return true if method has successfully resolved ambiguity */ private boolean resolveClassNamespaceAmbiguity(@NotNull Collection 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; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java index 9784cc77681..39b41223444 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java @@ -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; diff --git a/compiler/testData/diagnostics/tests/scopes/visibility2.jet b/compiler/testData/diagnostics/tests/scopes/visibility2.jet new file mode 100644 index 00000000000..af2385e32a0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/visibility2.jet @@ -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.bar() + foo() +} + +class A { + class B { + fun foo() { + val y = makeA() //assure that 'makeA' is visible + } + } +} + +