Considering static members when checking package-private visibility.
This commit is contained in:
@@ -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<!>()
|
||||
|
||||
+15
-2
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user