io.gitlab.arturbosch.detekt.rules.style.WildcardImport.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of detekt-rules-style Show documentation
Show all versions of detekt-rules-style Show documentation
Static code analysis for Kotlin
The newest version!
package io.gitlab.arturbosch.detekt.rules.style
import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Debt
import io.gitlab.arturbosch.detekt.api.Entity
import io.gitlab.arturbosch.detekt.api.Issue
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.Severity
import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import org.jetbrains.kotlin.psi.KtImportDirective
/**
* Wildcard imports should be replaced with imports using fully qualified class names. This helps increase clarity of
* which classes are imported and helps prevent naming conflicts.
*
* Library updates can introduce naming clashes with your own classes which might result in compilation errors.
*
* **NOTE**: This rule has a twin implementation NoWildcardImports in the formatting rule set (a wrapped KtLint rule).
* When suppressing an issue of WildcardImport in the baseline file, make sure to suppress the corresponding NoWildcardImports issue.
*
*
* import io.gitlab.arturbosch.detekt.*
*
* class DetektElements {
* val element1 = DetektElement1()
* val element2 = DetektElement2()
* }
*
*
*
* import io.gitlab.arturbosch.detekt.DetektElement1
* import io.gitlab.arturbosch.detekt.DetektElement2
*
* class DetektElements {
* val element1 = DetektElement1()
* val element2 = DetektElement2()
* }
*
*/
@ActiveByDefault(since = "1.0.0")
class WildcardImport(config: Config = Config.empty) : Rule(config) {
override val issue = Issue(
javaClass.simpleName,
Severity.Style,
"Wildcard imports should be replaced with imports using fully qualified class names. " +
"Wildcard imports can lead to naming conflicts. " +
"A library update can introduce naming clashes with your classes which " +
"results in compilation errors.",
Debt.FIVE_MINS
)
@Configuration("Define a list of package names that should be allowed to be imported with wildcard imports.")
private val excludeImports: List by config(listOf("java.util.*")) { imports ->
imports.map { it.removePrefix("*").removeSuffix("*") }
}
override fun visitImportDirective(importDirective: KtImportDirective) {
val import = importDirective.importPath?.pathStr
if (import != null) {
if (!import.contains("*")) {
return
}
if (excludeImports.any { import.contains(it, ignoreCase = true) }) {
return
}
report(
CodeSmell(
issue,
Entity.from(importDirective),
"$import " +
"is a wildcard import. Replace it with fully qualified imports."
)
)
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy