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