Filter implicitly-created declared substatements
[yangtools.git] / parser / yang-parser-reactor / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / AbstractResumedStatement.java
index 57bc6cf1ddb89277d01ee5f57f09183418061191..50fbbcd23cff059c9e8c4764836003fb4986a98c 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;
@@ -96,7 +97,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
     }
 
     @Override
-    public Collection<? extends StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements() {
+    public final Collection<? extends StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements() {
         return substatements;
     }
 
@@ -136,7 +137,24 @@ 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() {
+        var stream = substatements.stream();
+        if (getImplicitDeclaredFlag()) {
+            stream = stream.map(stmt -> {
+                var ret = stmt;
+                while (ret.origin() == StatementOrigin.CONTEXT) {
+                    final var stmts = ret.substatements;
+                    verify(stmts.size() == 1, "Unexpected substatements %s", stmts);
+                    ret = verifyNotNull(stmts.get(0));
+                }
+                return ret;
+            });
+        }
+
+        return stream.map(AbstractResumedStatement::declared);
     }
 
     @Override
@@ -205,13 +223,13 @@ 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
     final Stream<? extends @NonNull StmtContext<?, ?, ?>> streamDeclared() {
-        return declaredSubstatements().stream().filter(StmtContext::isSupportedToBuildEffective);
+        return substatements.stream().filter(StmtContext::isSupportedToBuildEffective);
     }
 
     @Override
@@ -314,6 +332,7 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
 
     private AbstractResumedStatement<?, ?, ?> createImplicitParent(final int offset,
             final StatementSupport<?, ?, ?> implicitParent, final StatementSourceReference ref, final String argument) {
+        setImplicitDeclaredFlag();
         return createSubstatement(offset, new StatementDefinitionContext<>(implicitParent),
             ImplicitSubstatement.of(ref), argument);
     }