Uploaded image for project: 'Clover'
  1. Clover
  2. CLOV-1839

Provide instrumentation support for Annotations in all places Java 8 allows to



    • Feedback Policy:

      Our product teams collect and evaluate feedback from a number of different sources. To learn more about how we use customer feedback in the planning process, check out our new feature policy.


      Provide support for instrumentation of annotations in all places where Java 8 allows developer put them. E.g annotation on types or in different parts of method declaration.

      Please note that javac compiler itself does not understand such annotations - it's up to annotation processors to handle them correctly.

      However, as Clover does perform instrumentation "offline" (i.e. not inside the javac process), we must at least allow these annotations to be present (i.e. do not throw parse exceptions); Clover does not need to understand them, however.

          void some (@RequestBody(required = false) String @Nullable [] arguments) { }
          static @interface Readonly { }
          static @interface NonNull { }
          static @interface NonEmpty { }
          // annotations for method receivers
          public int size() @Readonly {
              return 0;
          // annotations inside generic type arguments
          Map<@NonNull String, @NonEmpty List<@Readonly Document>> files;
          // annotations inside arrays
          // docs1 is an unmodifiable one-dimensional array of mutable Documents
          Document[@Readonly] docs1;
          // docs2 is a mutable array whose elements are unmodifiable one-dimensional arrays of mutable Documents
          Document[][@Readonly] docs2 = new Document[2][@Readonly 12];
          public void annotationInTypeCast(Object myObject) {
              String myString;
              // annotation in typecast
              myString = (@NonNull String)myObject;
          public void annotationInInstanceOf(Object myString) {
              // type tests
              boolean isNonNull = myString instanceof @NonNull String;
          public void annotationInObjectCreation() {
              Set myNonEmptyStringSet = new HashSet();
              // object creation
              new @Readonly @NonEmpty ArrayList(myNonEmptyStringSet);
          //type parameter bounds:
          //class Folder { ... }
          // t.b.d.
          // class inheritance
          abstract class UnmodifiableList<T> implements @Readonly List<@Readonly T> { }
          // throws clauses
          class TemperatureException extends Exception { }
          @interface Critical { }S
          void monitorTemperature() throws @Critical TemperatureException {
              throw new TemperatureException();


      Extend ANTLR grammar (java.g) to handle these constructs

      • method return values, thrown exceptions
      • generic types, including upper and lower bounds, wildcards
      • nested classes
      • arrays and varargs
      • type casting and instanceof
      • "new" keyword - constructors, including nested and generic ones
      • generic methods
      • class/interface inheritance
      • method and constructor references


      Out of scope:

      • explicit "this" receiver (if required to handle) - tracked in CLOV-1934


          Issue Links



              Unassigned Unassigned
              glewandowski Grzegorz Lewandowski
              4 Vote for this issue
              8 Start watching this issue