Clean up argument checking
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / base / BaseStatementSupport.java
index 2d38253cc461896fe64140d37e572842469643a1..ba212f5d8723e72446351bb161d123d5b11aec38 100644 (file)
@@ -7,17 +7,17 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.base;
 
-import java.util.ArrayList;
+import com.google.common.collect.ImmutableList;
 import java.util.Collection;
-import java.util.List;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.BaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedIdentitiesNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
@@ -29,8 +29,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
-public final class BaseStatementSupport
-        extends AbstractQNameStatementSupport<BaseStatement, EffectiveStatement<QName, BaseStatement>> {
+public final class BaseStatementSupport extends BaseQNameStatementSupport<BaseStatement, BaseEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR =
             SubstatementValidator.builder(YangStmtMapping.BASE).build();
     private static final BaseStatementSupport INSTANCE = new BaseStatementSupport();
@@ -49,40 +48,20 @@ public final class BaseStatementSupport
     }
 
     @Override
-    public BaseStatement createDeclared(final StmtContext<QName, BaseStatement, ?> ctx) {
-        return new BaseStatementImpl(ctx);
-    }
-
-    @Override
-    public EffectiveStatement<QName, BaseStatement> createEffective(
-            final StmtContext<QName, BaseStatement, EffectiveStatement<QName, BaseStatement>> ctx) {
-        return new BaseEffectiveStatementImpl(ctx);
-    }
-
-    @Override
-    public void onStatementDefinitionDeclared(
-            final Mutable<QName, BaseStatement, EffectiveStatement<QName, BaseStatement>> baseStmtCtx) {
-        final Mutable<?, ?, ?> baseParentCtx = baseStmtCtx.getParentContext();
-        if (StmtContextUtils.producesDeclared(baseParentCtx, IdentityStatement.class)) {
-
+    public void onStatementDefinitionDeclared(final Mutable<QName, BaseStatement, BaseEffectiveStatement> baseStmtCtx) {
+        final Mutable<?, ?, ?> baseParentCtx = baseStmtCtx.coerceParentContext();
+        if (baseParentCtx.producesDeclared(IdentityStatement.class)) {
             final QName baseIdentityQName = baseStmtCtx.coerceStatementArgument();
             final ModelActionBuilder baseIdentityAction = baseStmtCtx.newInferenceAction(
                 ModelProcessingPhase.STATEMENT_DEFINITION);
-            final Prerequisite<StmtContext<?, ?, ?>> requiresPrereq = baseIdentityAction.requiresCtx(baseStmtCtx,
-                IdentityNamespace.class, baseIdentityQName, ModelProcessingPhase.STATEMENT_DEFINITION);
-            final Prerequisite<StmtContext.Mutable<?, ?, ?>> mutatesPrereq = baseIdentityAction.mutatesCtx(
-                baseParentCtx, ModelProcessingPhase.STATEMENT_DEFINITION);
+            baseIdentityAction.requiresCtx(baseStmtCtx, IdentityNamespace.class, baseIdentityQName,
+                ModelProcessingPhase.STATEMENT_DEFINITION);
+            baseIdentityAction.mutatesCtx(baseParentCtx, ModelProcessingPhase.STATEMENT_DEFINITION);
 
             baseIdentityAction.apply(new InferenceAction() {
                 @Override
                 public void apply(final InferenceContext ctx) {
-                    List<StmtContext<?, ?, ?>> derivedIdentities = baseStmtCtx.getFromNamespace(
-                        DerivedIdentitiesNamespace.class, baseIdentityQName);
-                    if (derivedIdentities == null) {
-                        derivedIdentities = new ArrayList<>(1);
-                        baseStmtCtx.addToNs(DerivedIdentitiesNamespace.class, baseIdentityQName, derivedIdentities);
-                    }
-                    derivedIdentities.add(baseParentCtx);
+                    // No-op, we just want to ensure the statement is specified
                 }
 
                 @Override
@@ -99,4 +78,28 @@ public final class BaseStatementSupport
     protected SubstatementValidator getSubstatementValidator() {
         return SUBSTATEMENT_VALIDATOR;
     }
-}
\ No newline at end of file
+
+    @Override
+    protected BaseStatement createDeclared(final StmtContext<QName, BaseStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularBaseStatement(ctx.coerceStatementArgument(), substatements);
+    }
+
+    @Override
+    protected BaseStatement createEmptyDeclared(final StmtContext<QName, BaseStatement, ?> ctx) {
+        return new EmptyBaseStatement(ctx.coerceStatementArgument());
+    }
+
+    @Override
+    protected BaseEffectiveStatement createEffective(
+            final StmtContext<QName, BaseStatement, BaseEffectiveStatement> ctx, final BaseStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RegularBaseEffectiveStatement(declared, substatements);
+    }
+
+    @Override
+    protected BaseEffectiveStatement createEmptyEffective(
+            final StmtContext<QName, BaseStatement, BaseEffectiveStatement> ctx, final BaseStatement declared) {
+        return new EmptyBaseEffectiveStatement(declared);
+    }
+}