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();
+ }
}