Do not retain namespace context when not needed
[yangtools.git] / yang / yang-xpath-impl / src / main / java / org / opendaylight / yangtools / yang / xpath / impl / AntlrXPathParser.java
index 501903152088df18613383fc0d4603e3d77b5b57..a12dfd2e8b7a292fb5f47967adc2c62f45a2237b 100644 (file)
@@ -150,7 +150,7 @@ abstract class AntlrXPathParser implements YangXPathParser {
         public YangXPathExpression.QualifiedBound parseExpression(final String xpath) throws XPathExpressionException {
             final ParseExprResult result = parseExpr(xpath);
             return new AntlrYangXPathExpression.Qualified(mathMode, result.minimumYangVersion, result.expression, xpath,
-                namespaceContext);
+                result.haveLiteral ? namespaceContext : null);
         }
 
         @Override
@@ -180,7 +180,7 @@ abstract class AntlrXPathParser implements YangXPathParser {
             final ParseExprResult result = parseExpr(xpath);
 
             return new AntlrYangXPathExpression.Unqualified(mathMode, result.minimumYangVersion, result.expression,
-                xpath, namespaceContext, defaultNamespace);
+                xpath, result.haveLiteral ? namespaceContext : null, defaultNamespace);
         }
 
         @Override
@@ -198,10 +198,12 @@ abstract class AntlrXPathParser implements YangXPathParser {
     private static final class ParseExprResult {
         final YangVersion minimumYangVersion;
         final YangExpr expression;
+        final boolean haveLiteral;
 
-        ParseExprResult(final YangVersion minimumYangVersion, final YangExpr expression) {
+        ParseExprResult(final YangVersion minimumYangVersion, final YangExpr expression, final boolean haveLiteral) {
             this.minimumYangVersion = requireNonNull(minimumYangVersion);
             this.expression = requireNonNull(expression);
+            this.haveLiteral = haveLiteral;
         }
     }
 
@@ -222,6 +224,7 @@ abstract class AntlrXPathParser implements YangXPathParser {
     private final FunctionSupport functionSupport;
 
     private YangVersion minimumYangVersion = YangVersion.VERSION_1;
+    private boolean haveLiteral = false;
 
     AntlrXPathParser(final YangXPathMathMode mathMode) {
         this.mathMode = requireNonNull(mathMode);
@@ -265,6 +268,7 @@ abstract class AntlrXPathParser implements YangXPathParser {
 
         // Reset our internal context
         minimumYangVersion = YangVersion.VERSION_1;
+        haveLiteral = false;
 
         final YangExpr expr;
         try {
@@ -272,7 +276,7 @@ abstract class AntlrXPathParser implements YangXPathParser {
         } catch (RuntimeException e) {
             throw new XPathExpressionException(e);
         }
-        return new ParseExprResult(minimumYangVersion, expr);
+        return new ParseExprResult(minimumYangVersion, expr, haveLiteral);
     }
 
     /**
@@ -351,7 +355,12 @@ abstract class AntlrXPathParser implements YangXPathParser {
             if (minimumYangVersion.compareTo(func.getYangVersion()) < 0) {
                 minimumYangVersion = func.getYangVersion();
             }
-            return functionSupport.functionToExpr(func, args);
+
+            final YangExpr funcExpr = functionSupport.functionToExpr(func, args);
+            if (funcExpr instanceof YangLiteralExpr) {
+                haveLiteral = true;
+            }
+            return funcExpr;
         }
 
         checkArgument(!YangConstants.RFC6020_YIN_MODULE.equals(parsed.getModule()), "Unknown default function %s",
@@ -467,6 +476,7 @@ abstract class AntlrXPathParser implements YangXPathParser {
         switch (term.getSymbol().getType()) {
             case xpathParser.Literal:
                 // We have to strip quotes
+                haveLiteral = true;
                 return YangLiteralExpr.of(text.substring(1, text.length() - 1));
             case xpathParser.Number:
                 return mathSupport.createNumber(text);