aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlscript.cpp
diff options
context:
space:
mode:
authorMatthew Vogt <matthew.vogt@nokia.com>2012-07-06 13:04:53 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-11 01:49:59 +0200
commita1a2c81d7fd5512b8c0531b01453656fc4c96bed (patch)
tree519b6c02482c3487d64a060041e95ae09a878c49 /src/qml/qml/qqmlscript.cpp
parentf5cb65b35e076facbce45e896902a34da7036135 (diff)
Improved error messages for malformed .import statements
Report errors in .import statements, rather than pass them through to V8 to yield 'Syntax error'. Task-number: QTBUG-24867 Change-Id: I111b3bd3d198e97f42b29591f61753e86295aeb2 Reviewed-by: Glenn Watson <glenn.watson@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmlscript.cpp')
-rw-r--r--src/qml/qml/qqmlscript.cpp83
1 files changed, 61 insertions, 22 deletions
diff --git a/src/qml/qml/qqmlscript.cpp b/src/qml/qml/qqmlscript.cpp
index 469b5d5291..a237f9a2f8 100644
--- a/src/qml/qml/qqmlscript.cpp
+++ b/src/qml/qml/qqmlscript.cpp
@@ -1476,8 +1476,10 @@ static inline bool isUriToken(int token)
return false;
}
-QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QString &script)
+QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QString &script, QQmlError *error)
{
+ Q_ASSERT(error);
+
JavaScriptMetaData rv;
QQmlScript::Object::ScriptBlock::Pragmas &pragmas = rv.pragmas;
@@ -1499,6 +1501,10 @@ QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QStri
int startLine = l.tokenStartLine();
int startColumn = l.tokenStartColumn();
+ QQmlError importError;
+ importError.setLine(startLine);
+ importError.setColumn(startColumn);
+
token = l.lex();
CHECK_LINE;
@@ -1516,32 +1522,46 @@ QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QStri
QString file = l.tokenText();
- if (!file.endsWith(js))
+ if (!file.endsWith(js)) {
+ importError.setDescription(QCoreApplication::translate("QQmlParser","Imported file must be a script"));
+ *error = importError;
return rv;
+ }
+
+ bool invalidImport = false;
token = l.lex();
- CHECK_TOKEN(T_AS);
- CHECK_LINE;
+ if ((token != QQmlJSGrammar::T_AS) || (l.tokenStartLine() != startLine)) {
+ invalidImport = true;
+ } else {
+ token = l.lex();
- token = l.lex();
+ if ((token != QQmlJSGrammar::T_IDENTIFIER) || (l.tokenStartLine() != startLine))
+ invalidImport = true;
+ }
- CHECK_TOKEN(T_IDENTIFIER);
- CHECK_LINE;
+
+ if (invalidImport) {
+ importError.setDescription(QCoreApplication::translate("QQmlParser","File import requires a qualifier"));
+ *error = importError;
+ return rv;
+ }
int endOffset = l.tokenLength() + l.tokenOffset();
QString importId = script.mid(l.tokenOffset(), l.tokenLength());
- if (!importId.at(0).isUpper())
- return rv;
-
QQmlScript::LocationSpan location =
locationFromLexer(l, startLine, startColumn, startOffset);
token = l.lex();
- if (l.tokenStartLine() == startLine)
+
+ if (!importId.at(0).isUpper() || (l.tokenStartLine() == startLine)) {
+ importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid import qualifier"));
+ *error = importError;
return rv;
+ }
replaceWithSpace(script, startOffset, endOffset - startOffset);
@@ -1557,8 +1577,11 @@ QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QStri
QString uri;
while (true) {
- if (!isUriToken(token))
+ if (!isUriToken(token)) {
+ importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid module URI"));
+ *error = importError;
return rv;
+ }
uri.append(l.tokenText());
@@ -1573,34 +1596,50 @@ QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QStri
CHECK_LINE;
}
- CHECK_TOKEN(T_NUMERIC_LITERAL);
+ if (token != QQmlJSGrammar::T_NUMERIC_LITERAL) {
+ importError.setDescription(QCoreApplication::translate("QQmlParser","Module import requires a version"));
+ *error = importError;
+ return rv;
+ }
+
int vmaj, vmin;
ProcessAST::extractVersion(QStringRef(&script, l.tokenOffset(), l.tokenLength()),
&vmaj, &vmin);
+ bool invalidImport = false;
+
token = l.lex();
- CHECK_TOKEN(T_AS);
- CHECK_LINE;
+ if ((token != QQmlJSGrammar::T_AS) || (l.tokenStartLine() != startLine)) {
+ invalidImport = true;
+ } else {
+ token = l.lex();
- token = l.lex();
+ if ((token != QQmlJSGrammar::T_IDENTIFIER) || (l.tokenStartLine() != startLine))
+ invalidImport = true;
+ }
- CHECK_TOKEN(T_IDENTIFIER);
- CHECK_LINE;
+
+ if (invalidImport) {
+ importError.setDescription(QCoreApplication::translate("QQmlParser","Module import requires a qualifier"));
+ *error = importError;
+ return rv;
+ }
int endOffset = l.tokenLength() + l.tokenOffset();
QString importId = script.mid(l.tokenOffset(), l.tokenLength());
- if (!importId.at(0).isUpper())
- return rv;
-
QQmlScript::LocationSpan location =
locationFromLexer(l, startLine, startColumn, startOffset);
token = l.lex();
- if (l.tokenStartLine() == startLine)
+
+ if (!importId.at(0).isUpper() || (l.tokenStartLine() == startLine)) {
+ importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid import qualifier"));
+ *error = importError;
return rv;
+ }
replaceWithSpace(script, startOffset, endOffset - startOffset);