aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/qmlmin/main.cpp47
1 files changed, 34 insertions, 13 deletions
diff --git a/tools/qmlmin/main.cpp b/tools/qmlmin/main.cpp
index ebfc5851dd..b1aeab6168 100644
--- a/tools/qmlmin/main.cpp
+++ b/tools/qmlmin/main.cpp
@@ -182,6 +182,13 @@ protected:
*restOfRegExp += QLatin1Char('i');
if (flags & Multiline)
*restOfRegExp += QLatin1Char('m');
+
+ if (regExpFlags() == 0) {
+ // Add an extra space after the regexp literal delimiter (aka '/').
+ // This will avoid possible problems when pasting tokens like `instanceof'
+ // after the regexp literal.
+ *restOfRegExp += QLatin1Char(' ');
+ }
return true;
}
};
@@ -201,6 +208,7 @@ public:
protected:
bool parse(int startToken);
+ void escape(const QChar &ch, QString *out);
};
Minify::Minify()
@@ -213,6 +221,20 @@ QString Minify::minifiedCode() const
return _minifiedCode;
}
+void Minify::escape(const QChar &ch, QString *out)
+{
+ out->append(QLatin1String("\\u"));
+ const QString hx = QString::number(ch.unicode(), 16);
+ switch (hx.length()) {
+ case 1: out->append(QLatin1String("000")); break;
+ case 2: out->append(QLatin1String("00")); break;
+ case 3: out->append(QLatin1String("0")); break;
+ case 4: break;
+ default: Q_ASSERT(!"unreachable");
+ }
+ out->append(hx);
+}
+
bool Minify::parse(int startToken)
{
int yyaction = 0;
@@ -288,25 +310,24 @@ bool Minify::parse(int startToken)
_minifiedCode += QLatin1Char('0');
} else if (yytoken == T_IDENTIFIER) {
+ QString identifier = yytokentext;
+
+ if (classify(identifier.constData(), identifier.size(), qmlMode()) != T_IDENTIFIER) {
+ // the unescaped identifier is a keyword. In this case just replace
+ // the last character of the identifier with it escape sequence.
+ const QChar ch = identifier.at(identifier.length() - 1);
+ identifier.chop(1);
+ escape(ch, &identifier);
+ }
+
if (isIdentChar(lastChar))
_minifiedCode += QLatin1Char(' ');
- foreach (const QChar &ch, yytokentext) {
+ foreach (const QChar &ch, identifier) {
if (isIdentChar(ch))
_minifiedCode += ch;
else {
- _minifiedCode += QLatin1String("\\u");
- const QString hx = QString::number(ch.unicode(), 16);
- switch (hx.length()) {
- case 1: _minifiedCode += QLatin1String("000"); break;
- case 2: _minifiedCode += QLatin1String("00"); break;
- case 3: _minifiedCode += QLatin1String("0"); break;
- case 4: break;
- default:
- std::cerr << "qmlmin: invalid unicode sequence" << std::endl;
- return false;
- }
- _minifiedCode += hx;
+ escape(ch, &_minifiedCode);
}
}