@Beta
public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>,
E extends EffectiveStatement<A, D>> extends StatementSupport<A, D, E> {
- @Deprecated
- protected AbstractStatementSupport(final StatementDefinition publicDefinition, final CopyPolicy copyPolicy) {
- super(publicDefinition, copyPolicy);
- }
-
protected AbstractStatementSupport(final StatementDefinition publicDefinition, final StatementPolicy<A, D> policy) {
super(publicDefinition, policy);
}
@Override
public E createEffective(final Current<A, D> stmt,
final Stream<? extends StmtContext<?, ?, ?>> declaredSubstatements,
- final Stream<? extends StmtContext<?, ?, ?>> effectiveSubstatements) {
+ final Stream<? extends StmtContext<?, ?, ?>> inferredSubstatements) {
final ImmutableList<? extends EffectiveStatement<?, ?>> substatements =
buildEffectiveSubstatements(stmt, statementsToBuild(stmt,
- declaredSubstatements(declaredSubstatements, effectiveSubstatements)));
+ declaredSubstatements(declaredSubstatements, inferredSubstatements)));
return createEffective(stmt, substatements);
}
protected abstract @NonNull E createEffective(@NonNull Current<A, D> stmt,
@NonNull ImmutableList<? extends EffectiveStatement<?, ?>> substatements);
+ @Override
+ public E copyEffective(final Current<A, D> stmt, final E original) {
+ // Most implementations are only interested in substatements. copyOf() here should be a no-op
+ return createEffective(stmt, ImmutableList.copyOf(original.effectiveSubstatements()));
+ }
+
/**
* Give statement support a hook to transform statement contexts before they are built. Default implementation
* does nothing, but note {@code augment} statement performs a real transformation.
// FIXME: add documentation
public static final <E extends EffectiveStatement<?, ?>> @Nullable E findFirstStatement(
- final ImmutableList<? extends EffectiveStatement<?, ?>> statements, final Class<E> type) {
+ final Collection<? extends EffectiveStatement<?, ?>> statements, final Class<E> type) {
for (EffectiveStatement<?, ?> stmt : statements) {
if (type.isInstance(stmt)) {
return type.cast(stmt);
// FIXME: add documentation
public static final <A, E extends EffectiveStatement<A, ?>> A findFirstArgument(
- final ImmutableList<? extends EffectiveStatement<?, ?>> statements, final Class<@NonNull E> type,
+ final Collection<? extends EffectiveStatement<?, ?>> statements, final Class<@NonNull E> type,
final A defValue) {
final @Nullable E stmt = findFirstStatement(statements, type);
return stmt != null ? stmt.argument() : defValue;
*/
protected @NonNull ImmutableList<? extends EffectiveStatement<?, ?>> buildEffectiveSubstatements(
final Current<A, D> stmt, final List<? extends StmtContext<?, ?, ?>> substatements) {
- return defaultBuildEffectiveSubstatements(substatements);
- }
-
- private static @NonNull ImmutableList<? extends EffectiveStatement<?, ?>> defaultBuildEffectiveSubstatements(
- final List<? extends StmtContext<?, ?, ?>> substatements) {
- return substatements.stream()
- .filter(StmtContext::isSupportedToBuildEffective)
- .map(StmtContext::buildEffective)
- .collect(ImmutableList.toImmutableList());
+ return substatements.stream().map(StmtContext::buildEffective).collect(ImmutableList.toImmutableList());
}
private static @NonNull List<StmtContext<?, ?, ?>> declaredSubstatements(