我正在编写一个新的 Android lint 规则,该规则需要访问所有方法调用,然后分析每个方法的注释来决定处理。但是,我在第一步时遇到了麻烦:访问所有方法调用。
总之,我想要的是,当我有下面的代码时,最后两行(test.testMethod();和testMethod();)被Android Studio突出显示为错误。
public class MyClass {
class TestClass {
void testMethod() {}
}
void testMethod() {}
void testCall() {
TestClass test = new TestClass();
test.testMethod(); // expect highlight
testMethod(); // expect highlight
}
}
在旧版本的 lint 框架中,我想我可以通过以下方式实现这一点:
public class MyDetector extends Detector implements Detector.JavaScanner {
@Override
public
List<Class<? extends Node>> getApplicableNodeTypes() {
//noinspection unchecked
return Arrays.<Class<? extends Node>>asList(MethodInvocation.class);
}
@Nullable
@Override
public AstVisitor createJavaVisitor(@NonNull JavaContext context) {
return new CallVisitor(context);
}
private class CallVisitor extends ForwardingAstVisitor {
private final JavaContext mContext;
public CallVisitor(JavaContext context) {
mContext = context;
}
@Override
public boolean visitMethodInvocation(@NonNull MethodInvocation call) {
String message = "Nguyen Ha Quang";
mContext.report(THREAD, call, mContext.getLocation(call), message);
return false;
}
}
}
此代码引用自https://cs.android.com/android/platform/superproject/+/master:tools/base/lint/libs/lint-checks/src/main/java/com/android/ tools/lint/checks/SupportAnnotationDetector.java;bpv=0(第 1516 行 -> 结束)。
不幸的是,自从AndroidX发布后,这段代码就不再起作用了。现在,我必须尝试做这样的事情:
public class ChatWorkerDetector extends Detector implements Detector.UastScanner {
@Nullable
@Override
public List<Class<? extends UElement>> getApplicableUastTypes() {
return Arrays.<Class<? extends UElement>>asList(
UCallableReferenceExpression.class
);
}
@Override
public UElementHandler createUastHandler(JavaContext context) {
return new CustomElementHandler(context);
}
public class CustomElementHandler extends UElementHandler {
JavaContext mContext;
public CustomElementHandler(JavaContext mContext) {
this.mContext = mContext;
}
@Override
public void visitCallableReferenceExpression(UCallableReferenceExpression node) {
String message = "Nguyen Ha Quang";
mContext.report(THREAD, node, mContext.getLocation(node), message);
}
}
}
这段代码仍然无法按照我的预期工作,我也尝试过:visitCallableReferenceExpression、visitMethod、visitCallExpression,但它们都不起作用。
UElementHandler类中是否有任何visitABC函数可以完成我的工作?
UElementHandler源码:https://github.com/ouyangpeng/android-lint-checks-studio3.0/blob/master/libs/lint-api/src/main/java/com/android/tools/lint /client/api/UElementHandler.java
非常感谢。
你能找到
visit all method invocations
的答案吗?