e0bed7821b364caa5738ec3d6bd379b9335364bf
[yangtools.git] / model / yang-model-ri / src / main / java / org / opendaylight / yangtools / yang / model / ri / stmt / DeclaredStatements.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.yangtools.yang.model.ri.stmt;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.collect.ImmutableList;
12 import java.util.List;
13 import java.util.Set;
14 import org.eclipse.jdt.annotation.NonNullByDefault;
15 import org.opendaylight.yangtools.yang.common.Ordering;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.common.Revision;
18 import org.opendaylight.yangtools.yang.common.Uint32;
19 import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
20 import org.opendaylight.yangtools.yang.common.XMLNamespace;
21 import org.opendaylight.yangtools.yang.common.YangVersion;
22 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
23 import org.opendaylight.yangtools.yang.model.api.PathExpression;
24 import org.opendaylight.yangtools.yang.model.api.Status;
25 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
26 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
27 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureExpr;
53 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
54 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
60 import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement;
61 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
62 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
63 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
64 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
65 import org.opendaylight.yangtools.yang.model.api.stmt.ModifierStatement;
66 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
67 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
68 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
69 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
70 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
71 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
72 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
73 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
74 import org.opendaylight.yangtools.yang.model.api.stmt.PatternExpression;
75 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
76 import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
77 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
78 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
79 import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
80 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
81 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
82 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
83 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
84 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
85 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
86 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
87 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
88 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
89 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
90 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
91 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
92 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
93 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
94 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
95 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
96 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
97 import org.opendaylight.yangtools.yang.model.api.stmt.ValueRange;
98 import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
99 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
100 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
101 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
102 import org.opendaylight.yangtools.yang.model.api.type.ModifierKind;
103 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.DeviateStatementImpl;
104 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.DeviationStatementImpl;
105 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyActionStatement;
106 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyAnydataStatement;
107 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyAnyxmlStatement;
108 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyArgumentStatement;
109 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyAugmentStatement;
110 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyBaseStatement;
111 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyBelongsToStatement;
112 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyBitStatement;
113 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyCaseStatement;
114 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyChoiceStatement;
115 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyConfigStatement;
116 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyContactStatement;
117 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyContainerStatement;
118 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyDefaultStatement;
119 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyDescriptionStatement;
120 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyEnumStatement;
121 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyErrorAppTagStatement;
122 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyErrorMessageStatement;
123 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyExtensionStatement;
124 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyFeatureStatement;
125 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyFractionDigitsStatement;
126 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyGroupingStatement;
127 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyIdentityStatement;
128 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyIfFeatureStatement;
129 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyIncludeStatement;
130 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyInputStatement;
131 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyKeyStatement;
132 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyLeafListStatement;
133 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyLeafStatement;
134 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyLengthStatement;
135 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyListStatement;
136 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyMandatoryStatement;
137 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyMaxElementsStatement;
138 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyMinElementsStatement;
139 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyModifierStatement;
140 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyMustStatement;
141 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyNamespaceStatement;
142 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyNotificationStatement;
143 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyOrderedByStatement;
144 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyOrganizationStatement;
145 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyOutputStatement;
146 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyPathStatement;
147 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyPatternStatement;
148 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyPositionStatement;
149 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyPrefixStatement;
150 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyPresenceStatement;
151 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRangeStatement;
152 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyReferenceStatement;
153 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRequireInstanceStatement;
154 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRevisionDateStatement;
155 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRevisionStatement;
156 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRpcStatement;
157 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyStatusStatement;
158 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyTypeStatement;
159 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyTypedefStatement;
160 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyUniqueStatement;
161 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyUnitsStatement;
162 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyUsesStatement;
163 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyValueStatement;
164 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyWhenStatement;
165 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyYangVersionStatement;
166 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyYinElementStatement;
167 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.ImportStatementImpl;
168 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.ModuleStatementImpl;
169 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RefineStatementImpl;
170 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularActionStatement;
171 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularAnydataStatement;
172 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularAnyxmlStatement;
173 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularArgumentStatement;
174 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularAugmentStatement;
175 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularBaseStatement;
176 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularBelongsToStatement;
177 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularBitStatement;
178 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularCaseStatement;
179 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularChoiceStatement;
180 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularConfigStatement;
181 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularContactStatement;
182 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularContainerStatement;
183 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularDefaultStatement;
184 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularDescriptionStatement;
185 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularEnumStatement;
186 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularErrorAppTagStatement;
187 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularErrorMessageStatement;
188 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularExtensionStatement;
189 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularFeatureStatement;
190 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularFractionDigitsStatement;
191 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularGroupingStatement;
192 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularIdentityStatement;
193 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularIfFeatureStatement;
194 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularIncludeStatement;
195 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularInputStatement;
196 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularKeyStatement;
197 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularLeafListStatement;
198 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularLeafStatement;
199 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularLengthStatement;
200 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularListStatement;
201 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularMandatoryStatement;
202 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularMaxElementsStatement;
203 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularMinElementsStatement;
204 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularModifierStatement;
205 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularMustStatement;
206 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularNamespaceStatement;
207 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularNotificationStatement;
208 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularOrderedByStatement;
209 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularOrganizationStatement;
210 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularOutputStatement;
211 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularPathStatement;
212 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularPatternStatement;
213 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularPositionStatement;
214 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularPrefixStatement;
215 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularPresenceStatement;
216 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularRangeStatement;
217 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularReferenceStatement;
218 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularRequireInstanceStatement;
219 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularRevisionDateStatement;
220 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularRevisionStatement;
221 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularRpcStatement;
222 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularStatusStatement;
223 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularTypeStatement;
224 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularTypedefStatement;
225 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularUniqueStatement;
226 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularUnitsStatement;
227 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularUsesStatement;
228 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularValueStatement;
229 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularWhenStatement;
230 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularYangVersionStatement;
231 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.RegularYinElementStatement;
232 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.SubmoduleStatementImpl;
233 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.UnrecognizedStatementImpl;
234 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
235
236 /**
237  * Static entry point to instantiating {@link DeclaredStatement} covered in the {@code RFC7950} metamodel.
238  */
239 @Beta
240 @NonNullByDefault
241 public final class DeclaredStatements {
242     private DeclaredStatements() {
243         // Hidden on purpose
244     }
245
246     public static ActionStatement createAction(final QName argument,
247             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
248         return substatements.isEmpty() ? new EmptyActionStatement(argument)
249             : new RegularActionStatement(argument, substatements);
250     }
251
252     public static AnydataStatement createAnydata(final QName argument,
253             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
254         return substatements.isEmpty() ? new EmptyAnydataStatement(argument)
255             : new RegularAnydataStatement(argument, substatements);
256     }
257
258     public static AnyxmlStatement createAnyxml(final QName argument,
259             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
260         return substatements.isEmpty() ? new EmptyAnyxmlStatement(argument)
261             : new RegularAnyxmlStatement(argument, substatements);
262     }
263
264     public static ArgumentStatement createArgument(final QName argument,
265             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
266         return substatements.isEmpty() ? new EmptyArgumentStatement(argument)
267             : new RegularArgumentStatement(argument, substatements);
268     }
269
270     public static AugmentStatement createAugment(final String rawArgument, final SchemaNodeIdentifier argument,
271             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
272         return substatements.isEmpty() ? new EmptyAugmentStatement(rawArgument, argument)
273             : new RegularAugmentStatement(rawArgument, argument, substatements);
274     }
275
276     public static BaseStatement createBase(final QName argument,
277             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
278         return substatements.isEmpty() ? new EmptyBaseStatement(argument)
279             : new RegularBaseStatement(argument, substatements);
280     }
281
282     public static BelongsToStatement createBelongsTo(final String argument,
283             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
284         return substatements.isEmpty() ? new EmptyBelongsToStatement(argument)
285             : new RegularBelongsToStatement(argument, substatements);
286     }
287
288     public static BitStatement createBit(final String argument,
289             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
290         return substatements.isEmpty() ? new EmptyBitStatement(argument)
291             : new RegularBitStatement(argument, substatements);
292     }
293
294     public static CaseStatement createCase(final QName argument,
295             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
296         return substatements.isEmpty() ? new EmptyCaseStatement(argument)
297             : new RegularCaseStatement(argument, substatements);
298     }
299
300     public static ChoiceStatement createChoice(final QName argument,
301             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
302         return substatements.isEmpty() ? new EmptyChoiceStatement(argument)
303             : new RegularChoiceStatement(argument, substatements);
304     }
305
306     public static ConfigStatement createConfig(final boolean argument) {
307         return argument ? EmptyConfigStatement.TRUE : EmptyConfigStatement.FALSE;
308     }
309
310     public static ConfigStatement createConfig(final Boolean argument,
311             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
312         return substatements.isEmpty() ? createConfig(argument) : new RegularConfigStatement(argument, substatements);
313     }
314
315     public static ContactStatement createContact(final String argument) {
316         return new EmptyContactStatement(argument);
317     }
318
319     public static ContactStatement createContact(final String argument,
320             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
321         return substatements.isEmpty() ? createContact(argument) : new RegularContactStatement(argument, substatements);
322     }
323
324     public static ContainerStatement createContainer(final QName argument,
325             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
326         return substatements.isEmpty() ? new EmptyContainerStatement(argument)
327             : new RegularContainerStatement(argument, substatements);
328     }
329
330     public static DefaultStatement createDefault(final String argument,
331             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
332         return substatements.isEmpty() ? new EmptyDefaultStatement(argument)
333             : new RegularDefaultStatement(argument, substatements);
334     }
335
336     public static DescriptionStatement createDescription(final String argument,
337             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
338         return substatements.isEmpty() ? new EmptyDescriptionStatement(argument)
339             : new RegularDescriptionStatement(argument, substatements);
340     }
341
342     public static DeviateStatement createDeviate(final DeviateKind argument,
343             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
344         return new DeviateStatementImpl(argument, substatements);
345     }
346
347     public static DeviationStatement createDeviation(final String rawArgument, final Absolute argument,
348             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
349         return new DeviationStatementImpl(rawArgument, argument, substatements);
350     }
351
352     // FIXME: what is the distinction between rawArgument and argument?
353     public static EnumStatement createEnum(final String rawArgument, final String argument,
354             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
355         return substatements.isEmpty() ? new EmptyEnumStatement(rawArgument, argument)
356             : new RegularEnumStatement(rawArgument, argument, substatements);
357     }
358
359     public static ErrorAppTagStatement createErrorAppTag(final String argument,
360             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
361         return substatements.isEmpty() ? new EmptyErrorAppTagStatement(argument)
362             : new RegularErrorAppTagStatement(argument, substatements);
363     }
364
365     public static ErrorMessageStatement createErrorMessage(final String argument,
366             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
367         return substatements.isEmpty() ? new EmptyErrorMessageStatement(argument)
368             : new RegularErrorMessageStatement(argument, substatements);
369     }
370
371     public static ExtensionStatement createExtension(final QName argument,
372             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
373         return substatements.isEmpty() ? new EmptyExtensionStatement(argument)
374             : new RegularExtensionStatement(argument, substatements);
375     }
376
377     public static FeatureStatement createFeature(final QName argument,
378             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
379         return substatements.isEmpty() ? new EmptyFeatureStatement(argument)
380             : new RegularFeatureStatement(argument, substatements);
381     }
382
383     public static FractionDigitsStatement createFractionDigits(final int argument) {
384         return EmptyFractionDigitsStatement.of(argument);
385     }
386
387     public static FractionDigitsStatement createFractionDigits(final Integer argument,
388             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
389         return substatements.isEmpty() ? createFractionDigits(argument)
390             : new RegularFractionDigitsStatement(argument, substatements);
391     }
392
393     public static GroupingStatement createGrouping(final QName argument,
394             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
395         return substatements.isEmpty() ? new EmptyGroupingStatement(argument)
396             : new RegularGroupingStatement(argument, substatements);
397     }
398
399     public static IdentityStatement createIdentity(final QName argument,
400             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
401         return substatements.isEmpty() ? new EmptyIdentityStatement(argument)
402             : new RegularIdentityStatement(argument, substatements);
403     }
404
405     public static IfFeatureStatement createIfFeature(final String rawArgument, final IfFeatureExpr argument,
406             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
407         return substatements.isEmpty() ? new EmptyIfFeatureStatement(rawArgument, argument)
408             : new RegularIfFeatureStatement(rawArgument, argument, substatements);
409     }
410
411     public static ImportStatement createImport(final String argument,
412             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
413         return new ImportStatementImpl(argument, substatements);
414     }
415
416     public static IncludeStatement createInclude(final String rawArgument, final String argument,
417             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
418         return substatements.isEmpty() ? new EmptyIncludeStatement(rawArgument, argument)
419             : new RegularIncludeStatement(rawArgument, argument, substatements);
420     }
421
422     public static InputStatement createInput(final QName argument) {
423         return new EmptyInputStatement(argument);
424     }
425
426     public static InputStatement createInput(final QName argument,
427             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
428         return substatements.isEmpty() ? createInput(argument) : new RegularInputStatement(argument, substatements);
429     }
430
431     public static KeyStatement createKey(final String rawArgument, final Set<QName> argument,
432             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
433         return substatements.isEmpty() ? new EmptyKeyStatement(rawArgument, argument)
434             : new RegularKeyStatement(rawArgument, argument, substatements);
435     }
436
437     public static LeafStatement createLeaf(final QName argument,
438             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
439         return substatements.isEmpty() ? new EmptyLeafStatement(argument)
440             : new RegularLeafStatement(argument, substatements);
441     }
442
443     public static LeafListStatement createLeafList(final QName argument,
444             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
445         return substatements.isEmpty() ? new EmptyLeafListStatement(argument)
446             : new RegularLeafListStatement(argument, substatements);
447     }
448
449     public static LengthStatement createLength(final String rawArgument, final List<ValueRange> argument,
450             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
451         return substatements.isEmpty() ? new EmptyLengthStatement(rawArgument, argument)
452             : new RegularLengthStatement(rawArgument, argument, substatements);
453     }
454
455     public static ListStatement createList(final QName argument,
456             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
457         return substatements.isEmpty() ? new EmptyListStatement(argument)
458             : new RegularListStatement(argument, substatements);
459     }
460
461     public static MandatoryStatement createMandatory(final Boolean argument) {
462         return new EmptyMandatoryStatement(argument);
463     }
464
465     public static MandatoryStatement createMandatory(final Boolean argument,
466             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
467         return substatements.isEmpty() ? createMandatory(argument)
468             : new RegularMandatoryStatement(argument, substatements);
469     }
470
471     public static MaxElementsStatement createMaxElements(final String rawArgument, final String argument,
472             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
473         return substatements.isEmpty() ? new EmptyMaxElementsStatement(rawArgument, argument)
474             : new RegularMaxElementsStatement(rawArgument, argument, substatements);
475     }
476
477     public static MinElementsStatement createMinElements(final Integer argument) {
478         return new EmptyMinElementsStatement(argument);
479     }
480
481     public static MinElementsStatement createMinElements(final Integer argument,
482             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
483         return substatements.isEmpty() ? createMinElements(argument)
484             : new RegularMinElementsStatement(argument, substatements);
485     }
486
487     public static ModifierStatement createModifier(final ModifierKind argument,
488             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
489         return substatements.isEmpty() ? new EmptyModifierStatement(argument)
490             : new RegularModifierStatement(argument, substatements);
491     }
492
493     public static ModuleStatement createModule(final String rawArgument, final Unqualified argument,
494             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
495         return new ModuleStatementImpl(rawArgument, argument, substatements);
496     }
497
498     public static MustStatement createMust(final String rawArgument, final QualifiedBound argument,
499             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
500         return substatements.isEmpty() ? new EmptyMustStatement(rawArgument, argument)
501             : new RegularMustStatement(rawArgument, argument, substatements);
502     }
503
504     public static NamespaceStatement createNamespace(final XMLNamespace argument,
505             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
506         return substatements.isEmpty() ? new EmptyNamespaceStatement(argument)
507             : new RegularNamespaceStatement(argument, substatements);
508     }
509
510     public static NotificationStatement createNotification(final QName argument,
511             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
512         return substatements.isEmpty() ? new EmptyNotificationStatement(argument)
513             : new RegularNotificationStatement(argument, substatements);
514     }
515
516     public static OrganizationStatement createOrganization(final String argument) {
517         return new EmptyOrganizationStatement(argument);
518     }
519
520     public static OrganizationStatement createOrganization(final String argument,
521             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
522         return substatements.isEmpty() ? createOrganization(argument)
523             : new RegularOrganizationStatement(argument, substatements);
524     }
525
526     public static OutputStatement createOutput(final QName argument) {
527         return new EmptyOutputStatement(argument);
528     }
529
530     public static OutputStatement createOutput(final QName argument,
531             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
532         return substatements.isEmpty() ? createOutput(argument) : new RegularOutputStatement(argument, substatements);
533     }
534
535     public static OrderedByStatement createOrderedBy(final Ordering argument) {
536         return new EmptyOrderedByStatement(argument);
537     }
538
539     public static OrderedByStatement createOrderedBy(final Ordering argument,
540             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
541         return substatements.isEmpty() ? createOrderedBy(argument)
542             : new RegularOrderedByStatement(argument, substatements);
543     }
544
545     public static PathStatement createPath(final PathExpression argument,
546             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
547         return substatements.isEmpty() ? new EmptyPathStatement(argument)
548             : new RegularPathStatement(argument, substatements);
549     }
550
551     public static PatternStatement createPattern(final PatternExpression argument,
552             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
553         return substatements.isEmpty() ? new EmptyPatternStatement(argument)
554             : new RegularPatternStatement(argument, substatements);
555     }
556
557     public static PositionStatement createPosition(final Uint32 argument,
558             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
559         return substatements.isEmpty() ? new EmptyPositionStatement(argument)
560             : new RegularPositionStatement(argument, substatements);
561     }
562
563     public static PrefixStatement createPrefix(final String argument,
564             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
565         return substatements.isEmpty() ? new EmptyPrefixStatement(argument)
566             : new RegularPrefixStatement(argument, substatements);
567     }
568
569     public static PresenceStatement createPresence(final String argument,
570             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
571         return substatements.isEmpty() ? new EmptyPresenceStatement(argument)
572             : new RegularPresenceStatement(argument, substatements);
573     }
574
575     public static ReferenceStatement createReference(final String argument) {
576         return new EmptyReferenceStatement(argument);
577     }
578
579     public static ReferenceStatement createReference(final String argument,
580             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
581         return substatements.isEmpty() ? createReference(argument)
582             : new RegularReferenceStatement(argument, substatements);
583     }
584
585     public static RangeStatement createRange(final String rawArgument, final List<ValueRange> argument,
586             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
587         return substatements.isEmpty() ? new EmptyRangeStatement(rawArgument, argument)
588             : new RegularRangeStatement(rawArgument, argument, substatements);
589     }
590
591     public static RefineStatement createRefine(final String rawArgument, final Descendant argument,
592             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
593         return new RefineStatementImpl(rawArgument, argument, substatements);
594     }
595
596     public static RequireInstanceStatement createRequireInstance(final Boolean argument,
597             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
598         if (substatements.isEmpty()) {
599             return argument ? EmptyRequireInstanceStatement.TRUE : EmptyRequireInstanceStatement.FALSE;
600         }
601         return new RegularRequireInstanceStatement(argument, substatements);
602     }
603
604     public static RevisionStatement createRevision(final Revision argument,
605             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
606         return substatements.isEmpty() ? new EmptyRevisionStatement(argument)
607             : new RegularRevisionStatement(argument, substatements);
608     }
609
610     public static RevisionDateStatement createRevisionDate(final Revision argument,
611             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
612         return substatements.isEmpty() ? new EmptyRevisionDateStatement(argument)
613             : new RegularRevisionDateStatement(argument, substatements);
614     }
615
616     public static RpcStatement createRpc(final QName argument,
617             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
618         return substatements.isEmpty() ? new EmptyRpcStatement(argument)
619             : new RegularRpcStatement(argument, substatements);
620     }
621
622     public static StatusStatement createStatus(final Status argument,
623             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
624         return substatements.isEmpty() ? createStatus(argument) : new RegularStatusStatement(argument, substatements);
625     }
626
627     private static StatusStatement createStatus(final Status argument) {
628         switch (argument) {
629             case CURRENT:
630                 return EmptyStatusStatement.CURRENT;
631             case DEPRECATED:
632                 return EmptyStatusStatement.DEPRECATED;
633             case OBSOLETE:
634                 return EmptyStatusStatement.OBSOLETE;
635             default:
636                 throw new IllegalStateException("Unhandled argument " + argument);
637         }
638     }
639
640     public static SubmoduleStatement createSubmodule(final String rawArgument, final Unqualified argument,
641             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
642         return new SubmoduleStatementImpl(rawArgument, argument, substatements);
643     }
644
645     public static TypeStatement createType(final String rawArgument, final QName argument,
646             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
647         return substatements.isEmpty() ? new EmptyTypeStatement(rawArgument, argument)
648             : new RegularTypeStatement(rawArgument, argument, substatements);
649     }
650
651     public static TypedefStatement createTypedef(final QName argument,
652             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
653         return substatements.isEmpty() ? new EmptyTypedefStatement(argument)
654             : new RegularTypedefStatement(argument, substatements);
655     }
656
657     public static UniqueStatement createUnique(final String rawArgument, final Set<Descendant> argument,
658             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
659         return substatements.isEmpty() ? new EmptyUniqueStatement(rawArgument, argument)
660             : new RegularUniqueStatement(rawArgument, argument, substatements);
661     }
662
663     public static UnitsStatement createUnits(final String argument,
664             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
665         return substatements.isEmpty() ? new EmptyUnitsStatement(argument)
666             : new RegularUnitsStatement(argument, substatements);
667     }
668
669     public static UnrecognizedStatement createUnrecognized(final String rawArgument,
670             final StatementDefinition publicDefinition,
671             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
672         return new UnrecognizedStatementImpl(rawArgument, publicDefinition, substatements);
673     }
674
675     public static UsesStatement createUses(final String rawArgument, final QName argument,
676             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
677         return substatements.isEmpty() ?  new EmptyUsesStatement(rawArgument, argument)
678             : new RegularUsesStatement(rawArgument, argument, substatements);
679     }
680
681     public static ValueStatement createValue(final Integer argument) {
682         return new EmptyValueStatement(argument);
683     }
684
685     public static ValueStatement createValue(final Integer argument,
686             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
687         return substatements.isEmpty() ? createValue(argument) : new RegularValueStatement(argument, substatements);
688     }
689
690     public static WhenStatement createWhen(final String rawArgument, final QualifiedBound argument,
691             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
692         return substatements.isEmpty() ? new EmptyWhenStatement(rawArgument, argument)
693             : new RegularWhenStatement(rawArgument, argument, substatements);
694     }
695
696     public static YangVersionStatement createYangVersion(final YangVersion argument,
697             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
698         return substatements.isEmpty() ? createYangVersion(argument)
699             : new RegularYangVersionStatement(argument, substatements);
700     }
701
702     private static YangVersionStatement createYangVersion(final YangVersion argument) {
703         switch (argument) {
704             case VERSION_1:
705                 return EmptyYangVersionStatement.VERSION_1;
706             case VERSION_1_1:
707                 return EmptyYangVersionStatement.VERSION_1_1;
708             default:
709                 throw new IllegalStateException("Unhandled version " + argument);
710         }
711     }
712
713     public static YinElementStatement createYinElement(final boolean argument) {
714         return argument ? EmptyYinElementStatement.TRUE : EmptyYinElementStatement.FALSE;
715     }
716
717     public static YinElementStatement createYinElement(final Boolean argument,
718             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
719         return substatements.isEmpty() ? createYinElement(argument)
720             : new RegularYinElementStatement(argument, substatements);
721     }
722 }