Optimization

This commit is contained in:
Valentin Kipyatkov
2016-09-02 16:00:33 +03:00
parent 0f32574be0
commit 5ce780cafc
9 changed files with 33 additions and 16 deletions
@@ -22,29 +22,37 @@ import com.intellij.psi.search.SearchRequestCollector
import com.intellij.psi.search.SearchScope
import com.intellij.util.Processor
import org.jetbrains.kotlin.idea.references.KtArrayAccessReference
import org.jetbrains.kotlin.idea.references.readWriteAccess
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
//TODO: more effective search of 'set'
class IndexingOperatorReferenceSearcher(
targetFunction: KtFunction,
searchScope: SearchScope,
consumer: Processor<PsiReference>,
optimizer: SearchRequestCollector
optimizer: SearchRequestCollector,
private val isSet: Boolean
) : OperatorReferenceSearcher<KtArrayAccessExpression>(targetFunction, searchScope, consumer, optimizer, wordsToSearch = listOf("[")) {
override fun processSuspiciousExpression(expression: KtExpression) {
val accessExpression = expression.parent as? KtArrayAccessExpression ?: return
if (expression != accessExpression.arrayExpression) return
if (!checkAccessExpression(accessExpression)) return
processReferenceElement(accessExpression)
}
override fun isReferenceToCheck(ref: PsiReference) = ref is KtArrayAccessReference
override fun isReferenceToCheck(ref: PsiReference) = ref is KtArrayAccessReference && checkAccessExpression(ref.element as KtArrayAccessExpression)
override fun extractReference(element: PsiElement): PsiReference? {
val accessExpression = element as? KtArrayAccessExpression ?: return null
if (!checkAccessExpression(accessExpression)) return null
return accessExpression.references.firstIsInstance<KtArrayAccessReference>()
}
private fun checkAccessExpression(accessExpression: KtArrayAccessExpression): Boolean {
val readWriteAccess = accessExpression.readWriteAccess(useResolveForReadWrite = false)
return if (isSet) readWriteAccess.isWrite else readWriteAccess.isRead
}
}
@@ -133,8 +133,12 @@ abstract class OperatorReferenceSearcher<TReferenceElement : KtElement>(
return UnaryOperatorReferenceSearcher(declaration, unaryOp, searchScope, consumer, optimizer)
}
if (name in INDEXING_OPERATION_NAMES) {
return IndexingOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer)
if (name == OperatorNameConventions.GET) {
return IndexingOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, isSet = false)
}
if (name == OperatorNameConventions.SET) {
return IndexingOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, isSet = true)
}
return null
@@ -40,8 +40,6 @@ val ALL_SEARCHABLE_OPERATIONS: ImmutableSet<KtToken> = ImmutableSet
.add(KtTokens.BY_KEYWORD)
.build()
val INDEXING_OPERATION_NAMES = setOf(OperatorNameConventions.GET, OperatorNameConventions.SET)
val DELEGATE_ACCESSOR_NAMES = setOf(Name.identifier("getValue"), Name.identifier("setValue"))
val IN_OPERATIONS_TO_SEARCH = setOf(KtTokens.IN_KEYWORD)