Skip to content

Commit 6be2dea

Browse files
committed
Allow to blacklist annotations in annotation processing.
1 parent e5f6a1e commit 6be2dea

File tree

4 files changed

+46
-22
lines changed

4 files changed

+46
-22
lines changed

modules/jooby-apt/src/main/java/io/jooby/apt/JoobyProcessor.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.jooby.SneakyThrows;
1010
import io.jooby.internal.apt.HandlerCompiler;
1111
import io.jooby.internal.apt.ModuleCompiler;
12+
import io.jooby.internal.apt.Opts;
1213

1314
import javax.annotation.processing.AbstractProcessor;
1415
import javax.annotation.processing.Filer;
@@ -47,15 +48,12 @@
4748
* @since 2.1.0
4849
*/
4950
@SupportedOptions({
50-
JoobyProcessor.OPT_DEBUG,
51-
JoobyProcessor.OPT_INCREMENTAL,
52-
JoobyProcessor.OPT_SERVICES })
51+
Opts.OPT_DEBUG,
52+
Opts.OPT_INCREMENTAL,
53+
Opts.OPT_SERVICES,
54+
Opts.OPT_SKIP_ATTRIBUTE_ANNOTATIONS })
5355
public class JoobyProcessor extends AbstractProcessor {
5456

55-
protected static final String OPT_DEBUG = "jooby.debug";
56-
protected static final String OPT_INCREMENTAL = "jooby.incremental";
57-
protected static final String OPT_SERVICES = "jooby.services";
58-
5957
private ProcessingEnvironment processingEnv;
6058

6159
/**
@@ -101,9 +99,9 @@ public class JoobyProcessor extends AbstractProcessor {
10199
@Override public void init(ProcessingEnvironment processingEnvironment) {
102100
this.processingEnv = processingEnvironment;
103101

104-
debug = boolOpt(processingEnv, OPT_DEBUG, false);
105-
incremental = boolOpt(processingEnv, OPT_INCREMENTAL, true);
106-
services = boolOpt(processingEnv, OPT_SERVICES, true);
102+
debug = Opts.boolOpt(processingEnv, Opts.OPT_DEBUG, false);
103+
incremental = Opts.boolOpt(processingEnv, Opts.OPT_INCREMENTAL, true);
104+
services = Opts.boolOpt(processingEnv, Opts.OPT_SERVICES, true);
107105

108106
debug("Incremental annotation processing is turned %s.", incremental ? "ON" : "OFF");
109107
debug("Generation of service provider configuration is turned %s.", services ? "ON" : "OFF");
@@ -330,9 +328,4 @@ private List<String> path(String method, List<? extends AnnotationMirror> annota
330328
.distinct()
331329
.collect(Collectors.toList());
332330
}
333-
334-
private boolean boolOpt(ProcessingEnvironment processingEnvironment, String option, boolean defaultValue) {
335-
return Boolean.parseBoolean(processingEnvironment
336-
.getOptions().getOrDefault(option, String.valueOf(defaultValue)));
337-
}
338331
}

modules/jooby-apt/src/main/java/io/jooby/internal/apt/ModuleCompiler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,10 @@ private void install(ClassWriter writer, List<HandlerCompiler> handlers) throws
158158
visitor.visitParameter("provider", 0);
159159
visitor.visitCode();
160160

161+
String[] userAttrFilter = Opts.stringListOpt(processingEnv, Opts.OPT_SKIP_ATTRIBUTE_ANNOTATIONS, "");
162+
161163
RouteAttributesWriter routeAttributes = new RouteAttributesWriter(processingEnv.getElementUtils(),
162-
processingEnv.getTypeUtils(), writer, moduleInternalName, visitor);
164+
processingEnv.getTypeUtils(), writer, moduleInternalName, visitor, userAttrFilter);
163165

164166
Map<String, Integer> nameRegistry = new HashMap<>();
165167
for (HandlerCompiler handler : handlers) {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package io.jooby.internal.apt;
7+
8+
import javax.annotation.processing.ProcessingEnvironment;
9+
10+
public interface Opts {
11+
12+
String OPT_DEBUG = "jooby.debug";
13+
String OPT_INCREMENTAL = "jooby.incremental";
14+
String OPT_SERVICES = "jooby.services";
15+
String OPT_SKIP_ATTRIBUTE_ANNOTATIONS = "jooby.skipAttributeAnnotations";
16+
17+
static boolean boolOpt(ProcessingEnvironment processingEnvironment, String option, boolean defaultValue) {
18+
return Boolean.parseBoolean(processingEnvironment
19+
.getOptions().getOrDefault(option, String.valueOf(defaultValue)));
20+
}
21+
22+
static String[] stringListOpt(ProcessingEnvironment processingEnvironment, String option, String defaultValue) {
23+
String value = processingEnvironment.getOptions().getOrDefault(option, defaultValue);
24+
return value == null || value.isEmpty() ? new String[0] : value.split(",");
25+
}
26+
}

modules/jooby-apt/src/main/java/io/jooby/internal/apt/asm/RouteAttributesWriter.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,10 @@
3434
import java.util.Map;
3535
import java.util.UUID;
3636
import java.util.function.BiConsumer;
37-
import java.util.function.Consumer;
3837
import java.util.function.Predicate;
3938

4039
import static io.jooby.SneakyThrows.throwingConsumer;
4140
import static java.util.Collections.singletonList;
42-
import static java.util.Collections.sort;
4341
import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
4442
import static org.objectweb.asm.Opcodes.ACC_STATIC;
4543
import static org.objectweb.asm.Opcodes.ALOAD;
@@ -84,12 +82,13 @@ public EnumValue(String type, String value) {
8482

8583
private static final Predicate<String> NULL_ANNOTATION = it -> it.endsWith("NonNull")
8684
|| it.endsWith("NotNull")
85+
|| it.endsWith("Nonnull")
8786
|| it.endsWith("Nullable");
8887

8988
private static final Predicate<String> KOTLIN_ANNOTATION = it -> it.equals("kotlin.Metadata");
9089

91-
private static final Predicate<String> ATTR_FILTER = HTTP_ANNOTATION.negate()
92-
.and(NULL_ANNOTATION.negate()).and(KOTLIN_ANNOTATION.negate());
90+
private static final Predicate<String> ATTR_FILTER = HTTP_ANNOTATION
91+
.or(NULL_ANNOTATION).or(KOTLIN_ANNOTATION);
9392

9493
private final Elements elements;
9594

@@ -101,13 +100,16 @@ public EnumValue(String type, String value) {
101100

102101
private final MethodVisitor visitor;
103102

103+
private final String[] userAttrFilter;
104+
104105
public RouteAttributesWriter(Elements elements, Types types, ClassWriter writer,
105-
String moduleInternalName, MethodVisitor visitor) {
106+
String moduleInternalName, MethodVisitor visitor, String[] userAttrFilter) {
106107
this.elements = elements;
107108
this.types = types;
108109
this.writer = writer;
109110
this.moduleInternalName = moduleInternalName;
110111
this.visitor = visitor;
112+
this.userAttrFilter = userAttrFilter;
111113
}
112114

113115
public void process(ExecutableElement method, BiConsumer<String, Object[]> log)
@@ -143,7 +145,8 @@ private Map<String, Object> annotationMap(List<? extends AnnotationMirror> annot
143145
String root) {
144146
Map<String, Object> result = new HashMap<>();
145147
for (AnnotationMirror annotation : annotations) {
146-
if (!ATTR_FILTER.test(annotation.getAnnotationType().toString())) {
148+
String type = annotation.getAnnotationType().toString();
149+
if (ATTR_FILTER.test(type) || Arrays.stream(userAttrFilter).anyMatch(type::startsWith)) {
147150
// Ignore core,jars annotations
148151
continue;
149152
}

0 commit comments

Comments
 (0)