Move grouping copy policy to UsesStatementSupport 99/87399/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 2 Feb 2020 08:17:04 +0000 (09:17 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 3 Feb 2020 18:53:08 +0000 (19:53 +0100)
Exclusion of documentation nodes is a pure 'uses' statement mechanics
against a 'grouping' statement. Restore 'uses' behavior from before
541fde521d0b4e01e1023be8612d0fcff81a67bc, but retain reactor deferral
to substatements -- which means when we copy a grouping itself, its
documentation is correctly retained.

Change-Id: Ic58ce5f94181fe26f47ea470877911e6c0452c1c
JIRA: YANGTOOLS-694
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/description/DescriptionStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/reference/ReferenceStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/status/StatusStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java

index 2fdc3de240241ac92fbc55722ed13ea207c74ea0..016a90c5df90de49a2d34a6b88ba084b5240f30a 100644 (file)
@@ -8,18 +8,13 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.description;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Optional;
-import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStringStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 public final class DescriptionStatementSupport
@@ -41,13 +36,6 @@ public final class DescriptionStatementSupport
         return value;
     }
 
-    @Override
-    public Optional<? extends Mutable<?, ?, ?>> copyAsChildOf(final Mutable<?, ?, ?> stmt,
-            final Mutable<?, ?, ?> parent, final CopyType type, final QNameModule targetModule) {
-        return StmtContextUtils.isChildOfGrouping(stmt) ? Optional.empty()
-                : super.copyAsChildOf(stmt, parent, type, targetModule);
-    }
-
     @Override
     protected SubstatementValidator getSubstatementValidator() {
         return SUBSTATEMENT_VALIDATOR;
index 365e4ce28488e18b1ea799f9a2336b360031d674..82d5ca8a487c5c000707d6d92ed566be2e6dea3f 100644 (file)
@@ -8,18 +8,13 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.reference;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Optional;
-import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStringStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 public final class ReferenceStatementSupport
@@ -42,13 +37,6 @@ public final class ReferenceStatementSupport
         return value;
     }
 
-    @Override
-    public Optional<? extends Mutable<?, ?, ?>> copyAsChildOf(final Mutable<?, ?, ?> stmt,
-            final Mutable<?, ?, ?> parent, final CopyType type, final QNameModule targetModule) {
-        return StmtContextUtils.isChildOfGrouping(stmt) ? Optional.empty()
-                : super.copyAsChildOf(stmt, parent, type, targetModule);
-    }
-
     @Override
     protected SubstatementValidator getSubstatementValidator() {
         return SUBSTATEMENT_VALIDATOR;
index d39fd6f0b22b1e3e636fa423740a8612cf41fdea..13f062b99387ab8eb921b35ec2b9523098ef78a0 100644 (file)
@@ -8,9 +8,7 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.status;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
@@ -18,10 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
@@ -85,13 +80,6 @@ public final class StatusStatementSupport
         }
     }
 
-    @Override
-    public Optional<? extends Mutable<?, ?, ?>> copyAsChildOf(final Mutable<?, ?, ?> stmt,
-            final Mutable<?, ?, ?> parent, final CopyType type, final QNameModule targetModule) {
-        return StmtContextUtils.isChildOfGrouping(stmt) ? Optional.empty()
-                : super.copyAsChildOf(stmt, parent, type, targetModule);
-    }
-
     @Override
     protected SubstatementValidator getSubstatementValidator() {
         return SUBSTATEMENT_VALIDATOR;
index 7a9769310784182fece33c95a215a18ab5990a23..9c7584009e5f888f1382a88fa3de5824ce1ace78 100644 (file)
@@ -160,24 +160,48 @@ public final class UsesStatementSupport
     }
 
     // FIXME: YANGTOOLS-652: this map looks very much like InferredStatementContext.REUSED_DEF_SET
-    private static final ImmutableSet<YangStmtMapping> TOP_REUSED_DEF_SET = ImmutableSet.of(
-        YangStmtMapping.TYPE,
-        YangStmtMapping.TYPEDEF);
+    // FIXME: YANGTOOLS-694: we should take advantage of CopyPolicy
+    private static final ImmutableSet<? extends StatementDefinition> TOP_REUSED_DEF_SET = ImmutableSet.of(
+        YangStmtMapping.TYPE, YangStmtMapping.TYPEDEF);
+    private static final ImmutableSet<? extends StatementDefinition> DOCUMENTATION_STATEMENTS = ImmutableSet.of(
+        YangStmtMapping.DESCRIPTION, YangStmtMapping.REFERENCE, YangStmtMapping.STATUS);
 
     private static void copyStatement(final Mutable<?, ?, ?> original,
             final StatementContextBase<?, ?, ?> targetCtx, final QNameModule targetModule,
             final Collection<Mutable<?, ?, ?>> buffer) {
+
+        // FIXME: YANGTOOLS-694: This method needs to be adjusted to account for RFC7950,
+        //                       https://tools.ietf.org/html/rfc7950#section-7.13, which states that:
+        //
+        //        The effect of a "uses" reference to a grouping is that the nodes
+        //        defined by the grouping are copied into the current schema tree and
+        //        are then updated according to the "refine" and "augment" statements.
+        //
+        //                       This means that the statement that is about to be copied (and can be subjected to
+        //                       buildEffective() I think) is actually a SchemaTreeEffectiveStatement -- i.e. if it
+        //                       is not a SchemaTreeEffectiveStatement, it just cannot be added to target's tree and
+        //                       hence it should not be copied.
+
         final StatementDefinition def = original.getPublicDefinition();
+        if (DOCUMENTATION_STATEMENTS.contains(def)) {
+            // We do not want to propagate description/reference/status statements, as they are the source grouping's
+            // documentation, not target statement's
+            return;
+        }
         if (TOP_REUSED_DEF_SET.contains(def)) {
+            // a grouping's type/typedef statements are fully defined at the grouping, we want the same effective
+            // statement
             buffer.add(original);
             return;
         }
-        // Do not propagate uses, as their effects have been accounted for in effective statements
-        // FIXME: YANGTOOLS-652: this check is different from InferredStatementContext. Why is that? We should express
-        //                       a common condition in our own implementation of copyAsChildOf()
-        if (!YangStmtMapping.USES.equals(def)) {
-            original.copyAsChildOf(targetCtx, CopyType.ADDED_BY_USES, targetModule).ifPresent(buffer::add);
+        if (YangStmtMapping.USES.equals(def)) {
+            // Do not propagate uses, as their effects have been accounted for in effective statements
+            // FIXME: YANGTOOLS-652: this check is different from InferredStatementContext. Why is that? We should
+            //                       express a common condition in our own implementation of applyCopyPolicy()
+            // FIXME: YANGTOOLS-694: note that if the above is true, why are we propagating grouping statements?
+            return;
         }
+        original.copyAsChildOf(targetCtx, CopyType.ADDED_BY_USES, targetModule).ifPresent(buffer::add);
     }
 
     private static QNameModule getNewQNameModule(final StmtContext<?, ?, ?> targetCtx,
index 1a0f9462b99c9a0b442f6e520877746da81969bd..7d4ffbfe0f78e86be2a100b93bfe830c70799635 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.parser.spi.meta;
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
@@ -646,16 +645,4 @@ public final class StmtContextUtils {
         }
         return Optional.ofNullable(revision);
     }
-
-    /**
-     * Determine if a specific statetement context is a child of a statement context which produces a grouping.
-     *
-     * @param stmt Statement to examine
-     * @return True if parent context is that of a grouping.
-     */
-    @Beta
-    public static boolean isChildOfGrouping(final StmtContext<?, ?, ?> stmt) {
-        final StmtContext<?, ?, ?> parent = stmt.getParentContext();
-        return parent != null && parent.getPublicDefinition() == YangStmtMapping.GROUPING;
-    }
 }