forked from qt-creator/qt-creator
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:
@@ -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}')}\
|
||||
|
||||
@@ -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}')}\
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user