Android lint пользовательская проверка UCallExpression тип получателя метода - PullRequest
0 голосов
/ 19 декабря 2018

Я пишу собственную проверку, чтобы запретить некоторые методы.Поэтому, если кто-то вызывает запрещенный метод 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.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Я нашел решение, которое работает как для статических и нестатических методов, так и для функций верхнего уровня Kotlin.Не уверен, что это лучший способ сделать это, но по крайней мере это работает.

override fun visitCallExpression(node: UCallExpression) {
     (node.resolve()?.parent as? ClsClassImpl)?.stub?.qualifiedName
}
0 голосов
/ 27 декабря 2018

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
...