【问题标题】:Custom Android Lint visiting method reference自定义 Android Lint 访问方法参考
【发布时间】:2019-05-19 13:44:09
【问题描述】:

我有 Detector 的工作示例,它通过引用访问方法调用,但它不适用于通过方法引用的调用。

class RxOnErrorDetector : Detector(), Detector.UastScanner {
    override fun getApplicableMethodNames() = listOf("onError")

    override fun visitMethod(context: JavaContext, node: UCallExpression, method: PsiMethod) {
        if (context.evaluator.isMemberInClass(method, "io.reactivex.Emitter")) {
            context.report(ISSUE_ON_ERROR_CALL, node, context.getNameLocation(node), "onError method was called.")
        }
    }
}

带有方法引用调用的代码示例。

public class ObservableMethodReferenceProducer {

    private Listener listener = new Listener();

    public Observable<Integer> produceObservable() {
        return Observable.create(e -> {
            listener.doOnError(e::onError);
        });
    }

    class Listener {
        void doOnError(ErrorListener errorListener) {

        }
    }

    interface ErrorListener {
        void onError(Exception e);
    }
}

在 Android Lint 中检测特定类型的方法引用调用的最佳方法是什么?

【问题讨论】:

    标签: android testing static-analysis lint android-lint


    【解决方案1】:

    你需要找UCallableReferenceExpression:

    override fun getApplicableUastTypes(): List<Class<out UElement>> {
        return listOf(UCallableReferenceExpression::class.java)
    }
    
    override fun createUastHandler(context: JavaContext): UElementHandler? {
        return object : UElementHandler() {
            override fun visitCallableReferenceExpression(node: UCallableReferenceExpression) {
                // your logic here
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 2021-03-17
      • 2013-05-20
      • 2017-06-11
      相关资源
      最近更新 更多