From 90cfa80683e37b12acfeeda7f729881d0b4b00c1 Mon Sep 17 00:00:00 2001 From: kvirolainen Date: Sun, 12 Jan 2020 11:16:53 +0300 Subject: [PATCH] KT-27601 keep imports for extension functions used in kdoc --- .../kotlin/idea/references/referenceUtil.kt | 15 +++++++++++---- .../editor/optimizeImports/jvm/KDocReference.kt | 5 +++++ .../optimizeImports/jvm/KDocReference.kt.after | 3 +++ .../inspections/unusedImport/kDocReferences.kt | 5 +++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt index dfdaff600b0..6911ef71fb0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt @@ -10,9 +10,7 @@ import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.builtins.isExtensionFunctionType -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource -import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall @@ -287,7 +285,16 @@ fun KtExpression.readWriteAccessWithFullExpression(useResolveForReadWrite: Boole } fun KtReference.canBeResolvedViaImport(target: DeclarationDescriptor, bindingContext: BindingContext): Boolean { - if (this is KDocReference) return element.getQualifiedName().size == 1 + if (this is KDocReference) { + val qualifier = element.getQualifier() ?: return true + return if (target.isExtension) { + val elementHasFunctionDescriptor = element.resolveMainReferenceToDescriptors().find { it is FunctionDescriptor } != null + val qualifierHasClassDescriptor = qualifier.resolveMainReferenceToDescriptors().find { it is ClassDescriptor } != null + elementHasFunctionDescriptor && qualifierHasClassDescriptor + } else { + false + } + } return element.canBeResolvedViaImport(target, bindingContext) } diff --git a/idea/testData/editor/optimizeImports/jvm/KDocReference.kt b/idea/testData/editor/optimizeImports/jvm/KDocReference.kt index de92f1a10b5..cb6c65aca63 100644 --- a/idea/testData/editor/optimizeImports/jvm/KDocReference.kt +++ b/idea/testData/editor/optimizeImports/jvm/KDocReference.kt @@ -1,11 +1,16 @@ import kotlin.concurrent.fixedRateTimer import kotlin.concurrent.read +import kotlin.concurrent.withLock +import kotlin.concurrent.write import java.util.ArrayList +import java.util.concurrent.locks.Lock /** * Reference to [ArrayList] * Reference to [fixedRateTimer] * Reference to [kotlin.concurrent.read] + * Reference to [Lock.withLock] + * Reference to [java.util.concurrent.locks.ReentrantReadWriteLock.write] */ fun foo() { } diff --git a/idea/testData/editor/optimizeImports/jvm/KDocReference.kt.after b/idea/testData/editor/optimizeImports/jvm/KDocReference.kt.after index 62198b1319e..0638123357a 100644 --- a/idea/testData/editor/optimizeImports/jvm/KDocReference.kt.after +++ b/idea/testData/editor/optimizeImports/jvm/KDocReference.kt.after @@ -1,5 +1,8 @@ import java.util.ArrayList +import java.util.concurrent.locks.Lock import kotlin.concurrent.fixedRateTimer +import kotlin.concurrent.withLock +import kotlin.concurrent.write /** * Reference to [ArrayList] diff --git a/idea/testData/inspections/unusedImport/kDocReferences.kt b/idea/testData/inspections/unusedImport/kDocReferences.kt index de92f1a10b5..cb6c65aca63 100644 --- a/idea/testData/inspections/unusedImport/kDocReferences.kt +++ b/idea/testData/inspections/unusedImport/kDocReferences.kt @@ -1,11 +1,16 @@ import kotlin.concurrent.fixedRateTimer import kotlin.concurrent.read +import kotlin.concurrent.withLock +import kotlin.concurrent.write import java.util.ArrayList +import java.util.concurrent.locks.Lock /** * Reference to [ArrayList] * Reference to [fixedRateTimer] * Reference to [kotlin.concurrent.read] + * Reference to [Lock.withLock] + * Reference to [java.util.concurrent.locks.ReentrantReadWriteLock.write] */ fun foo() { }