Clarify StatementFactory.createEffective()
[yangtools.git] / yang / yang-parser-spi / src / main / java / org / opendaylight / yangtools / yang / parser / spi / meta / AbstractStatementSupport.java
index de120775d3191a86178159ebedbbe9dc9125304b..694a91860e71fef36358bd3552d5859dfd82bde7 100644 (file)
@@ -34,11 +34,6 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 @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);
     }
@@ -59,16 +54,22 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
     @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.
@@ -84,7 +85,7 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
 
     // 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);
@@ -95,7 +96,7 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
 
     // 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;
@@ -111,15 +112,7 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
      */
     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(