diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-03-12 16:55:06 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-23 21:16:46 +0200 |
commit | a885d10a0289da85b8c966d2fa40fb10edae4fd7 (patch) | |
tree | 7c16b5abd88d436f6596d6a424126c1b1dd2aba8 /src/qml/compiler/qqmlirbuilder.cpp | |
parent | 937fdde5d3b26291d417f856ee05ba479a6ba730 (diff) |
Extend the QML bootstrap library by the IR builders
This is among other things needed to fix the qml import scanner to detect
dependencies from .js files correctly.
The patch also fixes the use of Q_QML_EXPORT towards Q_QML_PRIVATE_EXPORT
where appropriate and corrects the wrong include path for the double conversion
code to actually be relative to the file it is included from. This worked by
accident because of other include paths present in the build.
Change-Id: I338583dad2f76300819af8ab0dae8e5724c84430
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qqmlirbuilder.cpp')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 93 |
1 files changed, 49 insertions, 44 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index 0dac79f6e7..28a4e23a37 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -41,13 +41,19 @@ #include "qqmlirbuilder_p.h" +#include <private/qv4value_inl_p.h> #include <private/qv4compileddata_p.h> #include <private/qqmljsparser_p.h> #include <private/qqmljslexer_p.h> -#include <private/qqmlcompiler_p.h> -#include <private/qqmlglobal_p.h> #include <QCoreApplication> +#ifndef V4_BOOTSTRAP +#include <private/qqmlglobal_p.h> +#include <private/qqmltypeloader_p.h> +#include <private/qqmlengine_p.h> +#include <private/qqmlcompiler_p.h> +#endif + #ifdef CONST #undef CONST #endif @@ -56,7 +62,9 @@ QT_USE_NAMESPACE static const quint32 emptyStringIndex = 0; +#ifndef V4_BOOTSTRAP DEFINE_BOOL_CONFIG_OPTION(lookupHints, QML_LOOKUP_HINTS); +#endif // V4_BOOTSTRAP using namespace QmlIR; @@ -296,7 +304,7 @@ void Document::collectTypeReferences() } } -void Document::extractScriptMetaData(QString &script, QQmlError *error) +void Document::extractScriptMetaData(QString &script, QQmlJS::DiagnosticMessage *error) { Q_ASSERT(error); @@ -318,8 +326,7 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error) int startLine = l.tokenStartLine(); int startColumn = l.tokenStartColumn(); - QQmlError importError; - importError.setLine(startLine + 1); // 0-based, adjust to be 1-based + error->loc.startLine = startLine + 1; // 0-based, adjust to be 1-based token = l.lex(); @@ -340,9 +347,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error) QString file = l.tokenText(); if (!file.endsWith(js)) { - importError.setDescription(QCoreApplication::translate("QQmlParser","Imported file must be a script")); - importError.setColumn(l.tokenStartColumn()); - *error = importError; + error->message = QCoreApplication::translate("QQmlParser","Imported file must be a script"); + error->loc.startColumn = l.tokenStartColumn(); return; } @@ -361,9 +367,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error) if (invalidImport) { - importError.setDescription(QCoreApplication::translate("QQmlParser","File import requires a qualifier")); - importError.setColumn(l.tokenStartColumn()); - *error = importError; + error->message = QCoreApplication::translate("QQmlParser","File import requires a qualifier"); + error->loc.startColumn = l.tokenStartColumn(); return; } @@ -374,9 +379,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error) token = l.lex(); if (!importId.at(0).isUpper() || (l.tokenStartLine() == startLine)) { - importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid import qualifier")); - importError.setColumn(l.tokenStartColumn()); - *error = importError; + error->message = QCoreApplication::translate("QQmlParser","Invalid import qualifier"); + error->loc.startColumn = l.tokenStartColumn(); return; } @@ -394,9 +398,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error) while (true) { if (!isUriToken(token)) { - importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid module URI")); - importError.setColumn(l.tokenStartColumn()); - *error = importError; + error->message = QCoreApplication::translate("QQmlParser","Invalid module URI"); + error->loc.startColumn = l.tokenStartColumn(); return; } @@ -414,9 +417,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error) } if (token != QQmlJSGrammar::T_NUMERIC_LITERAL) { - importError.setDescription(QCoreApplication::translate("QQmlParser","Module import requires a version")); - importError.setColumn(l.tokenStartColumn()); - *error = importError; + error->message = QCoreApplication::translate("QQmlParser","Module import requires a version"); + error->loc.startColumn = l.tokenStartColumn(); return; } @@ -439,9 +441,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error) if (invalidImport) { - importError.setDescription(QCoreApplication::translate("QQmlParser","Module import requires a qualifier")); - importError.setColumn(l.tokenStartColumn()); - *error = importError; + error->message = QCoreApplication::translate("QQmlParser","Module import requires a qualifier"); + error->loc.startColumn = l.tokenStartColumn(); return; } @@ -452,9 +453,8 @@ void Document::extractScriptMetaData(QString &script, QQmlError *error) token = l.lex(); if (!importId.at(0).isUpper() || (l.tokenStartLine() == startLine)) { - importError.setDescription(QCoreApplication::translate("QQmlParser","Invalid import qualifier")); - importError.setColumn(l.tokenStartColumn()); - *error = importError; + error->message = QCoreApplication::translate("QQmlParser","Invalid import qualifier"); + error->loc.startColumn = l.tokenStartColumn(); return; } @@ -558,7 +558,7 @@ IRBuilder::IRBuilder(const QSet<QString> &illegalNames) { } -bool IRBuilder::generateFromQml(const QString &code, const QUrl &url, const QString &urlString, Document *output) +bool IRBuilder::generateFromQml(const QString &code, const QString &url, const QString &urlString, Document *output) { this->url = url; QQmlJS::AST::UiProgram *program = 0; @@ -602,7 +602,6 @@ bool IRBuilder::generateFromQml(const QString &code, const QUrl &url, const QStr accept(program->headers); if (program->members->next) { - QQmlError error; QQmlJS::AST::SourceLocation loc = program->members->next->firstSourceLocation(); recordError(loc, QCoreApplication::translate("QQmlParser", "Unexpected object definition")); return false; @@ -971,8 +970,7 @@ bool IRBuilder::visit(QQmlJS::AST::UiPublicMember *node) const TypeNameToType *type = 0; for (int typeIndex = 0; typeIndex < propTypeNameToTypesCount; ++typeIndex) { const TypeNameToType *t = propTypeNameToTypes + typeIndex; - if (t->nameLength == size_t(memberType.length()) && - QHashedString::compare(memberType.constData(), t->name, static_cast<int>(t->nameLength))) { + if (memberType == QLatin1String(t->name, static_cast<int>(t->nameLength))) { type = t; break; } @@ -1023,16 +1021,14 @@ bool IRBuilder::visit(QQmlJS::AST::UiPublicMember *node) bool typeFound = false; QV4::CompiledData::Property::Type type; - if ((unsigned)memberType.length() == strlen("alias") && - QHashedString::compare(memberType.constData(), "alias", static_cast<int>(strlen("alias")))) { + if (memberType == QLatin1String("alias")) { type = QV4::CompiledData::Property::Alias; typeFound = true; } for (int ii = 0; !typeFound && ii < propTypeNameToTypesCount; ++ii) { const TypeNameToType *t = propTypeNameToTypes + ii; - if (t->nameLength == size_t(memberType.length()) && - QHashedString::compare(memberType.constData(), t->name, static_cast<int>(t->nameLength))) { + if (memberType == QLatin1String(t->name, static_cast<int>(t->nameLength))) { type = t->type; typeFound = true; } @@ -1043,8 +1039,7 @@ bool IRBuilder::visit(QQmlJS::AST::UiPublicMember *node) if (typeModifier.isEmpty()) { type = QV4::CompiledData::Property::Custom; - } else if ((unsigned)typeModifier.length() == strlen("list") && - QHashedString::compare(typeModifier.constData(), "list", static_cast<int>(strlen("list")))) { + } else if (typeModifier == QLatin1String("list")) { type = QV4::CompiledData::Property::CustomList; } else { recordError(node->typeModifierToken, QCoreApplication::translate("QQmlParser","Invalid property type modifier")); @@ -1483,11 +1478,9 @@ bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, O void IRBuilder::recordError(const QQmlJS::AST::SourceLocation &location, const QString &description) { - QQmlError error; - error.setUrl(url); - error.setLine(location.startLine); - error.setColumn(location.startColumn); - error.setDescription(description); + QQmlJS::DiagnosticMessage error; + error.loc = location; + error.message = description; errors << error; } @@ -1766,6 +1759,7 @@ QVector<int> JSCodeGen::generateJSCodeForFunctionsAndBindings(const QList<Compil return runtimeFunctionIndices; } +#ifndef V4_BOOTSTRAP QQmlPropertyData *JSCodeGen::lookupQmlCompliantProperty(QQmlPropertyCache *cache, const QString &name, bool *propertyExistsButForceNameLookup) { if (propertyExistsButForceNameLookup) @@ -1967,6 +1961,8 @@ static void initMetaObjectResolver(QV4::IR::MemberExpressionResolver *resolver, resolver->isQObjectResolver = true; } +#endif // V4_BOOTSTRAP + void JSCodeGen::beginFunctionBodyHook() { _contextObjectTemp = _block->newTemp(); @@ -1974,6 +1970,7 @@ void JSCodeGen::beginFunctionBodyHook() _importedScriptsTemp = _block->newTemp(); _idArrayTemp = _block->newTemp(); +#ifndef V4_BOOTSTRAP QV4::IR::Temp *temp = _block->TEMP(_contextObjectTemp); initMetaObjectResolver(&temp->memberResolver, _contextObject); move(temp, _block->NAME(QV4::IR::Name::builtin_qml_context_object, 0, 0)); @@ -1984,15 +1981,16 @@ void JSCodeGen::beginFunctionBodyHook() move(_block->TEMP(_importedScriptsTemp), _block->NAME(QV4::IR::Name::builtin_qml_imported_scripts_object, 0, 0)); move(_block->TEMP(_idArrayTemp), _block->NAME(QV4::IR::Name::builtin_qml_id_array, 0, 0)); +#endif } QV4::IR::Expr *JSCodeGen::fallbackNameLookup(const QString &name, int line, int col) { - if (_disableAcceleratedLookups) - return 0; - Q_UNUSED(line) Q_UNUSED(col) +#ifndef V4_BOOTSTRAP + if (_disableAcceleratedLookups) + return 0; // Implement QML lookup semantics in the current file context. // // Note: We do not check if properties of the qml scope object or context object @@ -2073,10 +2071,15 @@ QV4::IR::Expr *JSCodeGen::fallbackNameLookup(const QString &name, int line, int } } +#else + Q_UNUSED(name) +#endif // V4_BOOTSTRAP // fall back to name lookup at run-time. return 0; } +#ifndef V4_BOOTSTRAP + QQmlPropertyData *PropertyResolver::property(const QString &name, bool *notInRevision, QObject *object, QQmlContextData *context) { if (notInRevision) *notInRevision = false; @@ -2123,3 +2126,5 @@ QQmlPropertyData *PropertyResolver::signal(const QString &name, bool *notInRevis return 0; } + +#endif // V4_BOOTSTRAP |