Skip to content

Commit 563d7d7

Browse files
committed
Polish "Respect lombok.AccessLevel attributes"
Closes gh-13175
1 parent 3699132 commit 563d7d7

File tree

7 files changed

+87
-178
lines changed

7 files changed

+87
-178
lines changed

spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,7 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
7777

7878
static final String LOMBOK_SETTER_ANNOTATION = "lombok.Setter";
7979

80-
private static final String LOMBOK_ACCESS_LEVEL = "lombok.AccessLevel";
81-
82-
private static final String LOMBOK_ACCESS_LEVEL_PUBLIC = LOMBOK_ACCESS_LEVEL
83-
+ ".PUBLIC";
80+
static final String LOMBOK_ACCESS_LEVEL_PUBLIC = "PUBLIC";
8481

8582
private MetadataStore metadataStore;
8683

@@ -308,35 +305,44 @@ private void processNestedLombokTypes(String prefix, TypeElement element,
308305
}
309306

310307
private boolean isLombokField(VariableElement field, TypeElement element) {
311-
return hasLombokPublicMethod(field, element, LOMBOK_GETTER_ANNOTATION);
308+
return hasLombokPublicAccessor(field, element, true);
312309
}
313310

314311
private boolean hasLombokSetter(VariableElement field, TypeElement element) {
315312
return !field.getModifiers().contains(Modifier.FINAL)
316-
&& hasLombokPublicMethod(field, element, LOMBOK_SETTER_ANNOTATION);
317-
}
318-
319-
private boolean hasLombokPublicMethod(VariableElement field, TypeElement element,
320-
String lombokMethodAnnotation) {
321-
AnnotationMirror lombokMethodAnnotationOnField = getAnnotation(field,
322-
lombokMethodAnnotation);
313+
&& hasLombokPublicAccessor(field, element, false);
314+
}
315+
316+
/**
317+
* Determine if the specified {@link VariableElement field} defines a public accessor
318+
* using lombok annotations.
319+
* @param field the field to inspect
320+
* @param element the parent element of the field (i.e. its holding class)
321+
* @param getter {@code true} to look for the read accessor, {@code false} for the
322+
* write accessor
323+
* @return {@code true} if this field is a public accessor of the specified type
324+
*/
325+
private boolean hasLombokPublicAccessor(VariableElement field, TypeElement element,
326+
boolean getter) {
327+
String annotation = (getter ? LOMBOK_GETTER_ANNOTATION
328+
: LOMBOK_SETTER_ANNOTATION);
329+
AnnotationMirror lombokMethodAnnotationOnField = getAnnotation(field, annotation);
323330
if (lombokMethodAnnotationOnField != null) {
324-
return isLombokPublic(lombokMethodAnnotationOnField);
331+
return isAccessLevelPublic(lombokMethodAnnotationOnField);
325332
}
326-
327333
AnnotationMirror lombokMethodAnnotationOnElement = getAnnotation(element,
328-
lombokMethodAnnotation);
334+
annotation);
329335
if (lombokMethodAnnotationOnElement != null) {
330-
return isLombokPublic(lombokMethodAnnotationOnElement);
336+
return isAccessLevelPublic(lombokMethodAnnotationOnElement);
331337
}
332-
333338
return hasAnnotation(element, LOMBOK_DATA_ANNOTATION);
334339
}
335340

336-
private boolean isLombokPublic(AnnotationMirror lombokAnnotation) {
337-
return lombokAnnotation.getElementValues().values().stream()
338-
.noneMatch(e -> e.toString().startsWith(LOMBOK_ACCESS_LEVEL)
339-
&& !e.toString().equals(LOMBOK_ACCESS_LEVEL_PUBLIC));
341+
342+
private boolean isAccessLevelPublic(AnnotationMirror lombokAnnotation) {
343+
Map<String, Object> values = getAnnotationElementValues(lombokAnnotation);
344+
Object value = values.get("value");
345+
return (value == null || value.toString().equals(LOMBOK_ACCESS_LEVEL_PUBLIC));
340346
}
341347

342348
private void processNestedType(String prefix, TypeElement element,

spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,21 @@ public void lombokSimpleProperties() throws Exception {
488488
assertSimpleLombokProperties(metadata, LombokSimpleProperties.class, "simple");
489489
}
490490

491+
@Test
492+
public void lombokExplicitProperties() throws Exception {
493+
ConfigurationMetadata metadata = compile(LombokExplicitProperties.class);
494+
assertSimpleLombokProperties(metadata, LombokExplicitProperties.class,
495+
"explicit");
496+
assertThat(metadata.getItems()).hasSize(6);
497+
}
498+
499+
@Test
500+
public void lombokAccessLevelProperties() {
501+
ConfigurationMetadata metadata = compile(LombokAccessLevelProperties.class);
502+
assertAccessLevelLombokProperties(metadata, LombokAccessLevelProperties.class,
503+
"accesslevel", 2);
504+
}
505+
491506
@Test
492507
public void lombokAccessLevelOverwriteDataProperties() {
493508
ConfigurationMetadata metadata = compile(
@@ -515,20 +530,6 @@ public void lombokAccessLevelOverwriteDefaultProperties() {
515530
"accesslevel.overwrite.default");
516531
}
517532

518-
@Test
519-
public void lombokAccessLevelProperties() {
520-
ConfigurationMetadata metadata = compile(LombokAccessLevelProperties.class);
521-
assertAccessLevelLombokProperties(metadata, LombokAccessLevelProperties.class,
522-
"accesslevel", 2, 20);
523-
}
524-
525-
@Test
526-
public void lombokExplicitProperties() throws Exception {
527-
ConfigurationMetadata metadata = compile(LombokExplicitProperties.class);
528-
assertSimpleLombokProperties(metadata, LombokExplicitProperties.class,
529-
"explicit");
530-
}
531-
532533
@Test
533534
public void lombokInnerClassProperties() throws Exception {
534535
ConfigurationMetadata metadata = compile(LombokInnerClassProperties.class);
@@ -830,21 +831,17 @@ private void assertSimpleLombokProperties(ConfigurationMetadata metadata,
830831

831832
private void assertAccessLevelOverwriteLombokProperties(
832833
ConfigurationMetadata metadata, Class<?> source, String prefix) {
833-
assertAccessLevelLombokProperties(metadata, source, prefix, 7, 15);
834+
assertAccessLevelLombokProperties(metadata, source, prefix, 7);
834835
}
835836

836837
private void assertAccessLevelLombokProperties(ConfigurationMetadata metadata,
837-
Class<?> source, String prefix, int countNameFields, int countIgnoredFields) {
838+
Class<?> source, String prefix, int countNameFields) {
838839
assertThat(metadata).has(Metadata.withGroup(prefix).fromSource(source));
839840
for (int i = 0; i < countNameFields; i++) {
840841
assertThat(metadata)
841842
.has(Metadata.withProperty(prefix + ".name" + i, String.class));
842843
}
843-
844-
for (int i = 0; i < countIgnoredFields; i++) {
845-
assertThat(metadata)
846-
.doesNotHave(Metadata.withProperty(prefix + ".ignored" + i));
847-
}
844+
assertThat(metadata.getItems()).hasSize(1 + countNameFields);
848845
}
849846

850847
private ConfigurationMetadata compile(Class<?>... types) {

spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDataProperties.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -60,63 +60,64 @@ public class LombokAccessLevelOverwriteDataProperties {
6060
*/
6161
@Getter(AccessLevel.NONE)
6262
@Setter(AccessLevel.NONE)
63-
private String ignored0;
63+
private String ignoredAccessLevelNone;
6464

6565
@Getter(AccessLevel.NONE)
66-
private String ignored1;
66+
private String ignoredGetterAccessLevelNone;
6767

6868
@Setter(AccessLevel.NONE)
69-
private String ignored2;
69+
private String ignoredSetterAccessLevelNone;
7070

7171
/*
7272
* AccessLevel.PRIVATE
7373
*/
7474
@Getter(AccessLevel.PRIVATE)
7575
@Setter(AccessLevel.PRIVATE)
76-
private String ignored3;
76+
private String ignoredAccessLevelPrivate;
7777

7878
@Getter(AccessLevel.PRIVATE)
79-
private String ignored4;
79+
private String ignoredGetterAccessLevelPrivate;
8080

8181
@Setter(AccessLevel.PRIVATE)
82-
private String ignored5;
82+
private String ignoredSetterAccessLevelPrivate;
8383

8484
/*
8585
* AccessLevel.PACKAGE
8686
*/
8787
@Getter(AccessLevel.PACKAGE)
8888
@Setter(AccessLevel.PACKAGE)
89-
private String ignored6;
89+
private String ignoredAccessLevelPackage;
9090

9191
@Getter(AccessLevel.PACKAGE)
92-
private String ignored7;
92+
private String ignoredGetterAccessLevelPackage;
9393

9494
@Setter(AccessLevel.PACKAGE)
95-
private String ignored8;
95+
private String ignoredSetterAccessLevelPackage;
9696

9797
/*
9898
* AccessLevel.PROTECTED
9999
*/
100100
@Getter(AccessLevel.PROTECTED)
101101
@Setter(AccessLevel.PROTECTED)
102-
private String ignored9;
102+
private String ignoredAccessLevelProtected;
103103

104104
@Getter(AccessLevel.PROTECTED)
105-
private String ignored10;
105+
private String ignoredGetterAccessLevelProtected;
106106

107107
@Setter(AccessLevel.PROTECTED)
108-
private String ignored11;
108+
private String ignoredSetterAccessLevelProtected;
109109

110110
/*
111111
* AccessLevel.MODULE
112112
*/
113113
@Getter(AccessLevel.MODULE)
114114
@Setter(AccessLevel.MODULE)
115-
private String ignored12;
115+
private String ignoredAccessLevelModule;
116116

117117
@Getter(AccessLevel.MODULE)
118-
private String ignored13;
118+
private String ignoredGetterAccessLevelModule;
119119

120120
@Setter(AccessLevel.MODULE)
121-
private String ignored14;
121+
private String ignoredSetterAccessLevelModule;
122+
122123
}

spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteDefaultProperties.java

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2017 the original author or authors.
2+
* Copyright 2012-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -60,63 +60,34 @@ public class LombokAccessLevelOverwriteDefaultProperties {
6060
*/
6161
@Getter(AccessLevel.NONE)
6262
@Setter(AccessLevel.NONE)
63-
private String ignored0;
64-
65-
@Getter(AccessLevel.NONE)
66-
private String ignored1;
67-
68-
@Setter(AccessLevel.NONE)
69-
private String ignored2;
63+
private String ignoredAccessLevelNone;
7064

7165
/*
7266
* AccessLevel.PRIVATE
7367
*/
7468
@Getter(AccessLevel.PRIVATE)
7569
@Setter(AccessLevel.PRIVATE)
76-
private String ignored3;
77-
78-
@Getter(AccessLevel.PRIVATE)
79-
private String ignored4;
80-
81-
@Setter(AccessLevel.PRIVATE)
82-
private String ignored5;
70+
private String ignoredAccessLevelPrivate;
8371

8472
/*
8573
* AccessLevel.PACKAGE
8674
*/
8775
@Getter(AccessLevel.PACKAGE)
8876
@Setter(AccessLevel.PACKAGE)
89-
private String ignored6;
90-
91-
@Getter(AccessLevel.PACKAGE)
92-
private String ignored7;
93-
94-
@Setter(AccessLevel.PACKAGE)
95-
private String ignored8;
77+
private String ignoredAccessLevelPackage;
9678

9779
/*
9880
* AccessLevel.PROTECTED
9981
*/
10082
@Getter(AccessLevel.PROTECTED)
10183
@Setter(AccessLevel.PROTECTED)
102-
private String ignored9;
103-
104-
@Getter(AccessLevel.PROTECTED)
105-
private String ignored10;
106-
107-
@Setter(AccessLevel.PROTECTED)
108-
private String ignored11;
84+
private String ignoredAccessLevelProtected;
10985

11086
/*
11187
* AccessLevel.MODULE
11288
*/
11389
@Getter(AccessLevel.MODULE)
11490
@Setter(AccessLevel.MODULE)
115-
private String ignored12;
116-
117-
@Getter(AccessLevel.MODULE)
118-
private String ignored13;
91+
private String ignoredAccessLevelModule;
11992

120-
@Setter(AccessLevel.MODULE)
121-
private String ignored14;
12293
}

spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/lombok/LombokAccessLevelOverwriteExplicitProperties.java

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2017 the original author or authors.
2+
* Copyright 2012-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -60,63 +60,34 @@ public class LombokAccessLevelOverwriteExplicitProperties {
6060
*/
6161
@Getter(AccessLevel.NONE)
6262
@Setter(AccessLevel.NONE)
63-
private String ignored0;
64-
65-
@Getter(AccessLevel.NONE)
66-
private String ignored1;
67-
68-
@Setter(AccessLevel.NONE)
69-
private String ignored2;
63+
private String ignoredAccessLevelNone;
7064

7165
/*
7266
* AccessLevel.PRIVATE
7367
*/
7468
@Getter(AccessLevel.PRIVATE)
7569
@Setter(AccessLevel.PRIVATE)
76-
private String ignored3;
77-
78-
@Getter(AccessLevel.PRIVATE)
79-
private String ignored4;
80-
81-
@Setter(AccessLevel.PRIVATE)
82-
private String ignored5;
70+
private String ignoredAccessLevelPrivate;
8371

8472
/*
8573
* AccessLevel.PACKAGE
8674
*/
8775
@Getter(AccessLevel.PACKAGE)
8876
@Setter(AccessLevel.PACKAGE)
89-
private String ignored6;
90-
91-
@Getter(AccessLevel.PACKAGE)
92-
private String ignored7;
93-
94-
@Setter(AccessLevel.PACKAGE)
95-
private String ignored8;
77+
private String ignoredAccessLevelPackage;
9678

9779
/*
9880
* AccessLevel.PROTECTED
9981
*/
10082
@Getter(AccessLevel.PROTECTED)
10183
@Setter(AccessLevel.PROTECTED)
102-
private String ignored9;
103-
104-
@Getter(AccessLevel.PROTECTED)
105-
private String ignored10;
106-
107-
@Setter(AccessLevel.PROTECTED)
108-
private String ignored11;
84+
private String ignoredAccessLevelProtected;
10985

11086
/*
11187
* AccessLevel.MODULE
11288
*/
11389
@Getter(AccessLevel.MODULE)
11490
@Setter(AccessLevel.MODULE)
115-
private String ignored12;
116-
117-
@Getter(AccessLevel.MODULE)
118-
private String ignored13;
91+
private String ignoredAccessLevelModule;
11992

120-
@Setter(AccessLevel.MODULE)
121-
private String ignored14;
12293
}

0 commit comments

Comments
 (0)