IDEADEV-37208: Inline method leaves the method

This commit is contained in:
Maxim.Medvedev
2009-09-16 17:42:50 +04:00
parent a2b5602c88
commit 0470a1b2de
2 changed files with 32 additions and 7 deletions
@@ -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);
}
}
@@ -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<Language, InlineHandler.Inliner> 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<PsiReference> allReferences) {
final PsiReference[] usages = allReferences.toArray(new PsiReference[allReferences.size()]);
Arrays.sort(usages, new Comparator<PsiReference>() {
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;
}
}