Writing custom lint warning to check for custom annotation
android, android-lint, android-studio, java-annotations
Solution
But I do not know how to proceed from here
I suggest to write a test for your `Detector` first. Here is an example project which demonstrates how to write `Detector` tests [1]. That way you can try and adjust your `Detector` as you like.
How can I check if an annoation exists on a method
I suggest to have a look at Android's default detectors [2]. There you'll most probably find a good point to start. E.g. the `AnnotationDetector`.
and raise a warning such that it will be visible in Android Studio?
If you integrate your custom rules correctly into your project, then Lint will raise the warning for you. Please have a look here [3] for different options on how to integrate custom rules in your project. Note: AFAIK warnings of custom rules will only reported when running the corresponding Gradle task. The "auto-highlight" of Android Studio does not work with custom rules.
- 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
Problem
I have written the following 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 { } ``` Which is intended to annotate methods which can cause problems if called carelessly. I added an annotation processor to my project, but this only provides the warning in the log output of the javac command. I want this warning to appear in Android Studio along with the other lint warnings anywhere a method with this annotation is called. This is why I am trying to write a custom lint rule. I have the basic skeleton of the lint rule: ``` 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); } } ``` But I do not know how to proceed from here. How can I check if an annoation exists on a method, and raise a warning such that it will be visible in Android Studio?