From 1250b4612cc34b7243cccc023c01450e3152681d Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 11 Aug 2025 14:22:56 +0200 Subject: [PATCH] Java: report "Static initializer references subclass" when subclass is private but indirect (IDEA-348744) GitOrigin-RevId: ffc256b9afdcb4cd1ea073263e55188ad02b5636 --- .../StaticInitializerReferencesSubClassInspection.java | 5 +++-- .../StaticInitializer.java | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/java/java-analysis-impl/src/com/siyeh/ig/threading/StaticInitializerReferencesSubClassInspection.java b/java/java-analysis-impl/src/com/siyeh/ig/threading/StaticInitializerReferencesSubClassInspection.java index db35a91715cd..0ddda226cdca 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/threading/StaticInitializerReferencesSubClassInspection.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/threading/StaticInitializerReferencesSubClassInspection.java @@ -62,7 +62,7 @@ public final class StaticInitializerReferencesSubClassInspection extends Abstrac } PsiClass targetClass = extractClass(element); - if (targetClass != null && targetClass.isInheritor(baseClass, true) && !hasSingleInitializationPlace(targetClass)) { + if (targetClass != null && targetClass.isInheritor(baseClass, true) && !hasSingleInitializationPlace(targetClass, baseClass)) { PsiElement problemElement = calcProblemElement(element); if (problemElement != null) { result.set(Pair.create(problemElement, targetClass)); @@ -75,8 +75,9 @@ public final class StaticInitializerReferencesSubClassInspection extends Abstrac return result.get(); } - private static boolean hasSingleInitializationPlace(@NotNull PsiClass targetClass) { + private static boolean hasSingleInitializationPlace(@NotNull PsiClass targetClass, @NotNull PsiClass baseClass) { if (!targetClass.hasModifierProperty(PsiModifier.PRIVATE)) return false; + if (!targetClass.isInheritor(baseClass, false) && !baseClass.hasModifierProperty(PsiModifier.PRIVATE)) return false; PsiFile file = targetClass.getContainingFile(); if (file == null) return false; diff --git a/java/java-tests/testData/ig/com/siyeh/igtest/threading/StaticInitializerReferencesSubClass/StaticInitializer.java b/java/java-tests/testData/ig/com/siyeh/igtest/threading/StaticInitializerReferencesSubClass/StaticInitializer.java index d5dfacb26b7f..bee0785fd15d 100644 --- a/java/java-tests/testData/ig/com/siyeh/igtest/threading/StaticInitializerReferencesSubClass/StaticInitializer.java +++ b/java/java-tests/testData/ig/com/siyeh/igtest/threading/StaticInitializerReferencesSubClass/StaticInitializer.java @@ -21,6 +21,7 @@ class Super { static Super OK_SAME_ANONYMOUS = new Super(){}; static Sub[] OK_ARRAY = new Sub[3]; static Super OK_PRIVATE = new MySub(); + static Super C6 = new SubSub(); static java.util.List OK_GENERICS = new java.util.ArrayList(); static { @@ -38,6 +39,8 @@ class Super { } } + + private static class SubSub extends Sub {} // private but indirect subclass } class Sub extends Super implements Intf {