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