From 22a9cecfe0f018c4680fbfe2a0f21127e8e9d64c Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 3 Jul 2018 16:02:13 +0300 Subject: [PATCH] Optimize KotlinPropertyAccessorsReferenceSearcher for case of no kt-files Property names by accessors can be computed without resolving java descriptors #KT-11477 Fixed #KT-16890 Fixed --- .../synthetic/JavaSyntheticPropertiesScope.kt | 12 ++++--- ...otlinPropertyAccessorsReferenceSearcher.kt | 34 +++++++------------ 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt index be1a008aadf..8323576bb35 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt @@ -59,11 +59,7 @@ interface SyntheticJavaPropertyDescriptor : PropertyDescriptor { val originalGetterOrSetter = getterOrSetter.original - val names = listOfNotNull( - propertyNameByGetMethodName(name), - propertyNameBySetMethodName(name, withIsPrefix = true), - propertyNameBySetMethodName(name, withIsPrefix = false) - ) + val names = propertyNamesByAccessorName(name) return names .flatMap { @@ -76,6 +72,12 @@ interface SyntheticJavaPropertyDescriptor : PropertyDescriptor { .firstOrNull { originalGetterOrSetter == it.getMethod || originalGetterOrSetter == it.setMethod } } + fun propertyNamesByAccessorName(name: Name): List = listOfNotNull( + propertyNameByGetMethodName(name), + propertyNameBySetMethodName(name, withIsPrefix = true), + propertyNameBySetMethodName(name, withIsPrefix = false) + ) + fun findByGetterOrSetter(getterOrSetter: FunctionDescriptor, syntheticScope: SyntheticScope) = findByGetterOrSetter(getterOrSetter, object : SyntheticScopes { diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinPropertyAccessorsReferenceSearcher.kt b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinPropertyAccessorsReferenceSearcher.kt index 79b141ebb27..939bc8c6b17 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinPropertyAccessorsReferenceSearcher.kt +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinPropertyAccessorsReferenceSearcher.kt @@ -24,14 +24,10 @@ import com.intellij.psi.search.UsageSearchContext import com.intellij.psi.search.searches.MethodReferencesSearch import org.jetbrains.kotlin.asJava.namedUnwrappedElement import org.jetbrains.kotlin.compatibility.ExecutorProcessor -import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMethodDescriptor import org.jetbrains.kotlin.idea.search.restrictToKotlinSources -import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.storage.LockBasedStorageManager -import org.jetbrains.kotlin.synthetic.JavaSyntheticPropertiesScope import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor -import org.jetbrains.kotlin.synthetic.canBePropertyAccessor class KotlinPropertyAccessorsReferenceSearcher : QueryExecutorBase(true) { override fun processQuery(queryParameters: MethodReferencesSearch.SearchParameters, consumer: ExecutorProcessor) { @@ -39,27 +35,23 @@ class KotlinPropertyAccessorsReferenceSearcher : QueryExecutorBase { val unwrapped = method.namedUnwrappedElement if (unwrapped is KtProperty) { - return unwrapped.getName() + return listOfNotNull(unwrapped.getName()) } - if (!canBePropertyAccessor(method.name)) return null - val functionDescriptor = method.getJavaMethodDescriptor() ?: return null - val syntheticExtensionsScope = JavaSyntheticPropertiesScope(LockBasedStorageManager(), LookupTracker.DO_NOTHING) - val property = SyntheticJavaPropertyDescriptor.findByGetterOrSetter(functionDescriptor, syntheticExtensionsScope) ?: return null - return property.name.asString() + return SyntheticJavaPropertyDescriptor.propertyNamesByAccessorName(Name.identifier(method.name)).map(Name::asString) } }