diff --git a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/dep/xxx/PackagePrivateAbstractMethod.java b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/dep/xxx/PackagePrivateAbstractMethod.java new file mode 100644 index 000000000000..7a309487a89b --- /dev/null +++ b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/dep/xxx/PackagePrivateAbstractMethod.java @@ -0,0 +1,13 @@ +package xxx; + +public abstract class PackagePrivateAbstractMethod { + + abstract void foo(); + + void bar() {} + + protected void baz() {} + + public void qux() {} + +} \ No newline at end of file diff --git a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/src/OverridePackagePrivateMethod.kt b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/src/OverridePackagePrivateMethod.kt new file mode 100644 index 000000000000..d27cafab4c32 --- /dev/null +++ b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/suspiciousPackagePrivateAccess/src/OverridePackagePrivateMethod.kt @@ -0,0 +1,12 @@ +package xxx; + +class OverridePackagePrivateMethod : PackagePrivateAbstractMethod() { + + override fun foo() {} + + override fun bar() {} + + override protected fun baz() {} + + override fun qux() {} +} \ No newline at end of file diff --git a/jvm/jvm-analysis-kotlin-tests/testSrc/com/intellij/codeInspection/tests/kotlin/KtSuspiciousPackagePrivateAccessInspectionTest.kt b/jvm/jvm-analysis-kotlin-tests/testSrc/com/intellij/codeInspection/tests/kotlin/KtSuspiciousPackagePrivateAccessInspectionTest.kt index 060b7a7e010b..ce582fa98776 100644 --- a/jvm/jvm-analysis-kotlin-tests/testSrc/com/intellij/codeInspection/tests/kotlin/KtSuspiciousPackagePrivateAccessInspectionTest.kt +++ b/jvm/jvm-analysis-kotlin-tests/testSrc/com/intellij/codeInspection/tests/kotlin/KtSuspiciousPackagePrivateAccessInspectionTest.kt @@ -18,5 +18,9 @@ class KtSuspiciousPackagePrivateAccessInspectionTest : SuspiciousPackagePrivateA doTestWithDependency() } + fun testOverridePackagePrivateMethod() { + doTestWithDependency() + } + override fun getBasePath() = "${JvmAnalysisKtTestsUtil.TEST_DATA_PROJECT_RELATIVE_BASE_PATH}/codeInspection/suspiciousPackagePrivateAccess" } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspection.java index 562285d98946..5f628a56f3c1 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspection.java @@ -90,6 +90,11 @@ public class SuspiciousPackagePrivateAccessInspection extends AbstractBaseUastLo } } + @Override + public void processMethodOverriding(@NotNull UMethod method, @NotNull PsiMethod targetElement) { + checkOverridePackageLocal(method, targetElement); + } + @Override public void processConstructorInvocation(@NotNull UElement sourceNode, @NotNull PsiClass instantiatedClass, @@ -147,6 +152,30 @@ public class SuspiciousPackagePrivateAccessInspection extends AbstractBaseUastLo } } + private void checkOverridePackageLocal(@NotNull UMethod sourceNode, @NotNull PsiJvmMember targetElement) { + PsiMethod sourcePsi = sourceNode.getPsi(); + if (targetElement.hasModifier(JvmModifier.PACKAGE_LOCAL)) { + Module targetModule = ModuleUtilCore.findModuleForPsiElement(targetElement); + Module sourceModule = ModuleUtilCore.findModuleForPsiElement(sourcePsi); + if (isPackageLocalAccessSuspicious(sourceModule, targetModule)) { + List fixes = + JvmElementActionFactories.createModifierActions(targetElement, MemberRequestsKt.modifierRequest(JvmModifier.PUBLIC, true)); + String elementDescription = + StringUtil.removeHtmlTags(StringUtil.capitalize(RefactoringUIUtil.getDescription(targetElement, false))); + final String classDescription = + StringUtil.removeHtmlTags(RefactoringUIUtil.getDescription(targetElement.getParent(), false)); + LocalQuickFix[] quickFixes = + IntentionWrapper.wrapToQuickFixes(fixes.toArray(IntentionAction.EMPTY_ARRAY), targetElement.getContainingFile()); + String problem = elementDescription + " overrides a package-private method from " + classDescription + + " which is declared in a different module '" + targetModule.getName() + "'"; + myProblemsHolder.registerProblem(sourcePsi.getNameIdentifier(), problem, + ArrayUtil.append(quickFixes, + new MarkModulesAsLoadedTogetherFix(sourceModule.getName(), + targetModule.getName()))); + } + } + } + private boolean isPackageLocalAccessSuspicious(Module sourceModule, Module targetModule) { if (targetModule == null || sourceModule == null || targetModule.equals(sourceModule)) { return false; diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/dependency/suspicious_package_private_access/dep/xxx/PackagePrivateAbstractMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/dependency/suspicious_package_private_access/dep/xxx/PackagePrivateAbstractMethod.java new file mode 100644 index 000000000000..7a309487a89b --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/dependency/suspicious_package_private_access/dep/xxx/PackagePrivateAbstractMethod.java @@ -0,0 +1,13 @@ +package xxx; + +public abstract class PackagePrivateAbstractMethod { + + abstract void foo(); + + void bar() {} + + protected void baz() {} + + public void qux() {} + +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/dependency/suspicious_package_private_access/src/OverridePackagePrivateMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/dependency/suspicious_package_private_access/src/OverridePackagePrivateMethod.java new file mode 100644 index 000000000000..6d0a5941bfdf --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/dependency/suspicious_package_private_access/src/OverridePackagePrivateMethod.java @@ -0,0 +1,17 @@ +package xxx; + +class OverridePackagePrivateMethod extends PackagePrivateAbstractMethod { + + @Override + public void foo() {} + + @Override + public void bar() {} + + @Override + public void baz() {} + + @Override + public void qux() {} + +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspectionTest.java index c462f307f21c..326a1562b5ba 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/dependency/SuspiciousPackagePrivateAccessInspectionTest.java @@ -19,4 +19,8 @@ public class SuspiciousPackagePrivateAccessInspectionTest extends SuspiciousPack public void testAccessingPackagePrivateInSignatures() { doTestWithDependency(); } + + public void testOverridePackagePrivateMethod() { + doTestWithDependency(); + } }