如何在最新版本的Android Lint中访问方法调用

问题描述 投票:0回答:1

我正在编写一个新的 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

非常感谢。

java android lint
1个回答
0
投票

你能找到

visit all method invocations
的答案吗?

© www.soinside.com 2019 - 2024. All rights reserved.