Expose Iterator from effectiveChildrenToComplete()
[yangtools.git] / parser / yang-parser-reactor / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / AbstractResumedStatement.java
index 926fc6e6d92c884eda0232b1c20ce15f0716bcf2..f5b33582799fafbab1d14b39e795f26ce64e21e1 100644 (file)
@@ -14,6 +14,7 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Stream;
@@ -136,7 +137,12 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
         final ModelProcessingPhase phase = getCompletedPhase();
         checkState(phase == ModelProcessingPhase.FULL_DECLARATION || phase == ModelProcessingPhase.EFFECTIVE_MODEL,
                 "Cannot build declared instance after phase %s", phase);
-        return declaredInstance = definition().getFactory().createDeclared(this);
+        return declaredInstance = definition().getFactory().createDeclared(this, substatementsAsDeclared());
+    }
+
+    private @NonNull Stream<DeclaredStatement<?>> substatementsAsDeclared() {
+        // FIXME: YANGTOOLS-1383: this stream includes implicit case statements, but it should not
+        return substatements.stream().map(AbstractResumedStatement::declared);
     }
 
     @Override
@@ -205,8 +211,8 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
     }
 
     @Override
-    final Iterable<ReactorStmtCtx<?, ?, ?>> effectiveChildrenToComplete() {
-        return effective;
+    final Iterator<ReactorStmtCtx<?, ?, ?>> effectiveChildrenToComplete() {
+        return effective.iterator();
     }
 
     @Override
@@ -266,7 +272,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
      * @return Declared parent statement
      */
     final @Nullable AbstractResumedStatement<?, ?, ?> exitStatement(final ModelProcessingPhase phase) {
-        endDeclared(phase);
+        finishDeclaration(phase);
         final var parent = getParentContext();
         if (parent == null) {
             return null;
@@ -275,7 +281,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
         var ret = verifyParent(parent);
         // Unwind all undeclared statements
         while (ret.origin() == StatementOrigin.CONTEXT) {
-            ret.endDeclared(phase);
+            ret.finishDeclaration(phase);
             ret = verifyParent(ret.getParentContext());
         }
         return ret;
@@ -293,12 +299,14 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
         substatements = substatements.ensureCapacity(expectedSize);
     }
 
-    final void walkChildren(final ModelProcessingPhase phase) {
+    final void declarationFinished(final ModelProcessingPhase phase) {
+        finishChildrenDeclaration(phase);
+        finishDeclaration(phase);
+    }
+
+    private void finishChildrenDeclaration(final ModelProcessingPhase phase) {
         checkState(isFullyDefined());
-        substatements.forEach(stmt -> {
-            stmt.walkChildren(phase);
-            stmt.endDeclared(phase);
-        });
+        substatements.forEach(stmt -> stmt.declarationFinished(phase));
     }
 
     /**
@@ -306,7 +314,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
      *
      * @param phase processing phase that ended
      */
-    final void endDeclared(final ModelProcessingPhase phase) {
+    private void finishDeclaration(final ModelProcessingPhase phase) {
         definition().onDeclarationFinished(this, phase);
     }