mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-19 13:02:30 +07:00
IDEA-209607 When completing equals/hashCode/toString, show elements that show corresponding generate dialogs
GitOrigin-RevId: 2b2609cec214567b8f1fc46f06f0b946b4ed9cab
This commit is contained in:
committed by
intellij-monorepo-bot
parent
3037e7f3f8
commit
1a8e3454e5
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
class A {
|
||||
int a;
|
||||
equal<caret>
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
class A {
|
||||
int a;
|
||||
toStri<caret>
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
class A {
|
||||
int a;
|
||||
|
||||
@Override
|
||||
public String <caret>toString() {
|
||||
return "A{" +
|
||||
"a=" + a +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -1533,6 +1533,9 @@ class XInternalError {}
|
||||
assert LookupElementPresentation.renderElement(lookup.items[1]).strikeout
|
||||
}
|
||||
|
||||
void testInvokeGenerateEqualsHashCodeOnOverrideCompletion() { doTest() }
|
||||
void testInvokeGenerateToStringOnOverrideCompletion() { doTest() }
|
||||
|
||||
void testAccessorViaCompletion() {
|
||||
configure()
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user