YANGTOOLS-826: allow whitespace after function name 67/65267/3
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 7 Nov 2017 14:09:45 +0000 (15:09 +0100)
committerRobert Varga <nite@hq.sk>
Wed, 8 Nov 2017 09:48:36 +0000 (09:48 +0000)
As per https://www.w3.org/TR/1999/REC-xpath-19991116/#exprlex:

"For readability, whitespace may be used in expressions even though
not explicitly allowed by the grammar: ExprWhitespace may be freely
added within patterns before or after any ExprToken."

Add optional whitespace to the pattern to allow for this.

Change-Id: Iea5f7c9539734a5b5d3c1bb7367e615af4d1f9cb
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YT826Test.java [new file with mode: 0644]
yang/yang-parser-impl/src/test/resources/bugs/yangtools826/example.yang [new file with mode: 0644]

index 8597afca6cdb3d274c0b1d2d083835bf65a0df5d..1a8c356ac034246bc6b3957510cb2873fae6b414 100644 (file)
@@ -57,7 +57,7 @@ public final class Utils {
     private static final Pattern PATH_ABS = Pattern.compile("/[^/].*");
     @RegEx
     private static final String YANG_XPATH_FUNCTIONS_STRING =
-            "(re-match|deref|derived-from(-or-self)?|enum-value|bit-is-set)(\\()";
+            "(re-match|deref|derived-from(-or-self)?|enum-value|bit-is-set)([ \t\r\n]*)(\\()";
     private static final Pattern YANG_XPATH_FUNCTIONS_PATTERN = Pattern.compile(YANG_XPATH_FUNCTIONS_STRING);
     private static final Pattern ESCAPED_DQUOT = Pattern.compile("\\\"", Pattern.LITERAL);
     private static final Pattern ESCAPED_BACKSLASH = Pattern.compile("\\\\", Pattern.LITERAL);
diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YT826Test.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YT826Test.java
new file mode 100644 (file)
index 0000000..b574ab0
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
+import org.opendaylight.yangtools.yang.stmt.StmtTestUtils;
+
+public class YT826Test {
+
+    @Test
+    public void testWhenExpressionWhitespace() throws ReactorException, URISyntaxException, IOException,
+            YangSyntaxErrorException {
+        final SchemaContext schemaContext = StmtTestUtils.parseYangSource("/bugs/yangtools826/example.yang");
+        assertNotNull(schemaContext);
+    }
+
+}
diff --git a/yang/yang-parser-impl/src/test/resources/bugs/yangtools826/example.yang b/yang/yang-parser-impl/src/test/resources/bugs/yangtools826/example.yang
new file mode 100644 (file)
index 0000000..fb9e8fc
--- /dev/null
@@ -0,0 +1,39 @@
+module example {
+    yang-version 1.1;
+
+    namespace "http://www.example.com";
+
+    prefix "ex";
+
+    revision "2017-10-11";
+
+    identity interface-type;
+
+    identity ethernet {
+       base interface-type;
+    }
+
+    list interface {
+       key name;
+
+       leaf name {
+           type string;
+       }
+
+       leaf type {
+           type identityref {
+              base interface-type;
+          }
+       }
+    }
+
+    augment "/interface" {
+        when 'derived-from-or-self (type, "ex:ethernet")';
+
+        container extension {
+            leaf speed {
+                type int32;
+            }
+        }
+    }
+}