如何在自定义lint规则中解决context.report的重载解析歧义



我今天开始学习如何制定一些基本的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元素来定义这些?

如何解决这种过载歧义?

您可以将其强制转换为UElement

context.report(
issue = variableLengthIssue,
scope = node as UElement,
location = context.getNameLocation(node),
message = "this variable can be better named"
)

最新更新