From d8ed05dbfab176ac50212c4df15ace6d09408fb2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 8 Apr 2014 11:13:08 +0200 Subject: [PATCH] functional expressions: allow to delete/change signature of default methods of functional interfaces --- .../JavaChangeSignatureUsageSearcher.java | 7 +++++-- .../safeDelete/JavaSafeDeleteProcessor.java | 16 +++++++++------- .../changeSignature/DefaultMethodTouched.java | 12 ++++++++++++ .../DefaultMethodTouched_after.java | 12 ++++++++++++ .../FunctionalInterfaceDefaultMethod.java | 12 ++++++++++++ .../FunctionalInterfaceDefaultMethod_after.java | 11 +++++++++++ .../lambda/ChangeSignatureTouchLambdaTest.java | 4 ++++ .../com/intellij/refactoring/SafeDeleteTest.java | 5 +++++ 8 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched_after.java create mode 100644 java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod.java create mode 100644 java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod_after.java 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"); }