Do not confuse nested type with available types
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / AbstractJavaGeneratedType.java
index fe60bbbf27aeb924e9c8f03e404866b3541ed212..0d368f0252035d983d6e3af79634e373e3cf45d6 100644 (file)
@@ -13,13 +13,15 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Streams;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.concurrent.NotThreadSafe;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.binding.model.api.Enumeration;
+import org.opendaylight.mdsal.binding.model.api.Enumeration.Pair;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
@@ -48,18 +50,27 @@ abstract class AbstractJavaGeneratedType {
             b.put(type.getIdentifier().simpleName(), new NestedJavaGeneratedType(this, type));
         }
         enclosedTypes = b.build();
-        conflictingNames = ImmutableSet.of();
-    }
 
-    AbstractJavaGeneratedType(final JavaTypeName name, final GeneratedType genType) {
-        this.name = requireNonNull(name);
-        enclosedTypes = ImmutableMap.of();
+        final Set<String> cb = new HashSet<>();
+        if (genType instanceof Enumeration) {
+            ((Enumeration) genType).getValues().stream().map(Pair::getMappedName).forEach(cb::add);
+        }
+        // TODO: perhaps we can do something smarter to actually access the types
+        collectAccessibleTypes(cb, genType);
+
+        conflictingNames = ImmutableSet.copyOf(cb);
+    }
 
-        // This is a workaround for BuilderTemplate, which does not model itself correctly -- it should generate
-        // a GeneratedType for the Builder with a nested type for the implementation, which really should be
-        // a different template which gets generated as an inner type.
-        conflictingNames = Streams.concat(genType.getEnclosedTypes().stream(), genType.getEnumerations().stream())
-        .map(type -> type.getIdentifier().simpleName()).collect(ImmutableSet.toImmutableSet());
+    private void collectAccessibleTypes(Set<String> set, GeneratedType type) {
+        for (Type impl : type.getImplements()) {
+            if (impl instanceof GeneratedType) {
+                final GeneratedType genType = (GeneratedType) impl;
+                for (GeneratedType inner : Iterables.concat(genType.getEnclosedTypes(), genType.getEnumerations())) {
+                    set.add(inner.getIdentifier().simpleName());
+                }
+                collectAccessibleTypes(set, genType);
+            }
+        }
     }
 
     final JavaTypeName getName() {