From ba76e4d24d80a035e6fdb78b0de951e7890bad87 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Sat, 24 Sep 2016 23:00:04 +0300 Subject: [PATCH] Quick search of getValue/setValue operator usages --- .../IteratorOperatorReferenceSearcher.kt | 2 + .../usagesSearch/OperatorReferenceSearcher.kt | 3 ++ ...ertyDelegationOperatorReferenceSearcher.kt | 50 +++++++++++++++++++ .../idea/search/usagesSearch/conventions.kt | 3 -- .../conventions/getAsPropertyDelegate.log | 4 ++ .../conventions/setAsPropertyDelegate.log | 4 ++ 6 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/PropertyDelegationOperatorReferenceSearcher.kt create mode 100644 idea/testData/findUsages/kotlin/conventions/getAsPropertyDelegate.log create mode 100644 idea/testData/findUsages/kotlin/conventions/setAsPropertyDelegate.log diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/IteratorOperatorReferenceSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/IteratorOperatorReferenceSearcher.kt index 6e7c9b00e4b..7dd0d3827e7 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/IteratorOperatorReferenceSearcher.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/IteratorOperatorReferenceSearcher.kt @@ -23,10 +23,12 @@ import com.intellij.psi.search.SearchScope import com.intellij.util.Processor import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.idea.references.KtForLoopInReference +import org.jetbrains.kotlin.idea.references.KtPropertyDelegationMethodsReference import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtForExpression +import org.jetbrains.kotlin.psi.KtPropertyDelegate import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance class IteratorOperatorReferenceSearcher( diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/OperatorReferenceSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/OperatorReferenceSearcher.kt index 005d2cf761e..831f4514ebb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/OperatorReferenceSearcher.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/OperatorReferenceSearcher.kt @@ -183,6 +183,9 @@ abstract class OperatorReferenceSearcher( name == OperatorNameConventions.ITERATOR -> return IteratorOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, options) + name == OperatorNameConventions.GET_VALUE || name == OperatorNameConventions.SET_VALUE -> + return PropertyDelegationOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, options) + else -> return null } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/PropertyDelegationOperatorReferenceSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/PropertyDelegationOperatorReferenceSearcher.kt new file mode 100644 index 00000000000..4b70d27b776 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/PropertyDelegationOperatorReferenceSearcher.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.search.usagesSearch + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiReference +import com.intellij.psi.search.SearchRequestCollector +import com.intellij.psi.search.SearchScope +import com.intellij.util.Processor +import org.jetbrains.kotlin.idea.references.KtPropertyDelegationMethodsReference +import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtPropertyDelegate +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance + +class PropertyDelegationOperatorReferenceSearcher( + targetFunction: PsiElement, + searchScope: SearchScope, + consumer: Processor, + optimizer: SearchRequestCollector, + options: KotlinReferencesSearchOptions +) : OperatorReferenceSearcher(targetFunction, searchScope, consumer, optimizer, options, wordsToSearch = listOf("by")) { + + override fun processPossibleReceiverExpression(expression: KtExpression) { + (expression.parent as? KtPropertyDelegate)?.let { processReferenceElement(it) } + } + + override fun isReferenceToCheck(ref: PsiReference): Boolean { + return ref is KtPropertyDelegationMethodsReference + } + + override fun extractReference(element: KtElement): PsiReference? { + return (element as? KtPropertyDelegate)?.references?.firstIsInstance() + } +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/conventions.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/conventions.kt index 6a0add4476b..63c563102a5 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/conventions.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/conventions.kt @@ -36,11 +36,8 @@ val ALL_SEARCHABLE_OPERATIONS: ImmutableSet = ImmutableSet .add(KtTokens.BY_KEYWORD) .build() -val DELEGATE_ACCESSOR_NAMES = setOf(Name.identifier("getValue"), Name.identifier("setValue")) - fun Name.getOperationSymbolsToSearch(): Pair, Class<*>>? { when (this) { - in DELEGATE_ACCESSOR_NAMES -> return setOf(KtTokens.BY_KEYWORD) to KtPropertyDelegationMethodsReference::class.java DelegatedPropertyResolver.PROPERTY_DELEGATED_FUNCTION_NAME -> return setOf(KtTokens.BY_KEYWORD) to KtPropertyDelegationMethodsReference::class.java } diff --git a/idea/testData/findUsages/kotlin/conventions/getAsPropertyDelegate.log b/idea/testData/findUsages/kotlin/conventions/getAsPropertyDelegate.log new file mode 100644 index 00000000000..f76610eb64f --- /dev/null +++ b/idea/testData/findUsages/kotlin/conventions/getAsPropertyDelegate.log @@ -0,0 +1,4 @@ +Resolved by Delegate() +Searched references to Delegate +Used plain search of Delegate.getValue(thisRef: Any?, property: KProperty<*>) in LocalSearchScope: + CLASS:Delegate diff --git a/idea/testData/findUsages/kotlin/conventions/setAsPropertyDelegate.log b/idea/testData/findUsages/kotlin/conventions/setAsPropertyDelegate.log new file mode 100644 index 00000000000..0228fba2ee8 --- /dev/null +++ b/idea/testData/findUsages/kotlin/conventions/setAsPropertyDelegate.log @@ -0,0 +1,4 @@ +Resolved by Delegate() +Searched references to Delegate +Used plain search of Delegate.setValue(thisRef: Any?, property: KProperty<*>, value: String) in LocalSearchScope: + CLASS:Delegate