unused symbol inspection: mark method parameter used if method is used as method reference IDEA-210306

GitOrigin-RevId: 086a276669ee3dba969f8ea2334af157890594dc
This commit is contained in:
Dmitry Batkovich
2019-05-08 13:45:33 +02:00
committed by intellij-monorepo-bot
parent 6cc0a96a98
commit db60b80cc4
11 changed files with 45 additions and 7 deletions

View File

@@ -1346,6 +1346,11 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
myRefCountHolder.registerReference(expression, result);
}
final PsiElement method = result.getElement();
if (method instanceof PsiMethod && myRefCountHolder != null) {
for (PsiParameter parameter : ((PsiMethod)method).getParameterList().getParameters()) {
myRefCountHolder.registerLocallyReferenced(parameter);
}
}
if (method != null && !result.isAccessible()) {
String accessProblem = HighlightUtil.accessProblemDescription(expression, method, result);
HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(accessProblem).create();

View File

@@ -156,9 +156,21 @@ public class RefJavaUtilImpl extends RefJavaUtil {
public boolean visitCallableReferenceExpression(@NotNull UCallableReferenceExpression node) {
visitReferenceExpression(node);
processFunctionalExpression(node, getFunctionalInterfaceType(node));
markParametersReferenced(node);
return false;
}
private void markParametersReferenced(@NotNull UCallableReferenceExpression node) {
PsiElement resolved = node.resolve();
if (resolved == null) return;
RefElement refElement = refFrom.getRefManager().getReference(resolved);
if (refElement instanceof RefMethod) {
for (RefParameter parameter : ((RefMethod)refElement).getParameters()) {
refFrom.addReference(parameter, parameter.getPsiElement(), decl, false, true, node);
}
}
}
@Override
public boolean visitObjectLiteralExpression(@NotNull UObjectLiteralExpression node) {
visitReferenceExpression(node);

View File

@@ -14,7 +14,7 @@ class Test {
class Test2 {
static void m(Integer <warning descr="Parameter 'i' is never used">i</warning>) { }
static void m(Integer i) { }
interface I1 {
void m(int x);

View File

@@ -77,7 +77,7 @@ abstract class AbstractCollection<E> implements Collection<E> {
public boolean add(E e) {
return true;
}
public boolean addAll(Collection<? extends E> <warning descr="Parameter 'c' is never used">c</warning>) {
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
return modified;
}

View File

@@ -6,11 +6,11 @@ class Test {
Test m(List<Integer> l1, List<Integer> l2);
}
static Test meth(List<Integer>... <warning descr="Parameter 'lli' is never used">lli</warning>) {
static Test meth(List<Integer>... lli) {
return null;
}
Test(List<Integer>... <warning descr="Parameter 'lli' is never used">lli</warning>) {}
Test(List<Integer>... lli) {}
{
I <warning descr="Variable 'i1' is never used">i1</warning> = <warning descr="Unchecked generics array creation for varargs parameter">Test::meth</warning>;

View File

@@ -1,7 +1,7 @@
import java.util.stream.Stream;
class A {
private void test5(Integer <warning descr="Parameter 'i' is never used">i</warning>, String... <warning descr="Parameter 'strings' is never used">strings</warning>) {}
private void test5(Integer i, String... strings) {}
private void <warning descr="Private method 'test5(java.lang.Integer, java.lang.Integer, java.lang.String...)' is never used">test5</warning>(Integer i, Integer b, String... strings) {
System.out.println(i);
System.out.println(b);

View File

@@ -12,7 +12,7 @@ class MyTest<T> {
public static class Builder<E> {
public Builder<E> add(E <warning descr="Parameter 'element' is never used">element</warning>) {
public Builder<E> add(E element) {
return this;
}

View File

@@ -8,6 +8,6 @@ class Main {
}
public static boolean checkForJdk(String <warning descr="Parameter 'homePath' is never used">homePath</warning>) {return false;}
public static boolean checkForJdk(File <warning descr="Parameter 'homePath' is never used">homePath</warning>) {return false;}
public static boolean checkForJdk(File homePath) {return false;}
}

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<problems/>

View File

@@ -0,0 +1,15 @@
import javax.swing.*;
import java.awt.event.ActionEvent;
class A {
{
new JComboBox().addActionListener(this::handleActionEvent);
}
public static void main(String[] args) {
new A();
}
private void handleActionEvent(ActionEvent ignore) {
System.out.println(123);
}
}

View File

@@ -254,6 +254,10 @@ public class UnusedDeclarationTest extends AbstractUnusedDeclarationTest {
doTest();
}
public void testMethodParametersIfMethodReferenceUsed() {
doTest();
}
private void doTest5() {
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_1_5, () -> doTest());
}