import static com.google.common.base.Verify.verify;
+import java.util.List;
+import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultCaseRuntimeType;
import org.opendaylight.mdsal.binding.model.api.GeneratedType;
import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
+import org.opendaylight.mdsal.binding.runtime.api.AugmentRuntimeType;
+import org.opendaylight.mdsal.binding.runtime.api.CaseRuntimeType;
+import org.opendaylight.mdsal.binding.runtime.api.RuntimeType;
import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
/**
* Generator corresponding to a {@code case} statement.
*/
-final class CaseGenerator extends CompositeSchemaTreeGenerator<CaseEffectiveStatement, CaseGenerator> {
- CaseGenerator(final CaseEffectiveStatement statement, final AbstractCompositeGenerator<?> parent) {
+final class CaseGenerator extends CompositeSchemaTreeGenerator<CaseEffectiveStatement, CaseRuntimeType> {
+ CaseGenerator(final CaseEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent) {
super(statement, parent);
}
@Override
GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
- final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
- builder.addImplementsType(BindingTypes.DATA_OBJECT);
// We also are implementing target choice's type. This is tricky, as we need to cover two distinct cases:
// - being a child of a choice (i.e. normal definition)
// - being a child of an augment (i.e. augmented into a choice)
- final AbstractCompositeGenerator<?> parent = getParent();
+ final AbstractCompositeGenerator<?, ?> parent = getParent();
final ChoiceGenerator choice;
if (parent instanceof AbstractAugmentGenerator) {
- final AbstractCompositeGenerator<?> target = ((AbstractAugmentGenerator) parent).targetGenerator();
+ final AbstractCompositeGenerator<?, ?> target = ((AbstractAugmentGenerator) parent).targetGenerator();
verify(target instanceof ChoiceGenerator, "Unexpected parent augment %s target %s", parent, target);
choice = (ChoiceGenerator) target;
} else {
// Most generators have a parent->child dependency due to parent methods' return types and therefore children
// must not request parent's type. That is not true for choice->case relationship and hence we do not need to
- // go through DefaultType here.
+ // go through DefaultType here
+ final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
+ // Note: this needs to be the first type we mention as we are relying on that fact for global runtime type
+ // choice/case indexing.
builder.addImplementsType(choice.getGeneratedType(builderFactory));
+
+ builder.addImplementsType(BindingTypes.DATA_OBJECT);
addAugmentable(builder);
addUsesInterfaces(builder, builderFactory);
addConcreteInterfaceMethods(builder);
return builder.build();
}
+
+ @Override
+ CompositeRuntimeTypeBuilder<CaseEffectiveStatement, CaseRuntimeType> createBuilder(
+ final CaseEffectiveStatement statement) {
+ return new CompositeRuntimeTypeBuilder<>(statement) {
+ @Override
+ CaseRuntimeType build(final GeneratedType generatedType, final CaseEffectiveStatement statement,
+ final List<RuntimeType> childTypes, final List<AugmentRuntimeType> augmentTypes) {
+ return new DefaultCaseRuntimeType(generatedType, statement, childTypes, augmentTypes);
+ }
+ };
+ }
}