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 com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
13 import java.util.ArrayList;
14 import java.util.List;
15 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultTypedefRuntimeType;
16 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
17 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
18 import org.opendaylight.mdsal.binding.model.api.Type;
19 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
20 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
21 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
22 import org.opendaylight.mdsal.binding.runtime.api.TypedefRuntimeType;
23 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
24 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
25 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
28 * Generator corresponding to a {@code typedef} statement.
30 final class TypedefGenerator extends AbstractTypeObjectGenerator<TypedefEffectiveStatement, TypedefRuntimeType> {
32 * List of all generators for types directly derived from this typedef. We populate this list during initial type
33 * linking. It allows us to easily cascade inferences made by this typedef down the type derivation tree.
35 private List<AbstractTypeObjectGenerator<?, ?>> derivedGenerators = null;
37 TypedefGenerator(final TypedefEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent) {
38 super(statement, parent);
42 StatementNamespace namespace() {
43 return StatementNamespace.TYPEDEF;
47 void pushToInference(final SchemaInferenceStack dataTree) {
48 dataTree.enterTypedef(statement().argument());
51 void addDerivedGenerator(final AbstractTypeObjectGenerator<?, ?> derivedGenerator) {
52 if (derivedGenerators == null) {
53 derivedGenerators = new ArrayList<>(4);
55 derivedGenerators.add(requireNonNull(derivedGenerator));
59 void bindDerivedGenerators(final TypeReference reference) {
60 // Trigger any derived resolvers ...
61 if (derivedGenerators != null) {
62 for (AbstractTypeObjectGenerator<?, ?> derived : derivedGenerators) {
63 derived.bindTypeDefinition(reference);
66 // ... and make sure nobody can come in late
67 derivedGenerators = List.of();
71 ClassPlacement classPlacementImpl() {
72 return ClassPlacement.TOP_LEVEL;
76 TypeDefinition<?> extractTypeDefinition() {
77 return statement().getTypeDefinition();
81 GeneratedTransferObject createDerivedType(final TypeBuilderFactory builderFactory,
82 final GeneratedTransferObject baseType) {
83 final GeneratedTOBuilder builder = builderFactory.newGeneratedTOBuilder(typeName());
84 builder.setTypedef(true);
85 builder.setExtendsType(baseType);
86 builder.setIsUnion(baseType.isUnionType());
87 builder.setRestrictions(computeRestrictions());
88 YangSourceDefinition.of(currentModule().statement(), statement()).ifPresent(builder::setYangSourceDefinition);
90 final TypeDefinition<?> typedef = statement().getTypeDefinition();
91 annotateDeprecatedIfNecessary(typedef, builder);
92 addStringRegExAsConstant(builder, resolveRegExpressions(typedef));
93 addUnits(builder, typedef);
95 makeSerializable(builder);
96 return builder.build();
100 TypedefRuntimeType createExternalRuntimeType(final Type type) {
101 verify(type instanceof GeneratedType, "Unexpected type %s", type);
102 return new DefaultTypedefRuntimeType((GeneratedType) type, statement());
106 TypedefRuntimeType createInternalRuntimeType(final AugmentResolver resolver,
107 final TypedefEffectiveStatement statement, final Type type) {
108 // 'typedef' statements are not schema tree statements, they should not have internal references
109 throw new UnsupportedOperationException("Should never be called");
113 void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
114 // typedefs are a separate concept