From 323127cf3a2dcab15e3066b415213e29f55f0516 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 7 Nov 2017 15:09:45 +0100 Subject: [PATCH] YANGTOOLS-826: allow whitespace after function name 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 --- .../yang/parser/stmt/rfc6020/Utils.java | 2 +- .../yang/parser/stmt/rfc6020/YT826Test.java | 29 ++++++++++++++ .../resources/bugs/yangtools826/example.yang | 39 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YT826Test.java create mode 100644 yang/yang-parser-impl/src/test/resources/bugs/yangtools826/example.yang diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java index 8597afca6c..1a8c356ac0 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java @@ -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 index 0000000000..b574ab0f8e --- /dev/null +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YT826Test.java @@ -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 index 0000000000..fb9e8fc23c --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/bugs/yangtools826/example.yang @@ -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; + } + } + } +} -- 2.36.6