8bca3a398da8ac9d6f33125179d25a8135808b6a
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / TypedefGenerator.java
1 /*
2  * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.generator.impl.reactor;
9
10 import static java.util.Objects.requireNonNull;
11
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;
20
21 /**
22  * Generator corresponding to a {@code typedef} statement.
23  */
24 final class TypedefGenerator extends AbstractTypeObjectGenerator<TypedefEffectiveStatement> {
25     /**
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.
28      */
29     private List<AbstractTypeObjectGenerator<?>> derivedGenerators = null;
30
31     TypedefGenerator(final TypedefEffectiveStatement statement, final AbstractCompositeGenerator<?> parent) {
32         super(statement, parent);
33     }
34
35     @Override
36     StatementNamespace namespace() {
37         return StatementNamespace.TYPEDEF;
38     }
39
40     @Override
41     void pushToInference(final SchemaInferenceStack dataTree) {
42         dataTree.enterTypedef(statement().argument());
43     }
44
45     void addDerivedGenerator(final AbstractTypeObjectGenerator<?> derivedGenerator) {
46         if (derivedGenerators == null) {
47             derivedGenerators = new ArrayList<>(4);
48         }
49         derivedGenerators.add(requireNonNull(derivedGenerator));
50     }
51
52     @Override
53     void bindDerivedGenerators(final TypeReference reference) {
54         // Trigger any derived resolvers ...
55         if (derivedGenerators != null) {
56             for (AbstractTypeObjectGenerator<?> derived : derivedGenerators) {
57                 derived.bindTypeDefinition(reference);
58             }
59         }
60         // ... and make sure nobody can come in late
61         derivedGenerators = List.of();
62     }
63
64     @Override
65     ClassPlacement classPlacementImpl() {
66         return ClassPlacement.TOP_LEVEL;
67     }
68
69     @Override
70     TypeDefinition<?> extractTypeDefinition() {
71         return statement().getTypeDefinition();
72     }
73
74     @Override
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());
82
83         final TypeDefinition<?> typedef = statement().getTypeDefinition();
84         annotateDeprecatedIfNecessary(typedef, builder);
85         addStringRegExAsConstant(builder, resolveRegExpressions(typedef));
86         addUnits(builder, typedef);
87
88         makeSerializable(builder);
89         return builder.build();
90     }
91
92     @Override
93     void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
94         // typedefs are a separate concept
95     }
96 }