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;
}
@Override
- public Collection<? extends StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements() {
+ public final Collection<? extends StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements() {
return substatements;
}
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
}
@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
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);
}