mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-20 13:31:28 +07:00
IDEA-136406 Complete current statement doesn't insert a method body for default methods, creates broken code
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
public interface Foo {
|
||||
default void foo(<caret>)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
public interface Foo {
|
||||
default void foo() {
|
||||
<caret>
|
||||
}
|
||||
}
|
||||
@@ -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(); }
|
||||
|
||||
Reference in New Issue
Block a user