From 79c62daf97bb2d40f49630b4aad7b42e9bff465c Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 29 Nov 2016 14:49:11 +0100 Subject: [PATCH] generate equals/hashcode: use provided psiClass to avoid ambiguity with inner classes (IDEA-164523) --- .../quickFix/CreateFieldOrPropertyFix.java | 4 ++-- .../GenerateMembersHandlerBase.java | 2 +- .../generation/GenerateMembersUtil.java | 22 +++++++++++++++++-- .../generation/OverrideImplementUtil.java | 2 +- .../GenerateVisitorByHierarchyAction.java | 5 ++--- .../config/InsertAtCaretStrategy.java | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateFieldOrPropertyFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateFieldOrPropertyFix.java index b6fec5cbe294..58c451778094 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateFieldOrPropertyFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/quickFix/CreateFieldOrPropertyFix.java @@ -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 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; diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java index 3a8b4ede1250..d17964ae44a2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java @@ -133,7 +133,7 @@ public abstract class GenerateMembersHandlerBase implements CodeInsightActionHan List newMembers; try{ List prototypes = generateMemberPrototypes(aClass, members); - newMembers = GenerateMembersUtil.insertMembersAtOffset(aClass.getContainingFile(), offset, prototypes); + newMembers = GenerateMembersUtil.insertMembersAtOffset(aClass, offset, prototypes); } catch(IncorrectOperationException e){ LOG.error(e); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index eed904175819..9ae284705ba7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -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 List insertMembersAtOffset(PsiFile file, int offset, @NotNull List memberPrototypes) throws IncorrectOperationException { + public static List insertMembersAtOffset(PsiFile file, + int offset, + @NotNull List memberPrototypes) throws IncorrectOperationException { + return insertMembersAtOffset(file, offset, memberPrototypes, leaf -> findClassAtOffset(file, leaf)); + } + + @NotNull + public static List insertMembersAtOffset(@NotNull PsiClass psiClass, + int offset, + @NotNull List memberPrototypes) throws IncorrectOperationException { + return insertMembersAtOffset(psiClass.getContainingFile(), offset, memberPrototypes, leaf -> psiClass); + } + + @NotNull + private static List insertMembersAtOffset(PsiFile file, + int offset, + @NotNull List memberPrototypes, + final Function 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); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java index 0ee8e9323b88..eb5e9df33d30 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java @@ -526,7 +526,7 @@ public class OverrideImplementUtil extends OverrideImplementExploreUtil { } else { List> prototypes = overrideOrImplementMethods(aClass, candidates, copyJavadoc, insertOverrideWherePossible); - resultMembers = GenerateMembersUtil.insertMembersAtOffset(aClass.getContainingFile(), offset, prototypes); + resultMembers = GenerateMembersUtil.insertMembersAtOffset(aClass, offset, prototypes); } if (!resultMembers.isEmpty()) { diff --git a/java/java-impl/src/com/intellij/internal/GenerateVisitorByHierarchyAction.java b/java/java-impl/src/com/intellij/internal/GenerateVisitorByHierarchyAction.java index 714e2feaafe7..29a30f9174ac 100644 --- a/java/java-impl/src/com/intellij/internal/GenerateVisitorByHierarchyAction.java +++ b/java/java-impl/src/com/intellij/internal/GenerateVisitorByHierarchyAction.java @@ -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.singletonList( + GenerateMembersUtil.insertMembersAtOffset(implementor, implementor.getLastChild().getTextOffset(), Collections.singletonList( new PsiGenerationInfo<>(method))); } } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/config/InsertAtCaretStrategy.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/config/InsertAtCaretStrategy.java index bb5859eb5af7..526443d73675 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/config/InsertAtCaretStrategy.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/config/InsertAtCaretStrategy.java @@ -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 generationInfo = new PsiGenerationInfo<>(newMethod, false); - GenerateMembersUtil.insertMembersAtOffset(clazz.getContainingFile(), offset, Arrays.asList(generationInfo)); + GenerateMembersUtil.insertMembersAtOffset(clazz, offset, Arrays.asList(generationInfo)); return generationInfo.getPsiMember(); }