diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/AfterSemicolonEnterProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/AfterSemicolonEnterProcessor.java index 9d43379ce920..35a3df7a3fcc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/AfterSemicolonEnterProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/AfterSemicolonEnterProcessor.java @@ -39,9 +39,7 @@ public class AfterSemicolonEnterProcessor implements EnterProcessor { psiElement instanceof PsiAssertStatement || psiElement instanceof PsiField || psiElement instanceof PsiImportStatementBase || - psiElement instanceof PsiMethod && (((PsiMethod) psiElement).getContainingClass().isInterface() || - ((PsiMethod) psiElement).hasModifierProperty(PsiModifier.ABSTRACT) || - ((PsiMethod) psiElement).hasModifierProperty(PsiModifier.NATIVE))) { + psiElement instanceof PsiMethod && !MissingMethodBodyFixer.shouldHaveBody((PsiMethod)psiElement)) { int errorOffset = getErrorElementOffset(psiElement); int elementEndOffset = psiElement.getTextRange().getEndOffset(); if (psiElement instanceof PsiEnumConstant) { diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/MissingMethodBodyFixer.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/MissingMethodBodyFixer.java index f7f9459fcb6c..ae5c0423b7ff 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/MissingMethodBodyFixer.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/MissingMethodBodyFixer.java @@ -21,6 +21,8 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; +import static com.intellij.psi.PsiModifier.*; + /** * Created by IntelliJ IDEA. * User: max @@ -34,8 +36,7 @@ public class MissingMethodBodyFixer implements Fixer { if (!(psiElement instanceof PsiMethod)) return; PsiMethod method = (PsiMethod) psiElement; final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null || containingClass.isInterface() - || method.hasModifierProperty(PsiModifier.ABSTRACT) || method.hasModifierProperty(PsiModifier.NATIVE)) return; + if (!shouldHaveBody(method)) return; final PsiCodeBlock body = method.getBody(); final Document doc = editor.getDocument(); @@ -62,4 +63,12 @@ public class MissingMethodBodyFixer implements Fixer { } doc.insertString(endOffset, "{\n}"); } + + static boolean shouldHaveBody(PsiMethod method) { + PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) return false; + if (containingClass.isInterface() && !method.hasModifierProperty(DEFAULT)) return false; + if (method.hasModifierProperty(ABSTRACT)) return false; + return !method.hasModifierProperty(NATIVE); + } } diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/SemicolonFixer.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/SemicolonFixer.java index fd78db19f782..c43c02b2246d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/SemicolonFixer.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/SemicolonFixer.java @@ -102,8 +102,7 @@ public class SemicolonFixer implements Fixer { !(psiElement instanceof PsiAssertStatement) && !(psiElement instanceof PsiPackageStatement) && (!(psiElement instanceof PsiField) || psiElement instanceof PsiEnumConstant) && - (!(psiElement instanceof PsiMethod) || (!((PsiMethod)psiElement).getContainingClass().isInterface() && - !((PsiMethod)psiElement).hasModifierProperty(PsiModifier.ABSTRACT)))) { + (!(psiElement instanceof PsiMethod) || ((PsiMethod)psiElement).getBody() != null || MissingMethodBodyFixer.shouldHaveBody((PsiMethod)psiElement))) { return false; } String text = psiElement.getText(); diff --git a/java/java-tests/testData/codeInsight/completeStatement/DefaultMethodBody.java b/java/java-tests/testData/codeInsight/completeStatement/DefaultMethodBody.java new file mode 100644 index 000000000000..dec337c402f7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completeStatement/DefaultMethodBody.java @@ -0,0 +1,3 @@ +public interface Foo { + default void foo() +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completeStatement/DefaultMethodBody_after.java b/java/java-tests/testData/codeInsight/completeStatement/DefaultMethodBody_after.java new file mode 100644 index 000000000000..b392981855b2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completeStatement/DefaultMethodBody_after.java @@ -0,0 +1,5 @@ +public interface Foo { + default void foo() { + + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/CompleteStatementTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/CompleteStatementTest.java index 7339d1f87210..75ec37f22f24 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/CompleteStatementTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/CompleteStatementTest.java @@ -269,7 +269,9 @@ public class CompleteStatementTest extends EditorActionTestCase { public void testCompleteMethodCallAtReturn() throws Exception { doTest(); } public void testGenericMethodBody() throws Exception { doTest(); } - + + public void testDefaultMethodBody() { doTest(); } + public void testArrayInitializerRBracket() throws Exception { doTest(); } public void testReturnInLambda() { doTest(); }