Check for existence of slash before trimming 92/86792/5
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 7 Jan 2020 16:29:45 +0000 (17:29 +0100)
committerRobert Varga <nite@hq.sk>
Wed, 12 Feb 2020 14:44:59 +0000 (14:44 +0000)
Rather than creating multiple matchers for no good reason at all,
check if the string contains a backslash character before going
in and performing escaping.

JIRA: YANGTOOLS-652
Change-Id: I77fb02bad4ffb13a8393956c56b15ebe3e1dbf3f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/ArgumentContextUtils.java

index 375b7f7565d6939add006acebd32a3f0938cc434..20657353b76ffea911e83c3a65cdeb9e36a43e20 100644 (file)
@@ -48,16 +48,7 @@ final class ArgumentContextUtils {
                  * in the inner string and trim the result.
                  */
                 checkDoubleQuotedString(innerStr, yangVersion, ref);
-
-                sb.append(ESCAPED_TAB.matcher(
-                    ESCAPED_LF.matcher(
-                        ESCAPED_BACKSLASH.matcher(
-                            ESCAPED_DQUOT.matcher(
-                                trimWhitespace(innerStr, stringNode.getSymbol().getCharPositionInLine()))
-                            .replaceAll("\\\""))
-                        .replaceAll("\\\\"))
-                    .replaceAll("\\\n"))
-                    .replaceAll("\\\t"));
+                sb.append(unescape(trimWhitespace(innerStr, stringNode.getSymbol().getCharPositionInLine())));
             } else if (firstChar == '\'' && lastChar == '\'') {
                 /*
                  * According to RFC6020 a single quote character cannot occur in
@@ -72,6 +63,22 @@ final class ArgumentContextUtils {
         return sb.toString();
     }
 
+    private static String unescape(final String str) {
+        final int backslash = str.indexOf('\\');
+        if (backslash == -1) {
+            return str;
+        }
+
+        // FIXME: given we the leading backslash, it would be more efficient to walk the string and unescape in one go
+        return ESCAPED_TAB.matcher(
+                    ESCAPED_LF.matcher(
+                        ESCAPED_BACKSLASH.matcher(
+                            ESCAPED_DQUOT.matcher(str).replaceAll("\\\""))
+                        .replaceAll("\\\\"))
+                    .replaceAll("\\\n"))
+               .replaceAll("\\\t");
+    }
+
     private static void checkUnquotedString(final String str, final YangVersion yangVersion,
             final StatementSourceReference ref) {
         if (yangVersion == YangVersion.VERSION_1_1) {