Use instantiatedPolicy() in list statement 89/94889/4
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 29 Jan 2021 21:03:32 +0000 (22:03 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 29 Jan 2021 21:31:44 +0000 (22:31 +0100)
This conversion turns out to be quite simple, but don't forget
to add tests.

JIRA: YANGTOOLS-1208
Change-Id: I39071d4147b679dc88d132e37fa65fe5a202e199
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/EmptyListEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ListStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/RegularListEffectiveStatement.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java
yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/list.yang [new file with mode: 0644]

index 9dfa63a5abb7dc0d891b705d84a76aad29c859a3..affaebfff35df7b00a61d399464f9ec35df296b8 100644 (file)
@@ -59,6 +59,15 @@ abstract class AbstractListEffectiveStatement
         this.flags = flags;
     }
 
+    AbstractListEffectiveStatement(final AbstractListEffectiveStatement original, final SchemaPath path,
+            final int flags) {
+        super(original);
+        this.substatements = original.substatements;
+        this.keyDefinition = original.keyDefinition;
+        this.path = path;
+        this.flags = flags;
+    }
+
     @Override
     public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
         return unmaskList(substatements);
index 03b9c216130a857183a262bdb3014fe7e0c65720..b7a64b63efd8614f19a5ebecba23331993968fed 100644 (file)
@@ -23,6 +23,10 @@ final class EmptyListEffectiveStatement extends AbstractListEffectiveStatement {
         super(declared, path, flags, substatements, keyDefinition);
     }
 
+    EmptyListEffectiveStatement(final EmptyListEffectiveStatement original, final SchemaPath path, final int flags) {
+        super(original, path, flags);
+    }
+
     @Override
     public Optional<? extends SchemaNode> getOriginal() {
         return Optional.empty();
index e667748424456e5e3c8c072d78ad1a4139115ae8..c0237ff8ad10f68f0c36ab2d72032dcefd9a037d 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
@@ -113,7 +114,7 @@ public final class ListStatementSupport extends BaseSchemaTreeStatementSupport<L
     private final SubstatementValidator validator;
 
     ListStatementSupport(final SubstatementValidator validator) {
-        super(YangStmtMapping.LIST, StatementPolicy.legacyDeclaredCopy());
+        super(YangStmtMapping.LIST, instantiatedPolicy());
         this.validator = requireNonNull(validator);
     }
 
@@ -141,6 +142,22 @@ public final class ListStatementSupport extends BaseSchemaTreeStatementSupport<L
         return new EmptyListStatement(ctx.getArgument());
     }
 
+    @Override
+    public ListEffectiveStatement copyEffective(final Current<QName, ListStatement> stmt,
+            final ListEffectiveStatement original) {
+        final int flags = computeFlags(stmt, original.effectiveSubstatements());
+        if (original instanceof EmptyListEffectiveStatement) {
+            return new EmptyListEffectiveStatement((EmptyListEffectiveStatement) original, stmt.wrapSchemaPath(),
+                flags);
+        } else if (original instanceof RegularListEffectiveStatement) {
+            return new RegularListEffectiveStatement((RegularListEffectiveStatement) original, stmt.wrapSchemaPath(),
+                flags);
+        } else {
+            // Safe fallback
+            return super.copyEffective(stmt, original);
+        }
+    }
+
     @Override
     protected ListEffectiveStatement createEffective(final Current<QName, ListStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
@@ -167,15 +184,8 @@ public final class ListStatementSupport extends BaseSchemaTreeStatementSupport<L
             keyDefinition = ImmutableList.of();
         }
 
-        final EffectiveConfig configuration = stmt.effectiveConfig();
-        final int flags = new FlagsBuilder()
-                .setHistory(stmt.history())
-                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
-                .setConfiguration(configuration.asNullable())
-                .setUserOrdered(findFirstArgument(substatements, OrderedByEffectiveStatement.class, Ordering.SYSTEM)
-                    .equals(Ordering.USER))
-                .toFlags();
-        if (configuration == EffectiveConfig.TRUE && keyDefinition.isEmpty() && isInstantied(stmt)) {
+        final int flags = computeFlags(stmt, substatements);
+        if (stmt.effectiveConfig() == EffectiveConfig.TRUE && keyDefinition.isEmpty() && isInstantied(stmt)) {
             warnConfigList(stmt);
         }
 
@@ -197,6 +207,17 @@ public final class ListStatementSupport extends BaseSchemaTreeStatementSupport<L
         }
     }
 
+    private static int computeFlags(final Current<?, ?> stmt,
+            final Collection<? extends EffectiveStatement<?, ?>> substatements) {
+        return new FlagsBuilder()
+            .setHistory(stmt.history())
+            .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+            .setConfiguration(stmt.effectiveConfig().asNullable())
+            .setUserOrdered(findFirstArgument(substatements, OrderedByEffectiveStatement.class, Ordering.SYSTEM)
+                .equals(Ordering.USER))
+            .toFlags();
+    }
+
     private static void warnConfigList(final @NonNull Current<QName, ListStatement> stmt) {
         final StatementSourceReference ref = stmt.sourceReference();
         final Boolean warned = stmt.getFromNamespace(ConfigListWarningNamespace.class, ref);
index 582fbff4e66e1179ca2ba0bcc79fd76cf0ab86cb..b38657a696c65d5e91483c361d06b0d33b990f07 100644 (file)
@@ -29,6 +29,13 @@ final class RegularListEffectiveStatement extends AbstractListEffectiveStatement
         this.original = original;
     }
 
+    RegularListEffectiveStatement(final RegularListEffectiveStatement original, final SchemaPath path,
+            final int flags) {
+        super(original, path, flags);
+        this.elementCountConstraint = original.elementCountConstraint;
+        this.original = original.original;
+    }
+
     @Override
     public Optional<ListSchemaNode> getOriginal() {
         return Optional.ofNullable(original);
index c0aa06aa61fa09d78cbdbabab4696637a51a0ede..d43f7b82c0ad51bd508546a02af800be6737f0ab 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatemen
 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
 
@@ -149,4 +150,25 @@ public class YT1208Test {
 
         assertSame(contBar, grpBar);
     }
+
+    @Test
+    public void testListStatementReuse() throws Exception {
+        final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/list.yang")
+            .getModuleStatements()
+            .get(QNameModule.create(URI.create("foo")));
+        assertNotNull(module);
+
+        final NotificationEffectiveStatement notif = module
+            .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow();
+
+        final ListEffectiveStatement grpBar = notif
+            .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow()
+            .findFirstEffectiveSubstatement(ListEffectiveStatement.class).orElseThrow();
+        final ListEffectiveStatement contBar = notif
+            .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow()
+            .findFirstEffectiveSubstatement(ListEffectiveStatement.class).orElseThrow();
+
+        assertSame(contBar, grpBar);
+    }
+
 }
diff --git a/yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/list.yang b/yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/list.yang
new file mode 100644 (file)
index 0000000..68a210a
--- /dev/null
@@ -0,0 +1,21 @@
+module foo {
+  namespace foo;
+  prefix foo;
+
+  grouping grp {
+    list bar {
+      description "desc";
+      reference "ref";
+    }
+  }
+
+  notification foo {
+    grouping foo {
+      uses grp;
+    }
+
+    container foo {
+      uses foo;
+    }
+  }
+}