From 5f62d0948d4c41ada9b84ba8ff347c576f31b191 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 30 Nov 2016 16:47:40 +0300 Subject: [PATCH] optimisation: avoid restoring element when comparing usages by offset --- .../src/com/intellij/usageView/UsageInfo.java | 25 +++++++ .../usages/UsageInfo2UsageAdapter.java | 66 ++++++------------- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/platform/core-api/src/com/intellij/usageView/UsageInfo.java b/platform/core-api/src/com/intellij/usageView/UsageInfo.java index 2c2f3dc3be0c..48bbe8031cbd 100644 --- a/platform/core-api/src/com/intellij/usageView/UsageInfo.java +++ b/platform/core-api/src/com/intellij/usageView/UsageInfo.java @@ -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(); diff --git a/platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java b/platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java index 72c7a985e4a1..cce8a6170875 100644 --- a/platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java +++ b/platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java @@ -55,8 +55,8 @@ public class UsageInfo2UsageAdapter implements UsageInModule, UsageInLibrary, UsageInFile, PsiElementUsage, MergeableUsage, Comparable, RenameableUsage, TypeSafeDataProvider, UsagePresentation { - public static final NotNullFunction CONVERTER = usageInfo -> new UsageInfo2UsageAdapter(usageInfo); - private static final Comparator BY_NAVIGATION_OFFSET = (o1, o2) -> o1.getNavigationOffset() - o2.getNavigationOffset(); + public static final NotNullFunction CONVERTER = UsageInfo2UsageAdapter::new; + private static final Comparator 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() { - @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)() -> { + 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