2020package org.sonarsource.kotlin.checks
2121
2222import org.jetbrains.kotlin.kdoc.psi.impl.KDocLink
23- import org.jetbrains.kotlin.name.FqName
2423import org.jetbrains.kotlin.psi.KtArrayAccessExpression
2524import org.jetbrains.kotlin.psi.KtElement
2625import org.jetbrains.kotlin.psi.KtFile
@@ -37,6 +36,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
3736import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
3837import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
3938import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
39+ import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject
4040import org.jetbrains.kotlin.types.expressions.OperatorConventions
4141import org.sonar.check.Rule
4242import org.sonarsource.kotlin.api.AbstractCheck
@@ -99,18 +99,19 @@ class UnnecessaryImportsCheck : AbstractCheck() {
9999 ): List <KtImportDirective > {
100100 var relevantImports = importsWithSameName
101101 for (ref in relevantReferences) {
102- val refName = context.bindingContext.get(BindingContext .REFERENCE_TARGET , ref)?.getImportableDescriptor()?.fqNameOrNull ()
102+ val refDescriptor = context.bindingContext.get(BindingContext .REFERENCE_TARGET , ref)?.getImportableDescriptor()
103103 ? : return emptyList() // Discard all: over-estimate, resulting in less FPs and more FNs without binding ctx
104- relevantImports = relevantImports.filter { it.importedFqName != refName && ! it.isCompanionObjectImport(refName) }
104+ val refName = refDescriptor.fqNameOrNull() ? : return emptyList()
105+
106+ relevantImports = relevantImports.filter {
107+ it.importedFqName != refName && ! (refDescriptor.isCompanionObject() && it.importedFqName == refName.parent())
108+ }
109+
105110 if (relevantImports.isEmpty()) break
106111 }
107112 return relevantImports
108113 }
109114
110- private fun KtImportDirective.isCompanionObjectImport (
111- refName : FqName ,
112- ) = refName.shortName().asString() == " Companion" && importedFqName == refName.parent()
113-
114115 private fun collectReferences (file : KtFile ) =
115116 file.children.asSequence().filter {
116117 it !is KtPackageDirective && it !is KtImportList
0 commit comments