#android #kotlin #static-analysis #lint
#Android #kotlin #статический анализ #lint
Вопрос:
Сегодня я начал изучать, как создавать несколько основных правил lint, пытаясь создать правило lint для переменных, чтобы проверить длину их имен.
@Suppress("UnstableApiUsage")
class VariableLengthDetector : Detector(), Detector.UastScanner {
override fun getApplicableUastTypes() = listOf(UVariable::class.java)
override fun createUastHandler(context: JavaContext) =
VariableLengthHandler(context)
class VariableLengthHandler(private val context: JavaContext) :
UElementHandler() {
private val variableMinimumLength = 3
override fun visitVariable(node: UVariable) {
node.name?.let {
if (it.length < variableMinimumLength) {
context.report(
issue = variableLengthIssue,
scope = node,
location = context.getNameLocation(node),
message = "this variable can be better named"
)
}
}
}
}
}
этот код не компилируется из-за неоднозначности перегрузки, вызванной здесь:
context.report(issue = variableLengthIssue,
scope = node,
location = context.getNameLocation(node),
message = "this variable can be better named")
насколько я понимаю, это вызвано тем, что перегрузки для context.report могут быть
public final fun report(issue: Issue, scope: PsiElement?,...
или это может быть
public final fun report(issue: Issue, scope: UElement?,...
но я не уверен, как определить их с помощью элемента Uvariable, который у меня есть?
Как мне устранить эту неоднозначность перегрузки?
Ответ №1:
Вы можете использовать его как UElement
.
context.report(
issue = variableLengthIssue,
scope = node as UElement,
location = context.getNameLocation(node),
message = "this variable can be better named"
)