Move 'must' statement implementations
[yangtools.git] / yang / yang-model-ri / src / main / java / org / opendaylight / yangtools / yang / model / ri / stmt / EffectiveStatements.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 static com.google.common.base.Preconditions.checkArgument;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableList;
14 import com.google.common.collect.ImmutableSet;
15 import org.eclipse.jdt.annotation.NonNullByDefault;
16 import org.eclipse.jdt.annotation.Nullable;
17 import org.opendaylight.yangtools.concepts.Immutable;
18 import org.opendaylight.yangtools.yang.common.QNameModule;
19 import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
28 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentEffectiveStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.BaseEffectiveStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToEffectiveStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.BitEffectiveStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.ContactEffectiveStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
53 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
54 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
60 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
61 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationEffectiveStatement;
62 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
63 import org.opendaylight.yangtools.yang.model.api.stmt.EnumEffectiveStatement;
64 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
65 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagEffectiveStatement;
66 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
67 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement;
68 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
69 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionEffectiveStatement;
70 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
71 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureEffectiveStatement;
72 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
73 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement;
74 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
75 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
76 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
77 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement;
78 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
79 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureEffectiveStatement;
80 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
81 import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
82 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
83 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeEffectiveStatement;
84 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
85 import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
86 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
87 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
88 import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
89 import org.opendaylight.yangtools.yang.model.api.stmt.LengthEffectiveStatement;
90 import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement;
91 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
92 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
93 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatement;
94 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
95 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
96 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
97 import org.opendaylight.yangtools.yang.model.api.stmt.ModifierEffectiveStatement;
98 import org.opendaylight.yangtools.yang.model.api.stmt.ModifierStatement;
99 import org.opendaylight.yangtools.yang.model.api.stmt.MustEffectiveStatement;
100 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
101 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceEffectiveStatement;
102 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
103 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
104 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
105 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
106 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
107 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationEffectiveStatement;
108 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
109 import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
110 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
111 import org.opendaylight.yangtools.yang.model.api.stmt.PathEffectiveStatement;
112 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
113 import org.opendaylight.yangtools.yang.model.api.stmt.PatternEffectiveStatement;
114 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
115 import org.opendaylight.yangtools.yang.model.api.stmt.PositionEffectiveStatement;
116 import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
117 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
118 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
119 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceEffectiveStatement;
120 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
121 import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement;
122 import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
123 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
124 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
125 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement;
126 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
127 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateEffectiveStatement;
128 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
129 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionEffectiveStatement;
130 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
131 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
132 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
133 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
134 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
135 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
136 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
137 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
138 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
139 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
140 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
141 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
142 import org.opendaylight.yangtools.yang.model.api.stmt.ValueEffectiveStatement;
143 import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
144 import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
145 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
146 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement;
147 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
148 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementEffectiveStatement;
149 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
150 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
151 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRequireInstanceStatement;
152 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyStatusStatement;
153 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyYangVersionStatement;
154 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractLeafEffectiveStatement;
155 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ActionEffectiveStatementImpl;
156 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AugmentEffectiveStatementImpl;
157 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ChoiceEffectiveStatementImpl;
158 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ContainerEffectiveStatementImpl;
159 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredCaseEffectiveStatement;
160 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredInputEffectiveStatement;
161 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredOutputEffectiveStatement;
162 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeviateEffectiveStatementImpl;
163 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeviationEffectiveStatementImpl;
164 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyAnydataEffectiveStatement;
165 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyAnyxmlEffectiveStatement;
166 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyArgumentEffectiveStatement;
167 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBaseEffectiveStatement;
168 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBelongsToEffectiveStatement;
169 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBitEffectiveStatement;
170 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyConfigEffectiveStatement;
171 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyContactEffectiveStatement;
172 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyDefaultEffectiveStatement;
173 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyDescriptionEffectiveStatement;
174 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyEnumEffectiveStatement;
175 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyErrorAppTagEffectiveStatement;
176 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyErrorMessageEffectiveStatement;
177 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyFeatureEffectiveStatement;
178 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyFractionDigitsEffectiveStatement;
179 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIdentityEffectiveStatement;
180 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIfFeatureEffectiveStatement;
181 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIncludeEffectiveStatement;
182 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyLeafEffectiveStatement;
183 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyLengthEffectiveStatement;
184 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyMandatoryEffectiveStatement;
185 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyMaxElementsEffectiveStatement;
186 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyMinElementsEffectiveStatement;
187 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyModifierEffectiveStatement;
188 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyMustEffectiveStatement;
189 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyNamespaceEffectiveStatement;
190 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyOrderedByEffectiveStatement;
191 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyOrganizationEffectiveStatement;
192 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPathEffectiveStatement;
193 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPatternEffectiveStatement;
194 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPositionEffectiveStatement;
195 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPrefixEffectiveStatement;
196 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPresenceEffectiveStatement;
197 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyRangeEffectiveStatement;
198 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyReferenceEffectiveStatement;
199 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyRequireInstanceEffectiveStatement;
200 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyRevisionDateEffectiveStatement;
201 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyRevisionEffectiveStatement;
202 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyStatusEffectiveStatement;
203 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyUniqueEffectiveStatement;
204 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyUnitsEffectiveStatement;
205 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyValueEffectiveStatement;
206 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyWhenEffectiveStatement;
207 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyYangVersionEffectiveStatement;
208 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyYinElementEffectiveStatement;
209 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ExtensionEffectiveStatementImpl;
210 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.GroupingEffectiveStatementImpl;
211 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ImportEffectiveStatementImpl;
212 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.NotificationEffectiveStatementImpl;
213 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularAnydataEffectiveStatement;
214 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularAnyxmlEffectiveStatement;
215 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularArgumentEffectiveStatement;
216 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBaseEffectiveStatement;
217 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBelongsToEffectiveStatement;
218 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBitEffectiveStatement;
219 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularConfigEffectiveStatement;
220 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularContactEffectiveStatement;
221 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularDefaultEffectiveStatement;
222 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularDescriptionEffectiveStatement;
223 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularEnumEffectiveStatement;
224 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularErrorAppTagEffectiveStatement;
225 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularErrorMessageEffectiveStatement;
226 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularFeatureEffectiveStatement;
227 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularFractionDigitsEffectiveStatement;
228 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIdentityEffectiveStatement;
229 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIfFeatureEffectiveStatement;
230 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIncludeEffectiveStatement;
231 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularLeafEffectiveStatement;
232 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularLengthEffectiveStatement;
233 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularMandatoryEffectiveStatement;
234 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularMaxElementsEffectiveStatement;
235 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularMinElementsEffectiveStatement;
236 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularModifierEffectiveStatement;
237 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularMustEffectiveStatement;
238 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularNamespaceEffectiveStatement;
239 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularOrderedByEffectiveStatement;
240 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularOrganizationEffectiveStatement;
241 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPathEffectiveStatement;
242 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPatternEffectiveStatement;
243 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPositionEffectiveStatement;
244 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPrefixEffectiveStatement;
245 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPresenceEffectiveStatement;
246 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularRangeEffectiveStatement;
247 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularReferenceEffectiveStatement;
248 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularRequireInstanceEffectiveStatement;
249 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularRevisionDateEffectiveStatement;
250 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularRevisionEffectiveStatement;
251 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularStatusEffectiveStatement;
252 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularUniqueEffectiveStatement;
253 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularUnitsEffectiveStatement;
254 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularValueEffectiveStatement;
255 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularWhenEffectiveStatement;
256 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularYangVersionEffectiveStatement;
257 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularYinElementEffectiveStatement;
258 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RpcEffectiveStatementImpl;
259 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.TypedefEffectiveStatementImpl;
260 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredCaseEffectiveStatement;
261 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredInputEffectiveStatement;
262 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredOutputEffectiveStatement;
263 import org.opendaylight.yangtools.yang.model.spi.meta.SubstatementIndexingException;
264
265 /**
266  * Static entry point to instantiating {@link EffectiveStatement} covered in the {@code RFC7950} metamodel.
267  */
268 @Beta
269 @NonNullByDefault
270 public final class EffectiveStatements {
271     private EffectiveStatements() {
272         // Hidden on purpose
273     }
274
275     public static ActionEffectiveStatement copyAction(final ActionEffectiveStatement original, final Immutable path,
276             final int flags) {
277         checkArgument(original instanceof ActionEffectiveStatementImpl, "Unsupported original %s", original);
278         return new ActionEffectiveStatementImpl((ActionEffectiveStatementImpl) original, path, flags);
279     }
280
281     public static ActionEffectiveStatement createAction(final ActionStatement declared, final Immutable path,
282             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
283                 throws SubstatementIndexingException {
284         return new ActionEffectiveStatementImpl(declared, path, flags, substatements);
285     }
286
287     public static AnydataEffectiveStatement copyAnydata(final AnydataEffectiveStatement original, final Immutable path,
288             final int flags, final @Nullable AnydataSchemaNode newOriginal) {
289         if (original instanceof RegularAnydataEffectiveStatement) {
290             return new RegularAnydataEffectiveStatement((RegularAnydataEffectiveStatement) original, path, flags,
291                 newOriginal);
292         } else if (original instanceof EmptyAnydataEffectiveStatement) {
293             return new EmptyAnydataEffectiveStatement((EmptyAnydataEffectiveStatement) original, path, flags,
294                 newOriginal);
295         } else {
296             throw new IllegalArgumentException("Unsupported original " + original);
297         }
298     }
299
300     public static AnydataEffectiveStatement createAnydata(final AnydataStatement declared, final Immutable path,
301             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
302             final @Nullable AnydataSchemaNode original) {
303         return substatements.isEmpty() ? new EmptyAnydataEffectiveStatement(declared, path, flags, original)
304             : new RegularAnydataEffectiveStatement(declared, path, flags, original, substatements);
305     }
306
307     public static AnyxmlEffectiveStatement copyAnyxml(final AnyxmlEffectiveStatement original, final Immutable path,
308             final int flags, final @Nullable AnyxmlSchemaNode newOriginal) {
309         if (original instanceof RegularAnyxmlEffectiveStatement) {
310             return new RegularAnyxmlEffectiveStatement((RegularAnyxmlEffectiveStatement) original, path, flags,
311                 newOriginal);
312         } else if (original instanceof EmptyAnyxmlEffectiveStatement) {
313             return new EmptyAnyxmlEffectiveStatement((EmptyAnyxmlEffectiveStatement) original, path, flags,
314                 newOriginal);
315         } else {
316             throw new IllegalArgumentException("Unsupported original " + original);
317         }
318     }
319
320     public static AnyxmlEffectiveStatement createAnyxml(final AnyxmlStatement declared, final Immutable path,
321             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
322             final @Nullable AnyxmlSchemaNode original) {
323         return substatements.isEmpty() ? new EmptyAnyxmlEffectiveStatement(declared, path, flags, original)
324             : new RegularAnyxmlEffectiveStatement(declared, path, flags, original, substatements);
325     }
326
327     public static ArgumentEffectiveStatement createArgument(final ArgumentStatement declared,
328             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
329         return substatements.isEmpty() ? new EmptyArgumentEffectiveStatement(declared)
330             : new RegularArgumentEffectiveStatement(declared, substatements);
331     }
332
333     public static AugmentEffectiveStatement createAugment(final AugmentStatement declared,
334             final SchemaNodeIdentifier argument, final int flags, final QNameModule rootModuleQName,
335             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
336             final @Nullable AugmentationSchemaNode original) throws SubstatementIndexingException {
337         return new AugmentEffectiveStatementImpl(declared, argument, flags, rootModuleQName, substatements, original);
338     }
339
340     public static BaseEffectiveStatement createBase(final BaseStatement declared,
341             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
342         return substatements.isEmpty() ? new EmptyBaseEffectiveStatement(declared)
343             : new RegularBaseEffectiveStatement(declared, substatements);
344     }
345
346     public static BelongsToEffectiveStatement createBelongsTo(final BelongsToStatement declared,
347             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
348         return substatements.isEmpty() ? new EmptyBelongsToEffectiveStatement(declared)
349             : new RegularBelongsToEffectiveStatement(declared, substatements);
350     }
351
352     public static BitEffectiveStatement createBit(final BitStatement declared,
353             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
354         return substatements.isEmpty() ? new EmptyBitEffectiveStatement(declared)
355             : new RegularBitEffectiveStatement(declared, substatements);
356     }
357
358     public static CaseEffectiveStatement copyCase(final CaseEffectiveStatement original,
359             final Immutable path, final int flags, final @Nullable CaseSchemaNode newOriginal) {
360         if (original instanceof DeclaredCaseEffectiveStatement) {
361             return new DeclaredCaseEffectiveStatement((DeclaredCaseEffectiveStatement) original, path, flags,
362                 newOriginal);
363         } else if (original instanceof UndeclaredCaseEffectiveStatement) {
364             return new UndeclaredCaseEffectiveStatement((UndeclaredCaseEffectiveStatement) original, path, flags,
365                 newOriginal);
366         } else {
367             throw new IllegalArgumentException("Unsupported origin " + original);
368         }
369     }
370
371     public static CaseEffectiveStatement createCase(final Immutable path,
372             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
373                 final @Nullable CaseSchemaNode original) {
374         return new UndeclaredCaseEffectiveStatement(substatements, path, flags, original);
375     }
376
377     public static CaseEffectiveStatement createCase(final CaseStatement declared, final Immutable path,
378             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
379             final @Nullable CaseSchemaNode original) {
380         return new DeclaredCaseEffectiveStatement(declared, substatements, path, flags, original);
381     }
382
383     public static ChoiceEffectiveStatement copyChoice(final ChoiceEffectiveStatement original,
384             final Immutable path, final int flags, final @Nullable ChoiceSchemaNode newOriginal) {
385         checkArgument(original instanceof ChoiceEffectiveStatementImpl, "Unsupported original %s", original);
386         return new ChoiceEffectiveStatementImpl((ChoiceEffectiveStatementImpl) original, path, flags, newOriginal);
387     }
388
389     public static ChoiceEffectiveStatement createChoice(final ChoiceStatement declared, final Immutable path,
390             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
391             final @Nullable CaseSchemaNode defaultCase, final @Nullable ChoiceSchemaNode original) {
392         return new ChoiceEffectiveStatementImpl(declared, substatements, path, flags, defaultCase, original);
393     }
394
395     public static ConfigEffectiveStatement createConfig(final boolean argument) {
396         return argument ? EmptyConfigEffectiveStatement.TRUE : EmptyConfigEffectiveStatement.FALSE;
397     }
398
399     public static ConfigEffectiveStatement createConfig(final ConfigStatement declared) {
400         return new EmptyConfigEffectiveStatement(declared);
401     }
402
403     public static ConfigEffectiveStatement createConfig(final ConfigStatement declared,
404             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
405         return substatements.isEmpty() ? createConfig(declared)
406             : new RegularConfigEffectiveStatement(declared, substatements);
407     }
408
409     public static ContactEffectiveStatement createContact(final ContactStatement declared) {
410         return new EmptyContactEffectiveStatement(declared);
411     }
412
413     public static ContactEffectiveStatement createContact(final ContactStatement declared,
414             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
415         return substatements.isEmpty() ? createContact(declared)
416             : new RegularContactEffectiveStatement(declared, substatements);
417     }
418
419     public static ContainerEffectiveStatement copyContainer(final ContainerEffectiveStatement original,
420             final Immutable path, final int flags, final @Nullable ContainerSchemaNode orig) {
421         checkArgument(original instanceof ContainerEffectiveStatementImpl, "Unsupported original %s", original);
422         return new ContainerEffectiveStatementImpl((ContainerEffectiveStatementImpl) original, path, flags, orig);
423     }
424
425     public static ContainerEffectiveStatement createContainer(final ContainerStatement declared, final Immutable path,
426             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
427             final @Nullable ContainerSchemaNode original) {
428         return new ContainerEffectiveStatementImpl(declared, substatements, path, flags, original);
429     }
430
431     public static DefaultEffectiveStatement createDefault(final DefaultStatement declared,
432             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
433         return substatements.isEmpty() ? new EmptyDefaultEffectiveStatement(declared)
434             : new RegularDefaultEffectiveStatement(declared, substatements);
435     }
436
437     public static DescriptionEffectiveStatement createDescription(final DescriptionStatement declared,
438             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
439         return substatements.isEmpty() ? new EmptyDescriptionEffectiveStatement(declared)
440             : new RegularDescriptionEffectiveStatement(declared, substatements);
441     }
442
443     public static DeviateEffectiveStatement createDeviate(final DeviateStatement declared,
444             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
445         return new DeviateEffectiveStatementImpl(declared, substatements);
446     }
447
448     public static DeviationEffectiveStatement createDeviation(final DeviationStatement declared,
449             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
450         return new DeviationEffectiveStatementImpl(declared, substatements);
451     }
452
453     public static EnumEffectiveStatement createEnum(final EnumStatement declared,
454             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
455         return substatements.isEmpty() ? new EmptyEnumEffectiveStatement(declared)
456             : new RegularEnumEffectiveStatement(declared, substatements);
457     }
458
459     public static ErrorAppTagEffectiveStatement createErrorAppTag(final ErrorAppTagStatement declared,
460             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
461         return substatements.isEmpty() ? new EmptyErrorAppTagEffectiveStatement(declared)
462             : new RegularErrorAppTagEffectiveStatement(declared, substatements);
463     }
464
465     public static ErrorMessageEffectiveStatement createErrorMessage(final ErrorMessageStatement declared,
466             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
467         return substatements.isEmpty() ? new EmptyErrorMessageEffectiveStatement(declared)
468             : new RegularErrorMessageEffectiveStatement(declared, substatements);
469     }
470
471     public static ExtensionEffectiveStatement createExtension(final ExtensionStatement declared,
472             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
473             final @Nullable SchemaPath schemaPath) {
474         return new ExtensionEffectiveStatementImpl(declared, substatements, schemaPath);
475     }
476
477     public static FeatureEffectiveStatement createFeature(final FeatureStatement declared, final Immutable path,
478             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
479         return substatements.isEmpty() ? new EmptyFeatureEffectiveStatement(declared, path, flags)
480             : new RegularFeatureEffectiveStatement(declared, path, flags, substatements);
481     }
482
483     public static FractionDigitsEffectiveStatement createFractionDigits(final FractionDigitsStatement declared) {
484         return new EmptyFractionDigitsEffectiveStatement(declared);
485     }
486
487     public static FractionDigitsEffectiveStatement createFractionDigits(final FractionDigitsStatement declared,
488             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
489         return substatements.isEmpty() ? createFractionDigits(declared)
490             : new RegularFractionDigitsEffectiveStatement(declared, substatements);
491     }
492
493     public static GroupingEffectiveStatement createGrouping(final GroupingStatement declared,
494             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final Immutable path,
495             final int flags) throws SubstatementIndexingException {
496         return new GroupingEffectiveStatementImpl(declared, substatements, path, flags);
497     }
498
499     public static IfFeatureEffectiveStatement createIfFeature(final IfFeatureStatement declared,
500             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
501         return substatements.isEmpty() ? new EmptyIfFeatureEffectiveStatement(declared)
502             : new RegularIfFeatureEffectiveStatement(declared, substatements);
503     }
504
505     public static IdentityEffectiveStatement createIdentity(final IdentityStatement declared, final Immutable path) {
506         return new EmptyIdentityEffectiveStatement(declared, path);
507     }
508
509     public static IdentityEffectiveStatement createIdentity(final IdentityStatement declared, final Immutable path,
510             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
511             final ImmutableSet<IdentitySchemaNode> baseIdentities) {
512         return new RegularIdentityEffectiveStatement(declared, path, flags, substatements, baseIdentities);
513     }
514
515     public static ImportEffectiveStatement createImport(final ImportStatement declared,
516             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
517             final SourceIdentifier importedSource) {
518         return new ImportEffectiveStatementImpl(declared, substatements, importedSource);
519     }
520
521     public static IncludeEffectiveStatement createInclude(final IncludeStatement declared,
522             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
523         return substatements.isEmpty() ? new EmptyIncludeEffectiveStatement(declared)
524             : new RegularIncludeEffectiveStatement(declared, substatements);
525     }
526
527     public static InputEffectiveStatement copyInput(final InputEffectiveStatement original, final Immutable path,
528             final int flags) {
529         if (original instanceof DeclaredInputEffectiveStatement) {
530             return new DeclaredInputEffectiveStatement((DeclaredInputEffectiveStatement) original, path, flags);
531         } else if (original instanceof UndeclaredInputEffectiveStatement) {
532             return new UndeclaredInputEffectiveStatement((UndeclaredInputEffectiveStatement) original, path, flags);
533         } else {
534             throw new IllegalArgumentException("Unsupported original " + original);
535         }
536     }
537
538     public static InputEffectiveStatement createInput(final Immutable path, final int flags,
539             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
540             throws SubstatementIndexingException {
541         return new UndeclaredInputEffectiveStatement(substatements, path, flags);
542     }
543
544     public static InputEffectiveStatement createInput(final InputStatement declared, final Immutable path,
545             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
546                 throws SubstatementIndexingException {
547         return new DeclaredInputEffectiveStatement(declared, substatements, path, flags);
548     }
549
550     public static LeafEffectiveStatement copyLeaf(final LeafEffectiveStatement original, final Immutable path,
551             final int flags, final @Nullable LeafSchemaNode newOriginal) {
552         checkArgument(original instanceof AbstractLeafEffectiveStatement, "Unsupported original %s", original);
553         return new RegularLeafEffectiveStatement((AbstractLeafEffectiveStatement) original, path, flags, newOriginal);
554     }
555
556     public static LeafEffectiveStatement createLeaf(final LeafStatement declared, final Immutable path,
557             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
558             final @Nullable LeafSchemaNode original)  throws SubstatementIndexingException {
559         return original == null ? new EmptyLeafEffectiveStatement(declared, path, flags, substatements)
560             : new RegularLeafEffectiveStatement(declared, path, flags, substatements, original);
561     }
562
563     public static LengthEffectiveStatement createLength(final LengthStatement declared,
564             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
565         return substatements.isEmpty() ? new EmptyLengthEffectiveStatement(declared)
566             : new RegularLengthEffectiveStatement(declared, substatements);
567     }
568
569     public static MandatoryEffectiveStatement createMandatory(final MandatoryStatement declared) {
570         return new EmptyMandatoryEffectiveStatement(declared);
571     }
572
573     public static MandatoryEffectiveStatement createMandatory(final MandatoryStatement declared,
574             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
575         return substatements.isEmpty() ? createMandatory(declared)
576             : new RegularMandatoryEffectiveStatement(declared, substatements);
577     }
578
579     public static MaxElementsEffectiveStatement createMaxElements(final MaxElementsStatement declared,
580             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
581         return substatements.isEmpty() ? new EmptyMaxElementsEffectiveStatement(declared)
582             : new RegularMaxElementsEffectiveStatement(declared, substatements);
583     }
584
585     public static MinElementsEffectiveStatement createMinElements(final MinElementsStatement declared) {
586         return new EmptyMinElementsEffectiveStatement(declared);
587     }
588
589     public static MinElementsEffectiveStatement createMinElements(final MinElementsStatement declared,
590             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
591         return substatements.isEmpty() ? createMinElements(declared)
592             : new RegularMinElementsEffectiveStatement(declared, substatements);
593     }
594
595     public static ModifierEffectiveStatement createModifier(final ModifierStatement declared,
596             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
597         return substatements.isEmpty() ? new EmptyModifierEffectiveStatement(declared)
598             : new RegularModifierEffectiveStatement(declared, substatements);
599     }
600
601     public static MustEffectiveStatement createMust(final MustStatement declared,
602             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
603         return substatements.isEmpty() ? new EmptyMustEffectiveStatement(declared)
604             : new RegularMustEffectiveStatement(declared, substatements);
605     }
606
607     public static NamespaceEffectiveStatement createNamespace(final NamespaceStatement declared,
608             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
609         return substatements.isEmpty() ? new EmptyNamespaceEffectiveStatement(declared)
610             : new RegularNamespaceEffectiveStatement(declared, substatements);
611     }
612
613     public static NotificationEffectiveStatement copyNotification(final NotificationEffectiveStatement original,
614             final Immutable path, final int flags) {
615         checkArgument(original instanceof NotificationEffectiveStatementImpl, "Unsupported original %s", original);
616         return new NotificationEffectiveStatementImpl((NotificationEffectiveStatementImpl) original, path, flags);
617     }
618
619     public static NotificationEffectiveStatement createNotification(final NotificationStatement declared,
620             final Immutable path, final int flags,
621             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
622                 throws SubstatementIndexingException {
623         return new NotificationEffectiveStatementImpl(declared, substatements, path, flags);
624     }
625
626     public static OutputEffectiveStatement copyOutput(final OutputEffectiveStatement original, final Immutable path,
627             final int flags) {
628         if (original instanceof DeclaredOutputEffectiveStatement) {
629             return new DeclaredOutputEffectiveStatement((DeclaredOutputEffectiveStatement) original, path, flags);
630         } else if (original instanceof UndeclaredOutputEffectiveStatement) {
631             return new UndeclaredOutputEffectiveStatement((UndeclaredOutputEffectiveStatement) original, path, flags);
632         } else {
633             throw new IllegalArgumentException("Unsupported original " + original);
634         }
635     }
636
637     public static OutputEffectiveStatement createOutput(final Immutable path, final int flags,
638             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
639             throws SubstatementIndexingException {
640         return new UndeclaredOutputEffectiveStatement(substatements, path, flags);
641     }
642
643     public static OutputEffectiveStatement createOutput(final OutputStatement declared, final Immutable path,
644             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
645                 throws SubstatementIndexingException {
646         return new DeclaredOutputEffectiveStatement(declared, substatements, path, flags);
647     }
648
649     public static OrderedByEffectiveStatement createOrderedBy(final OrderedByStatement declared) {
650         return new EmptyOrderedByEffectiveStatement(declared);
651     }
652
653     public static OrderedByEffectiveStatement createOrderedBy(final OrderedByStatement declared,
654             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
655         return substatements.isEmpty() ? createOrderedBy(declared)
656             : new RegularOrderedByEffectiveStatement(declared, substatements);
657     }
658
659     public static OrganizationEffectiveStatement createOrganization(final OrganizationStatement declared) {
660         return new EmptyOrganizationEffectiveStatement(declared);
661     }
662
663     public static OrganizationEffectiveStatement createOrganization(final OrganizationStatement declared,
664             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
665         return substatements.isEmpty() ? createOrganization(declared)
666             : new RegularOrganizationEffectiveStatement(declared, substatements);
667     }
668
669     public static PathEffectiveStatement createPath(final PathStatement declared,
670             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
671         return substatements.isEmpty() ? new EmptyPathEffectiveStatement(declared)
672             : new RegularPathEffectiveStatement(declared, substatements);
673     }
674
675     public static PatternEffectiveStatement createPattern(final PatternStatement declared,
676             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
677         return substatements.isEmpty() ? new EmptyPatternEffectiveStatement(declared)
678             : new RegularPatternEffectiveStatement(declared, substatements);
679     }
680
681     public static PositionEffectiveStatement createPosition(final PositionStatement declared) {
682         return new EmptyPositionEffectiveStatement(declared);
683     }
684
685     public static PositionEffectiveStatement createPosition(final PositionStatement declared,
686             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
687         return substatements.isEmpty() ? createPosition(declared)
688             : new RegularPositionEffectiveStatement(declared, substatements);
689     }
690
691     public static PrefixEffectiveStatement createPrefix(final PrefixStatement declared,
692             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
693         return substatements.isEmpty() ? new EmptyPrefixEffectiveStatement(declared)
694             : new RegularPrefixEffectiveStatement(declared, substatements);
695     }
696
697     public static PresenceEffectiveStatement createPresence(final PresenceStatement declared,
698             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
699         return substatements.isEmpty() ? new EmptyPresenceEffectiveStatement(declared)
700             : new RegularPresenceEffectiveStatement(declared, substatements);
701     }
702
703     public static RangeEffectiveStatement createRange(final RangeStatement declared,
704             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
705         return substatements.isEmpty() ? new EmptyRangeEffectiveStatement(declared)
706             : new RegularRangeEffectiveStatement(declared, substatements);
707     }
708
709     public static ReferenceEffectiveStatement createReference(final ReferenceStatement declared) {
710         return new EmptyReferenceEffectiveStatement(declared);
711     }
712
713     public static ReferenceEffectiveStatement createReference(final ReferenceStatement declared,
714             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
715         return substatements.isEmpty() ? createReference(declared)
716             : new RegularReferenceEffectiveStatement(declared, substatements);
717     }
718
719     public static RevisionEffectiveStatement createRevision(final RevisionStatement declared,
720             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
721         return substatements.isEmpty() ? new EmptyRevisionEffectiveStatement(declared)
722             : new RegularRevisionEffectiveStatement(declared, substatements);
723     }
724
725     public static RequireInstanceEffectiveStatement createRequireInstance(final boolean argument) {
726         return argument ? EmptyRequireInstanceEffectiveStatement.TRUE : EmptyRequireInstanceEffectiveStatement.FALSE;
727     }
728
729     public static RequireInstanceEffectiveStatement createRequireInstance(final RequireInstanceStatement declared) {
730         if (EmptyRequireInstanceStatement.TRUE.equals(declared)) {
731             return EmptyRequireInstanceEffectiveStatement.TRUE;
732         } else if (EmptyRequireInstanceStatement.FALSE.equals(declared)) {
733             return EmptyRequireInstanceEffectiveStatement.FALSE;
734         } else {
735             return new EmptyRequireInstanceEffectiveStatement(declared);
736         }
737     }
738
739     public static RequireInstanceEffectiveStatement createRequireInstance(final RequireInstanceStatement declared,
740             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
741         return substatements.isEmpty() ? createRequireInstance(declared)
742             : new RegularRequireInstanceEffectiveStatement(declared, substatements);
743     }
744
745     public static RevisionDateEffectiveStatement createRevisionDate(final RevisionDateStatement declared,
746             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
747         return substatements.isEmpty() ? new EmptyRevisionDateEffectiveStatement(declared)
748             : new RegularRevisionDateEffectiveStatement(declared, substatements);
749     }
750
751     public static RpcEffectiveStatement createRpc(final RpcStatement declared,
752             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final Immutable path,
753                 final int flags) throws SubstatementIndexingException {
754         return new RpcEffectiveStatementImpl(declared, substatements, path, flags);
755     }
756
757     public static StatusEffectiveStatement createStatus(final StatusStatement declared) {
758         // Aggressively reuse effective instances which are backed by the corresponding empty declared instance, as this
759         // is the case unless there is a weird extension in use.
760         if (EmptyStatusStatement.DEPRECATED.equals(declared)) {
761             // Most likely to be seen (as current is the default)
762             return EmptyStatusEffectiveStatement.DEPRECATED;
763         } else if (EmptyStatusStatement.OBSOLETE.equals(declared)) {
764             // less likely
765             return EmptyStatusEffectiveStatement.OBSOLETE;
766         } else if (EmptyStatusStatement.CURRENT.equals(declared)) {
767             // ... okay, why is this there? :)
768             return EmptyStatusEffectiveStatement.CURRENT;
769         } else {
770             return new EmptyStatusEffectiveStatement(declared);
771         }
772     }
773
774     public static StatusEffectiveStatement createStatus(final StatusStatement declared,
775             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
776         return substatements.isEmpty() ? createStatus(declared)
777             : new RegularStatusEffectiveStatement(declared, substatements);
778     }
779
780     public static TypedefEffectiveStatement createTypedef(final TypedefStatement declared,
781             final Immutable path, final int flags,
782             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
783         return new TypedefEffectiveStatementImpl(declared, path, flags, substatements);
784     }
785
786     public static UnitsEffectiveStatement createUnits(final UnitsStatement declared,
787             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
788         return substatements.isEmpty() ? new EmptyUnitsEffectiveStatement(declared)
789             : new RegularUnitsEffectiveStatement(declared, substatements);
790     }
791
792     public static UniqueEffectiveStatement createUnique(final UniqueStatement declared,
793             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
794         return substatements.isEmpty() ? new EmptyUniqueEffectiveStatement(declared)
795             : new RegularUniqueEffectiveStatement(declared, substatements);
796     }
797
798     public static ValueEffectiveStatement createValue(final ValueStatement declared) {
799         return new EmptyValueEffectiveStatement(declared);
800     }
801
802     public static ValueEffectiveStatement createValue(final ValueStatement declared,
803             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
804         return substatements.isEmpty() ? createValue(declared)
805             : new RegularValueEffectiveStatement(declared, substatements);
806     }
807
808     public static WhenEffectiveStatement createWhen(final WhenStatement declared,
809             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
810         return substatements.isEmpty() ? new EmptyWhenEffectiveStatement(declared)
811             : new RegularWhenEffectiveStatement(declared, substatements);
812     }
813
814     public static YangVersionEffectiveStatement createYangVersion(final YangVersionStatement declared) {
815         if (EmptyYangVersionStatement.VERSION_1.equals(declared)) {
816             return EmptyYangVersionEffectiveStatement.VERSION_1;
817         } else if (EmptyYangVersionStatement.VERSION_1_1.equals(declared)) {
818             return EmptyYangVersionEffectiveStatement.VERSION_1_1;
819         } else {
820             return new EmptyYangVersionEffectiveStatement(declared);
821         }
822     }
823
824     public static YangVersionEffectiveStatement createYangVersion(final YangVersionStatement declared,
825             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
826         return substatements.isEmpty() ? createYangVersion(declared)
827             : new RegularYangVersionEffectiveStatement(declared, substatements);
828     }
829
830     public static YinElementEffectiveStatement createYinElement(final YinElementStatement declared) {
831         return new EmptyYinElementEffectiveStatement(declared);
832     }
833
834     public static YinElementEffectiveStatement createYinElement(final YinElementStatement declared,
835         final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
836         return substatements.isEmpty() ? createYinElement(declared)
837             : new RegularYinElementEffectiveStatement(declared, substatements);
838     }
839 }