Skip to content

Commit 9d9304a

Browse files
authored
Refactor annotation processing (#1342)
2 parents 6cdbf86 + d90c81e commit 9d9304a

File tree

4 files changed

+45
-45
lines changed

4 files changed

+45
-45
lines changed

doma-processor/src/main/java/org/seasar/doma/internal/apt/DomaProcessor.java

Lines changed: 34 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@
2525
import static org.seasar.doma.internal.apt.AnnotationTypes.EXTERNAL_DOMAIN;
2626
import static org.seasar.doma.internal.apt.AnnotationTypes.SCOPE;
2727

28-
import java.util.HashSet;
29-
import java.util.Map;
28+
import java.util.List;
29+
import java.util.Objects;
3030
import java.util.Set;
3131
import java.util.function.Function;
32+
import java.util.stream.Collectors;
3233
import javax.annotation.processing.AbstractProcessor;
3334
import javax.annotation.processing.ProcessingEnvironment;
3435
import javax.annotation.processing.RoundEnvironment;
@@ -81,25 +82,24 @@
8182
})
8283
public class DomaProcessor extends AbstractProcessor {
8384

84-
private static final Map<String, Function<RoundContext, ElementProcessor>> functionMap =
85-
Map.of(
86-
EXTERNAL_DOMAIN, ExternalDomainProcessor::new,
87-
DATA_TYPE, DataTypeProcessor::new,
88-
DOMAIN, DomainProcessor::new,
89-
DOMAIN_CONVERTERS, DomainConvertersProcessor::new,
90-
EMBEDDABLE, EmbeddableProcessor::new,
91-
ENTITY, EntityProcessor::new,
92-
AGGREGATE_STRATEGY, AggregateStrategyProcessor::new,
93-
DAO, DaoProcessor::new,
94-
SCOPE, ScopeProcessor::new);
85+
private static final List<Operation> operations =
86+
List.of(
87+
new Operation(EXTERNAL_DOMAIN, ExternalDomainProcessor::new),
88+
new Operation(DATA_TYPE, DataTypeProcessor::new),
89+
new Operation(DOMAIN, DomainProcessor::new),
90+
new Operation(DOMAIN_CONVERTERS, DomainConvertersProcessor::new),
91+
new Operation(EMBEDDABLE, EmbeddableProcessor::new),
92+
new Operation(ENTITY, EntityProcessor::new),
93+
new Operation(AGGREGATE_STRATEGY, AggregateStrategyProcessor::new),
94+
new Operation(DAO, DaoProcessor::new),
95+
new Operation(SCOPE, ScopeProcessor::new));
9596

9697
private ProcessingContext processingContext;
9798

9899
@Override
99100
public synchronized void init(ProcessingEnvironment processingEnv) {
100101
super.init(processingEnv);
101-
processingContext = new ProcessingContext(processingEnv);
102-
processingContext.init();
102+
processingContext = ProcessingContext.of(processingEnv);
103103
}
104104

105105
@Override
@@ -115,37 +115,32 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
115115

116116
var roundContext = processingContext.createRoundContext(roundEnv);
117117

118-
var externalDomainAnnotation = new HashSet<TypeElement>(1);
119-
var otherAnnotations = new HashSet<TypeElement>(functionMap.size() - 1);
118+
var annotationMap =
119+
annotations.stream()
120+
.collect(
121+
Collectors.toUnmodifiableMap(
122+
it -> it.getQualifiedName().toString(), Function.identity()));
120123

121-
for (var annotation : annotations) {
122-
if (annotation.getQualifiedName().contentEquals(EXTERNAL_DOMAIN)) {
123-
externalDomainAnnotation.add(annotation);
124-
} else {
125-
otherAnnotations.add(annotation);
124+
for (var operation : operations) {
125+
var annotation = annotationMap.get(operation.name);
126+
if (annotation == null) {
127+
continue;
126128
}
129+
var elements = roundContext.getElementsAnnotatedWith(annotation);
130+
if (elements.isEmpty()) {
131+
continue;
132+
}
133+
var processor = operation.function.apply(roundContext);
134+
processor.process(elements);
127135
}
128136

129-
// process ExternalDomain annotation first
130-
processWithRoundContext(externalDomainAnnotation, roundContext);
131-
132-
// process other annotations
133-
processWithRoundContext(otherAnnotations, roundContext);
134-
135137
return true;
136138
}
137139

138-
private void processWithRoundContext(Set<TypeElement> annotations, RoundContext roundContext) {
139-
for (var annotation : annotations) {
140-
String annotationName = annotation.getQualifiedName().toString();
141-
var function = functionMap.get(annotationName);
142-
if (function != null) {
143-
var elements = roundContext.getElementsAnnotatedWith(annotation);
144-
if (!elements.isEmpty()) {
145-
var processor = function.apply(roundContext);
146-
processor.process(elements);
147-
}
148-
}
140+
private record Operation(String name, Function<RoundContext, ElementProcessor> function) {
141+
Operation {
142+
Objects.requireNonNull(name);
143+
Objects.requireNonNull(function);
149144
}
150145
}
151146
}

doma-processor/src/main/java/org/seasar/doma/internal/apt/ProcessingContext.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public class ProcessingContext {
3030
private Reporter reporter;
3131
private Resources resources;
3232

33-
public ProcessingContext(ProcessingEnvironment env) {
33+
private ProcessingContext(ProcessingEnvironment env) {
3434
this.env = Objects.requireNonNull(env);
3535
}
3636

37-
public void init() {
37+
private void init() {
3838
if (initialized) {
3939
throw new AptIllegalStateException("already initialized");
4040
}
@@ -103,4 +103,11 @@ private void assertInitialized() {
103103
throw new AptIllegalStateException("not yet initialized");
104104
}
105105
}
106+
107+
public static ProcessingContext of(ProcessingEnvironment env) {
108+
Objects.requireNonNull(env);
109+
var processingContext = new ProcessingContext(env);
110+
processingContext.init();
111+
return processingContext;
112+
}
106113
}

doma-processor/src/test/java/org/seasar/doma/internal/apt/TestProcessor.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ protected TestProcessor() {}
4141
@Override
4242
public synchronized void init(ProcessingEnvironment env) {
4343
super.init(env);
44-
ctx = new ProcessingContext(env);
45-
ctx.init();
44+
ctx = ProcessingContext.of(env);
4645
}
4746

4847
@Override

doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/MyAnnotationProcessor.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ public MyAnnotationProcessor(Function<TypeElement, NullElementMeta> handler) {
3838
@Override
3939
public synchronized void init(ProcessingEnvironment processingEnv) {
4040
super.init(processingEnv);
41-
this.ctx = new ProcessingContext(processingEnv);
42-
ctx.init();
41+
this.ctx = ProcessingContext.of(processingEnv);
4342
}
4443

4544
@Override

0 commit comments

Comments
 (0)