generate members: don't override user's template text in order to insert super call (IDEA-144213)

This commit is contained in:
Anna Kozlova
2015-08-24 15:30:47 +03:00
parent 3d5df4668d
commit 49a6bb7f87
2 changed files with 36 additions and 6 deletions
@@ -537,12 +537,26 @@ public class GenerateMembersUtil {
PsiClass base = containingClass == null ? null : containingClass.getSuperClass();
PsiMethod overridden = base == null ? null : base.findMethodBySignature(method, true);
boolean emptyTemplate = true;
PsiCodeBlock body = method.getBody();
if (body != null) {
PsiJavaToken lBrace = body.getLBrace();
int left = lBrace != null ? lBrace.getStartOffsetInParent() + 1 : 0;
PsiJavaToken rBrace = body.getRBrace();
int right = rBrace != null ? rBrace.getStartOffsetInParent() : body.getTextLength();
emptyTemplate = StringUtil.isEmptyOrSpaces(body.getText().substring(left, right));
}
if (overridden == null) {
CreateFromUsageUtils.setupMethodBody(method, containingClass);
if (emptyTemplate) {
CreateFromUsageUtils.setupMethodBody(method, containingClass);
}
return;
}
OverrideImplementUtil.setupMethodBody(method, overridden, containingClass);
if (emptyTemplate) {
OverrideImplementUtil.setupMethodBody(method, overridden, containingClass);
}
OverrideImplementUtil.annotateOnOverrideImplement(method, base, overridden);
}
@@ -4,10 +4,8 @@ import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.generation.GenerateMembersUtil;
import com.intellij.codeInsight.generation.GenerationInfo;
import com.intellij.codeInsight.generation.PsiGenerationInfo;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiType;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.psi.*;
import com.intellij.testFramework.LightCodeInsightTestCase;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -53,4 +51,22 @@ public class GenerateMembersUtilTest extends LightCodeInsightTestCase {
members.get(0).positionCaret(myEditor, true);
checkResultByFile(null, BASE_PATH + getTestName(false) + "_after.java", true);
}
public void testSetupGeneratedMethodNotOverridingInitialBody() throws Exception {
String methodText = "public void tearDown() {\n //comment\n }";
PsiElementFactory factory = JavaPsiFacade.getElementFactory(getProject());
PsiMethod method = factory.createMethodFromText(methodText, null);
GenerateMembersUtil.setupGeneratedMethod(method);
assertEquals(methodText, method.getText());
//empty template
PsiJavaFile file = (PsiJavaFile)PsiFileFactory.getInstance(getProject())
.createFileFromText(JavaLanguage.INSTANCE, "class A {void foo() {}}\n class B extends A {void foo() {}\n}");
method = file.getClasses()[1].getMethods()[0];
GenerateMembersUtil.setupGeneratedMethod(method);
assertEquals("@Override void foo() {\n" +
" super.foo();\n" +
" }", method.getText());
}
}