3030import javax .lang .model .type .DeclaredType ;
3131import javax .lang .model .type .TypeKind ;
3232import javax .lang .model .type .TypeMirror ;
33+ import javax .lang .model .util .Elements ;
3334import javax .tools .Diagnostic ;
3435import javax .tools .StandardLocation ;
3536import java .io .IOException ;
4142import java .util .List ;
4243import java .util .Map ;
4344import java .util .Set ;
45+ import java .util .function .Function ;
4446
4547import static java .lang .Boolean .parseBoolean ;
4648import static javax .lang .model .util .ElementFilter .fieldsIn ;
@@ -374,7 +376,8 @@ private void processElement(Element element, @Nullable Element parent) {
374376 // skip it completely
375377 return ;
376378 }
377- else if ( isEntityOrEmbeddable ( element ) && !element .getModifiers ().contains ( Modifier .PRIVATE )) {
379+ else if ( isEntityOrEmbeddable ( element )
380+ && !element .getModifiers ().contains ( Modifier .PRIVATE ) ) {
378381 context .logMessage ( Diagnostic .Kind .OTHER , "Processing annotated entity class '" + element + "'" );
379382 handleRootElementAnnotationMirrors ( element , parent );
380383 }
@@ -409,30 +412,14 @@ else if ( element instanceof TypeElement typeElement ) {
409412 }
410413 }
411414 if ( enclosesEntityOrEmbeddable ( element ) ) {
412- AnnotationMetaEntity parentMeta = null ;
413- if ( parent instanceof TypeElement parentElement ) {
414- final String key = parentElement .getQualifiedName ().toString ();
415- if ( context .getMetamodel ( key ) instanceof AnnotationMetaEntity parentMetaEntity ) {
416- parentMeta = parentMetaEntity ;
417- }
418- }
419- final NonManagedMetamodel metaEntity =
420- NonManagedMetamodel .create (
421- typeElement , context ,
422- false , parentMeta );
415+ final AnnotationMetaEntity parentMeta = parentMetadata ( parent , context ::getMetamodel );
416+ final NonManagedMetamodel metaEntity =
417+ NonManagedMetamodel .create ( typeElement , context , false , parentMeta );
423418 context .addMetaEntity ( metaEntity .getQualifiedName (), metaEntity );
424- if ( context .generateJakartaDataStaticMetamodel ()) {
425- AnnotationMetaEntity parentDataMeta = null ;
426- if ( parent instanceof TypeElement parentElement ) {
427- final String key = parentElement .getQualifiedName ().toString ();
428- if ( context .getDataMetaEntity ( key ) instanceof AnnotationMetaEntity parentMetaEntity ) {
429- parentDataMeta = parentMetaEntity ;
430- }
431- }
432- final NonManagedMetamodel dataMetaEntity =
433- NonManagedMetamodel .create (
434- typeElement , context ,
435- true , parentDataMeta );
419+ if ( context .generateJakartaDataStaticMetamodel () ) {
420+ final AnnotationMetaEntity parentDataMeta = parentMetadata ( parent , context ::getDataMetaEntity );
421+ final NonManagedMetamodel dataMetaEntity =
422+ NonManagedMetamodel .create ( typeElement , context , true , parentDataMeta );
436423 context .addDataMetaEntity ( dataMetaEntity .getQualifiedName (), dataMetaEntity );
437424 }
438425
@@ -458,6 +445,17 @@ else if ( element instanceof TypeElement typeElement ) {
458445 }
459446 }
460447
448+ private AnnotationMetaEntity parentMetadata (Element parent , Function <String ,Object > metamodel ) {
449+ if ( parent instanceof TypeElement parentElement
450+ && metamodel .apply ( parentElement .getQualifiedName ().toString () )
451+ instanceof AnnotationMetaEntity parentMetaEntity ) {
452+ return parentMetaEntity ;
453+ }
454+ else {
455+ return null ;
456+ }
457+ }
458+
461459 private boolean hasPackageAnnotation (Element element , String annotation ) {
462460 final PackageElement pack = context .getElementUtils ().getPackageOf ( element ); // null for module descriptor
463461 return pack != null && hasAnnotation ( pack , annotation );
@@ -562,15 +560,18 @@ private boolean modelGenerationNeedsToBeDeferred(Collection<Metamodel> entities,
562560 }
563561
564562 private static boolean enclosesEntityOrEmbeddable (Element element ) {
565- if ( !(element instanceof TypeElement typeElement ) ) {
563+ if ( element instanceof TypeElement typeElement ) {
564+ for ( final Element enclosedElement : typeElement .getEnclosedElements () ) {
565+ if ( isEntityOrEmbeddable ( enclosedElement )
566+ || enclosesEntityOrEmbeddable ( enclosedElement ) ) {
567+ return true ;
568+ }
569+ }
566570 return false ;
567571 }
568- for ( final Element enclosedElement : typeElement .getEnclosedElements () ) {
569- if ( isEntityOrEmbeddable ( enclosedElement ) || enclosesEntityOrEmbeddable ( enclosedElement ) ) {
570- return true ;
571- }
572+ else {
573+ return false ;
572574 }
573- return false ;
574575 }
575576
576577 private static boolean isEntityOrEmbeddable (Element element ) {
@@ -783,13 +784,14 @@ else if ( hasAnnotation( typeElement, EMBEDDABLE ) ) {
783784
784785 private void writeIndex () {
785786 final ProcessingEnvironment processingEnvironment = context .getProcessingEnvironment ();
787+ final Elements elementUtils = processingEnvironment .getElementUtils ();
786788 context .getEntityNameMappings ().forEach ((entityName , className ) -> {
787789 try (Writer writer = processingEnvironment .getFiler ()
788790 .createResource (
789791 StandardLocation .SOURCE_OUTPUT ,
790792 ENTITY_INDEX ,
791793 entityName ,
792- processingEnvironment . getElementUtils () .getTypeElement ( className )
794+ elementUtils .getTypeElement ( className )
793795 )
794796 .openWriter ()) {
795797 writer .append (className );
@@ -801,11 +803,12 @@ private void writeIndex() {
801803 }
802804 });
803805 context .getEnumTypesByValue ().forEach ((valueName , enumTypeNames ) -> {
804- try (Writer writer = processingEnvironment .getFiler ().createResource (
806+ try (Writer writer = processingEnvironment .getFiler ()
807+ .createResource (
805808 StandardLocation .SOURCE_OUTPUT ,
806809 ENTITY_INDEX ,
807810 '.' + valueName ,
808- processingEnvironment . getElementUtils () .getTypeElement ( enumTypeNames .iterator ().next () )
811+ elementUtils .getTypeElement ( enumTypeNames .iterator ().next () )
809812 )
810813 .openWriter ()) {
811814 for (String enumTypeName : enumTypeNames ) {
0 commit comments