Merge location step shorthand handling 37/81037/3
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 20 Mar 2019 11:19:08 +0000 (12:19 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 20 Mar 2019 15:44:12 +0000 (16:44 +0100)
This eliminates duplicate code by introducing parseStepShorthand()
and adjusting its two users to use it.

Change-Id: I0e4db3e9a7fd062e5085ce27f6ba6d21cf6cf668
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 82cc304f600f4033570dbbcbcaa6bf735418b65c)

yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java

index 2b53a3b2f9f769bedee01d387d639f32b3dc1b5d..e44a7c897c7b3e8469da91ab07d29e70cf140fcd 100644 (file)
@@ -251,15 +251,7 @@ final class AntlrXPathParser implements YangXPathParser {
         verifyChildCount(abs, 2);
 
         final Deque<Step> steps = parseLocationPathSteps(getChild(abs, RelativeLocationPathContext.class, 1));
-        switch (getTerminalType(abs, 0)) {
-            case xpathParser.PATHSEP:
-                break;
-            case xpathParser.ABRPATH:
-                steps.addFirst(YangXPathAxis.DESCENDANT_OR_SELF.asStep());
-                break;
-            default:
-                throw illegalShape(abs);
-        }
+        parseStepShorthand(abs.getChild(0)).ifPresent(steps::addFirst);
 
         return YangLocationPath.of(true, steps);
     }
@@ -295,6 +287,8 @@ 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)));
     }
@@ -335,16 +329,7 @@ final class AntlrXPathParser implements YangXPathParser {
         steps.add(parseStep(nextContext(it, StepContext.class)));
 
         while (it.hasNext()) {
-            final ParseTree tree = it.next();
-            switch (verifyTerminal(tree).getSymbol().getType()) {
-                case xpathParser.PATHSEP:
-                    break;
-                case xpathParser.ABRPATH:
-                    steps.add(YangXPathAxis.DESCENDANT_OR_SELF.asStep());
-                    break;
-                default:
-                    throw illegalShape(tree);
-            }
+            parseStepShorthand(it.next()).ifPresent(steps::add);
 
             // Parse step and add it if it's not SELF_STEP
             final Step step = parseStep(nextContext(it, StepContext.class));
@@ -566,4 +551,15 @@ final class AntlrXPathParser implements YangXPathParser {
         final String str = verifyTerminal(tree).getText();
         return verifyNotNull(BINARY_OPERATORS.get(str), "Unhandled operator %s", str);
     }
+
+    private static Optional<Step> parseStepShorthand(final ParseTree tree) {
+        switch (verifyTerminal(tree).getSymbol().getType()) {
+            case xpathParser.PATHSEP:
+                return Optional.empty();
+            case xpathParser.ABRPATH:
+                return Optional.of(YangXPathAxis.DESCENDANT_OR_SELF.asStep());
+            default:
+                throw illegalShape(tree);
+        }
+    }
 }