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) : %{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 @endif
%{JS: Cpp.closeNamespaces('%{Class}')}\ %{JS: Cpp.closeNamespaces('%{Class}')}\

View File

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

View File

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

View File

@@ -111,7 +111,9 @@ void JsExpander::registerForExpander(Utils::MacroExpander *macroExpander)
"JS", "JS",
QCoreApplication::translate("Core::JsExpander", QCoreApplication::translate("Core::JsExpander",
"Evaluate simple JavaScript statements.<br>" "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 { [this](QString in) -> QString {
QString errorMessage; QString errorMessage;
QString result = evaluate(in, &errorMessage); QString result = evaluate(in, &errorMessage);

View File

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