Considering static members when checking package-private visibility.
This commit is contained in:
@@ -2,12 +2,24 @@
|
|||||||
package a;
|
package a;
|
||||||
|
|
||||||
class MyJavaClass {
|
class MyJavaClass {
|
||||||
|
static int staticMethod() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class NestedClass {
|
||||||
|
static int staticMethodOfNested() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//FILE:a.kt
|
//FILE:a.kt
|
||||||
package a
|
package a
|
||||||
|
|
||||||
val mc = MyJavaClass()
|
val mc = MyJavaClass()
|
||||||
|
val x = MyJavaClass.staticMethod()
|
||||||
|
val y = MyJavaClass.NestedClass.staticMethodOfNested()
|
||||||
|
val z = MyJavaClass.NestedClass()
|
||||||
|
|
||||||
//FILE: b.kt
|
//FILE: b.kt
|
||||||
package b
|
package b
|
||||||
@@ -16,9 +28,17 @@ 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<!>()
|
||||||
|
|
||||||
//FILE: c.kt
|
//FILE: c.kt
|
||||||
package a.c
|
package a.c
|
||||||
|
|
||||||
import a.<!INVISIBLE_REFERENCE!>MyJavaClass<!>
|
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;
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
|
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) {
|
private static boolean areInSamePackage(@NotNull DeclarationDescriptor first, @NotNull DeclarationDescriptor second) {
|
||||||
PackageFragmentDescriptor whatPackage = DescriptorUtils.getParentOfType(first, PackageFragmentDescriptor.class, false);
|
PackageFragmentDescriptor whatPackage = getPackageStaticsAware(first);
|
||||||
PackageFragmentDescriptor fromPackage = DescriptorUtils.getParentOfType(second, PackageFragmentDescriptor.class, false);
|
PackageFragmentDescriptor fromPackage = getPackageStaticsAware(second);
|
||||||
return fromPackage != null && whatPackage != null && whatPackage.getFqName().equals(fromPackage.getFqName());
|
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.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
|
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.DescriptorResolverUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||||
|
|||||||
Reference in New Issue
Block a user