55 */
66package io .jooby .apt ;
77
8+ import io .jooby .Jooby ;
89import io .jooby .MvcFactory ;
910import io .jooby .SneakyThrows ;
1011import io .jooby .internal .apt .HandlerCompiler ;
1112import io .jooby .internal .apt .ModuleCompiler ;
1213
13- import javax .annotation .processing .AbstractProcessor ;
14- import javax .annotation .processing .Filer ;
15- import javax .annotation .processing .ProcessingEnvironment ;
16- import javax .annotation .processing .RoundEnvironment ;
14+ import javax .annotation .processing .*;
1715import javax .lang .model .SourceVersion ;
1816import javax .lang .model .element .AnnotationMirror ;
1917import javax .lang .model .element .Element ;
2927import java .io .IOException ;
3028import java .io .OutputStream ;
3129import java .io .PrintWriter ;
32- import java .util .ArrayList ;
33- import java .util .Collections ;
34- import java .util .LinkedHashMap ;
35- import java .util .LinkedHashSet ;
36- import java .util .List ;
37- import java .util .Map ;
38- import java .util .Set ;
30+ import java .util .*;
3931import java .util .stream .Collectors ;
4032import java .util .stream .Stream ;
4133
4436 *
4537 * @since 2.1.0
4638 */
39+ @ SupportedOptions ({
40+ JoobyProcessor .OPT_DEBUG ,
41+ JoobyProcessor .OPT_INCREMENTAL })
4742public class JoobyProcessor extends AbstractProcessor {
4843
44+ protected static final String OPT_DEBUG = "jooby.debug" ;
45+ protected static final String OPT_INCREMENTAL = "jooby.incremental" ;
46+
4947 private ProcessingEnvironment processingEnv ;
5048
5149 /**
@@ -57,9 +55,21 @@ public class JoobyProcessor extends AbstractProcessor {
5755 private Map <TypeElement , Map <TypeElement , List <ExecutableElement >>> routeMap = new LinkedHashMap <>();
5856
5957 private boolean debug ;
58+ private boolean incremental ;
6059
6160 private int round ;
6261
62+ @ Override public Set <String > getSupportedOptions () {
63+ Set <String > options = new HashSet <>(super .getSupportedOptions ());
64+
65+ if (incremental ) {
66+ // enables incremental annotation processing support in Gradle
67+ options .add ("org.gradle.annotation.processing.isolating" );
68+ }
69+
70+ return options ;
71+ }
72+
6373 @ Override public Set <String > getSupportedAnnotationTypes () {
6474 return Stream .concat (Annotations .PATH .stream (), Annotations .HTTP_METHODS .stream ())
6575 .collect (Collectors .toCollection (LinkedHashSet ::new ));
@@ -71,7 +81,11 @@ public class JoobyProcessor extends AbstractProcessor {
7181
7282 @ Override public void init (ProcessingEnvironment processingEnvironment ) {
7383 this .processingEnv = processingEnvironment ;
74- debug = Boolean .parseBoolean (processingEnvironment .getOptions ().getOrDefault ("debug" , "false" ));
84+
85+ debug = boolOpt (processingEnv , OPT_DEBUG , false );
86+ incremental = boolOpt (processingEnv , OPT_INCREMENTAL , false );
87+
88+ debug ("Incremental annotation processing is turned %s." , incremental ? "ON" : "OFF" );
7589 }
7690
7791 @ Override
@@ -183,7 +197,11 @@ private void build(Filer filer) throws Exception {
183197 moduleList .add (moduleClass );
184198 }
185199
186- //doServices(filer, moduleList);
200+ if (!incremental ) {
201+ // writing resource files would prevent incremental annotation processing in Gradle:
202+ // https://docs.gradle.org/5.0/userguide/java_plugin.html#sec:incremental_annotation_processing
203+ doServices (filer , moduleList );
204+ }
187205 }
188206
189207 private String signature (ExecutableElement method ) {
@@ -291,4 +309,9 @@ private List<String> path(String method, List<? extends AnnotationMirror> annota
291309 .distinct ()
292310 .collect (Collectors .toList ());
293311 }
312+
313+ private boolean boolOpt (ProcessingEnvironment processingEnvironment , String option , boolean defaultValue ) {
314+ return Boolean .parseBoolean (processingEnvironment
315+ .getOptions ().getOrDefault (option , String .valueOf (defaultValue )));
316+ }
294317}
0 commit comments