android - SourceCodeScanner 没有调用 visitMethodCall
问题描述
我在玩 lint 规则。
我的所有ResourceXmlDetector
运行都没有问题并通过了所有测试。但是Detector(), SourceCodeScanner
失败是因为它们返回 0 个警告/错误,并且visitMethodCall
没有调用原因,因此也context.report
不会。
我的代码类似于android lint-checks,例如CipherGetInstanceDetector,但我找不到我的错误。
@Suppress("UnstableApiUsage")
class MySourceDetector : Detector(), SourceCodeScanner {
override fun getApplicableMethodNames() = listOf("...")
override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
if (context.evaluator.isMemberInClass(method, "...")) {
...
reportUsage(context, node)
}
}
private fun reportUsage(context: JavaContext, node: UCallExpression) {
context.report(
issue = ISSUE,
scope = node,
location = context.getCallLocation(
call = node,
includeReceiver = true,
includeArguments = true
),
message = ISSUE.getExplanation(TextFormat.RAW)
)
}
companion object {
@JvmField
val ISSUE = Issue.create(...Scope.JAVA_FILE_SCOPE)
}
}
在断点处停止的唯一方法是Issue.create
和getApplicableMethodNames()
。少了什么东西?
解决方案
根据UElementVisitor#DelegatingPsiVisitor.visitMethodCallExpression
源码,发现有些java或kotlin方法无法识别为“方法”:<code>val function = node.resolve() is null。
推荐阅读
- sql-server - 将存储为字符串的 Access 下拉列表转换为相关表中的索引
- sql - 从远程机器执行 BCP
- python - TypeError:训练 keras 模型时无法腌制 _thread.lock 对象
- java - 继承远程 webdriver 语法
- javascript - 如何访问for循环外的值
- xml - XSLT-1.0 | 获取第一个和最后一个节点并调用特定模板
- gradle - Intellij gradle 导入问题
- python - 如何均匀分布 GUI 标签和条目
- c# - 泛型参数 T 不能隐式分配给对象——泛型方法调用非泛型重载方法
- jquery - 使用jquery数据表时如何调用存储过程