Unused import: do not report for 'invoke' function import that is used from same file

#KT-24281 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-10-08 23:43:53 +09:00
committed by Vladimir Dolzhenko
parent 8aa120576b
commit 8c4fdd1edd
5 changed files with 70 additions and 3 deletions
@@ -47,11 +47,12 @@ import org.jetbrains.kotlin.idea.core.targetDescriptors
import org.jetbrains.kotlin.idea.imports.KotlinImportOptimizer
import org.jetbrains.kotlin.idea.imports.OptimizedImportsBuilder
import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.references.KtInvokeFunctionReference
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtCodeFragment
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtImportDirective
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.siblings
import org.jetbrains.kotlin.resolve.ImportPath
@@ -86,6 +87,11 @@ class KotlinUnusedImportInspection : AbstractKotlinInspection() {
}
}
val invokeFunctionCallFqNames = optimizerData.references.mapNotNull {
val reference = (it.element as? KtCallExpression)?.mainReference as? KtInvokeFunctionReference ?: return@mapNotNull null
(reference.resolve() as? KtNamedFunction)?.descriptor?.importableFqName
}
val importPaths = HashSet<ImportPath>(directives.size)
val unusedImports = ArrayList<KtImportDirective>()
@@ -97,6 +103,7 @@ class KotlinUnusedImportInspection : AbstractKotlinInspection() {
!importPaths.add(importPath) -> false
importPath.isAllUnder -> importPath.fqName in parentFqNames
importPath.fqName in fqNames -> importPath.importedName?.let { it in fqNames.getValue(importPath.fqName) } ?: false
importPath.fqName in invokeFunctionCallFqNames -> true
// case for type alias
else -> directive.targetDescriptors(resolutionFacade).firstOrNull()?.let { it.importableFqName in fqNames } ?: false
}
+18
View File
@@ -0,0 +1,18 @@
// "Optimize imports" "false"
// WITH_RUNTIME
// ACTION: Introduce import alias
package ppp
import ppp.invoke<caret>
object Bar
object Foo {
val bar = Bar
}
fun Foo.bar() = 1
operator fun Bar.invoke() = 2
fun main() {
println(Foo.bar())
}
+17
View File
@@ -0,0 +1,17 @@
// "Optimize imports" "true"
// WITH_RUNTIME
package ppp
import ppp.invoke<caret>
object Bar
object Foo {
// val bar = Bar
}
fun Foo.bar() = 1
operator fun Bar.invoke() = 2
fun main() {
println(Foo.bar())
}
+15
View File
@@ -0,0 +1,15 @@
// "Optimize imports" "true"
// WITH_RUNTIME
package ppp
object Bar
object Foo {
// val bar = Bar
}
fun Foo.bar() = 1
operator fun Bar.invoke() = 2
fun main() {
println(Foo.bar())
}
@@ -9726,6 +9726,16 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
public void testImportAlias() throws Exception {
runTest("idea/testData/quickfix/optimizeImports/importAlias.kt");
}
@TestMetadata("invoke.kt")
public void testInvoke() throws Exception {
runTest("idea/testData/quickfix/optimizeImports/invoke.kt");
}
@TestMetadata("invoke2.kt")
public void testInvoke2() throws Exception {
runTest("idea/testData/quickfix/optimizeImports/invoke2.kt");
}
}
@TestMetadata("idea/testData/quickfix/override")