diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/afterAlternativeID.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/afterAlternativeID.java new file mode 100644 index 000000000000..6db6d489eb75 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/afterAlternativeID.java @@ -0,0 +1,9 @@ +// "Remove 'boxing' suppression" "true" +import java.util.ArrayList; + +class Test { + void doSomething() { + final Integer number = Integer.valueOf(1); + System.out.println(number); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/afterMerger.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/afterMerger.java new file mode 100644 index 000000000000..a4b5e8946724 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/afterMerger.java @@ -0,0 +1,9 @@ +// "Remove 'CloneDoesntCallSuperClone' suppression" "true" + +class NoSuperCall { + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/beforeAlternativeID.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/beforeAlternativeID.java new file mode 100644 index 000000000000..388689198b60 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/beforeAlternativeID.java @@ -0,0 +1,10 @@ +// "Remove 'boxing' suppression" "true" +import java.util.ArrayList; + +class Test { + @SuppressWarnings( {"boxing"}) + void doSomething() { + final Integer number = Integer.valueOf(1); + System.out.println(number); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/beforeMerger.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/beforeMerger.java new file mode 100644 index 000000000000..9a9242869abb --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantUncheckedVarargs/beforeMerger.java @@ -0,0 +1,10 @@ +// "Remove 'CloneDoesntCallSuperClone' suppression" "true" + +class NoSuperCall { + @SuppressWarnings("CloneDoesntCallSuperClone") + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/RemoveRedundantSuppressionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/RemoveRedundantSuppressionTest.java index 37f9a8402dc5..cb4c356099b6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/RemoveRedundantSuppressionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/RemoveRedundantSuppressionTest.java @@ -9,6 +9,8 @@ import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection; import com.intellij.codeInspection.uncheckedWarnings.UncheckedWarningLocalInspection; import com.intellij.psi.impl.source.tree.injected.MyTestInjector; import com.siyeh.ig.controlflow.FallthruInSwitchStatementInspection; +import com.siyeh.ig.inheritance.RefusedBequestInspection; +import com.siyeh.ig.jdk.AutoBoxingInspection; public class RemoveRedundantSuppressionTest extends LightQuickFixParameterizedTestCase { @Override @@ -20,7 +22,9 @@ public class RemoveRedundantSuppressionTest extends LightQuickFixParameterizedTe new UncheckedWarningLocalInspection(), new FallthruInSwitchStatementInspection(), new UnusedDeclarationInspection(true), - new RedundantLambdaCodeBlockInspection()); + new RedundantLambdaCodeBlockInspection(), + new AutoBoxingInspection(), + new RefusedBequestInspection()); } @Override diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java index 7b82affe2b82..d5d59fdec6de 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java @@ -55,7 +55,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Function; -import java.util.stream.Collectors; /** * @author max @@ -224,7 +223,17 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass if (toolWrappers.stream().anyMatch(LocalInspectionToolWrapper::runForWholeFile)) { return; } - Set activeTools = toolWrappers.stream().filter(tool -> !tool.isUnfair()).map(tool -> tool.getID()).collect(Collectors.toSet()); + Set activeTools = new HashSet<>(); + for (LocalInspectionToolWrapper tool : toolWrappers) { + if (!tool.isUnfair()) { + activeTools.add(tool.getID()); + ContainerUtil.addIfNotNull(activeTools, tool.getAlternativeID()); + InspectionElementsMerger elementsMerger = InspectionElementsMerger.getMerger(tool.getShortName()); + if (elementsMerger != null) { + activeTools.addAll(Arrays.asList(elementsMerger.getSuppressIds())); + } + } + } LocalInspectionTool localTool = ((RedundantSuppressInspection)toolWrapper.getTool()).createLocalTool((RedundantSuppressionDetector)suppressor, mySuppressedElements, activeTools); ProblemsHolder holder = new ProblemsHolder(iManager, getFile(), true); diff --git a/platform/lang-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java b/platform/lang-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java index bbd75e72153a..9dcc177db96f 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/RedundantSuppressInspection.java @@ -108,17 +108,17 @@ public class RedundantSuppressInspection extends GlobalSimpleInspectionTool { if (suppressedScopes.values().isEmpty()) return ProblemDescriptor.EMPTY_ARRAY; // have to visit all file from scratch since inspections can be written in any pervasive way including checkFile() overriding - Map suppressedTools = new THashMap<>(); - InspectionToolWrapper[] toolWrappers = getInspectionTools(psiElement, manager); + Map, String> suppressedTools = new THashMap<>(); + InspectionToolWrapper[] toolWrappers = getInspectionTools(psiElement, manager); for (Collection ids : suppressedScopes.values()) { for (Iterator iterator = ids.iterator(); iterator.hasNext(); ) { String suppressId = iterator.next().trim(); - List reportingWrappers = findReportingTools(toolWrappers, suppressId); + List> reportingWrappers = findReportingTools(toolWrappers, suppressId); if (reportingWrappers.isEmpty()) { iterator.remove(); } else { - for (InspectionToolWrapper toolWrapper : reportingWrappers) { + for (InspectionToolWrapper toolWrapper : reportingWrappers) { suppressedTools.put(toolWrapper, suppressId); } } @@ -135,7 +135,7 @@ public class RedundantSuppressInspection extends GlobalSimpleInspectionTool { final List result; try { result = new ArrayList<>(); - for (InspectionToolWrapper toolWrapper : suppressedTools.keySet()) { + for (InspectionToolWrapper toolWrapper : suppressedTools.keySet()) { String toolId = suppressedTools.get(toolWrapper); toolWrapper.initialize(globalContext); final Collection descriptors; @@ -203,10 +203,10 @@ public class RedundantSuppressInspection extends GlobalSimpleInspectionTool { return result.toArray(ProblemDescriptor.EMPTY_ARRAY); } - private static List findReportingTools(InspectionToolWrapper[] toolWrappers, String suppressedId) { - List wrappers = Collections.emptyList(); + private static List> findReportingTools(InspectionToolWrapper[] toolWrappers, String suppressedId) { + List> wrappers = Collections.emptyList(); String mergedToolName = InspectionElementsMerger.getMergedToolName(suppressedId); - for (InspectionToolWrapper toolWrapper : toolWrappers) { + for (InspectionToolWrapper toolWrapper : toolWrappers) { String toolWrapperShortName = toolWrapper.getShortName(); String alternativeID = toolWrapper.getTool().getAlternativeID(); if (toolWrapper instanceof LocalInspectionToolWrapper && @@ -275,7 +275,7 @@ public class RedundantSuppressInspection extends GlobalSimpleInspectionTool { } @NotNull - protected InspectionToolWrapper[] getInspectionTools(PsiElement psiElement, @NotNull InspectionManager manager) { + protected InspectionToolWrapper[] getInspectionTools(PsiElement psiElement, @NotNull InspectionManager manager) { String currentProfileName = ((InspectionManagerBase)manager).getCurrentProfile(); InspectionProjectProfileManager profileManager = InspectionProjectProfileManager.getInstance(manager.getProject()); InspectionProfileImpl usedProfile = profileManager.getProfile(currentProfileName, false);