optimisation: avoid restoring element when comparing usages by offset

This commit is contained in:
Alexey Kudravtsev
2016-12-01 12:48:21 +03:00
parent d9d1e2ced4
commit 5f62d0948d
2 changed files with 45 additions and 46 deletions
@@ -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