IDEA-136406 Complete current statement doesn't insert a method body for default methods, creates broken code

This commit is contained in:
peter
2015-02-13 18:01:01 +01:00
parent edc45484d9
commit 5ea85b6d84
6 changed files with 24 additions and 8 deletions

View File

@@ -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) {

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -0,0 +1,3 @@
public interface Foo {
default void foo(<caret>)
}

View File

@@ -0,0 +1,5 @@
public interface Foo {
default void foo() {
<caret>
}
}

View File

@@ -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(); }