Rework inlined union generation
[mdsal.git] / binding / mdsal-binding-generator-impl / src / main / java / org / opendaylight / mdsal / binding / generator / impl / AbstractTypeGenerator.java
index 06d57f2544793321f4a57b4c4e7fceb8604c2b23..fd242571c98be016cd93b538cd86cf9ce8be6c7c 100644 (file)
@@ -1378,13 +1378,10 @@ abstract class AbstractTypeGenerator {
                 }
                 typeProvider.putReferencedType(leaf.getPath(), returnType);
             } else if (typeDef instanceof UnionTypeDefinition) {
-                GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((UnionTypeDefinition) typeDef, typeBuilder, leaf,
-                    parentModule);
-                if (genTOBuilder != null) {
-                    returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule);
-                    // Store the inner type within the union so that we can find the reference for it
-                    context.addInnerTypedefType(typeDef.getPath(), returnType);
-                }
+                final UnionTypeDefinition unionDef = (UnionTypeDefinition)typeDef;
+                returnType = addTOToTypeBuilder(unionDef, typeBuilder, leaf, parentModule);
+                // Store the inner type within the union so that we can find the reference for it
+                context.addInnerTypedefType(typeDef.getPath(), returnType);
             } else if (typeDef instanceof BitsTypeDefinition) {
                 GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((BitsTypeDefinition) typeDef, typeBuilder, leaf,
                     parentModule);
@@ -1587,11 +1584,8 @@ abstract class AbstractTypeGenerator {
                 returnType = new ReferencedTypeImpl(enumBuilder.getIdentifier());
                 typeProvider.putReferencedType(node.getPath(), returnType);
             } else if (typeDef instanceof UnionTypeDefinition) {
-                final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((UnionTypeDefinition)typeDef, typeBuilder,
-                    node, parentModule);
-                if (genTOBuilder != null) {
-                    returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule);
-                }
+                final UnionTypeDefinition unionDef = (UnionTypeDefinition)typeDef;
+                returnType = addTOToTypeBuilder(unionDef, typeBuilder, node, parentModule);
             } else if (typeDef instanceof BitsTypeDefinition) {
                 final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((BitsTypeDefinition)typeDef, typeBuilder,
                     node, parentModule);
@@ -1612,22 +1606,31 @@ abstract class AbstractTypeGenerator {
         return true;
     }
 
-    private Type createReturnTypeForUnion(final GeneratedTOBuilder genTOBuilder, final TypeDefinition<?> typeDef,
+    private Type createReturnTypeForUnion(final GeneratedTOBuilder genTOBuilder, final UnionTypeDefinition typeDef,
             final GeneratedTypeBuilder typeBuilder, final Module parentModule) {
-        final GeneratedTOBuilder returnType = typeProvider.newGeneratedTOBuilder(genTOBuilder.getIdentifier());
-
-        addCodegenInformation(returnType, parentModule, typeDef);
-        returnType.setSchemaPath(typeDef.getPath());
-        returnType.setModuleName(parentModule.getName());
+        final GeneratedTOBuilder returnTypeBuilder = typeProvider.newGeneratedTOBuilder(genTOBuilder.getIdentifier());
+        returnTypeBuilder.setIsUnion(true);
+        addCodegenInformation(returnTypeBuilder, parentModule, typeDef);
+        returnTypeBuilder.setSchemaPath(typeDef.getPath());
+        returnTypeBuilder.setModuleName(parentModule.getName());
+        final GeneratedTransferObject returnType = returnTypeBuilder.build();
 
         genTOBuilder.setTypedef(true);
         genTOBuilder.setIsUnion(true);
         AbstractTypeProvider.addUnitsToGenTO(genTOBuilder, typeDef.getUnits().orElse(null));
 
+        createUnionBuilder(genTOBuilder, typeBuilder, returnType, parentModule);
+        return returnType;
+    }
 
-
-        final GeneratedTOBuilder unionBuilder = createUnionBuilder(genTOBuilder, typeBuilder);
-
+    private void createUnionBuilder(final GeneratedTOBuilder genTOBuilder, final GeneratedTypeBuilder typeBuilder,
+            final GeneratedTransferObject returnType, final Module parentModule) {
+        // Append enclosing path hierarchy without dots
+        final StringBuilder sb = new StringBuilder();
+        genTOBuilder.getIdentifier().localNameComponents().forEach(sb::append);
+        final GeneratedTOBuilder unionBuilder = typeProvider.newGeneratedTOBuilder(
+            JavaTypeName.create(typeBuilder.getPackageName(), sb.append("Builder").toString()));
+        unionBuilder.setIsUnionBuilder(true);
 
         final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance");
         method.setReturnType(returnType);
@@ -1635,25 +1638,13 @@ abstract class AbstractTypeGenerator {
         method.setAccessModifier(AccessModifier.PUBLIC);
         method.setStatic(true);
 
+        final GeneratedTransferObject unionBuilderType = unionBuilder.build();
         final Set<Type> types = typeProvider.getAdditionalTypes().get(parentModule);
         if (types == null) {
-            typeProvider.getAdditionalTypes().put(parentModule,
-                    Sets.newHashSet(unionBuilder.build()));
+            typeProvider.getAdditionalTypes().put(parentModule, Sets.newHashSet(unionBuilderType));
         } else {
-            types.add(unionBuilder.build());
+            types.add(unionBuilderType);
         }
-        return returnType.build();
-    }
-
-    private GeneratedTOBuilder createUnionBuilder(final GeneratedTOBuilder genTOBuilder,
-            final GeneratedTypeBuilder typeBuilder) {
-        // Append enclosing path hierarchy without dots
-        final StringBuilder sb = new StringBuilder();
-        genTOBuilder.getIdentifier().localNameComponents().forEach(sb::append);
-        final GeneratedTOBuilder unionBuilder = typeProvider.newGeneratedTOBuilder(
-            JavaTypeName.create(typeBuilder.getPackageName(), sb.append("Builder").toString()));
-        unionBuilder.setIsUnionBuilder(true);
-        return unionBuilder;
     }
 
     private GeneratedTypeBuilder addDefaultInterfaceDefinition(final ModuleContext context,
@@ -1667,7 +1658,6 @@ abstract class AbstractTypeGenerator {
         return addDefaultInterfaceDefinition(packageName, schemaNode, baseInterface, context);
     }
 
-
     /**
      * Instantiates generated type builder with <code>packageName</code> and
      * <code>schemaNode</code>.
@@ -1967,7 +1957,7 @@ abstract class AbstractTypeGenerator {
      *            parent module
      * @return generated TO builder for <code>typeDef</code>
      */
-    private GeneratedTOBuilder addTOToTypeBuilder(final UnionTypeDefinition typeDef,
+    private Type addTOToTypeBuilder(final UnionTypeDefinition typeDef,
             final GeneratedTypeBuilder typeBuilder, final DataSchemaNode leaf, final Module parentModule) {
         final List<GeneratedTOBuilder> types = typeProvider.provideGeneratedTOBuildersForUnionTypeDef(
             typeBuilder.getIdentifier().createEnclosed(BindingMapping.getClassName(leaf.getQName())),
@@ -1976,12 +1966,17 @@ abstract class AbstractTypeGenerator {
         checkState(!types.isEmpty(), "No GeneratedTOBuilder objects generated from union %s", typeDef);
         final List<GeneratedTOBuilder> genTOBuilders = new ArrayList<>(types);
         final GeneratedTOBuilder resultTOBuilder = types.remove(0);
-        for (final GeneratedTOBuilder genTOBuilder : types) {
-            resultTOBuilder.addEnclosingTransferObject(genTOBuilder);
+        types.forEach(resultTOBuilder::addEnclosingTransferObject);
+        genTOBuilders.forEach(typeBuilder::addEnclosingTransferObject);
+
+        for (GeneratedTOBuilder builder : types) {
+            if (builder.isUnion()) {
+                final GeneratedTransferObject type = builder.build();
+                createUnionBuilder(builder, typeBuilder, type, parentModule);
+            }
         }
 
-        processEnclosedTOBuilderes(typeBuilder, genTOBuilders);
-        return resultTOBuilder;
+        return createReturnTypeForUnion(resultTOBuilder, typeDef, typeBuilder, parentModule);
     }
 
     /**
@@ -2014,14 +2009,6 @@ abstract class AbstractTypeGenerator {
 
     }
 
-    private static GeneratedTOBuilder processEnclosedTOBuilderes(final GeneratedTypeBuilder typeBuilder,
-            final List<GeneratedTOBuilder> genTOBuilders) {
-        for (final GeneratedTOBuilder genTOBuilder : genTOBuilders) {
-            typeBuilder.addEnclosingTransferObject(genTOBuilder);
-        }
-        return genTOBuilders.get(0);
-    }
-
     /**
      * Adds the implemented types to type builder.
      *