10

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?

Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219
Adam
  • 2,167
  • 5
  • 19
  • 33

1 Answers1

2

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.

  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
André Diermann
  • 2,725
  • 23
  • 28
  • Does the lombok.ast library have any documentation I can refer to in order to better understand what's going on in the source code of the second link? – Adam Oct 20 '16 at 08:41
  • I found this https://jar-download.com/java-documentation-javadoc.php?a=lombok-ast&g=com.android.tools.external.lombok&v=0.2.3 , but they're mostly empty, not much information. – Adam Oct 20 '16 at 08:48
  • I'm afraid this is all you'll get. There are more Android detectors which use lombok and search for annotations (e.g. CallSuperDetector). I know this is not sophisticating, but taking existing solutions, understand how they work and adapt their approach is maybe all we have. If you find out more, please let me know :-) – André Diermann Oct 20 '16 at 10:13
  • I have found the Eclipse AST docs helpful in understanding lombok http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FAST.html – Adam Oct 25 '16 at 15:47
  • You said: The "auto-highlight" of Android Studio does not work with custom rules. Is it currently happening? Because I wrote a custom lint but Android Studio doesn't hightlight it. Regards – Georgevik Aug 01 '18 at 13:41
  • @AndréDiermann if "auto-hightlight" does not work, how something like timber achive that behavior? – Andrey Danilov Dec 17 '19 at 17:09