Написание пользовательского предупреждения lint для проверки пользовательской аннотации

Я написал следующую аннотацию:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD})
public @interface Warning {

}

Который предназначен для аннотирования методов, которые могут вызвать проблемы при небрежном вызове. Я добавил в свой проект обработчик аннотаций, но это дает только предупреждение в выводе журнала команды javac. Я хочу, чтобы это предупреждение появлялось в Android Studio вместе с другими предупреждениями lint везде, где вызывается метод с этой аннотацией. Вот почему я пытаюсь написать собственное правило lint. У меня есть основной скелет правила lint:

import com.android.tools.lint.detector.api.Category;
import com.android.tools.lint.detector.api.Detector;
import com.android.tools.lint.detector.api.Implementation;
import com.android.tools.lint.detector.api.Issue;
import com.android.tools.lint.detector.api.Scope;
import com.android.tools.lint.detector.api.Severity;

public class CaimitoDetector extends Detector implements Detector.JavaScanner {

  public static final Issue ISSUE = Issue.create(
      "WarningAnnotation",
      "This method has been annotated with @Warning",
      "This method has special conditions surrounding it's use, be careful when using it and refer to its documentation.",
      Category.USABILITY, 7, Severity.WARNING,
      new Implementation(CaimitoDetector.class, Scope.JAVA_FILE_SCOPE));

  @Override
  public void visitMethod(JavaContext context, AstVisitor visitor, MethodInvocation node) {

  }

}

import com.android.tools.lint.client.api.IssueRegistry;
import com.android.tools.lint.detector.api.Issue;

import java.util.Collections;
import java.util.List;

public class CaimitoIssueRegistry extends IssueRegistry {

  @Override
  public List<Issue> getIssues() {
    return Collections.singletonList(CaimitoDetector.ISSUE);
  }

}

Но я не знаю, как действовать дальше. Как я могу проверить, существует ли аннотация в методе, и вывести предупреждение, чтобы оно было видно в Android Studio?


person Moses    schedule 19.10.2016    source источник
comment
лучше опубликовать свой ответ отдельно от вопроса   -  person Beloo    schedule 18.12.2019
comment
пожалуйста, ответьте на свой вопрос самостоятельно с правками, которые я только что удалил. Помните, что это сайт вопросов и ответов.   -  person Jean-François Fabre    schedule 21.12.2019


Ответы (1)


Но я не знаю, как действовать дальше

Я предлагаю сначала написать тест для вашего Detector. Вот пример проекта, который демонстрирует, как писать Detector тесты [1]. Таким образом, вы можете попробовать настроить Detector по своему усмотрению.

Как я могу проверить, существует ли аннотация в методе

Я предлагаю взглянуть на детекторы Android по умолчанию [2]. Там вы, скорее всего, найдете хорошую точку для начала. Например. AnnotationDetector.

и выдать предупреждение, чтобы оно было видно в Android Studio?

Если вы правильно интегрируете свои пользовательские правила в свой проект, Lint выдаст вам предупреждение. Пожалуйста, посмотрите здесь [3] для различных вариантов того, как интегрировать пользовательские правила в ваш проект. Примечание. AFAIK предупреждает о пользовательских правилах только при запуске соответствующей задачи Gradle. «Автоматическое выделение» Android Studio не работает с пользовательскими правилами.

  1. https://github.com/a11n/CustomLintRules
  2. https://android.googlesource.com/platform/tools/base/+/master/lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks
  3. https://github.com/a11n/android-lint/tree/master/6_application
person André Diermann    schedule 19.10.2016
comment
Есть ли в библиотеке lombok.ast какая-либо документация, на которую я могу ссылаться, чтобы лучше понять, что происходит в исходном коде второй ссылки? - person Moses; 20.10.2016
comment
Я нашел это jar-download.com/ , но в основном они пусты, мало информации. - person Moses; 20.10.2016
comment
Боюсь, это все, что вы получите. Есть и другие детекторы Android, которые используют ломбок и ищут аннотации (например, CallSuperDetector). Я знаю, что это не сложно, но взять существующие решения, понять, как они работают, и адаптировать их подход — это, возможно, все, что у нас есть. Если вы узнаете больше, пожалуйста, дайте мне знать :-) - person André Diermann; 20.10.2016
comment
Я нашел документацию Eclipse AST полезной для понимания ломбока help.eclipse.org/luna/ - person Moses; 25.10.2016
comment
Вы сказали: автоматическое выделение Android Studio не работает с пользовательскими правилами. Это происходит в настоящее время? Потому что я написал собственный lint, но Android Studio не выделяет его. С уважением - person Georgevik; 01.08.2018
comment
@AndréDiermann AndréDiermann, если автоподсветка не работает, как что-то вроде дерева обеспечивает такое поведение? - person Andrey Danilov; 17.12.2019