mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
optimisation: avoid restoring element when comparing usages by offset
This commit is contained in:
@@ -15,10 +15,12 @@
|
||||
*/
|
||||
package com.intellij.usageView;
|
||||
|
||||
import com.intellij.injected.editor.VirtualFileWindow;
|
||||
import com.intellij.lang.injection.InjectedLanguageManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.ProperTextRange;
|
||||
import com.intellij.openapi.util.Segment;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
@@ -250,6 +252,29 @@ public class UsageInfo {
|
||||
Math.min(range.getEndOffset(), range.getStartOffset() + rangeInElement.getEndOffset()));
|
||||
}
|
||||
|
||||
public int compareToByStartOffset(@NotNull UsageInfo info) {
|
||||
VirtualFile containingFile0 = getVirtualFile();
|
||||
int shift0 = 0;
|
||||
if (containingFile0 instanceof VirtualFileWindow) {
|
||||
shift0 = ((VirtualFileWindow)containingFile0).getDocumentWindow().injectedToHost(0);
|
||||
containingFile0 = ((VirtualFileWindow)containingFile0).getDelegate();
|
||||
}
|
||||
VirtualFile containingFile1 = info.getVirtualFile();
|
||||
int shift1 = 0;
|
||||
if (containingFile1 instanceof VirtualFileWindow) {
|
||||
shift1 = ((VirtualFileWindow)containingFile1).getDocumentWindow().injectedToHost(0);
|
||||
containingFile1 = ((VirtualFileWindow)containingFile1).getDelegate();
|
||||
}
|
||||
if (containingFile0 == null && containingFile1 == null || !Comparing.equal(containingFile0, containingFile1)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Segment range0 = mySmartPointer.getPsiRange();
|
||||
Segment range1 = info.mySmartPointer.getPsiRange();
|
||||
if (range0 == null || range1 == null) return 0;
|
||||
return range0.getStartOffset() + shift0 - range1.getStartOffset() - shift1;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Project getProject() {
|
||||
return mySmartPointer.getProject();
|
||||
|
||||
@@ -55,8 +55,8 @@ public class UsageInfo2UsageAdapter implements UsageInModule,
|
||||
UsageInLibrary, UsageInFile, PsiElementUsage,
|
||||
MergeableUsage, Comparable<UsageInfo2UsageAdapter>,
|
||||
RenameableUsage, TypeSafeDataProvider, UsagePresentation {
|
||||
public static final NotNullFunction<UsageInfo, Usage> CONVERTER = usageInfo -> new UsageInfo2UsageAdapter(usageInfo);
|
||||
private static final Comparator<UsageInfo> BY_NAVIGATION_OFFSET = (o1, o2) -> o1.getNavigationOffset() - o2.getNavigationOffset();
|
||||
public static final NotNullFunction<UsageInfo, Usage> CONVERTER = UsageInfo2UsageAdapter::new;
|
||||
private static final Comparator<UsageInfo> BY_NAVIGATION_OFFSET = Comparator.comparingInt(UsageInfo::getNavigationOffset);
|
||||
|
||||
private final UsageInfo myUsageInfo;
|
||||
@NotNull
|
||||
@@ -72,33 +72,30 @@ public class UsageInfo2UsageAdapter implements UsageInModule,
|
||||
myMergedUsageInfos = usageInfo;
|
||||
|
||||
Point data =
|
||||
ApplicationManager.getApplication().runReadAction(new Computable<Point>() {
|
||||
@Override
|
||||
public Point compute() {
|
||||
PsiElement element = getElement();
|
||||
PsiFile psiFile = usageInfo.getFile();
|
||||
Document document = psiFile == null ? null : PsiDocumentManager.getInstance(getProject()).getDocument(psiFile);
|
||||
ApplicationManager.getApplication().runReadAction((Computable<Point>)() -> {
|
||||
PsiElement element = getElement();
|
||||
PsiFile psiFile = usageInfo.getFile();
|
||||
Document document = psiFile == null ? null : PsiDocumentManager.getInstance(getProject()).getDocument(psiFile);
|
||||
|
||||
int offset;
|
||||
int lineNumber;
|
||||
if (document == null) {
|
||||
// element over light virtual file
|
||||
int offset;
|
||||
int lineNumber;
|
||||
if (document == null) {
|
||||
// element over light virtual file
|
||||
offset = element == null ? 0 : element.getTextOffset();
|
||||
lineNumber = -1;
|
||||
}
|
||||
else {
|
||||
int startOffset = myUsageInfo.getNavigationOffset();
|
||||
if (startOffset == -1) {
|
||||
offset = element == null ? 0 : element.getTextOffset();
|
||||
lineNumber = -1;
|
||||
}
|
||||
else {
|
||||
int startOffset = myUsageInfo.getNavigationOffset();
|
||||
if (startOffset == -1) {
|
||||
offset = element == null ? 0 : element.getTextOffset();
|
||||
lineNumber = -1;
|
||||
}
|
||||
else {
|
||||
offset = -1;
|
||||
lineNumber = getLineNumber(document, startOffset);
|
||||
}
|
||||
offset = -1;
|
||||
lineNumber = getLineNumber(document, startOffset);
|
||||
}
|
||||
return new Point(offset, lineNumber);
|
||||
}
|
||||
return new Point(offset, lineNumber);
|
||||
});
|
||||
myOffset = data.x;
|
||||
myLineNumber = data.y;
|
||||
@@ -379,30 +376,7 @@ public class UsageInfo2UsageAdapter implements UsageInModule,
|
||||
// by start offset
|
||||
@Override
|
||||
public int compareTo(@NotNull final UsageInfo2UsageAdapter o) {
|
||||
VirtualFile containingFile = getFile();
|
||||
int shift1 = 0;
|
||||
if (containingFile instanceof VirtualFileWindow) {
|
||||
shift1 = ((VirtualFileWindow)containingFile).getDocumentWindow().injectedToHost(0);
|
||||
containingFile = ((VirtualFileWindow)containingFile).getDelegate();
|
||||
}
|
||||
VirtualFile oContainingFile = o.getFile();
|
||||
int shift2 = 0;
|
||||
if (oContainingFile instanceof VirtualFileWindow) {
|
||||
shift2 = ((VirtualFileWindow)oContainingFile).getDocumentWindow().injectedToHost(0);
|
||||
oContainingFile = ((VirtualFileWindow)oContainingFile).getDelegate();
|
||||
}
|
||||
if (containingFile == null && oContainingFile == null || !Comparing.equal(containingFile, oContainingFile)) {
|
||||
return 0;
|
||||
}
|
||||
Segment s1 = getFirstSegment();
|
||||
Segment s2 = o.getFirstSegment();
|
||||
if (s1 == null || s2 == null) return 0;
|
||||
return s1.getStartOffset() + shift1 - s2.getStartOffset() - shift2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return super.equals(obj);
|
||||
return getUsageInfo().compareToByStartOffset(o.getUsageInfo());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user