diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml deleted file mode 100644 index e22a2df7e4..0000000000 --- a/gradle/verification-metadata.xml +++ /dev/null @@ -1,1795 +0,0 @@ - - - - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/NoUnusedImportsRule.kt b/ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/NoUnusedImportsRule.kt index 0f8d6b5a28..ec4b229d15 100644 --- a/ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/NoUnusedImportsRule.kt +++ b/ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/NoUnusedImportsRule.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtPackageDirective +import org.jetbrains.kotlin.resolve.ImportPath class NoUnusedImportsRule : Rule("no-unused-imports") { @@ -70,6 +71,7 @@ class NoUnusedImportsRule : Rule("no-unused-imports") { private val ref = mutableSetOf() private val parentExpressions = mutableSetOf() private val imports = mutableSetOf() + private val usedImportPaths = mutableSetOf() private var packageName = "" private var rootNode: ASTNode? = null @@ -99,7 +101,11 @@ class NoUnusedImportsRule : Rule("no-unused-imports") { ) { ref.add(Reference(text.removeBackticks(), psi.parentDotQualifiedExpression() != null)) } else if (type == IMPORT_DIRECTIVE) { - imports += (vnode.psi as KtImportDirective).importPath!!.pathStr.removeBackticks().trim() + val importPath = (vnode.psi as KtImportDirective).importPath!! + if (!usedImportPaths.add(importPath)) { + emit(vnode.startOffset, "Unused import", false) + } + imports += importPath.pathStr.removeBackticks().trim() } } val directCalls = ref.filter { !it.inDotQualifiedExpression }.map { it.text } diff --git a/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/NoUnusedImportsRuleTest.kt b/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/NoUnusedImportsRuleTest.kt index 9c36ef5b82..231c8443e5 100644 --- a/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/NoUnusedImportsRuleTest.kt +++ b/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/NoUnusedImportsRuleTest.kt @@ -192,6 +192,88 @@ class NoUnusedImportsRuleTest { ) } + @Test + fun testRepeatedImport() { + assertThat( + NoUnusedImportsRule().lint( + """ + + + import org.repository.RepositoryPolicy + import org.repository.any + import org.repository.all + import org.repository.any + fun main() { + RepositoryPolicy( + any(false), all("trial") + ) + } + """.trimIndent() + ) + ).isEqualTo( + listOf( + LintError(6, 1, "no-unused-imports", "Unused import") + ) + ) + } + + @Test + fun testRepeatedImportTwice() { + assertThat( + NoUnusedImportsRule().lint( + """ + + + import org.repository.RepositoryPolicy + import org.repository.any + import org.repository.all + import org.repository.any + import org.repository.any + fun main() { + RepositoryPolicy( + any(false), all("trial") + ) + } + """.trimIndent() + ) + ).isEqualTo( + listOf( + LintError(6, 1, "no-unused-imports", "Unused import"), + LintError(7, 1, "no-unused-imports", "Unused import") + + ) + ) + } + + @Test + fun testRepeatedImportsWithDistinctIncidences() { + assertThat( + NoUnusedImportsRule().lint( + """ + + + import org.repository.RepositoryPolicy + import org.repository.any + import org.repository.all + import org.repository.many + import org.repository.any + import org.repository.none + import org.repository.all + fun main() { + RepositoryPolicy( + any(false), all("trial"), many("hello"), none("goodbye") + ) + } + """.trimIndent() + ) + ).isEqualTo( + listOf( + LintError(7, 1, "no-unused-imports", "Unused import"), + LintError(9, 1, "no-unused-imports", "Unused import") + ) + ) + } + @Test fun testFormat() { assertThat(