IDEA-209607 When completing equals/hashCode/toString, show elements that show corresponding generate dialogs

GitOrigin-RevId: 2b2609cec214567b8f1fc46f06f0b946b4ed9cab
This commit is contained in:
peter
2019-10-04 23:27:15 +02:00
committed by intellij-monorepo-bot
parent 3037e7f3f8
commit 1a8e3454e5
8 changed files with 85 additions and 10 deletions

View File

@@ -23,9 +23,11 @@ import com.intellij.util.ObjectUtils;
import com.intellij.util.VisibilityUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FList;
import com.siyeh.ig.psiutils.MethodUtils;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.java.generate.GenerateToStringActionHandlerImpl;
import org.jetbrains.java.generate.exception.GenerateCodeException;
import javax.swing.*;
@@ -179,12 +181,32 @@ public class JavaGenerateMemberCompletionContributor {
final PsiClass parent = PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), PsiClass.class, false);
if (parent == null) return;
if (GenerateEqualsHandler.hasNonStaticFields(parent) && generateByWizards(context)) {
return;
}
try (AccessToken ignored = generateDefaultMethods ? forceDefaultMethodsInside() : AccessToken.EMPTY_ACCESS_TOKEN) {
List<PsiMethod> prototypes = OverrideImplementUtil.overrideOrImplementMethod(parent, baseMethod, false);
insertGenerationInfos(context, OverrideImplementUtil.convert2GenerationInfos(prototypes));
}
}
private boolean generateByWizards(@NotNull InsertionContext context) {
PsiFile file = context.getFile();
if (MethodUtils.isEquals(baseMethod) || MethodUtils.isHashCode(baseMethod)) {
context.setAddCompletionChar(false);
context.setLaterRunnable(() -> new GenerateEqualsHandler().invoke(context.getProject(), context.getEditor(), file));
return true;
}
if (MethodUtils.isToString(baseMethod)) {
context.setAddCompletionChar(false);
context.setLaterRunnable(() -> new GenerateToStringActionHandlerImpl().invoke(context.getProject(), context.getEditor(), file));
return true;
}
return false;
}
}, generateDefaultMethods, targetClass);
}

View File

@@ -19,6 +19,7 @@ import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.generation.ui.GenerateEqualsWizard;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
@@ -93,13 +94,19 @@ public class GenerateEqualsHandler extends GenerateMembersHandlerBase {
return null;
}
GenerateEqualsWizard wizard = new GenerateEqualsWizard(project, aClass, needEquals, needHashCode);
if (!wizard.showAndGet()) {
return null;
if (ApplicationManager.getApplication().isUnitTestMode()) {
myEqualsFields = myHashCodeFields = aClass.getFields();
myNonNullFields = PsiField.EMPTY_ARRAY;
} else {
GenerateEqualsWizard wizard = new GenerateEqualsWizard(project, aClass, needEquals, needHashCode);
if (!wizard.showAndGet()) {
return null;
}
myEqualsFields = wizard.getEqualsFields();
myHashCodeFields = wizard.getHashCodeFields();
myNonNullFields = wizard.getNonNullFields();
}
myEqualsFields = wizard.getEqualsFields();
myHashCodeFields = wizard.getHashCodeFields();
myNonNullFields = wizard.getNonNullFields();
return DUMMY_RESULT;
}
@@ -107,7 +114,7 @@ public class GenerateEqualsHandler extends GenerateMembersHandlerBase {
return equalsMethod == null || !equalsMethod.isPhysical();
}
private static boolean hasNonStaticFields(PsiClass aClass) {
public static boolean hasNonStaticFields(PsiClass aClass) {
for (PsiField field : aClass.getFields()) {
if (!field.hasModifierProperty(PsiModifier.STATIC)) {
return true;

View File

@@ -0,0 +1,4 @@
class A {
int a;
equal<caret>
}

View File

@@ -0,0 +1,18 @@
import java.util.Objects;
class A {
int a;
@Override
public boolean equals(Object o) {<caret>
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
A a1 = (A) o;
return a == a1.a;
}
@Override
public int hashCode() {
return Objects.hash(a);
}
}

View File

@@ -0,0 +1,4 @@
class A {
int a;
toStri<caret>
}

View File

@@ -0,0 +1,10 @@
class A {
int a;
@Override
public String <caret>toString() {
return "A{" +
"a=" + a +
'}';
}
}

View File

@@ -1533,6 +1533,9 @@ class XInternalError {}
assert LookupElementPresentation.renderElement(lookup.items[1]).strikeout
}
void testInvokeGenerateEqualsHashCodeOnOverrideCompletion() { doTest() }
void testInvokeGenerateToStringOnOverrideCompletion() { doTest() }
void testAccessorViaCompletion() {
configure()

View File

@@ -20,7 +20,8 @@ import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.generation.PsiElementClassMember;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.ide.util.MemberChooser;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.options.Configurable;
@@ -115,8 +116,13 @@ public class GenerateToStringActionHandlerImpl implements GenerateToStringAction
chooser.setCopyJavadocVisible(false);
chooser.selectElements(getPreselection(clazz, dialogMembers));
header.setChooser(chooser);
chooser.show();
if (ApplicationManager.getApplication().isUnitTestMode()) {
chooser.close(DialogWrapper.OK_EXIT_CODE);
}
else {
chooser.show();
}
if (DialogWrapper.OK_EXIT_CODE == chooser.getExitCode()) {
Collection<PsiMember> selectedMembers = GenerationUtil.convertClassMembersToPsiMembers(chooser.getSelectedElements());
@@ -128,7 +134,8 @@ public class GenerateToStringActionHandlerImpl implements GenerateToStringAction
// decide what to do if the method already exists
ConflictResolutionPolicy resolutionPolicy = worker.exitsMethodDialog(template);
try {
WriteAction.run(() -> worker.execute(selectedMembers, template, resolutionPolicy));
WriteCommandAction.runWriteCommandAction(project, "Generate toString()", null,
() -> worker.execute(selectedMembers, template, resolutionPolicy));
}
catch (Exception e) {
GenerationUtil.handleException(project, e);