From 9472dd50e8552758b4669dcfb7e80f62912675c8 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 27 Jan 2021 11:54:58 +0100 Subject: [PATCH] Add a proper grouping statement policy A grouping is very similar to an uninstantiated statement, yet it is a bit more loose. Add a proper StatementPolicy to cover its mechanics. JIRA: YANGTOOLS-1208 Change-Id: I79eb18766be252fd4b163e8a51653621585127a3 Signed-off-by: Robert Varga --- .../grouping/GroupingStatementSupport.java | 6 ++++- .../yangtools/yang/stmt/YT1208Test.java | 22 ++++++++++++++++++ .../test/resources/bugs/YT1208/grouping.yang | 23 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/grouping.yang diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingStatementSupport.java index 68ab5afcd3..5613c953d8 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingStatementSupport.java @@ -75,7 +75,11 @@ public final class GroupingStatementSupport private final SubstatementValidator validator; GroupingStatementSupport(final SubstatementValidator validator) { - super(YangStmtMapping.GROUPING, StatementPolicy.legacyDeclaredCopy()); + super(YangStmtMapping.GROUPING, StatementPolicy.copyDeclared( + (copy, current, substatements) -> + copy.history().isAddedByUses() == current.history().isAddedByUses() + && copy.getArgument().equals(current.getArgument()) + && copy.equalParentPath(current))); this.validator = requireNonNull(validator); } diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java index 040b5725e2..2792dde483 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YT1208Test.java @@ -20,6 +20,28 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement; public class YT1208Test { + @Test + public void testGroupingStatementReuse() throws Exception { + final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/grouping.yang") + .getModuleStatements() + .get(QNameModule.create(URI.create("foo"))); + assertNotNull(module); + + final NotificationEffectiveStatement notif = module + .findFirstEffectiveSubstatement(NotificationEffectiveStatement.class).orElseThrow(); + + final GroupingEffectiveStatement grpBar = notif + .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow() + .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow() + .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow(); + final GroupingEffectiveStatement contBar = notif + .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow() + .findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).orElseThrow() + .findFirstEffectiveSubstatement(GroupingEffectiveStatement.class).orElseThrow(); + + assertSame(contBar, grpBar); + } + @Test public void testLeafStatementReuse() throws Exception { final ModuleEffectiveStatement module = StmtTestUtils.parseYangSource("/bugs/YT1208/leaf.yang") diff --git a/yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/grouping.yang b/yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/grouping.yang new file mode 100644 index 0000000000..28104d70a1 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/test/resources/bugs/YT1208/grouping.yang @@ -0,0 +1,23 @@ +module foo { + namespace foo; + prefix foo; + + grouping grp { + container foo { + grouping bar { + container bar; + description "desc"; + } + } + } + + notification foo { + grouping baz { + uses grp; + } + + container baz { + uses baz; + } + } +} -- 2.36.6