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 63a6e8d9afd5195557b470b3ef1339654e58afef..07b2c5382fa63725ad7e37894a806000bcf30c32 100644 (file)
@@ -9,7 +9,9 @@ package org.opendaylight.mdsal.binding.generator.impl.reactor;
 
 import static org.opendaylight.mdsal.binding.model.ri.BindingTypes.identifiable;
 
+import java.util.List;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultListRuntimeType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature.ValueMechanics;
 import org.opendaylight.mdsal.binding.model.api.Type;
@@ -17,20 +19,23 @@ import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilde
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
 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;
 
 /**
  * Generator corresponding to a {@code list} statement.
  */
-final class ListGenerator extends CompositeSchemaTreeGenerator<ListEffectiveStatement, ListGenerator> {
+final class ListGenerator extends CompositeSchemaTreeGenerator<ListEffectiveStatement, ListRuntimeType> {
     private final @Nullable KeyGenerator keyGen;
 
-    ListGenerator(final ListEffectiveStatement statement, final AbstractCompositeGenerator<?> parent) {
+    ListGenerator(final ListEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent) {
         super(statement, parent);
         keyGen = statement.findFirstEffectiveSubstatement(KeyEffectiveStatement.class)
             .map(key -> new KeyGenerator(key, parent, this))
@@ -76,17 +81,17 @@ final class ListGenerator extends CompositeSchemaTreeGenerator<ListEffectiveStat
         return builder.build();
     }
 
+    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);
@@ -105,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());
+            }
+        };
+    }
 }