Fix C++ Library wizard when compiled with Qt < 5.12

Only Qt 5.12 got true ECMA Script capabilities, so arrow function
expressions are not supported before that.

To be able to use "regular" inline functions, we allow usage of } by escaping with backslash.
For variables that do not start with "JS:" we already supported backslash for escaping.

Fixes: QTCREATORBUG-22336
Change-Id: I9fc638e64d2757a21fffc16355635e2fcff87a36
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Eike Ziller
2019-05-31 15:29:05 +02:00
parent d73c271259
commit 23c222f61b
5 changed files with 17 additions and 5 deletions

View File

@@ -11,7 +11,7 @@
: %{BaseClassName}(parent)
{
}
%{JS: '%{PluginMethods}'.split('|').map(s => '\n' + s.replace(/([a-zA-Z0-9]+\()/, '%{CN}::$1') + '\n\u007B\n static_assert(false, "You need to implement this function");\n\u007D').join('\n')}\
%{JS: '%{PluginMethods}'.split('|').map(function(s) { return '\\n' + s.replace(/([a-zA-Z0-9]+\\()/, '%{CN}::$1') + '\\n\{\\n static_assert(false, "You need to implement this function");\\n\}'; \}).join('\\n')}\
@endif
%{JS: Cpp.closeNamespaces('%{Class}')}\

View File

@@ -36,7 +36,7 @@ public:
explicit %{CN}(QObject *parent = nullptr);
private:
%{JS: '%{PluginMethods}'.split('|').map(s => ' ' + s + ' override;').join('\n')}
%{JS: '%{PluginMethods}'.split('|').map(function(s) { return ' ' + s + ' override;'; \}).join('\\n')}
};
@endif
%{JS: Cpp.closeNamespaces('%{Class}')}\

View File

@@ -143,7 +143,7 @@ bool AbstractMacroExpander::expandNestedMacros(const QString &str, int *pos, QSt
varName.reserve(strLen - i);
for (; i < strLen; prev = c) {
c = str.at(i++);
if (c == '\\' && i < strLen && validateVarName(varName)) {
if (c == '\\' && i < strLen) {
c = str.at(i++);
// For the replacement, do not skip the escape sequence when followed by a digit.
// This is needed for enabling convenient capture group replacement,

View File

@@ -111,7 +111,9 @@ void JsExpander::registerForExpander(Utils::MacroExpander *macroExpander)
"JS",
QCoreApplication::translate("Core::JsExpander",
"Evaluate simple JavaScript statements.<br>"
"The statements may not contain '{' nor '}' characters."),
"Literal '}' characters must be escaped as \"\\}\", "
"'\\' characters must be escaped as \"\\\\\", "
"and \"%{\" must be escaped as \"%\\{\"."),
[this](QString in) -> QString {
QString errorMessage;
QString result = evaluate(in, &errorMessage);

View File

@@ -68,6 +68,14 @@ public:
*ret = "bar";
return true;
}
if (name == "JS:with } inside") {
*ret = "yay";
return true;
}
if (name == "JS:literal%{") {
*ret = "hurray";
return true;
}
return false;
}
};
@@ -159,6 +167,8 @@ void tst_StringUtils::testMacroExpander_data()
{"%{hihi/(.)(.)r/\\2\\1c}", "abc"}, // no escape for capture groups
{"%{hihi/b/c/d}", "c/dar"},
{"%{hihi/a/e{\\}e}", "be{}er"}, // escape closing brace
{"%{JS:with \\} inside}", "yay"}, // escape closing brace also in JS:
{"%{JS:literal%\\{}", "hurray"},
{"%{slash/o\\/b/ol's c}", "fool's car"},
{"%{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)