From 0470a1b2de95b698e7913dd18ae43e2f36018af1 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Wed, 16 Sep 2009 17:42:50 +0400 Subject: [PATCH] IDEADEV-37208: Inline method leaves the method --- .../lang/refactoring/InlineHandler.java | 5 +-- .../inline/GenericInlineHandler.java | 34 ++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/platform/lang-api/src/com/intellij/lang/refactoring/InlineHandler.java b/platform/lang-api/src/com/intellij/lang/refactoring/InlineHandler.java index 530b62f74af7..a74358e24653 100644 --- a/platform/lang-api/src/com/intellij/lang/refactoring/InlineHandler.java +++ b/platform/lang-api/src/com/intellij/lang/refactoring/InlineHandler.java @@ -20,6 +20,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; +import com.intellij.usageView.UsageInfo; import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -74,9 +75,9 @@ public interface InlineHandler { /** * Perform actual inline of element to the point where it is referenced - * @param reference reference to inlined element + * @param usage usage of inlined element * @param referenced inlined element */ - void inlineReference(PsiReference reference, PsiElement referenced); + void inlineUsage(UsageInfo usage, PsiElement referenced); } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/inline/GenericInlineHandler.java b/platform/lang-impl/src/com/intellij/refactoring/inline/GenericInlineHandler.java index 0f4ce8d98b7f..188be48be668 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/inline/GenericInlineHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/inline/GenericInlineHandler.java @@ -15,6 +15,7 @@ import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.usageView.UsageInfo; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; @@ -89,8 +90,16 @@ public class GenericInlineHandler { CommandProcessor.getInstance().executeCommand(project, new Runnable() { public void run() { - for (PsiReference reference : allReferences) { - inlineReference(reference, element, inliners); + final PsiReference[] references = sortDepthFirstRightLeftOrder(allReferences); + + + final UsageInfo[] usages = new UsageInfo[references.length]; + for (int i = 0; i < references.length; i++) { + usages[i] = new UsageInfo(references[i]); + } + + for (UsageInfo usage : usages) { + inlineReference(usage, element, inliners); } if (!settings.isOnlyOneReferenceToInline()) { @@ -117,13 +126,13 @@ public class GenericInlineHandler { } } - private static void inlineReference(final PsiReference reference, + private static void inlineReference(final UsageInfo usage, final PsiElement element, final Map inliners) { - final Language language = reference.getElement().getLanguage(); + final Language language = usage.getElement().getLanguage(); final InlineHandler.Inliner inliner = inliners.get(language); if (inliner != null) { - inliner.inlineReference(reference, element); + inliner.inlineUsage(usage, element); } } @@ -132,4 +141,19 @@ public class GenericInlineHandler { super(message); } } + + //order of usages across different files is irrelevant + public static PsiReference[] sortDepthFirstRightLeftOrder(final Collection allReferences) { + final PsiReference[] usages = allReferences.toArray(new PsiReference[allReferences.size()]); + Arrays.sort(usages, new Comparator() { + public int compare(final PsiReference usage1, final PsiReference usage2) { + final PsiElement element1 = usage1.getElement(); + final PsiElement element2 = usage2.getElement(); + if (element1 == null || element2 == null) return 0; + return element2.getTextRange().getStartOffset() - element1.getTextRange().getStartOffset(); + } + }); + return usages; + } + }