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