1
0
Fork 0
fenix/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaBannedPropertyAccess.kt

54 lines
2.1 KiB
Kotlin

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.detektrules
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 org.jetbrains.kotlin.psi.*
class MozillaBannedPropertyAccess(config: Config = Config.empty): Rule(config) {
override val issue = Issue(
"MozillaBannedPropertyAccess",
Severity.Defect,
DESCR,
Debt.FIVE_MINS
)
private val banned by lazy {
val bannedPropertiesList = valueOrDefault("bannedProperties", "")
if (bannedPropertiesList.contentEquals("")) {
listOf<String>()
} else {
bannedPropertiesList.split(",")
}
}
override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) {
super.visitDotQualifiedExpression(expression)
val possiblyBannedPropertyAccess = expression.node.chars
// Does the current property access, a.b.c.d.possibly.Banned, end with
// it. Use endsWith() so that package qualification does not interfere
// with the check. In other words, if the configuration tells this rule
// to ban d.definitely.Banned, flag a use of the property via
// x.y.z.d.definitely.Banned.
banned.filter { possiblyBannedPropertyAccess.endsWith(it) }.map {
CodeSmell(
issue,
Entity.from(expression),
"Using ${possiblyBannedPropertyAccess} is not allowed because accessing property ${it} is against Mozilla policy. See 'mozilla-detekt-rules' stanza in 'config/detekt.yml' for more information.\n"
)
}.forEach { report(it) }
}
}
internal const val DESCR = "Using banned property"