From cdd60556a94376f0ee940d2f31ab2381f6629d95 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 2 Apr 2019 14:15:43 +0300 Subject: [PATCH] kotlin: fix false positives for 'suspicious package-private access' inspection in object literal expressions in Kotlin (IDEA-210216) --- .../src/AccessingProtectedMembers.kt | 29 ++++++++++++++++++- ...piciousPackagePrivateAccessInspection.java | 21 +++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/src/AccessingProtectedMembers.kt b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/src/AccessingProtectedMembers.kt index 4fc4709420a9..bb23857c7f2a 100644 --- a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/src/AccessingProtectedMembers.kt +++ b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/src/AccessingProtectedMembers.kt @@ -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) \ No newline at end of file +class AccessingProtectedConstructorFromSubclass : ProtectedConstructors(1) + +val objectAccessingDefaultProtectedConstructorFromSubclass = object : ProtectedConstructors() {} + +val objectAccessingProtectedConstructorFromSubclass = object : ProtectedConstructors(1) {} diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspection.java index 51829362d1a3..294c4d66394b 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspection.java @@ -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) {