Optimization
This commit is contained in:
+11
-3
@@ -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
|
||||
}
|
||||
}
|
||||
+6
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user