unused parameter: correctly ignore parameters used in overridden methods

when graph was build over not project scope (IDEA-180281)
This commit is contained in:
Anna.Kozlova
2017-10-11 12:09:57 +02:00
parent a695c507aa
commit 4e2a83d6d0
6 changed files with 64 additions and 4 deletions
@@ -41,7 +41,6 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.profile.codeInspection.ui.SingleInspectionProfilePanel;
import com.intellij.psi.*;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PropertyUtilBase;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.safeDelete.SafeDeleteHandler;
@@ -564,7 +563,15 @@ public class UnusedDeclarationPresentation extends DefaultInspectionToolPresenta
final PsiElement psiElement = ReadAction.compute(() -> ((RefElement)refEntity).getElement());
List<CommonProblemDescriptor> foreignDescriptors = new ArrayList<>();
for (CommonProblemDescriptor descriptor : descriptors) {
if (descriptor instanceof ProblemDescriptor && ReadAction.compute(() -> ((ProblemDescriptor)descriptor).getPsiElement()) == psiElement) continue;
if (descriptor instanceof ProblemDescriptor) {
PsiElement problemElement = ReadAction.compute(() -> {
PsiElement element = ((ProblemDescriptor)descriptor).getPsiElement();
if (element instanceof PsiIdentifier) element = element.getParent();
return element;
});
if (problemElement == psiElement ||
problemElement instanceof PsiParameter && ((PsiParameter)problemElement).getDeclarationScope() == psiElement) continue;
}
foreignDescriptors.add(descriptor);
}
if (foreignDescriptors.size() == descriptors.length) return;
@@ -117,7 +117,7 @@ class UnusedParametersInspection extends GlobalJavaBatchInspectionTool {
for (int i = 0; i < derived.length && !found[0]; i++) {
if (scope == null || !scope.contains(derived[i])) {
final PsiParameter[] parameters = derived[i].getParameterList().getParameters();
if (parameters.length >= idx) continue;
if (parameters.length < idx) continue;
PsiParameter psiParameter = parameters[idx];
ReferencesSearch.search(psiParameter, helper.getUseScope(psiParameter), false)
.forEach(new PsiReferenceProcessorAdapter(
@@ -125,7 +125,7 @@ class UnusedParametersInspection extends GlobalJavaBatchInspectionTool {
@Override
public boolean execute(PsiReference element) {
refParameter.parameterReferenced(false);
processor.ignoreElement(refParameter);
processor.ignoreElement(refMethod);
found[0] = true;
return false;
}
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<problems/>
@@ -0,0 +1,7 @@
public class Test {
public void doSmth(String str) {}
public static void main(String[] args) {
new Test().doSmth("");
}
}
@@ -0,0 +1,5 @@
public class Main extends Test {
public void doSmth(String str) {
System.out.println(str);
}
}
@@ -0,0 +1,39 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.java.codeInspection;
import com.intellij.analysis.AnalysisScope;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiManager;
import com.intellij.testFramework.PsiTestUtil;
import org.jetbrains.annotations.NotNull;
public class UnusedDeclarationInSubScopeTest extends AbstractUnusedDeclarationTest {
@Override
protected void setupRootModel(@NotNull String testDir, @NotNull VirtualFile[] sourceDir, String jdkName) {
super.setupRootModel(testDir, sourceDir, jdkName);
VirtualFile projectDir = LocalFileSystem.getInstance().findFileByPath(testDir);
assertNotNull(projectDir);
VirtualFile test = projectDir.findChild("test_src");
if (test != null) PsiTestUtil.addSourceRoot(myModule, test, true);
}
@NotNull
@Override
protected AnalysisScope createAnalysisScope(VirtualFile sourceDir) {
VirtualFile[] roots = ModuleRootManager.getInstance(myModule).getSourceRoots(false);
assertTrue(roots.length == 1);
PsiManager psiManager = PsiManager.getInstance(myProject);
return new AnalysisScope(psiManager.findDirectory(roots[0]));
}
public void testParameterUsedInOutOfScopeOverrider() {
doTest();
}
@Override
protected void doTest() {
doTest("deadCode/" + getTestName(true), myToolWrapper);
}
}