android - 自定义 Android Lint 访问方法参考
问题描述
我有一个工作示例,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 中检测特定类型的方法引用调用的最佳方法是什么?
解决方案
您需要寻找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
}
}
}
推荐阅读
- html - 如何修复:CSS display:inline-block with text-align:center on parent 稍微偏离中心
- jpa - 遇到数组值参数绑定,但期待 [java.lang.String (n/a)]
- .net - Sql Package Exe可以在命令行中运行部署后脚本吗?
- rest - Rest API 不适用于 IE11,但适用于 Chrome 和 edge
- angular - 标记名 jasmine 和量角器未找到元素
- excel - 带循环的 VBA 工作表名称
- arrays - 用自己的方法调用数组时返回空
- javascript - 两个搜索字段需要 google places API
- plsql - 我想删除从光标获取的数据而不使用更新
- html - 当我单击复选框时,不显示标记为选中,反之亦然