From e129868d331e2f33897a4cb1288c4d151e25f5f5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 11 Sep 2017 17:43:19 +0300 Subject: [PATCH] unused: search for main in inner classes (IDEA-178721) --- .../deadCode/UnusedDeclarationInspectionBase.java | 14 +++++++++++++- .../unusedDecls/InnerClassWithMainMethod.java | 7 +++++++ .../codeInsight/daemon/UnusedSymbolLocalTest.java | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/unusedDecls/InnerClassWithMainMethod.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspectionBase.java index f92423e6923c..ae334bfeefac 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspectionBase.java @@ -400,7 +400,9 @@ public class UnusedDeclarationInspectionBase extends GlobalInspectionTool { if (isAddServletEnabled() && servlet != null && aClass.isInheritor(servlet, true)) { return true; } - if (isAddMainsEnabled() && PsiMethodUtil.hasMainMethod(aClass)) return true; + if (isAddMainsEnabled()) { + if (hasMainMethodDeep(aClass)) return true; + } } if (element instanceof PsiModifierListOwner) { final EntryPointsManager entryPointsManager = EntryPointsManager.getInstance(project); @@ -414,6 +416,16 @@ public class UnusedDeclarationInspectionBase extends GlobalInspectionTool { return RefUtil.isImplicitUsage(element); } + private static boolean hasMainMethodDeep(PsiClass aClass) { + if (PsiMethodUtil.hasMainMethod(aClass)) return true; + for (PsiClass innerClass : aClass.getInnerClasses()) { + if (innerClass.hasModifierProperty(PsiModifier.STATIC) && PsiMethodUtil.hasMainMethod(innerClass)) { + return true; + } + } + return false; + } + public boolean isGlobalEnabledInEditor() { return myEnabledInEditor; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/unusedDecls/InnerClassWithMainMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/unusedDecls/InnerClassWithMainMethod.java new file mode 100644 index 000000000000..0b8919a4754a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/unusedDecls/InnerClassWithMainMethod.java @@ -0,0 +1,7 @@ +class Test { + static class NestedTest { + public static void main(String[] args) { + new Test(); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/UnusedSymbolLocalTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/UnusedSymbolLocalTest.java index 61c4ff17962a..b51d802a2c38 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/UnusedSymbolLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/UnusedSymbolLocalTest.java @@ -35,6 +35,7 @@ public class UnusedSymbolLocalTest extends DaemonAnalyzerTestCase { } public void testInnerClass() throws Exception { doTest(); } + public void testInnerClassWithMainMethod() throws Exception { doTest(); } public void testInnerUsesSelf() throws Exception { doTest(); } public void testLocalClass() throws Exception { doTest(); } public void testPrivateConstructor() throws Exception { doTest(); }