编写自定义 lint 警告以检查自定义注释

Posted

技术标签:

【中文标题】编写自定义 lint 警告以检查自定义注释【英文标题】:Writing custom lint warning to check for custom annotation 【发布时间】:2017-03-01 04:41:24 【问题描述】:

我写了如下注释:

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 命令的日志输出中提供警告。我希望此警告与其他 lint 警告一起出现在 android Studio 中,只要调用具有此注释的方法即可。这就是我尝试编写自定义 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 中可见?

【问题讨论】:

最好将您的答案与问题分开发布 请用我刚刚删除的编辑内容自行回答您的问题。请记住,这是一个问答网站。 【参考方案1】:

但我不知道如何从这里开始

我建议先为您的Detector 编写一个测试。这是一个示例项目,它演示了如何编写 Detector 测试 [1]。这样您就可以根据需要尝试调整您的Detector

如何检查方法上是否存在注解

我建议看看 Android 的默认检测器 [2]。在那里你很可能会找到一个好的起点。例如。 AnnotationDetector

并发出警告以使其在 Android Studio 中可见?

如果您将自定义规则正确集成到项目中,Lint 会为您发出警告。请在此处查看 [3] 以了解有关如何在项目中集成自定义规则的不同选项。注意:自定义规则的 AFAIK 警告只会在运行相应的 Gradle 任务时报告。 Android Studio 的“自动高亮”不适用于自定义规则。

    https://github.com/a11n/CustomLintRules https://android.googlesource.com/platform/tools/base/+/master/lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks https://github.com/a11n/android-lint/tree/master/6_application

【讨论】:

lombok.ast 库是否有任何我可以参考的文档,以便更好地理解第二个链接的源代码中发生了什么? 我找到了这个jar-download.com/…,但它们大多是空的,信息不多。 恐怕这就是你所能得到的。有更多的 Android 检测器使用 lombok 并搜索注释(例如 CallSuperDetector)。我知道这并不复杂,但采用现有的解决方案,了解它们的工作原理并调整它们的方法可能就是我们所拥有的。如果您了解更多信息,请告诉我:-) 我发现 Eclipse AST 文档有助于理解 lombok help.eclipse.org/luna/… 您说:Android Studio 的“自动高亮”不适用于自定义规则。目前正在发生吗?因为我写了一个自定义 lint,但 Android Studio 没有突出显示它。问候

以上是关于编写自定义 lint 警告以检查自定义注释的主要内容,如果未能解决你的问题,请参考以下文章

Cppcheck:所有功能的检查注释的自定义规则

自定义注释以根据枚举类型验证字符串

添加自定义 Lint 规则

自定义 android lint 规则未执行

自定义管道以消除警告

FxCop 自定义规则检查命名空间