I have working example of Detector
which visits method calls by reference but it doesn't work for calls by method reference.
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.")
}
}
}
Code example with method reference call.
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);
}
}
What is the best way to detect method reference call of particular type in Android Lint?
You need to look for 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
}
}
}