编写自定义 lint 警告以检查自定义注释
Writing custom lint warning to check for custom annotation
我写了如下注释:
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 中可见?
But I do not know how to proceed from here
我建议先为您的 Detector
编写一个测试。这是一个示例项目,演示了如何编写 Detector
测试 [1]。这样您就可以根据自己的喜好尝试调整 Detector
。
How can I check if an annoation exists on a method
我建议看一下 Android 的默认检测器 [2]。在那里您很可能会找到一个很好的起点。例如。 AnnotationDetector
.
and raise a warning such that it will be visible in Android Studio?
如果您将自定义规则正确地集成到您的项目中,那么 Lint 会为您发出警告。请查看此处 [3],了解有关如何在您的项目中集成自定义规则的不同选项。注意:自定义规则的 AFAIK 警告只会在 运行 相应的 Gradle 任务时报告。 Android Studio 的 "auto-highlight" 不适用于自定义规则。
我写了如下注释:
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 中可见?
But I do not know how to proceed from here
我建议先为您的 Detector
编写一个测试。这是一个示例项目,演示了如何编写 Detector
测试 [1]。这样您就可以根据自己的喜好尝试调整 Detector
。
How can I check if an annoation exists on a method
我建议看一下 Android 的默认检测器 [2]。在那里您很可能会找到一个很好的起点。例如。 AnnotationDetector
.
and raise a warning such that it will be visible in Android Studio?
如果您将自定义规则正确地集成到您的项目中,那么 Lint 会为您发出警告。请查看此处 [3],了解有关如何在您的项目中集成自定义规则的不同选项。注意:自定义规则的 AFAIK 警告只会在 运行 相应的 Gradle 任务时报告。 Android Studio 的 "auto-highlight" 不适用于自定义规则。