Considering static members when checking package-private visibility.

This commit is contained in:
Evgeny Gerashchenko
2014-01-11 19:55:54 +04:00
parent e994b718cb
commit cb78defa36
3 changed files with 37 additions and 3 deletions
@@ -2,12 +2,24 @@
package a;
class MyJavaClass {
static int staticMethod() {
return 1;
}
static class NestedClass {
static int staticMethodOfNested() {
return 1;
}
}
}
//FILE:a.kt
package a
val mc = MyJavaClass()
val x = MyJavaClass.staticMethod()
val y = MyJavaClass.NestedClass.staticMethodOfNested()
val z = MyJavaClass.NestedClass()
//FILE: b.kt
package b
@@ -16,9 +28,17 @@ import a.<!INVISIBLE_REFERENCE!>MyJavaClass<!>
val mc1 = <!INVISIBLE_MEMBER!>MyJavaClass<!>()
val x = MyJavaClass.<!INVISIBLE_MEMBER!>staticMethod<!>()
val y = MyJavaClass.NestedClass.<!INVISIBLE_MEMBER!>staticMethodOfNested<!>()
val z = MyJavaClass.<!INVISIBLE_MEMBER!>NestedClass<!>()
//FILE: c.kt
package a.c
import a.<!INVISIBLE_REFERENCE!>MyJavaClass<!>
val mc1 = <!INVISIBLE_MEMBER!>MyJavaClass<!>()
val mc1 = <!INVISIBLE_MEMBER!>MyJavaClass<!>()
val x = MyJavaClass.<!INVISIBLE_MEMBER!>staticMethod<!>()
val y = MyJavaClass.NestedClass.<!INVISIBLE_MEMBER!>staticMethodOfNested<!>()
val z = MyJavaClass.<!INVISIBLE_MEMBER!>NestedClass<!>()
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
@@ -134,8 +135,20 @@ public class JavaVisibilities {
};
private static boolean areInSamePackage(@NotNull DeclarationDescriptor first, @NotNull DeclarationDescriptor second) {
PackageFragmentDescriptor whatPackage = DescriptorUtils.getParentOfType(first, PackageFragmentDescriptor.class, false);
PackageFragmentDescriptor fromPackage = DescriptorUtils.getParentOfType(second, PackageFragmentDescriptor.class, false);
PackageFragmentDescriptor whatPackage = getPackageStaticsAware(first);
PackageFragmentDescriptor fromPackage = getPackageStaticsAware(second);
return fromPackage != null && whatPackage != null && whatPackage.getFqName().equals(fromPackage.getFqName());
}
@Nullable
private static PackageFragmentDescriptor getPackageStaticsAware(@NotNull DeclarationDescriptor member) {
PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(member, PackageFragmentDescriptor.class, false);
if (packageFragment instanceof JavaPackageFragmentDescriptor
&& ((JavaPackageFragmentDescriptor) packageFragment).getKind() == JavaPackageFragmentDescriptor.Kind.CLASS_STATICS) {
ClassDescriptor classForPackage =
((JavaPackageFragmentDescriptor) packageFragment).getJavaDescriptorResolver().resolveClass(packageFragment.getFqName());
return DescriptorUtils.getParentOfType(classForPackage, PackageFragmentDescriptor.class, false);
}
return packageFragment;
}
}
@@ -20,6 +20,7 @@ import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.descriptors.Visibility;
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;