From 10f37913cf44e52bf76802aa97acb306a4db904f Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 20 Mar 2019 13:04:46 +0100 Subject: [PATCH] Fix XPathExpr parsing The parser mistakenly treated filter/path concatenation as a binary expression, which lead to its inability to parse leafrefs, which contain such a concatenation in predicates. This fixes the parser to correctly use XPathExpr in this case. Change-Id: Ica1ac3ee7d099273dccdf8565da2a69d9f11c046 Signed-off-by: Robert Varga --- .../yangtools/yang/xpath/api/YangPathExpr.java | 2 +- .../yangtools/yang/xpath/impl/AntlrXPathParser.java | 8 ++++---- .../yangtools/yang/xpath/impl/XPathParserTest.java | 2 ++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangPathExpr.java b/yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangPathExpr.java index d695d2ec41..47577c8b69 100644 --- a/yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangPathExpr.java +++ b/yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangPathExpr.java @@ -44,7 +44,7 @@ public class YangPathExpr implements YangExpr { return new YangPathExpr(filterExpr); } - public static YangExpr of(final YangExpr expr, final YangLocationPath locationPath) { + public static YangPathExpr of(final YangExpr expr, final YangLocationPath locationPath) { return new WithLocation(expr, locationPath); } diff --git a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java index 1366bbe334..2c7f506cc1 100644 --- a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java +++ b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java @@ -56,6 +56,7 @@ import org.opendaylight.yangtools.yang.xpath.api.YangNaryExpr; import org.opendaylight.yangtools.yang.xpath.api.YangNaryOperator; import org.opendaylight.yangtools.yang.xpath.api.YangNegateExpr; import org.opendaylight.yangtools.yang.xpath.api.YangNumberExpr; +import org.opendaylight.yangtools.yang.xpath.api.YangPathExpr; import org.opendaylight.yangtools.yang.xpath.api.YangVariableReferenceExpr; import org.opendaylight.yangtools.yang.xpath.api.YangXPathAxis; import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression; @@ -267,10 +268,9 @@ final class AntlrXPathParser implements YangXPathParser { } verifyChildCount(expr, 3); - - // FIXME: this actually is a concatenation - return parseOperator(expr.getChild(1)).exprWith(filter, - parseRelativeLocationPath(getChild(expr, RelativeLocationPathContext.class, 2))); + final Deque steps = parseLocationPathSteps(getChild(expr, RelativeLocationPathContext.class, 2)); + parseStepShorthand(expr.getChild(1)).ifPresent(steps::addFirst); + return YangPathExpr.of(filter, YangLocationPath.of(false, steps)); } private YangExpr parsePredicate(final PredicateContext expr) { diff --git a/yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java b/yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java index 3fe300bd0f..3b363d3eb7 100644 --- a/yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java +++ b/yang/yang-xpath-impl/src/test/java/org/opendaylight/yangtools/yang/xpath/impl/XPathParserTest.java @@ -39,6 +39,8 @@ public class XPathParserTest { @Test public void testSmoke() throws XPathExpressionException { + parseExpr("../a[foo = current()/foo]"); + parseExpr("3 + 5"); parseExpr("/a/b"); parseExpr("a/b"); -- 2.36.6