package org.opendaylight.yangtools.yang.parser.stmt.reactor;
import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Verify.verify;
import static java.util.Objects.requireNonNull;
final List<ReactorStmtCtx<?, ?, ?>> addEffectiveSubstatementsImpl(final List<ReactorStmtCtx<?, ?, ?>> effective,
final Collection<? extends Mutable<?, ?, ?>> statements) {
final List<ReactorStmtCtx<?, ?, ?>> resized = beforeAddEffectiveStatement(effective, statements.size());
- final Collection<? extends StatementContextBase<?, ?, ?>> casted =
- (Collection<? extends StatementContextBase<?, ?, ?>>) statements;
+ final Collection<? extends ReactorStmtCtx<?, ?, ?>> casted =
+ (Collection<? extends ReactorStmtCtx<?, ?, ?>>) statements;
final ModelProcessingPhase phase = completedPhase;
if (phase != null) {
- for (StatementContextBase<?, ?, ?> stmt : casted) {
+ for (ReactorStmtCtx<?, ?, ?> stmt : casted) {
ensureCompletedPhase(stmt, phase);
}
}
return factory.createEffective(ctx, ctx.streamDeclared(), ctx.streamEffective());
}
- abstract Stream<? extends StmtContext<?, ?, ?>> streamDeclared();
+ /**
+ * Return a stream of declared statements which can be built into an {@link EffectiveStatement}, as per
+ * {@link StmtContext#buildEffective()} contract.
+ *
+ * @return Stream of supported declared statements.
+ */
+ // FIXME: we really want to unify this with streamEffective(), under its name
+ abstract Stream<? extends @NonNull StmtContext<?, ?, ?>> streamDeclared();
- abstract Stream<? extends StmtContext<?, ?, ?>> streamEffective();
+ /**
+ * Return a stream of inferred statements which can be built into an {@link EffectiveStatement}, as per
+ * {@link StmtContext#buildEffective()} contract.
+ *
+ * @return Stream of supported effective statements.
+ */
+ // FIXME: this method is currently a misnomer, but unifying with streamDeclared() would make this accurate again
+ abstract Stream<? extends @NonNull StmtContext<?, ?, ?>> streamEffective();
@Override
final boolean doTryToCompletePhase(final ModelProcessingPhase phase) {
}
private void summarizeSubstatementPolicy() {
- if (noSensitiveSubstatements()) {
+ if (definition().support().copyPolicy() == CopyPolicy.EXACT_REPLICA || noSensitiveSubstatements()) {
setAllSubstatementsContextIndependent();
}
}
/**
- * Determine whether any substatements are context-sensitive as determined by {@link StatementSupport#copyPolicy()}.
- * Only {@link CopyPolicy#CONTEXT_INDEPENDENT} and {@link CopyPolicy#IGNORE} are context-insensitive. Note that
- * statements which are not {@link StmtContext#isSupportedToBuildEffective()} are all considered
- * context-insensitive.
+ * Determine whether any substatements are copy-sensitive as determined by {@link StatementSupport#copyPolicy()}.
+ * Only {@link CopyPolicy#CONTEXT_INDEPENDENT}, {@link CopyPolicy#EXACT_REPLICA} and {@link CopyPolicy#IGNORE} are
+ * copy-insensitive. Note that statements which are not {@link StmtContext#isSupportedToBuildEffective()} are all
+ * considered copy-insensitive.
*
* <p>
* Implementations are expected to call {@link #noSensitiveSubstatements()} to actually traverse substatement sets.
*
- * @return True if no substatements require context-sensitive handling
+ * @return True if no substatements require copy-sensitive handling
*/
abstract boolean noSensitiveSubstatements();
switch (stmt.definition().support().copyPolicy()) {
case CONTEXT_INDEPENDENT:
+ case EXACT_REPLICA:
case IGNORE:
break;
default:
* @throws NullPointerException if any of the arguments is null
*/
void addPhaseCompletedListener(final ModelProcessingPhase phase, final OnPhaseFinished listener) {
- checkNotNull(phase, "Statement context processing phase cannot be null at: %s", sourceReference());
- checkNotNull(listener, "Statement context phase listener cannot be null at: %s", sourceReference());
+ requireNonNull(phase, "Statement context processing phase cannot be null");
+ requireNonNull(listener, "Statement context phase listener cannot be null");
ModelProcessingPhase finishedPhase = completedPhase;
while (finishedPhase != null) {
final StatementSupport<A, D, E> support = definition.support();
final CopyPolicy policy = support.copyPolicy();
switch (policy) {
+ case EXACT_REPLICA:
+ return replicaAsChildOf(parent);
case CONTEXT_INDEPENDENT:
if (allSubstatementsContextIndependent()) {
return replicaAsChildOf(parent);
}
parent.ensureCompletedPhase(copy);
- return canReuseCurrent(copy) ? replicaAsChildOf(parent) : copy;
+ return canReuseCurrent(copy) ? this : copy;
}
private boolean canReuseCurrent(final ReactorStmtCtx<A, D, E> copy) {