Rework AugmentRuntimeType and Choice/Case linkage
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / ListGenerator.java
index a7c464e392f5f54e07824a5a9d7a5e6c3073dea4..07b2c5382fa63725ad7e37894a806000bcf30c32 100644 (file)
@@ -20,13 +20,13 @@ import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilde
 import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
 import org.opendaylight.mdsal.binding.model.ri.Types;
 import org.opendaylight.mdsal.binding.runtime.api.AugmentRuntimeType;
+import org.opendaylight.mdsal.binding.runtime.api.KeyRuntimeType;
 import org.opendaylight.mdsal.binding.runtime.api.ListRuntimeType;
 import org.opendaylight.mdsal.binding.runtime.api.RuntimeType;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.common.Ordering;
 import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
 /**
@@ -81,24 +81,17 @@ final class ListGenerator extends CompositeSchemaTreeGenerator<ListEffectiveStat
         return builder.build();
     }
 
-    @Override
-    ListRuntimeType createRuntimeType(final GeneratedType type, final ListEffectiveStatement statement,
-            final List<RuntimeType> children, final List<AugmentRuntimeType> augments) {
-        return new DefaultListRuntimeType(type, statement, children, augments,
-            keyGen != null ? keyGen.runtimeType().orElseThrow() : null);
+    private @Nullable KeyRuntimeType keyRuntimeType() {
+        final var gen = keyGen;
+        return gen != null ? gen.runtimeType().orElseThrow() : null;
     }
 
     @Override
     Type methodReturnType(final TypeBuilderFactory builderFactory) {
         final Type generatedType = super.methodReturnType(builderFactory);
         // We are wrapping the generated type in either a List or a Map based on presence of the key
-        if (keyGen != null) {
-            final Ordering ordering = statement()
-                .findFirstEffectiveSubstatementArgument(OrderedByEffectiveStatement.class)
-                .orElse(Ordering.SYSTEM);
-            if (ordering == Ordering.SYSTEM) {
-                return Types.mapTypeFor(keyGen.getGeneratedType(builderFactory), generatedType);
-            }
+        if (keyGen != null && statement().ordering() == Ordering.SYSTEM) {
+            return Types.mapTypeFor(keyGen.getGeneratedType(builderFactory), generatedType);
         }
 
         return Types.listTypeFor(generatedType);
@@ -117,4 +110,17 @@ final class ListGenerator extends CompositeSchemaTreeGenerator<ListEffectiveStat
 
         return ret;
     }
+
+    @Override
+    CompositeRuntimeTypeBuilder<ListEffectiveStatement, ListRuntimeType> createBuilder(
+            final ListEffectiveStatement statement) {
+        return new CompositeRuntimeTypeBuilder<>(statement) {
+            @Override
+            ListRuntimeType build(final GeneratedType type, final ListEffectiveStatement statement,
+                    final List<RuntimeType> children, final List<AugmentRuntimeType> augments) {
+                // FIXME: the key here is not rebased correctly :(
+                return new DefaultListRuntimeType(type, statement, children, augments, keyRuntimeType());
+            }
+        };
+    }
 }