checkState(inProgressPhase != ModelProcessingPhase.EFFECTIVE_MODEL,
"Declared statement cannot be added in effective phase at: %s", sourceReference());
- final Optional<StatementSupport<?, ?, ?>> implicitParent =
- definition().getImplicitParentFor(def.getPublicView());
+ final var implicitParent = definition().getImplicitParentFor(this, def.getPublicView());
if (implicitParent.isPresent()) {
- return createImplicitParent(offset, implicitParent.get(), ref, argument).createSubstatement(offset, def,
- ref, argument);
+ return createImplicitParent(offset, implicitParent.orElseThrow(), ref, argument)
+ .createSubstatement(offset, def, ref, argument);
}
final AbstractResumedStatement<X, Y, Z> ret = new SubstatementContext<>(this, def, ref, argument);
private <X, Y extends DeclaredStatement<X>, Z extends EffectiveStatement<X, Y>> Mutable<X, Y, Z> childCopyOf(
final StatementContextBase<X, Y, Z> original, final CopyType type, final QNameModule targetModule) {
- final Optional<StatementSupport<?, ?, ?>> implicitParent = definition.getImplicitParentFor(
- original.publicDefinition());
+ final var implicitParent = definition.getImplicitParentFor(this, original.publicDefinition());
final StatementContextBase<X, Y, Z> result;
final InferredStatementContext<X, Y, Z> copy;
@Beta
public final StatementContextBase<?, ?, ?> wrapWithImplicit(final StatementContextBase<?, ?, ?> original) {
- final Optional<StatementSupport<?, ?, ?>> optImplicit = definition.getImplicitParentFor(
- original.publicDefinition());
+ final var optImplicit = definition.getImplicitParentFor(this, original.publicDefinition());
if (optImplicit.isEmpty()) {
return original;
}
- final StatementDefinitionContext<?, ?, ?> def = new StatementDefinitionContext<>(optImplicit.get());
+ final StatementDefinitionContext<?, ?, ?> def = new StatementDefinitionContext<>(optImplicit.orElseThrow());
final CopyType type = original.history().getLastOperation();
final SubstatementContext<?, ?, ?> result = new SubstatementContext(original.getParentContext(), def,
original.sourceReference(), original.rawArgument(), original.argument(), type);
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
+import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceStmtCtx;
import org.opendaylight.yangtools.yang.parser.spi.meta.OverrideChildStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementFactory;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
return support.getPublicView();
}
- Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final StatementDefinition stmtDef) {
+ Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final NamespaceStmtCtx parent,
+ final StatementDefinition stmtDef) {
return support instanceof ImplicitParentAwareStatementSupport
- ? ((ImplicitParentAwareStatementSupport) support).getImplicitParentFor(stmtDef) : Optional.empty();
+ ? ((ImplicitParentAwareStatementSupport) support).getImplicitParentFor(parent, stmtDef)
+ : Optional.empty();
}
void onStatementAdded(final Mutable<A, D, E> stmt) {
private static @NonNull StatementSupportBundle fullDeclarationBundle(final StatementSupportBundle stmtDefBundle,
final XPathSupport xpathSupport, final YangParserConfiguration config) {
- final CaseStatementSupport rfc6020case = CaseStatementSupport.rfc6020Instance(config);
- final CaseStatementSupport rfc7950case = CaseStatementSupport.rfc7950Instance(config);
-
return StatementSupportBundle.derivedFrom(stmtDefBundle)
.addSupport(new LeafStatementSupport(config))
.addSupport(new ConfigStatementSupport(config))
.addSupport(new DeviationStatementSupport(config))
.addVersionSpecificSupport(VERSION_1, new DeviateStatementRFC6020Support(config))
.addVersionSpecificSupport(VERSION_1_1, new DeviateStatementRFC7950Support(config))
- .addVersionSpecificSupport(VERSION_1, ChoiceStatementSupport.rfc6020Instance(config, rfc6020case))
- .addVersionSpecificSupport(VERSION_1_1, ChoiceStatementSupport.rfc7950Instance(config, rfc7950case))
- .addVersionSpecificSupport(VERSION_1, rfc6020case)
- .addVersionSpecificSupport(VERSION_1_1, rfc7950case)
+ .addVersionSpecificSupport(VERSION_1, ChoiceStatementSupport.rfc6020Instance(config))
+ .addVersionSpecificSupport(VERSION_1_1, ChoiceStatementSupport.rfc7950Instance(config))
+ .addVersionSpecificSupport(VERSION_1, CaseStatementSupport.rfc6020Instance(config))
+ .addVersionSpecificSupport(VERSION_1_1, CaseStatementSupport.rfc7950Instance(config))
.addSupport(new MustStatementSupport(xpathSupport, config))
.addSupport(new MandatoryStatementSupport(config))
.addSupport(new AnyxmlStatementSupport(config))
*/
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.meta;
+import static com.google.common.base.Verify.verifyNotNull;
import static java.util.Objects.requireNonNull;
import com.google.common.annotations.Beta;
import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
+import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceStmtCtx;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
.addOptional(YangStmtMapping.WHEN)
.build();
- private final CaseStatementSupport implicitCase;
-
- private ChoiceStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator,
- final CaseStatementSupport implicitCase) {
+ private ChoiceStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator) {
super(YangStmtMapping.CHOICE, instantiatedPolicy(), config, requireNonNull(validator));
- this.implicitCase = requireNonNull(implicitCase);
}
- public static @NonNull ChoiceStatementSupport rfc6020Instance(final YangParserConfiguration config,
- final CaseStatementSupport implicitCase) {
- return new ChoiceStatementSupport(config, RFC6020_VALIDATOR, implicitCase);
+ public static @NonNull ChoiceStatementSupport rfc6020Instance(final YangParserConfiguration config) {
+ return new ChoiceStatementSupport(config, RFC6020_VALIDATOR);
}
- public static @NonNull ChoiceStatementSupport rfc7950Instance(final YangParserConfiguration config,
- final CaseStatementSupport implicitCase) {
- return new ChoiceStatementSupport(config, RFC7950_VALIDATOR, implicitCase);
+ public static @NonNull ChoiceStatementSupport rfc7950Instance(final YangParserConfiguration config) {
+ return new ChoiceStatementSupport(config, RFC7950_VALIDATOR);
}
@Override
- public Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final StatementDefinition stmtDef) {
- return YangValidationBundles.SUPPORTED_CASE_SHORTHANDS.contains(stmtDef) ? Optional.of(implicitCase)
- : Optional.empty();
+ public Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final NamespaceStmtCtx parent,
+ final StatementDefinition stmtDef) {
+ if (!YangValidationBundles.SUPPORTED_CASE_SHORTHANDS.contains(stmtDef)) {
+ return Optional.empty();
+ }
+ return Optional.of(verifyNotNull(parent.getFromNamespace(StatementSupportNamespace.class,
+ YangStmtMapping.CASE.getStatementName())));
}
@Override
* {@link StatementSupport} trait for statements which create intermediate parent node for some of its child nodes.
* An example of this is RFC6020/RFC7950 choice statement, which creates implicit case statements for child containers
* and others.
- *
- * @author Robert Varga
*/
@Beta
public interface ImplicitParentAwareStatementSupport {
* implementations of this interface add implicit parent to the build context hierarchy before a substatement
* is created.
*
+ * @param parent parent statement context
* @param stmtDef statement definition of substatement
* @return optional of implicit parent statement support
*/
- // FIXME: YANGTOOLS-1371: pass a NamespaceStmtCtx here, so choice/case can be decoupled
- Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(StatementDefinition stmtDef);
+ Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(NamespaceStmtCtx parent, StatementDefinition stmtDef);
}