generate equals/hashcode: use provided psiClass to avoid ambiguity with inner classes (IDEA-164523)

This commit is contained in:
Anna.Kozlova
2016-11-30 10:38:40 +01:00
parent 4da9e51a37
commit 79c62daf97
6 changed files with 27 additions and 10 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -112,7 +112,7 @@ public class CreateFieldOrPropertyFix implements IntentionAction, LocalQuickFix
private void generateMembers(final Project project, final Editor editor, final PsiFile file) {
try {
List<? extends GenerationInfo> prototypes = new GenerateFieldOrPropertyHandler(myName, myType, myMemberType, myAnnotations).generateMemberPrototypes(myClass, ClassMember.EMPTY_ARRAY);
prototypes = GenerateMembersUtil.insertMembersAtOffset(myClass.getContainingFile(), editor.getCaretModel().getOffset(), prototypes);
prototypes = GenerateMembersUtil.insertMembersAtOffset(myClass, editor.getCaretModel().getOffset(), prototypes);
if (prototypes.isEmpty()) return;
final PsiElement scope = prototypes.get(0).getPsiMember().getContext();
assert scope != null;
@@ -133,7 +133,7 @@ public abstract class GenerateMembersHandlerBase implements CodeInsightActionHan
List<? extends GenerationInfo> newMembers;
try{
List<? extends GenerationInfo> prototypes = generateMemberPrototypes(aClass, members);
newMembers = GenerateMembersUtil.insertMembersAtOffset(aClass.getContainingFile(), offset, prototypes);
newMembers = GenerateMembersUtil.insertMembersAtOffset(aClass, offset, prototypes);
}
catch(IncorrectOperationException e){
LOG.error(e);
@@ -39,6 +39,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.VisibilityUtil;
import com.intellij.util.containers.HashMap;
@@ -59,12 +60,29 @@ public class GenerateMembersUtil {
}
@NotNull
public static <T extends GenerationInfo> List<T> insertMembersAtOffset(PsiFile file, int offset, @NotNull List<T> memberPrototypes) throws IncorrectOperationException {
public static <T extends GenerationInfo> List<T> insertMembersAtOffset(PsiFile file,
int offset,
@NotNull List<T> memberPrototypes) throws IncorrectOperationException {
return insertMembersAtOffset(file, offset, memberPrototypes, leaf -> findClassAtOffset(file, leaf));
}
@NotNull
public static <T extends GenerationInfo> List<T> insertMembersAtOffset(@NotNull PsiClass psiClass,
int offset,
@NotNull List<T> memberPrototypes) throws IncorrectOperationException {
return insertMembersAtOffset(psiClass.getContainingFile(), offset, memberPrototypes, leaf -> psiClass);
}
@NotNull
private static <T extends GenerationInfo> List<T> insertMembersAtOffset(PsiFile file,
int offset,
@NotNull List<T> memberPrototypes,
final Function<PsiElement, PsiClass> aClassFunction) throws IncorrectOperationException {
if (memberPrototypes.isEmpty()) return memberPrototypes;
final PsiElement leaf = file.findElementAt(offset);
if (leaf == null) return Collections.emptyList();
PsiClass aClass = findClassAtOffset(file, leaf);
PsiClass aClass = aClassFunction.fun(leaf);
if (aClass == null) return Collections.emptyList();
PsiElement anchor = memberPrototypes.get(0).findInsertionAnchor(aClass, leaf);
@@ -526,7 +526,7 @@ public class OverrideImplementUtil extends OverrideImplementExploreUtil {
}
else {
List<PsiGenerationInfo<PsiMethod>> prototypes = overrideOrImplementMethods(aClass, candidates, copyJavadoc, insertOverrideWherePossible);
resultMembers = GenerateMembersUtil.insertMembersAtOffset(aClass.getContainingFile(), offset, prototypes);
resultMembers = GenerateMembersUtil.insertMembersAtOffset(aClass, offset, prototypes);
}
if (!resultMembers.isEmpty()) {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,7 +34,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
@@ -293,7 +292,7 @@ public class GenerateVisitorByHierarchyAction extends AnAction {
accept.replace(method);
}
else {
GenerateMembersUtil.insertMembersAtOffset(implementor.getContainingFile(), implementor.getLastChild().getTextOffset(), Collections.<GenerationInfo>singletonList(
GenerateMembersUtil.insertMembersAtOffset(implementor, implementor.getLastChild().getTextOffset(), Collections.<GenerationInfo>singletonList(
new PsiGenerationInfo<>(method)));
}
}
@@ -40,7 +40,7 @@ public class InsertAtCaretStrategy implements InsertNewMethodStrategy {
public PsiMethod insertNewMethod(PsiClass clazz, @NotNull PsiMethod newMethod, Editor editor) {
int offset = (editor != null) ? editor.getCaretModel().getOffset() : (clazz.getTextRange().getEndOffset() - 1);
final PsiGenerationInfo<PsiMethod> generationInfo = new PsiGenerationInfo<>(newMethod, false);
GenerateMembersUtil.insertMembersAtOffset(clazz.getContainingFile(), offset, Arrays.asList(generationInfo));
GenerateMembersUtil.insertMembersAtOffset(clazz, offset, Arrays.asList(generationInfo));
return generationInfo.getPsiMember();
}