2 * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.generator.impl.reactor;
10 import static java.util.Objects.requireNonNull;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
15 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
16 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
17 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
18 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
22 * Generator corresponding to a {@code typedef} statement.
24 final class TypedefGenerator extends AbstractTypeObjectGenerator<TypedefEffectiveStatement> {
26 * List of all generators for types directly derived from this typedef. We populate this list during initial type
27 * linking. It allows us to easily cascade inferences made by this typedef down the type derivation tree.
29 private List<AbstractTypeObjectGenerator<?>> derivedGenerators = null;
31 TypedefGenerator(final TypedefEffectiveStatement statement, final AbstractCompositeGenerator<?> parent) {
32 super(statement, parent);
36 StatementNamespace namespace() {
37 return StatementNamespace.TYPEDEF;
41 void pushToInference(final SchemaInferenceStack dataTree) {
42 dataTree.enterTypedef(statement().argument());
45 void addDerivedGenerator(final AbstractTypeObjectGenerator<?> derivedGenerator) {
46 if (derivedGenerators == null) {
47 derivedGenerators = new ArrayList<>(4);
49 derivedGenerators.add(requireNonNull(derivedGenerator));
53 void bindDerivedGenerators(final TypeReference reference) {
54 // Trigger any derived resolvers ...
55 if (derivedGenerators != null) {
56 for (AbstractTypeObjectGenerator<?> derived : derivedGenerators) {
57 derived.bindTypeDefinition(reference);
60 // ... and make sure nobody can come in late
61 derivedGenerators = List.of();
65 ClassPlacement classPlacementImpl() {
66 return ClassPlacement.TOP_LEVEL;
70 TypeDefinition<?> extractTypeDefinition() {
71 return statement().getTypeDefinition();
75 GeneratedTransferObject createDerivedType(final TypeBuilderFactory builderFactory,
76 final GeneratedTransferObject baseType) {
77 final GeneratedTOBuilder builder = builderFactory.newGeneratedTOBuilder(typeName());
78 builder.setTypedef(true);
79 builder.setExtendsType(baseType);
80 builder.setIsUnion(baseType.isUnionType());
81 builder.setRestrictions(computeRestrictions());
83 final TypeDefinition<?> typedef = statement().getTypeDefinition();
84 annotateDeprecatedIfNecessary(typedef, builder);
85 addStringRegExAsConstant(builder, resolveRegExpressions(typedef));
86 addUnits(builder, typedef);
88 makeSerializable(builder);
89 return builder.build();
93 void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
94 // typedefs are a separate concept