mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEADEV-37208: Inline method leaves the method
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user