首页 > 解决方案 > 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.creategetApplicableMethodNames()。少了什么东西?

标签: androidandroid-testinglintandroid-lint

解决方案


根据UElementVisitor#DelegatingPsiVisitor.visitMethodCallExpression源码,发现有些java或kotlin方法无法识别为“方法”:<code>val function = node.resolve() is null。


推荐阅读