Skip to content

Commit

Permalink
Improve RequiresTypeResolution
Browse files Browse the repository at this point in the history
  • Loading branch information
BraisGabin committed Aug 7, 2022
1 parent 4ce4024 commit 6b50290
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 8 deletions.
Expand Up @@ -14,7 +14,9 @@ import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution
import io.gitlab.arturbosch.detekt.rules.fqNameOrNull
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
import org.jetbrains.kotlin.psi.KtReferenceExpression
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.types.typeUtil.supertypes
import kotlin.reflect.KClass
Expand All @@ -33,11 +35,12 @@ class RequiresTypeResolution(config: Config = Config.empty) : Rule(config) {
Debt.FIVE_MINS
)

override fun visitClass(klass: KtClass) {
super.visitClass(klass)
private val klasses: MutableList<KtClass> = mutableListOf()
private var usesBindingContext: Boolean = false

if (klass.extendsFrom(BaseRule::class)) {
val usesBindingContext = usesBindingContext(klass)
override fun visitKtFile(file: KtFile) {
super.visitKtFile(file)
klasses.forEach { klass ->
val isAnnotatedWithRequiresTypeResolution = klass.isAnnotatedWith(RequiresTypeResolution::class)
if (usesBindingContext && !isAnnotatedWithRequiresTypeResolution) {
report(
Expand All @@ -58,10 +61,20 @@ class RequiresTypeResolution(config: Config = Config.empty) : Rule(config) {
}
}
}
}

private fun usesBindingContext(element: KtElement): Boolean {
return element.containingKtFile.text.contains("bindingContext", ignoreCase = false)
override fun visitClass(klass: KtClass) {
super.visitClass(klass)

if (klass.extendsFrom(BaseRule::class)) {
klasses.add(klass)
}
}

override fun visitReferenceExpression(expression: KtReferenceExpression) {
super.visitReferenceExpression(expression)
usesBindingContext = usesBindingContext ||
(expression is KtNameReferenceExpression && expression.text == "bindingContext")
}
}

context(BaseRule) private inline fun <reified T : Any> KtClass.extendsFrom(kClass: KClass<T>): Boolean {
Expand Down
Expand Up @@ -89,4 +89,27 @@ internal class RequiresTypeResolutionSpec(private val env: KotlinCoreEnvironment
val findings = rule.compileAndLintWithContext(env, code)
assertThat(findings).hasSize(1)
}

@Test
fun `should report Rules that use bindingContext outside class and are not annotated`() {
val code = """
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Rule
class A(config: Config) : Rule(config) {
override val issue = error("I don't care")
private fun asdf() {
extension()
}
}
private inline fun Rule.extension(): Boolean {
bindingContext
return true
}
"""
val findings = rule.compileAndLintWithContext(env, code)
assertThat(findings).hasSize(1)
}
}

0 comments on commit 6b50290

Please sign in to comment.