From 3be096f1524ee8009400053823e4332fedb1df0c Mon Sep 17 00:00:00 2001
From: Orgad Shaneh <orgad.shaneh@audiocodes.com>
Date: Sun, 3 Jul 2016 22:02:05 +0300
Subject: [PATCH] Utils: Support default value substitution in macro expansion

Syntax is similar to bash substitution:

%{variable:-default}

Change-Id: I50e4e18a186c5408dc8b7b95cebbf891d13e03bf
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: hjk <hjk@qt.io>
---
 src/libs/utils/stringutils.cpp                   | 9 +++++++++
 tests/auto/utils/stringutils/tst_stringutils.cpp | 1 +
 2 files changed, 10 insertions(+)

diff --git a/src/libs/utils/stringutils.cpp b/src/libs/utils/stringutils.cpp
index 274a8bfb7c7..3b2de69ec72 100644
--- a/src/libs/utils/stringutils.cpp
+++ b/src/libs/utils/stringutils.cpp
@@ -128,6 +128,7 @@ bool AbstractMacroExpander::expandNestedMacros(const QString &str, int *pos, QSt
 {
     QString varName;
     QString pattern, replace;
+    QString defaultValue;
     QString *currArg = &varName;
     QChar prev;
     QChar c;
@@ -172,12 +173,20 @@ bool AbstractMacroExpander::expandNestedMacros(const QString &str, int *pos, QSt
                 }
                 return true;
             }
+            if (!defaultValue.isEmpty()) {
+                *pos = i;
+                *ret = defaultValue;
+                return true;
+            }
             return false;
         } else if (c == '{' && prev == '%') {
             if (!expandNestedMacros(str, &i, ret))
                 return false;
             varName.chop(1);
             varName += ret;
+        } else if (currArg == &varName && c == '-' && prev == ':' && validateVarName(varName)) {
+            varName.chop(1);
+            currArg = &defaultValue;
         } else if (currArg == &varName && c == '/' && validateVarName(varName)) {
             currArg = &pattern;
             if (i < strLen && str.at(i) == '/') {
diff --git a/tests/auto/utils/stringutils/tst_stringutils.cpp b/tests/auto/utils/stringutils/tst_stringutils.cpp
index 972d0b35d5b..051baf34702 100644
--- a/tests/auto/utils/stringutils/tst_stringutils.cpp
+++ b/tests/auto/utils/stringutils/tst_stringutils.cpp
@@ -153,6 +153,7 @@ void tst_StringUtils::testMacroExpander_data()
         { "%{sl\\/sh/(.)(a)(.)/\\2\\1\\3as}", "salsash" }, // escape in variable name
         { "%{JS:foo/b/c}", "%{JS:foo/b/c}" }, // No replacement for JS (all considered varName)
         { "%{%{a}%{a}/b/c}", "car" },
+        { "%{nonsense:-sense}", "sense" },
     };
 
     for (unsigned i = 0; i < sizeof(vals)/sizeof(vals[0]); i++)
-- 
GitLab