Skip to content

Commit 6dc9f67

Browse files
authored
Improve the efficiency of type management in annotation processing (#1349)
2 parents 99cc19e + c2851ac commit 6dc9f67

File tree

21 files changed

+1189
-641
lines changed

21 files changed

+1189
-641
lines changed

build.gradle.kts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,6 @@ configure(modularProjects) {
213213
useJUnitPlatform()
214214
}
215215

216-
build {
217-
dependsOn("publishToMavenLocal")
218-
}
219-
220216
withType<Sign>().configureEach {
221217
onlyIf { isReleaseVersion }
222218
}
@@ -250,6 +246,13 @@ configure(integrationTestProjects) {
250246
options.encoding = encoding
251247
}
252248

249+
compileJava {
250+
val ap: String by project
251+
ap.split(",").map { it.trim() }.filter { it.isNotEmpty() }.map { "-A$it" }.forEach {
252+
options.compilerArgs.add(it)
253+
}
254+
}
255+
253256
compileTestJava {
254257
options.compilerArgs.addAll(listOf("-proc:none"))
255258
}
@@ -297,7 +300,7 @@ configure(integrationTestProjects) {
297300
}
298301

299302
register("testAll") {
300-
dependsOn(h2, mysql, oracle, postgresql, sqlserver)
303+
dependsOn(h2, mysql, oracle, postgresql, sqlite, sqlserver)
301304
}
302305
}
303306
}

doma-core/src/main/java/org/seasar/doma/message/Message.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -472,8 +472,8 @@ public enum Message implements MessageResource {
472472
DOMA4089(
473473
"When you annotate the field with @Id or @Version, "
474474
+ "you must not annotate the field with @Column(updatable=false) to the same field."),
475-
DOMA4090("The annotation processor \"{0}\" starts processing for the element \"{1}\"."),
476-
DOMA4091("The annotation processor \"{0}\" ends processing for the element \"{1}\"."),
475+
DOMA4090("Starting processing of annotation \"{0}\" on element \"{1}\"."),
476+
DOMA4091("Finished processing of annotation \"{0}\" on element \"{1}\"."),
477477
DOMA4092(
478478
"Failed to verify the SQL template \"{0}\" on line {2} at column {3}. The cause is as follows: {4} SQL=[{1}]."),
479479
DOMA4093("The field annotated with @Version must be numeric."),

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public SourceVersion getSupportedSourceVersion() {
109109

110110
@Override
111111
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
112-
if (roundEnv.processingOver()) {
112+
if (roundEnv.processingOver() || annotations.isEmpty()) {
113113
return true;
114114
}
115115

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

Lines changed: 95 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,21 @@
2828
import java.util.LinkedHashMap;
2929
import java.util.List;
3030
import java.util.Map;
31+
import java.util.Set;
3132
import java.util.function.Predicate;
3233
import java.util.stream.Stream;
34+
import javax.lang.model.AnnotatedConstruct;
3335
import javax.lang.model.element.AnnotationMirror;
3436
import javax.lang.model.element.AnnotationValue;
3537
import javax.lang.model.element.Element;
3638
import javax.lang.model.element.ElementVisitor;
3739
import javax.lang.model.element.ExecutableElement;
3840
import javax.lang.model.element.Modifier;
41+
import javax.lang.model.element.ModuleElement;
3942
import javax.lang.model.element.Name;
4043
import javax.lang.model.element.PackageElement;
4144
import javax.lang.model.element.Parameterizable;
45+
import javax.lang.model.element.RecordComponentElement;
4246
import javax.lang.model.element.TypeElement;
4347
import javax.lang.model.element.TypeParameterElement;
4448
import javax.lang.model.element.VariableElement;
@@ -54,13 +58,15 @@
5458

5559
public class MoreElements implements Elements {
5660

57-
private final ProcessingContext ctx;
61+
private static final Object NOT_FOUND = new Object();
62+
63+
private final RoundContext ctx;
5864

5965
private final Elements elementUtils;
6066

61-
private final Map<String, TypeElement> typeElementCache = new HashMap<>(64);
67+
private final Map<String, Object> typeElementCache = new HashMap<>(256);
6268

63-
public MoreElements(ProcessingContext ctx, Elements elementUtils) {
69+
public MoreElements(RoundContext ctx, Elements elementUtils) {
6470
assertNotNull(ctx, elementUtils);
6571
this.ctx = ctx;
6672
this.elementUtils = elementUtils;
@@ -72,7 +78,6 @@ public PackageElement getPackageElement(CharSequence name) {
7278
return elementUtils.getPackageElement(name);
7379
}
7480

75-
// delegate to elementUtils
7681
@Override
7782
public TypeElement getTypeElement(CharSequence canonicalName) {
7883
assertNotNull(canonicalName);
@@ -85,7 +90,14 @@ public TypeElement getTypeElement(Class<?> clazz) {
8590
}
8691

8792
private TypeElement getTypeElementInternal(String canonicalName) {
88-
return typeElementCache.computeIfAbsent(canonicalName, elementUtils::getTypeElement);
93+
var typeElement =
94+
typeElementCache.computeIfAbsent(
95+
canonicalName,
96+
it -> {
97+
var result = elementUtils.getTypeElement(it);
98+
return result == null ? NOT_FOUND : result;
99+
});
100+
return typeElement == NOT_FOUND ? null : (TypeElement) typeElement;
89101
}
90102

91103
// delegate to elementUtils
@@ -168,6 +180,84 @@ public boolean isFunctionalInterface(TypeElement type) {
168180
return elementUtils.isFunctionalInterface(type);
169181
}
170182

183+
// delegate to elementUtils
184+
@Override
185+
public PackageElement getPackageElement(ModuleElement module, CharSequence name) {
186+
return elementUtils.getPackageElement(module, name);
187+
}
188+
189+
// delegate to elementUtils
190+
@Override
191+
public Set<? extends PackageElement> getAllPackageElements(CharSequence name) {
192+
return elementUtils.getAllPackageElements(name);
193+
}
194+
195+
// delegate to elementUtils
196+
@Override
197+
public TypeElement getTypeElement(ModuleElement module, CharSequence name) {
198+
return elementUtils.getTypeElement(module, name);
199+
}
200+
201+
// delegate to elementUtils
202+
@Override
203+
public Set<? extends TypeElement> getAllTypeElements(CharSequence name) {
204+
return elementUtils.getAllTypeElements(name);
205+
}
206+
207+
// delegate to elementUtils
208+
@Override
209+
public ModuleElement getModuleElement(CharSequence name) {
210+
return elementUtils.getModuleElement(name);
211+
}
212+
213+
// delegate to elementUtils
214+
@Override
215+
public Set<? extends ModuleElement> getAllModuleElements() {
216+
return elementUtils.getAllModuleElements();
217+
}
218+
219+
// delegate to elementUtils
220+
@Override
221+
public Origin getOrigin(Element e) {
222+
return elementUtils.getOrigin(e);
223+
}
224+
225+
// delegate to elementUtils
226+
@Override
227+
public Origin getOrigin(AnnotatedConstruct c, AnnotationMirror a) {
228+
return elementUtils.getOrigin(c, a);
229+
}
230+
231+
// delegate to elementUtils
232+
@Override
233+
public Origin getOrigin(ModuleElement m, ModuleElement.Directive directive) {
234+
return elementUtils.getOrigin(m, directive);
235+
}
236+
237+
// delegate to elementUtils
238+
@Override
239+
public boolean isBridge(ExecutableElement e) {
240+
return elementUtils.isBridge(e);
241+
}
242+
243+
// delegate to elementUtils
244+
@Override
245+
public ModuleElement getModuleOf(Element e) {
246+
return elementUtils.getModuleOf(e);
247+
}
248+
249+
// delegate to elementUtils
250+
@Override
251+
public boolean isAutomaticModule(ModuleElement module) {
252+
return elementUtils.isAutomaticModule(module);
253+
}
254+
255+
// delegate to elementUtils
256+
@Override
257+
public RecordComponentElement recordComponentFor(ExecutableElement accessor) {
258+
return elementUtils.recordComponentFor(accessor);
259+
}
260+
171261
public String getParameterName(VariableElement variableElement) {
172262
assertNotNull(variableElement);
173263
ParameterName parameterName = variableElement.getAnnotation(ParameterName.class);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@
4343

4444
public class MoreTypes implements Types {
4545

46-
private final ProcessingContext ctx;
46+
private final RoundContext ctx;
4747

4848
private final Types typeUtils;
4949

50-
public MoreTypes(ProcessingContext ctx, Types typeUtils) {
50+
public MoreTypes(RoundContext ctx, Types typeUtils) {
5151
assertNotNull(ctx, typeUtils);
5252
this.ctx = ctx;
5353
this.typeUtils = typeUtils;

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
import java.util.Objects;
1919
import javax.annotation.processing.ProcessingEnvironment;
2020
import javax.annotation.processing.RoundEnvironment;
21+
import javax.lang.model.util.Elements;
22+
import javax.lang.model.util.Types;
2123

2224
public class ProcessingContext {
2325

2426
private final ProcessingEnvironment env;
2527

2628
private boolean initialized;
27-
private MoreElements moreElements;
28-
private MoreTypes moreTypes;
2929
private Options options;
3030
private Reporter reporter;
3131
private Resources resources;
@@ -38,8 +38,6 @@ private void init() {
3838
if (initialized) {
3939
throw new AptIllegalStateException("already initialized");
4040
}
41-
moreElements = new MoreElements(this, env.getElementUtils());
42-
moreTypes = new MoreTypes(this, env.getTypeUtils());
4341
reporter = new Reporter(env.getMessager());
4442
resources =
4543
new Resources(
@@ -73,16 +71,6 @@ public RoundContext createRoundContext(RoundEnvironment roundEnvironment) {
7371
return roundContext;
7472
}
7573

76-
public MoreElements getMoreElements() {
77-
assertInitialized();
78-
return moreElements;
79-
}
80-
81-
public MoreTypes getMoreTypes() {
82-
assertInitialized();
83-
return moreTypes;
84-
}
85-
8674
public Options getOptions() {
8775
assertInitialized();
8876
return options;
@@ -98,6 +86,16 @@ public Resources getResources() {
9886
return resources;
9987
}
10088

89+
public Elements getElements() {
90+
assertInitialized();
91+
return env.getElementUtils();
92+
}
93+
94+
public Types getTypes() {
95+
assertInitialized();
96+
return env.getTypeUtils();
97+
}
98+
10199
private void assertInitialized() {
102100
if (!initialized) {
103101
throw new AptIllegalStateException("not yet initialized");

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public class RoundContext {
3333
private final RoundEnvironment roundEnvironment;
3434
private final List<ExternalDomainMeta> externalDomainMetaList = new ArrayList<>();
3535
private boolean initialized;
36+
private MoreElements moreElements;
37+
private MoreTypes moreTypes;
3638
private Annotations annotations;
3739
private Declarations declarations;
3840
private CtTypes ctTypes;
@@ -47,6 +49,8 @@ void init() {
4749
if (initialized) {
4850
throw new AptIllegalStateException("already initialized");
4951
}
52+
moreElements = new MoreElements(this, processingContext.getElements());
53+
moreTypes = new MoreTypes(this, processingContext.getTypes());
5054
annotations = new Annotations(this);
5155
declarations = new Declarations(this);
5256
ctTypes = new CtTypes(this);
@@ -61,12 +65,12 @@ public RoundEnvironment getRoundEnvironment() {
6165

6266
public MoreElements getMoreElements() {
6367
assertInitialized();
64-
return processingContext.getMoreElements();
68+
return moreElements;
6569
}
6670

6771
public MoreTypes getMoreTypes() {
6872
assertInitialized();
69-
return processingContext.getMoreTypes();
73+
return moreTypes;
7074
}
7175

7276
public Options getOptions() {

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.seasar.doma.internal.apt.generator.Code;
2424
import org.seasar.doma.internal.jdbc.scalar.BasicScalarSuppliers;
2525
import org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalarSuppliers;
26-
import org.seasar.doma.internal.util.Pair;
2726
import org.seasar.doma.internal.wrapper.WrapperSuppliers;
2827

2928
public class BasicCtType extends AbstractCtType {
@@ -32,12 +31,11 @@ public class BasicCtType extends AbstractCtType {
3231

3332
private final TypeElement wrapperTypeElement;
3433

35-
BasicCtType(
36-
RoundContext ctx, TypeMirror type, Pair<TypeElement, TypeMirror> wrapperElementAndType) {
34+
BasicCtType(RoundContext ctx, TypeMirror type, TypeElement wrapperTypeElement) {
3735
super(ctx, type);
38-
assertNotNull(wrapperElementAndType);
36+
assertNotNull(wrapperTypeElement);
3937
this.boxedType = ctx.getMoreTypes().boxIfPrimitive(type);
40-
this.wrapperTypeElement = wrapperElementAndType.fst;
38+
this.wrapperTypeElement = wrapperTypeElement;
4139
}
4240

4341
public TypeMirror getBoxedType() {

0 commit comments

Comments
 (0)