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)
|
: %{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}')}\
|
||||||
|
|||||||
@@ -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}')}\
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user