From f99580f6a50c78054962b1e8cf23952de0272d4b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 23 Dec 2014 17:56:32 +0100 Subject: [PATCH] enable delegate for interfaces in 1.8 --- .../changeSignature/JavaChangeSignatureHandler.java | 3 ++- .../changeSignature/JavaChangeSignatureUsageProcessor.java | 5 ++++- .../lambda/changeSignature/DelegateInInterface.java | 3 +++ .../lambda/changeSignature/DelegateInInterface_after.java | 7 +++++++ .../daemon/lambda/ChangeSignatureTouchLambdaTest.java | 4 ++++ 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DelegateInInterface.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DelegateInInterface_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureHandler.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureHandler.java index d7f193e1fe70..1883fa27c7df 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureHandler.java @@ -27,6 +27,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.changeClassSignature.ChangeClassSignatureDialog; @@ -89,7 +90,7 @@ public class JavaChangeSignatureHandler implements ChangeSignatureHandler { final PsiClass containingClass = method.getContainingClass(); final PsiReferenceExpression refExpr = editor != null ? TargetElementUtil.findReferenceExpression(editor) : null; - final boolean allowDelegation = containingClass != null && !containingClass.isInterface(); + final boolean allowDelegation = containingClass != null && (!containingClass.isInterface() || PsiUtil.isLanguageLevel8OrHigher(containingClass)); final DialogWrapper dialog = new JavaChangeSignatureDialog(project, method, allowDelegation, refExpr == null ? method : refExpr); dialog.show(); } diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java index 2a7cdd5f46f9..ab3cc1330039 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -639,7 +639,10 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr private static void generateDelegate(JavaChangeInfo changeInfo) throws IncorrectOperationException { final PsiMethod delegate = (PsiMethod)changeInfo.getMethod().copy(); final PsiClass targetClass = changeInfo.getMethod().getContainingClass(); - LOG.assertTrue(!targetClass.isInterface()); + LOG.assertTrue(targetClass != null); + if (targetClass.isInterface() && delegate.getBody() == null) { + delegate.getModifierList().setModifierProperty(PsiModifier.DEFAULT, true); + } PsiElementFactory factory = JavaPsiFacade.getElementFactory(targetClass.getProject()); ChangeSignatureProcessor.makeEmptyBody(factory, delegate); final PsiCallExpression callExpression = ChangeSignatureProcessor.addDelegatingCallTemplate(delegate, changeInfo.getNewName()); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DelegateInInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DelegateInInterface.java new file mode 100644 index 000000000000..3a0e1917a53a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DelegateInInterface.java @@ -0,0 +1,3 @@ +interface SAM { + void foo(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DelegateInInterface_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DelegateInInterface_after.java new file mode 100644 index 000000000000..b654c68bfae8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DelegateInInterface_after.java @@ -0,0 +1,7 @@ +interface SAM { + default void foo() { + foo(false); + } + + void foo(boolean b); +} \ No newline at end of file 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 3b651cff08a4..eef39a1aa92a 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 @@ -38,6 +38,10 @@ public class ChangeSignatureTouchLambdaTest extends ChangeSignatureBaseTest { doTest(null, null, null, new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "b", PsiType.BOOLEAN)}, new ThrownExceptionInfo[0], false); } + public void testDelegateInInterface() throws Exception { + doTest(null, null, null, new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "b", PsiType.BOOLEAN, "false")}, new ThrownExceptionInfo[0], true); + } + private void doTestConflict() { try { doTest(null, null, null, new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "b", PsiType.BOOLEAN)}, new ThrownExceptionInfo[0], false);