Android lint 自定义检查 UCallExpression 类型的方法接收者

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

我正在编写自定义 lint 检查来禁止某些方法。因此,如果有人在类

foo
的实例上调用被禁止的方法
A
,lint 应该报告错误。

我通过这样的静态方法实现了这一点(在

visitCallExpression(UCallExpression)
中:

node.receiver as UReferenceExpression).getQualifiedName()

从限定名称中,我可以获取

Class
对象并运行我的检查,但我无法获取在实例化对象上调用的方法的限定名称。我可以获取对象所属类的名称,但不能获取限定名称。

如何获取在该类的实例上调用的方法的类的限定名称?如果我不清楚,这里有一个例子。

import android.view.Button;

class ButtonSetTextIntClass {
       private Button button;

       public void bannedSetText (){
            button.setText(123);
       }
}

我需要在

visitCallExpression (UCallExpression)
获得
button
的合格名称/类别。

java android kotlin lint android-lint
4个回答
0
投票

UCallExpression.receiverType
做你想做的事:

public class CustomDetector extends Detector implements SourceCodeScanner {

    @Nullable
    @Override
    public List<Class<? extends UElement>> getApplicableUastTypes() {
        return Collections.singletonList(UCallExpression.class);
    }

    @Nullable
    @Override
    public UElementHandler createUastHandler(@NotNull JavaContext context) {
        return new UElementHandler() {

            @Override
            public void visitCallExpression(@NotNull UCallExpression node) {
                node.getReceiverType(); // PsiType:Button
            }
        };
    }
}

要提取限定名称,您可以使用以下方法:

((PsiClassType) node.getReceiverType()).resolve().getQualifiedName() // android.widget.Button

0
投票

我找到了一个适用于静态和非静态方法以及 Kotlin 顶级函数的解决方案。不确定这是否是“最好”的方法,但至少它有效。 override fun visitCallExpression(node: UCallExpression) { (node.resolve()?.parent as? ClsClassImpl)?.stub?.qualifiedName }



0
投票


0
投票

(node.returnType as? PsiClassType)?.resolve()?.qualifiedName)

它又回来了

com.google.android.material.button.MaterialButton

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