diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java index 858d6116dd58..b5c72021d887 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java @@ -49,9 +49,7 @@ import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewUtil; import com.intellij.usages.*; import com.intellij.util.ArrayUtil; -import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.MultiMap; @@ -255,12 +253,22 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { @Override public Collection findConflicts(PsiElement element, PsiElement[] elements, UsageInfo[] usages) { String methodRefFound = null; - if (!ApplicationManager.getApplication().isUnitTestMode() && (element instanceof PsiMethod || element instanceof PsiParameter)) { - for (UsageInfo usage : usages) { - final PsiElement refElement = usage.getElement(); - if (refElement instanceof PsiMethodReferenceExpression) { - methodRefFound = RefactoringBundle.message("expand.method.reference.warning"); - break; + if (element instanceof PsiMethod || element instanceof PsiParameter) { + PsiMethod method; + if (element instanceof PsiMethod) { + method = (PsiMethod)element; + } + else { + PsiElement declarationScope = ((PsiParameter)element).getDeclarationScope(); + method = declarationScope instanceof PsiMethod ? (PsiMethod)declarationScope : null; + } + if (method != null) { + for (UsageInfo usage : usages) { + final PsiElement refElement = usage.getElement(); + if (refElement instanceof PsiMethodReferenceExpression && method.equals(((PsiMethodReferenceExpression)refElement).resolve())) { + methodRefFound = RefactoringBundle.message("expand.method.reference.warning"); + break; + } } } } diff --git a/java/java-tests/testData/refactoring/safeDelete/NoConflictOnDeleteParameterWithMethodRefArg.java b/java/java-tests/testData/refactoring/safeDelete/NoConflictOnDeleteParameterWithMethodRefArg.java new file mode 100644 index 000000000000..926b0bb36aab --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/NoConflictOnDeleteParameterWithMethodRefArg.java @@ -0,0 +1,13 @@ +import java.util.function.Consumer; + +public class Subst { + void test1() { + test2(Subst::bar); + } + + private static void bar(Object o) { + + } + + void test2(final Consumer consumer) {} +} diff --git a/java/java-tests/testData/refactoring/safeDelete/NoConflictOnDeleteParameterWithMethodRefArg_after.java b/java/java-tests/testData/refactoring/safeDelete/NoConflictOnDeleteParameterWithMethodRefArg_after.java new file mode 100644 index 000000000000..87b2e5480514 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/NoConflictOnDeleteParameterWithMethodRefArg_after.java @@ -0,0 +1,13 @@ +import java.util.function.Consumer; + +public class Subst { + void test1() { + test2(); + } + + private static void bar(Object o) { + + } + + void test2() {} +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java index db481b14dc3d..9e5251c74b9b 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -312,6 +312,17 @@ public class SafeDeleteTest extends MultiFileTestCase { } public void testParameterInMethodUsedInMethodReference() throws Exception { + LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8); + try { + BaseRefactoringProcessor.ConflictsInTestsException.setTestIgnore(true); + doSingleFileTest(); + } + finally { + BaseRefactoringProcessor.ConflictsInTestsException.setTestIgnore(false); + } + } + + public void testNoConflictOnDeleteParameterWithMethodRefArg() throws Exception { LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8); doSingleFileTest(); }