diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java index 3d710fa6498c..9e08b3541485 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java @@ -77,8 +77,11 @@ class JavaChangeSignatureUsageSearcher { methods.add(method); for (PsiMethod psiMethod : methods) { - for (PsiFunctionalExpression functionalExpression : FunctionalExpressionSearch.search(psiMethod.getContainingClass())) { - result.add(new FunctionalInterfaceChangedUsageInfo(functionalExpression, psiMethod)); + final PsiClass containingClass = psiMethod.getContainingClass(); + if (psiMethod == LambdaUtil.getFunctionalInterfaceMethod(containingClass)) { + for (PsiFunctionalExpression functionalExpression : FunctionalExpressionSearch.search(containingClass)) { + result.add(new FunctionalInterfaceChangedUsageInfo(functionalExpression, psiMethod)); + } } } 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 e61ba7af6426..0cc98b49400d 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java @@ -485,13 +485,15 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { private static void findFunctionalExpressions(final List usages, PsiMethod... methods) { for (PsiMethod method : methods) { final PsiClass containingClass = method.getContainingClass(); - FunctionalExpressionSearch.search(containingClass).forEach(new Processor() { - @Override - public boolean process(PsiFunctionalExpression expression) { - usages.add(new SafeDeleteFunctionalExpressionUsageInfo(expression, containingClass)); - return true; - } - }); + if (LambdaUtil.getFunctionalInterfaceMethod(containingClass) == method) { + FunctionalExpressionSearch.search(containingClass).forEach(new Processor() { + @Override + public boolean process(PsiFunctionalExpression expression) { + usages.add(new SafeDeleteFunctionalExpressionUsageInfo(expression, containingClass)); + return true; + } + }); + } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched.java new file mode 100644 index 000000000000..3edf10d0a992 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched.java @@ -0,0 +1,12 @@ +interface SAM { + default void foo(){} + void bar(); +} + +class Test { + { + bar(() -> {}); + } + + void bar(SAM sam){} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched_after.java new file mode 100644 index 000000000000..b833d50f4a7d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched_after.java @@ -0,0 +1,12 @@ +interface SAM { + default void foo(boolean b){} + void bar(); +} + +class Test { + { + bar(() -> {}); + } + + void bar(SAM sam){} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod.java b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod.java new file mode 100644 index 000000000000..e9c4a9126dbd --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod.java @@ -0,0 +1,12 @@ +interface SAM { + default void foo(int i){} + void bar(int i); +} + +class Test { + + { + SAM sam = (i) -> {}; + } + +} diff --git a/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod_after.java b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod_after.java new file mode 100644 index 000000000000..2530d0feeaaf --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod_after.java @@ -0,0 +1,11 @@ +interface SAM { + void bar(int i); +} + +class Test { + + { + SAM sam = (i) -> {}; + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java index cc75afee0e07..e7c19bf19c3f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java @@ -31,6 +31,10 @@ public class ChangeSignatureTouchLambdaTest extends ChangeSignatureBaseTest { doTestConflict(); } + public void testDefaultMethodTouched() throws Exception { + doTest(null, null, null, new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "b", PsiType.BOOLEAN)}, new ThrownExceptionInfo[0], false); + } + private void doTestConflict() { try { doTest(null, null, null, new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "b", PsiType.BOOLEAN)}, new ThrownExceptionInfo[0], false); diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java index 610dd19bc4cb..e99d8a5d1cec 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java @@ -158,6 +158,11 @@ public class SafeDeleteTest extends MultiFileTestCase { } } + public void testFunctionalInterfaceDefaultMethod() throws Exception { + LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8); + doSingleFileTest(); + } + public void testMethodDeepHierarchy() throws Exception { doTest("Super"); }