编写自定义 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 警告以检查自定义注释的主要内容,如果未能解决你的问题,请参考以下文章