From a2bc9cd7dec0aa483d808c74e76a2936b486fd08 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 1 Apr 2015 22:20:28 +0300 Subject: [PATCH] Added optimization for isReferenceTo. It quickly says false for references from non-source code to anywhere except same file. --- .../kotlin/idea/references/JetSimpleNameReference.kt | 3 +++ .../jetbrains/kotlin/idea/references/referenceUtil.kt | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetSimpleNameReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetSimpleNameReference.kt index b1769f1e91f..b2318d0c54d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetSimpleNameReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetSimpleNameReference.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.psi.psiUtil.* import com.intellij.psi.impl.light.LightElement import com.intellij.openapi.extensions.Extensions +import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.plugin.references.SimpleNameReferenceExtension public class JetSimpleNameReference( @@ -45,6 +46,8 @@ public class JetSimpleNameReference( override fun isReferenceTo(element: PsiElement?): Boolean { if (element != null) { + if (!canBeReferenceTo(element)) return false + val extensions = Extensions.getArea(element.getProject()).getExtensionPoint( SimpleNameReferenceExtension.EP_NAME).getExtensions() for (extension in extensions) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt index 09a1c78770a..ef039dd9874 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.references import com.intellij.psi.* import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.idea.intentions.OperatorToFunctionIntention +import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType @@ -43,7 +44,16 @@ public val PsiReference.unwrappedTargets: Set } } +// +public fun PsiReference.canBeReferenceTo(candidateTarget: PsiElement): Boolean { + // optimization + return getElement().getContainingFile() == candidateTarget.getContainingFile() + || ProjectRootsUtil.isInProjectOrLibSource(getElement()) +} + public fun PsiReference.matchesTarget(candidateTarget: PsiElement): Boolean { + if (!canBeReferenceTo(candidateTarget)) return false + val unwrappedCandidate = candidateTarget.unwrapped?.getOriginalElement() ?: return false val targets = unwrappedTargets if (unwrappedCandidate in targets) return true