Added optimization for isReferenceTo. It quickly says false for

references from non-source code to anywhere except same file.
This commit is contained in:
Evgeny Gerashchenko
2015-04-01 22:20:28 +03:00
parent 28f320498c
commit a2bc9cd7de
2 changed files with 13 additions and 0 deletions
@@ -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) {
@@ -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<PsiElement>
}
}
//
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