38
38
*
39
39
* @author Stephane Nicoll
40
40
* @author Phillip Webb
41
+ * @author Moritz Halbritter
41
42
*/
42
43
class TypeElementMembers {
43
44
44
45
private static final String OBJECT_CLASS_NAME = Object .class .getName ();
45
46
47
+ private static final String RECORD_CLASS_NAME = "java.lang.Record" ;
48
+
46
49
private final MetadataGenerationEnvironment env ;
47
50
48
51
private final TypeElement targetType ;
49
52
53
+ private final boolean isRecord ;
54
+
50
55
private final Map <String , VariableElement > fields = new LinkedHashMap <>();
51
56
52
57
private final Map <String , List <ExecutableElement >> publicGetters = new LinkedHashMap <>();
@@ -56,18 +61,20 @@ class TypeElementMembers {
56
61
TypeElementMembers (MetadataGenerationEnvironment env , TypeElement targetType ) {
57
62
this .env = env ;
58
63
this .targetType = targetType ;
64
+ this .isRecord = RECORD_CLASS_NAME .equals (targetType .getSuperclass ().toString ());
59
65
process (targetType );
60
66
}
61
67
62
68
private void process (TypeElement element ) {
63
- for (ExecutableElement method : ElementFilter .methodsIn (element .getEnclosedElements ())) {
64
- processMethod (method );
65
- }
66
69
for (VariableElement field : ElementFilter .fieldsIn (element .getEnclosedElements ())) {
67
70
processField (field );
68
71
}
72
+ for (ExecutableElement method : ElementFilter .methodsIn (element .getEnclosedElements ())) {
73
+ processMethod (method );
74
+ }
69
75
Element superType = this .env .getTypeUtils ().asElement (element .getSuperclass ());
70
- if (superType instanceof TypeElement && !OBJECT_CLASS_NAME .equals (superType .toString ())) {
76
+ if (superType instanceof TypeElement && !OBJECT_CLASS_NAME .equals (superType .toString ())
77
+ && !RECORD_CLASS_NAME .equals (superType .toString ())) {
71
78
process ((TypeElement ) superType );
72
79
}
73
80
}
@@ -122,12 +129,22 @@ private ExecutableElement getMatchingAccessor(List<ExecutableElement> candidates
122
129
}
123
130
124
131
private boolean isGetter (ExecutableElement method ) {
132
+ boolean hasParameters = !method .getParameters ().isEmpty ();
133
+ boolean returnsVoid = TypeKind .VOID == method .getReturnType ().getKind ();
134
+ if (hasParameters || returnsVoid ) {
135
+ return false ;
136
+ }
125
137
String name = method .getSimpleName ().toString ();
126
- return ((name .startsWith ("get" ) && name .length () > 3 ) || (name .startsWith ("is" ) && name .length () > 2 ))
127
- && method .getParameters ().isEmpty () && (TypeKind .VOID != method .getReturnType ().getKind ());
138
+ if (this .isRecord && this .fields .containsKey (name )) {
139
+ return true ;
140
+ }
141
+ return (name .startsWith ("get" ) && name .length () > 3 ) || (name .startsWith ("is" ) && name .length () > 2 );
128
142
}
129
143
130
144
private boolean isSetter (ExecutableElement method ) {
145
+ if (this .isRecord ) {
146
+ return false ;
147
+ }
131
148
final String name = method .getSimpleName ().toString ();
132
149
return (name .startsWith ("set" ) && name .length () > 3 && method .getParameters ().size () == 1
133
150
&& isSetterReturnType (method ));
@@ -151,16 +168,29 @@ private boolean isSetterReturnType(ExecutableElement method) {
151
168
}
152
169
153
170
private String getAccessorName (String methodName ) {
154
- String name = methodName .startsWith ("is" ) ? methodName .substring (2 ) : methodName .substring (3 );
171
+ if (this .isRecord ) {
172
+ return methodName ;
173
+ }
174
+ String name ;
175
+ if (methodName .startsWith ("is" )) {
176
+ name = methodName .substring (2 );
177
+ }
178
+ else if (methodName .startsWith ("get" )) {
179
+ name = methodName .substring (3 );
180
+ }
181
+ else if (methodName .startsWith ("set" )) {
182
+ name = methodName .substring (3 );
183
+ }
184
+ else {
185
+ throw new AssertionError ("methodName must start with 'is', 'get' or 'set', was '" + methodName + "'" );
186
+ }
155
187
name = Character .toLowerCase (name .charAt (0 )) + name .substring (1 );
156
188
return name ;
157
189
}
158
190
159
191
private void processField (VariableElement field ) {
160
192
String name = field .getSimpleName ().toString ();
161
- if (!this .fields .containsKey (name )) {
162
- this .fields .put (name , field );
163
- }
193
+ this .fields .putIfAbsent (name , field );
164
194
}
165
195
166
196
Map <String , VariableElement > getFields () {
0 commit comments