1515import java .io .IOException ;
1616import java .io .PrintWriter ;
1717import java .util .ArrayList ;
18+ import java .util .HashMap ;
1819import java .util .HashSet ;
1920import java .util .List ;
2021import java .util .Map ;
@@ -100,7 +101,7 @@ private void processConfigClass(TypeElement classElement, String configurableNam
100101
101102 List <VariableElement > configFields = collectConfigurableFields (classElement , configValueName );
102103
103- Set <TypeElement > dependencyTypes = new HashSet <>();
104+ Set <String > dependencyTypes = new HashSet <>();
104105 collectDependencies (configFields , dependencyTypes , configurableName );
105106
106107 generateClass (targetPackage , configName , configFields , extension , configValueName , generatedConfigName , dependencyTypes );
@@ -139,14 +140,14 @@ private List<VariableElement> collectConfigurableFields(TypeElement classElement
139140 return configFields ;
140141 }
141142
142- private void collectDependencies ( List <VariableElement > fields , Set <TypeElement > dependencies , String configurableName ) {
143+ private void collectDependencies ( List <VariableElement > fields , Set <String > dependencies , String configurableName ) {
143144 for (VariableElement field : fields ) {
144145 TypeMirror fieldType = field .asType ();
145146 TypeElement typeElement = getTypeElement (fieldType );
146147
147- if (typeElement != null && !dependencies .contains (typeElement )) {
148+ if (typeElement != null && !dependencies .contains (typeElement . getQualifiedName (). toString () )) {
148149 if (isConfigurable (typeElement )) {
149- dependencies .add (typeElement );
150+ dependencies .add (typeElement . getQualifiedName (). toString () );
150151 collectDependencies (collectConfigurableFields (typeElement , configurableName .replace ("Configurable" , "ConfigValue" )), dependencies , configurableName );
151152 }
152153 }
@@ -157,8 +158,8 @@ private void collectDependencies( List<VariableElement> fields, Set<TypeElement>
157158 if (types .isSameType (types .erasure (declaredType ), types .erasure (listElement .asType ())) && !declaredType .getTypeArguments ().isEmpty ()) {
158159 TypeMirror genericType = declaredType .getTypeArguments ().getFirst ();
159160 TypeElement genericElement = getTypeElement (genericType );
160- if (genericElement != null && !dependencies .contains (genericElement ) && isConfigurable (genericElement )) {
161- dependencies .add (genericElement );
161+ if (genericElement != null && !dependencies .contains (genericElement . getQualifiedName (). toString () ) && isConfigurable (genericElement )) {
162+ dependencies .add (genericElement . getQualifiedName (). toString () );
162163 collectDependencies (collectConfigurableFields (genericElement , configurableName .replace ("Configurable" , "ConfigValue" )), dependencies , configurableName );
163164 }
164165 }
@@ -182,7 +183,7 @@ private boolean isConfigurable(TypeElement typeElement) {
182183 return false ;
183184 }
184185
185- private void generateClass (String packageName , String className , List <VariableElement > fields , String extension , String configValueName , String generatedConfigName , Set <TypeElement > dependencyTypes ) throws IOException {
186+ private void generateClass (String packageName , String className , List <VariableElement > fields , String extension , String configValueName , String generatedConfigName , Set <String > dependencyTypes ) throws IOException {
186187 JavaFileObject builderFile = processingEnv .getFiler ().createSourceFile (packageName + "." + className );
187188 try (PrintWriter printWriter = new PrintWriter (builderFile .openWriter ())) {
188189
@@ -208,9 +209,14 @@ private void generateClass(String packageName, String className, List<VariableEl
208209 for (VariableElement field : fields ) {
209210 extractImports (field .asType ().toString (), imports );
210211 }
211- for (TypeElement dep : dependencyTypes ) {
212- imports .add (dep .getQualifiedName ().toString ());
213- imports .add (getGeneratedConfigClassName (dep ));
212+ Map <String , TypeElement > depElements = new HashMap <>();
213+ for (String dep : dependencyTypes ) {
214+ TypeElement element = elements .getTypeElement (dep );
215+ if (element != null ) {
216+ depElements .put (dep , element );
217+ imports .add (dep );
218+ imports .add (getGeneratedConfigClassName (element ));
219+ }
214220 }
215221
216222 for (String importString : imports ) {
@@ -227,10 +233,12 @@ private void generateClass(String packageName, String className, List<VariableEl
227233 printWriter .println ();
228234
229235 // VarHandles
230- for (TypeElement dep : dependencyTypes ) {
231- List <VariableElement > depFields = collectConfigurableFields (dep , configValueName );
236+ for (String dep : dependencyTypes ) {
237+ TypeElement depElement = depElements .get (dep );
238+ if (depElement == null ) continue ;
239+ List <VariableElement > depFields = collectConfigurableFields (depElement , configValueName );
232240 for (VariableElement field : depFields ) {
233- String handleName = getHandleName (dep , field );
241+ String handleName = getHandleName (depElement , field );
234242 printWriter .println (" private static final VarHandle " + handleName + ";" );
235243 }
236244 }
@@ -240,19 +248,21 @@ private void generateClass(String packageName, String className, List<VariableEl
240248 printWriter .println (" MethodHandles.Lookup lookup = MethodHandles.lookup();" );
241249 printWriter .println (" try {" );
242250
243- for (TypeElement dep : dependencyTypes ) {
244- String depClassName = getGeneratedConfigClassName (dep );
245- List <VariableElement > depFields = collectConfigurableFields (dep , configValueName );
251+ for (String dep : dependencyTypes ) {
252+ TypeElement depElement = depElements .get (dep );
253+ if (depElement == null ) continue ;
254+ String depClassName = getGeneratedConfigClassName (depElement );
255+ List <VariableElement > depFields = collectConfigurableFields (depElement , configValueName );
246256 for (VariableElement field : depFields ) {
247- String handleName = getHandleName (dep , field );
257+ String handleName = getHandleName (depElement , field );
248258 String fieldName = field .getSimpleName ().toString ();
249259 String fieldTypeClass ;
250260 if (isListType (field .asType ())) {
251261 fieldTypeClass = "List.class" ;
252262 } else {
253263 // Check if it is a Configurable dependency, use generated class name .class
254264 TypeElement typeEle = getTypeElement (field .asType ());
255- if (typeEle != null && dependencyTypes .contains (typeEle )) {
265+ if (typeEle != null && dependencyTypes .contains (typeEle . getQualifiedName (). toString () )) {
256266 fieldTypeClass = getGeneratedConfigClassName (typeEle ) + ".class" ;
257267 } else {
258268 fieldTypeClass = types .erasure (field .asType ()).toString () + ".class" ;
@@ -272,7 +282,7 @@ private void generateClass(String packageName, String className, List<VariableEl
272282
273283 // Fields
274284 for (VariableElement field : fields ) {
275- String type = getFieldType (field , dependencyTypes );
285+ String type = getFieldType (field , dependencyTypes , depElements );
276286 printWriter .println (" private " + type + " " + field .getSimpleName () + ";" );
277287 }
278288 printWriter .println ();
@@ -312,8 +322,11 @@ private void generateClass(String packageName, String className, List<VariableEl
312322 printWriter .println ();
313323
314324 // Serialization Helpers
315- for (TypeElement dep : dependencyTypes ) {
316- generateDependencyHelpers (printWriter , dep , configValueName );
325+ for (String dep : dependencyTypes ) {
326+ TypeElement depElement = depElements .get (dep );
327+ if (depElement != null ) {
328+ generateDependencyHelpers (printWriter , depElement , configValueName , dependencyTypes );
329+ }
317330 }
318331
319332 // Load Method (Sync)
@@ -328,7 +341,7 @@ private void generateClass(String packageName, String className, List<VariableEl
328341 printWriter .println ();
329342
330343 for (VariableElement field : fields ) {
331- generateFieldLoad (printWriter , field , configValueName , dependencyTypes );
344+ generateFieldLoad (printWriter , field , configValueName , dependencyTypes , depElements );
332345 }
333346
334347 printWriter .println (" }" );
@@ -343,7 +356,7 @@ private void generateClass(String packageName, String className, List<VariableEl
343356 // Save Method (Sync)
344357 printWriter .println (" public void save() {" );
345358 for (VariableElement field : fields ) {
346- generateFieldSave (printWriter , field , configValueName , dependencyTypes );
359+ generateFieldSave (printWriter , field , configValueName , dependencyTypes , depElements );
347360 }
348361 printWriter .println (" try {" );
349362 printWriter .println (" yamlConfiguration.save(file);" );
@@ -378,12 +391,12 @@ private void generateClass(String packageName, String className, List<VariableEl
378391 }
379392 }
380393
381- private String getFieldType (VariableElement field , Set <TypeElement > dependencyTypes ) {
394+ private String getFieldType (VariableElement field , Set <String > dependencyTypes , Map < String , TypeElement > depElements ) {
382395 TypeMirror typeMirror = field .asType ();
383396 TypeElement typeElement = getTypeElement (typeMirror );
384397
385398 // Check exact match
386- if (typeElement != null && dependencyTypes .contains (typeElement )) {
399+ if (typeElement != null && dependencyTypes .contains (typeElement . getQualifiedName (). toString () )) {
387400 return getGeneratedSimpleClassName (typeElement );
388401 }
389402
@@ -393,7 +406,7 @@ private String getFieldType(VariableElement field, Set<TypeElement> dependencyTy
393406 if (!dt .getTypeArguments ().isEmpty ()) {
394407 TypeMirror generic = dt .getTypeArguments ().getFirst ();
395408 TypeElement genericElement = getTypeElement (generic );
396- if (genericElement != null && dependencyTypes .contains (genericElement )) {
409+ if (genericElement != null && dependencyTypes .contains (genericElement . getQualifiedName (). toString () )) {
397410 return "List<" + getGeneratedSimpleClassName (genericElement ) + ">" ;
398411 }
399412 }
@@ -406,7 +419,7 @@ private String getHandleName(TypeElement type, VariableElement field) {
406419 return "HANDLE_" + typeName + "_" + field .getSimpleName ();
407420 }
408421
409- private void generateDependencyHelpers (PrintWriter printWriter , TypeElement typeElement , String configValueName ) {
422+ private void generateDependencyHelpers (PrintWriter printWriter , TypeElement typeElement , String configValueName , Set < String > dependencyTypes ) {
410423 String typeName = typeElement .getSimpleName ().toString ();
411424 List <VariableElement > fields = collectConfigurableFields (typeElement , configValueName );
412425
@@ -423,7 +436,7 @@ private void generateDependencyHelpers(PrintWriter printWriter, TypeElement type
423436 // Nested check
424437 TypeMirror fieldType = field .asType ();
425438 TypeElement fieldTypeElement = getTypeElement (fieldType );
426- boolean isNested = fieldTypeElement != null && isConfigurable (fieldTypeElement );
439+ boolean isNested = fieldTypeElement != null && dependencyTypes . contains (fieldTypeElement . getQualifiedName (). toString () );
427440
428441 if (isNested ) {
429442 printWriter .println (" map.put(\" " + path + "\" , serialize" + fieldTypeElement .getSimpleName () + "((" + getGeneratedSimpleClassName (fieldTypeElement ) + ") " + handleName + ".get(instance)));" );
@@ -453,7 +466,7 @@ private void generateDependencyHelpers(PrintWriter printWriter, TypeElement type
453466 // Nested check
454467 TypeMirror fieldType = field .asType ();
455468 TypeElement fieldTypeElement = getTypeElement (fieldType );
456- boolean isNested = fieldTypeElement != null && isConfigurable (fieldTypeElement );
469+ boolean isNested = fieldTypeElement != null && dependencyTypes . contains (fieldTypeElement . getQualifiedName (). toString () );
457470
458471 printWriter .println (" if (map.containsKey(\" " + path + "\" )) {" );
459472 if (isNested ) {
@@ -483,7 +496,7 @@ private void generateDependencyHelpers(PrintWriter printWriter, TypeElement type
483496 printWriter .println ();
484497 }
485498
486- private void generateFieldLoad (PrintWriter printWriter , VariableElement field , String configValueName , Set <TypeElement > dependencyTypes ) {
499+ private void generateFieldLoad (PrintWriter printWriter , VariableElement field , String configValueName , Set <String > dependencyTypes , Map < String , TypeElement > depElements ) {
487500 AnnotationMirror cv = getAnnotationMirror (field , configValueName );
488501 if (cv == null ) return ;
489502 String path = getAnnotationValue (cv , "fieldName" , String .class );
@@ -492,7 +505,7 @@ private void generateFieldLoad(PrintWriter printWriter, VariableElement field, S
492505
493506 // Check if nested
494507 TypeElement typeElement = getTypeElement (field .asType ());
495- boolean isNested = typeElement != null && dependencyTypes .contains (typeElement );
508+ boolean isNested = typeElement != null && dependencyTypes .contains (typeElement . getQualifiedName (). toString () );
496509
497510 // Check if List<Nested>
498511 boolean isListNested = false ;
@@ -501,7 +514,7 @@ private void generateFieldLoad(PrintWriter printWriter, VariableElement field, S
501514 DeclaredType dt = (DeclaredType ) field .asType ();
502515 if (!dt .getTypeArguments ().isEmpty ()) {
503516 listGenericType = getTypeElement (dt .getTypeArguments ().getFirst ());
504- if (listGenericType != null && dependencyTypes .contains (listGenericType )) {
517+ if (listGenericType != null && dependencyTypes .contains (listGenericType . getQualifiedName (). toString () )) {
505518 isListNested = true ;
506519 }
507520 }
@@ -535,14 +548,14 @@ private void generateFieldLoad(PrintWriter printWriter, VariableElement field, S
535548 printWriter .println (" }" );
536549 }
537550
538- private void generateFieldSave (PrintWriter printWriter , VariableElement field , String configValueName , Set <TypeElement > dependencyTypes ) {
551+ private void generateFieldSave (PrintWriter printWriter , VariableElement field , String configValueName , Set <String > dependencyTypes , Map < String , TypeElement > depElements ) {
539552 AnnotationMirror cv = getAnnotationMirror (field , configValueName );
540553 if (cv == null ) return ;
541554 String path = getAnnotationValue (cv , "fieldName" , String .class );
542555
543556 // Check nested
544557 TypeElement typeElement = getTypeElement (field .asType ());
545- boolean isNested = typeElement != null && dependencyTypes .contains (typeElement );
558+ boolean isNested = typeElement != null && dependencyTypes .contains (typeElement . getQualifiedName (). toString () );
546559
547560 // Check List<Nested>
548561 boolean isListNested = false ;
@@ -551,7 +564,7 @@ private void generateFieldSave(PrintWriter printWriter, VariableElement field, S
551564 DeclaredType dt = (DeclaredType ) field .asType ();
552565 if (!dt .getTypeArguments ().isEmpty ()) {
553566 listGenericType = getTypeElement (dt .getTypeArguments ().getFirst ());
554- if (listGenericType != null && dependencyTypes .contains (listGenericType )) {
567+ if (listGenericType != null && dependencyTypes .contains (listGenericType . getQualifiedName (). toString () )) {
555568 isListNested = true ;
556569 }
557570 }
0 commit comments