kotlin: fix false positives for 'suspicious package-private access' inspection in object literal expressions in Kotlin

(IDEA-210216)
This commit is contained in:
nik
2019-04-02 14:34:18 +03:00
parent 4afe0a5841
commit cdd60556a9
2 changed files with 48 additions and 2 deletions
@@ -24,13 +24,40 @@ class AccessingProtectedMembersFromSubclass : ProtectedMembers() {
var inner1: ProtectedMembers.StaticInner
var inner2: StaticInner
val runnable = object : Runnable {
override fun run() {
method()
staticMethod()
}
}
}
private val runnable = object : Runnable {
override fun run() {
method()
staticMethod()
}
}
private val obj = object : StaticInner() {}
private class StaticInnerImpl1 : ProtectedMembers.StaticInner()
private class StaticInnerImpl2 : StaticInner()
private inner class OwnInnerClass {
fun bar() {
method()
staticMethod()
}
}
}
class AccessingDefaultProtectedConstructorFromSubclass : ProtectedConstructors()
class AccessingProtectedConstructorFromSubclass : ProtectedConstructors(1)
class AccessingProtectedConstructorFromSubclass : ProtectedConstructors(1)
val objectAccessingDefaultProtectedConstructorFromSubclass = object : ProtectedConstructors() {}
val objectAccessingProtectedConstructorFromSubclass = object : ProtectedConstructors(1) {}
@@ -228,7 +228,26 @@ public class SuspiciousPackagePrivateAccessInspection extends AbstractBaseUastLo
PsiElement sourcePsi = sourceNode.getSourcePsi();
UClass sourceClass = UastUtils.findContaining(sourcePsi, UClass.class);
if (sourceClass == null) return false;
return JavaResolveUtil.canAccessProtectedMember(member, memberClass, accessObjectType, sourceClass.getJavaPsi(), member.hasModifierProperty(PsiModifier.STATIC));
return canAccessProtectedMember(member, memberClass, accessObjectType, member.hasModifierProperty(PsiModifier.STATIC),
sourceClass);
}
private static boolean canAccessProtectedMember(PsiMember member, PsiClass memberClass, PsiClass accessObjectType,
boolean isMemberStatic, UClass sourceClass) {
if (JavaResolveUtil.canAccessProtectedMember(member, memberClass, accessObjectType, sourceClass.getJavaPsi(), isMemberStatic)) {
return true;
}
if (sourceClass instanceof UAnonymousClass && sourceClass.getJavaPsi().getContext() == null) {
//workaround for KT-30752: KtLightClassForAnonymousDeclaration::getContext returns null for object literal expressions in some member initializers
UElement uastParent = sourceClass.getUastParent();
if (uastParent != null) {
UClass parentClass = UastUtils.findContaining(uastParent.getSourcePsi(), UClass.class);
if (parentClass != null) {
return canAccessProtectedMember(member, memberClass, accessObjectType, isMemberStatic, parentClass);
}
}
}
return false;
}
private boolean isPackageLocalAccessSuspicious(Module sourceModule, Module targetModule) {