EffectiveStatements track StatementContextBase 76/87776/1
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 14 Feb 2020 14:10:22 +0000 (15:10 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 16 Feb 2020 09:45:05 +0000 (10:45 +0100)
While StatementContextBase.effective is declared to hold Mutable
contexts, in reality it should only ever hold StatementContextBase
(or whatever is the lowest reactor base class).

Add explicit verification, allowing us to eliminate an instanceof
check in completeChildren().

JIRA: YANGTOOLS-1082
Change-Id: Ic25d056492dba49e2dd8042d3de9e79443369738
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java

index 602c472d0e298e06ceafd8b342e6c3b1200c3d69..9911d4323b627beb2f98dba1689898557d94588a 100644 (file)
@@ -30,7 +30,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
@@ -140,7 +139,7 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
 
     private Multimap<ModelProcessingPhase, OnPhaseFinished> phaseListeners = ImmutableMultimap.of();
     private Multimap<ModelProcessingPhase, ContextMutation> phaseMutation = ImmutableMultimap.of();
-    private List<Mutable<?, ?, ?>> effective = ImmutableList.of();
+    private List<StatementContextBase<?, ?, ?>> effective = ImmutableList.of();
     private List<StmtContext<?, ?, ?>> effectOfStatement = ImmutableList.of();
 
     private @Nullable ModelProcessingPhase completedPhase;
@@ -436,7 +435,7 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
             return;
         }
 
-        final Iterator<Mutable<?, ?, ?>> iterator = effective.iterator();
+        final Iterator<StatementContextBase<?, ?, ?>> iterator = effective.iterator();
         while (iterator.hasNext()) {
             final Mutable<?, ?, ?> next = iterator.next();
             if (statementDef.equals(next.getPublicDefinition()) && statementArg.equals(next.rawStatementArgument())) {
@@ -470,8 +469,9 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
      *             if statement parameter is null
      */
     public void addEffectiveSubstatement(final Mutable<?, ?, ?> substatement) {
+        verifyStatement(substatement);
         beforeAddEffectiveStatement(1);
-        effective.add(substatement);
+        effective.add((StatementContextBase<?, ?, ?>) substatement);
     }
 
     /**
@@ -484,13 +484,15 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
      *             if statement parameter is null
      */
     public void addEffectiveSubstatements(final Collection<? extends Mutable<?, ?, ?>> statements) {
-        if (statements.isEmpty()) {
-            return;
+        if (!statements.isEmpty()) {
+            statements.forEach(StatementContextBase::verifyStatement);
+            beforeAddEffectiveStatement(statements.size());
+            effective.addAll((Collection<? extends StatementContextBase<?, ?, ?>>) statements);
         }
+    }
 
-        statements.forEach(Objects::requireNonNull);
-        beforeAddEffectiveStatement(statements.size());
-        effective.addAll(statements);
+    private static void verifyStatement(final Mutable<?, ?, ?> stmt) {
+        verify(stmt instanceof StatementContextBase, "Unexpected statement %s", stmt);
     }
 
     private void beforeAddEffectiveStatement(final int toAdd) {
@@ -559,10 +561,8 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
         for (final StatementContextBase<?, ?, ?> child : mutableDeclaredSubstatements()) {
             finished &= child.tryToCompletePhase(phase);
         }
-        for (final Mutable<?, ?, ?> child : effective) {
-            if (child instanceof StatementContextBase) {
-                finished &= ((StatementContextBase<?, ?, ?>) child).tryToCompletePhase(phase);
-            }
+        for (final StatementContextBase<?, ?, ?> child : effective) {
+            finished &= child.tryToCompletePhase(phase);
         }
 
         if (finished) {