forked from qt-creator/qt-creator
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>
This commit is contained in:
committed by
Orgad Shaneh
parent
eece696da3
commit
3be096f152
@@ -128,6 +128,7 @@ bool AbstractMacroExpander::expandNestedMacros(const QString &str, int *pos, QSt
|
|||||||
{
|
{
|
||||||
QString varName;
|
QString varName;
|
||||||
QString pattern, replace;
|
QString pattern, replace;
|
||||||
|
QString defaultValue;
|
||||||
QString *currArg = &varName;
|
QString *currArg = &varName;
|
||||||
QChar prev;
|
QChar prev;
|
||||||
QChar c;
|
QChar c;
|
||||||
@@ -172,12 +173,20 @@ bool AbstractMacroExpander::expandNestedMacros(const QString &str, int *pos, QSt
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (!defaultValue.isEmpty()) {
|
||||||
|
*pos = i;
|
||||||
|
*ret = defaultValue;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
} else if (c == '{' && prev == '%') {
|
} else if (c == '{' && prev == '%') {
|
||||||
if (!expandNestedMacros(str, &i, ret))
|
if (!expandNestedMacros(str, &i, ret))
|
||||||
return false;
|
return false;
|
||||||
varName.chop(1);
|
varName.chop(1);
|
||||||
varName += ret;
|
varName += ret;
|
||||||
|
} else if (currArg == &varName && c == '-' && prev == ':' && validateVarName(varName)) {
|
||||||
|
varName.chop(1);
|
||||||
|
currArg = &defaultValue;
|
||||||
} else if (currArg == &varName && c == '/' && validateVarName(varName)) {
|
} else if (currArg == &varName && c == '/' && validateVarName(varName)) {
|
||||||
currArg = &pattern;
|
currArg = &pattern;
|
||||||
if (i < strLen && str.at(i) == '/') {
|
if (i < strLen && str.at(i) == '/') {
|
||||||
|
@@ -153,6 +153,7 @@ void tst_StringUtils::testMacroExpander_data()
|
|||||||
{ "%{sl\\/sh/(.)(a)(.)/\\2\\1\\3as}", "salsash" }, // escape in variable name
|
{ "%{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)
|
{ "%{JS:foo/b/c}", "%{JS:foo/b/c}" }, // No replacement for JS (all considered varName)
|
||||||
{ "%{%{a}%{a}/b/c}", "car" },
|
{ "%{%{a}%{a}/b/c}", "car" },
|
||||||
|
{ "%{nonsense:-sense}", "sense" },
|
||||||
};
|
};
|
||||||
|
|
||||||
for (unsigned i = 0; i < sizeof(vals)/sizeof(vals[0]); i++)
|
for (unsigned i = 0; i < sizeof(vals)/sizeof(vals[0]); i++)
|
||||||
|
Reference in New Issue
Block a user