Rework BindingRuntimeTypes
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / TypedefGenerator.java
index 8bca3a398da8ac9d6f33125179d25a8135808b6a..3267b83aa530c022fa0b9d46dde9c0f9f82792f1 100644 (file)
@@ -7,13 +7,18 @@
  */
 package org.opendaylight.mdsal.binding.generator.impl.reactor;
 
+import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
 import java.util.ArrayList;
 import java.util.List;
+import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultTypedefRuntimeType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
+import org.opendaylight.mdsal.binding.model.api.GeneratedType;
+import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
+import org.opendaylight.mdsal.binding.runtime.api.TypedefRuntimeType;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
@@ -21,14 +26,14 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 /**
  * Generator corresponding to a {@code typedef} statement.
  */
-final class TypedefGenerator extends AbstractTypeObjectGenerator<TypedefEffectiveStatement> {
+final class TypedefGenerator extends AbstractTypeObjectGenerator<TypedefEffectiveStatement, TypedefRuntimeType> {
     /**
      * List of all generators for types directly derived from this typedef. We populate this list during initial type
      * linking. It allows us to easily cascade inferences made by this typedef down the type derivation tree.
      */
-    private List<AbstractTypeObjectGenerator<?>> derivedGenerators = null;
+    private List<AbstractTypeObjectGenerator<?, ?>> derivedGenerators = null;
 
-    TypedefGenerator(final TypedefEffectiveStatement statement, final AbstractCompositeGenerator<?> parent) {
+    TypedefGenerator(final TypedefEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent) {
         super(statement, parent);
     }
 
@@ -42,7 +47,7 @@ final class TypedefGenerator extends AbstractTypeObjectGenerator<TypedefEffectiv
         dataTree.enterTypedef(statement().argument());
     }
 
-    void addDerivedGenerator(final AbstractTypeObjectGenerator<?> derivedGenerator) {
+    void addDerivedGenerator(final AbstractTypeObjectGenerator<?, ?> derivedGenerator) {
         if (derivedGenerators == null) {
             derivedGenerators = new ArrayList<>(4);
         }
@@ -53,7 +58,7 @@ final class TypedefGenerator extends AbstractTypeObjectGenerator<TypedefEffectiv
     void bindDerivedGenerators(final TypeReference reference) {
         // Trigger any derived resolvers ...
         if (derivedGenerators != null) {
-            for (AbstractTypeObjectGenerator<?> derived : derivedGenerators) {
+            for (AbstractTypeObjectGenerator<?, ?> derived : derivedGenerators) {
                 derived.bindTypeDefinition(reference);
             }
         }
@@ -89,6 +94,17 @@ final class TypedefGenerator extends AbstractTypeObjectGenerator<TypedefEffectiv
         return builder.build();
     }
 
+    @Override
+    TypedefRuntimeType createRuntimeType(final Type type) {
+        verify(type instanceof GeneratedType, "Unexpected type %s", type);
+        return new DefaultTypedefRuntimeType((GeneratedType) type, statement());
+    }
+
+    @Override
+    TypedefRuntimeType rebaseRuntimeType(final TypedefRuntimeType type, final TypedefEffectiveStatement statement) {
+        return new DefaultTypedefRuntimeType(type.javaType(), statement);
+    }
+
     @Override
     void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
         // typedefs are a separate concept