Bug: JMH APT processor claims all annotations

Aleksey Shipilev aleksey.shipilev at gmail.com
Mon Sep 5 09:19:02 UTC 2016


Later this week, if everything is in order.

-Aleksey

On 09/05/2016 12:13 PM, Dimitar Dimitrov wrote:
> Thank you! Any idea when to expect a release?
> 
> Dimitar
> 
> 
> On Mon, Sep 5, 2016, 16:37 Aleksey Shipilev <aleksey.shipilev at gmail.com
> <mailto:aleksey.shipilev at gmail.com>> wrote:
> 
>     Yes, sorry about that, should be fixed with:
>      https://bugs.openjdk.java.net/browse/CODETOOLS-7901779
> 
>     Thanks,
>     -Aleksey
> 
>     On 08/11/2016 07:10 AM, Dimitar Dimitrov wrote:
>     > Problem:
>     > ------------
>     > When a codebase using JMH also uses other annotation processors (i.e.
>     > Lombok, Dagger 2, etc) The other processors will not get a chance
>     to run if
>     > they are ordered after JMH.
>     >
>     >
>     > Root cause:
>     > ----------------
>     > The JMH BenchmarkProcessor#process() method returns
>     unconditionally true
>     > regardless of whether it processed an annotation or not.
>     >
>     >
>     http://hg.openjdk.java.net/code-tools/jmh/file/397891feda1b/jmh-generator-annprocess/src/main/java/org/openjdk/jmh/generators/BenchmarkProcessor.java
>     >
>     > According to the Javadoc, if a processor returns true, it will
>     "claim" the
>     > annotation for itself and no other processors will be given a
>     chance to
>     > process it.
>     >
>     >
>     > Proposed fix:
>     > ------------------
>     > I am not deeply familiar with JMH, but for what I know, it has a
>     closed set
>     > of annotations, so line 41 in on BenchmarkProcessor.java to:
>     >
>     >      SupportedAnnotationTypes("org.openjdk.jmh.annotations.*")
>     >
>     > If JMH allows user-defined annotations things get a bit more
>     complicated.
>     > If the user-defined annotations are known in advance, one can override
>     > Processor#getSupportedAnnotationTypes()
>     >
>     > if there is a need to dynamically support user defined
>     annotations, one
>     > needs to inspect the first arg of the process() method and sure
>     that it
>     > returns true only in cases where all annotations are for JMH.
>     >
>     > AFinally, a simpler option is for the main processor to always
>     return false
>     > and add a separate processor that doesn't do anything else but
>     claim the
>     > known JMH annotations. That covers most cases, though that may
>     result in
>     > javac warning (-Xlint:processing) with user-defined annotations.
>     >
>     > Best regards,
>     > Dimitar
>     >
> 
> 




More information about the jmh-dev mailing list