diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-03-17 21:26:04 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-18 09:05:57 +0100 |
commit | fa24ef3d721a7b94d0c5abbc6c9558e74bdb0f3d (patch) | |
tree | 37bac24bafc1d2b879d76ac225272912538d072d /src | |
parent | 3f7951c04ef474f81eda2134b67c4e4020fe39d1 (diff) |
Cleanup, part 2
* QQmlCodeGenerator -> QQmlIR::IRBuilder (it doesn't generate code, it
generates the Object/Property/Signal/etc. IR of the .qml file, that's
going to get transformed to QV4::CompiledData::*)
* ParsedQML -> QQmlIR::Document
Change-Id: I329e858487b66e1ae528d44316761f5dd34b79f4
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/compiler/compiler.pri | 4 | ||||
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp (renamed from src/qml/compiler/qqmlcodegenerator.cpp) | 76 | ||||
-rw-r--r-- | src/qml/compiler/qqmlirbuilder_p.h (renamed from src/qml/compiler/qqmlcodegenerator_p.h) | 29 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler.cpp | 40 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler_p.h | 9 | ||||
-rw-r--r-- | src/qml/qml/qqmlcompiler_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 99 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader_p.h | 12 |
8 files changed, 133 insertions, 137 deletions
diff --git a/src/qml/compiler/compiler.pri b/src/qml/compiler/compiler.pri index 24379ca5f3..6e3159ba4e 100644 --- a/src/qml/compiler/compiler.pri +++ b/src/qml/compiler/compiler.pri @@ -11,7 +11,7 @@ HEADERS += \ $$PWD/qv4isel_moth_p.h \ $$PWD/qv4isel_util_p.h \ $$PWD/qv4ssa_p.h \ - $$PWD/qqmlcodegenerator_p.h \ + $$PWD/qqmlirbuilder_p.h \ $$PWD/qqmltypecompiler_p.h SOURCES += \ @@ -23,5 +23,5 @@ SOURCES += \ $$PWD/qv4isel_p.cpp \ $$PWD/qv4jsir.cpp \ $$PWD/qv4ssa.cpp \ - $$PWD/qqmlcodegenerator.cpp \ + $$PWD/qqmlirbuilder.cpp \ $$PWD/qqmltypecompiler.cpp diff --git a/src/qml/compiler/qqmlcodegenerator.cpp b/src/qml/compiler/qqmlirbuilder.cpp index c826049ef7..dbd733f506 100644 --- a/src/qml/compiler/qqmlcodegenerator.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#include "qqmlcodegenerator_p.h" +#include "qqmlirbuilder_p.h" #include <private/qv4compileddata_p.h> #include <private/qqmljsparser_p.h> @@ -197,7 +197,7 @@ QStringList Signal::parameterStringList(const QStringList &stringPool) const return result; } -QQmlCodeGenerator::QQmlCodeGenerator(const QSet<QString> &illegalNames) +IRBuilder::IRBuilder(const QSet<QString> &illegalNames) : illegalNames(illegalNames) , _object(0) , _propertyDeclaration(0) @@ -205,7 +205,7 @@ QQmlCodeGenerator::QQmlCodeGenerator(const QSet<QString> &illegalNames) { } -bool QQmlCodeGenerator::generateFromQml(const QString &code, const QUrl &url, const QString &urlString, ParsedQML *output) +bool IRBuilder::generateFromQml(const QString &code, const QUrl &url, const QString &urlString, Document *output) { this->url = url; QQmlJS::AST::UiProgram *program = 0; @@ -268,7 +268,7 @@ bool QQmlCodeGenerator::generateFromQml(const QString &code, const QUrl &url, co return errors.isEmpty(); } -bool QQmlCodeGenerator::isSignalPropertyName(const QString &name) +bool IRBuilder::isSignalPropertyName(const QString &name) { if (name.length() < 3) return false; if (!name.startsWith(QStringLiteral("on"))) return false; @@ -282,18 +282,18 @@ bool QQmlCodeGenerator::isSignalPropertyName(const QString &name) return false; // consists solely of underscores - invalid. } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiArrayMemberList *ast) +bool IRBuilder::visit(QQmlJS::AST::UiArrayMemberList *ast) { return QQmlJS::AST::Visitor::visit(ast); } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiProgram *) +bool IRBuilder::visit(QQmlJS::AST::UiProgram *) { Q_ASSERT(!"should not happen"); return false; } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectDefinition *node) +bool IRBuilder::visit(QQmlJS::AST::UiObjectDefinition *node) { // The grammar can't distinguish between two different definitions here: // Item { ... } @@ -322,7 +322,7 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectDefinition *node) return false; } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectBinding *node) +bool IRBuilder::visit(QQmlJS::AST::UiObjectBinding *node) { int idx = 0; if (!defineQMLObject(&idx, node->qualifiedTypeNameId, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer)) @@ -331,13 +331,13 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectBinding *node) return false; } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiScriptBinding *node) +bool IRBuilder::visit(QQmlJS::AST::UiScriptBinding *node) { appendBinding(node->qualifiedId, node->statement); return false; } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiArrayBinding *node) +bool IRBuilder::visit(QQmlJS::AST::UiArrayBinding *node) { const QQmlJS::AST::SourceLocation qualifiedNameLocation = node->qualifiedId->identifierToken; Object *object = 0; @@ -374,37 +374,37 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiArrayBinding *node) return false; } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiHeaderItemList *list) +bool IRBuilder::visit(QQmlJS::AST::UiHeaderItemList *list) { return QQmlJS::AST::Visitor::visit(list); } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectInitializer *ast) +bool IRBuilder::visit(QQmlJS::AST::UiObjectInitializer *ast) { return QQmlJS::AST::Visitor::visit(ast); } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiObjectMemberList *ast) +bool IRBuilder::visit(QQmlJS::AST::UiObjectMemberList *ast) { return QQmlJS::AST::Visitor::visit(ast); } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiParameterList *ast) +bool IRBuilder::visit(QQmlJS::AST::UiParameterList *ast) { return QQmlJS::AST::Visitor::visit(ast); } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiQualifiedId *id) +bool IRBuilder::visit(QQmlJS::AST::UiQualifiedId *id) { return QQmlJS::AST::Visitor::visit(id); } -void QQmlCodeGenerator::accept(QQmlJS::AST::Node *node) +void IRBuilder::accept(QQmlJS::AST::Node *node) { QQmlJS::AST::Node::acceptChild(node, this); } -bool QQmlCodeGenerator::defineQMLObject(int *objectIndex, QQmlJS::AST::UiQualifiedId *qualifiedTypeNameId, const QQmlJS::AST::SourceLocation &location, QQmlJS::AST::UiObjectInitializer *initializer, Object *declarationsOverride) +bool IRBuilder::defineQMLObject(int *objectIndex, QQmlJS::AST::UiQualifiedId *qualifiedTypeNameId, const QQmlJS::AST::SourceLocation &location, QQmlJS::AST::UiObjectInitializer *initializer, Object *declarationsOverride) { if (QQmlJS::AST::UiQualifiedId *lastName = qualifiedTypeNameId) { while (lastName->next) @@ -446,7 +446,7 @@ bool QQmlCodeGenerator::defineQMLObject(int *objectIndex, QQmlJS::AST::UiQualifi return true; } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiImport *node) +bool IRBuilder::visit(QQmlJS::AST::UiImport *node) { QString uri; QV4::CompiledData::Import *import = New<QV4::CompiledData::Import>(); @@ -518,7 +518,7 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiImport *node) return false; } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiPragma *node) +bool IRBuilder::visit(QQmlJS::AST::UiPragma *node) { Pragma *pragma = New<Pragma>(); @@ -562,7 +562,7 @@ static QStringList astNodeToStringList(QQmlJS::AST::Node *node) return QStringList(); } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiPublicMember *node) +bool IRBuilder::visit(QQmlJS::AST::UiPublicMember *node) { static const struct TypeNameToType { const char *name; @@ -800,7 +800,7 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiPublicMember *node) return false; } -bool QQmlCodeGenerator::visit(QQmlJS::AST::UiSourceElement *node) +bool IRBuilder::visit(QQmlJS::AST::UiSourceElement *node) { if (QQmlJS::AST::FunctionDeclaration *funDecl = QQmlJS::AST::cast<QQmlJS::AST::FunctionDeclaration *>(node->sourceElement)) { CompiledFunctionOrExpression *foe = New<CompiledFunctionOrExpression>(); @@ -823,7 +823,7 @@ bool QQmlCodeGenerator::visit(QQmlJS::AST::UiSourceElement *node) return false; } -QString QQmlCodeGenerator::asString(QQmlJS::AST::UiQualifiedId *node) +QString IRBuilder::asString(QQmlJS::AST::UiQualifiedId *node) { QString s; @@ -837,7 +837,7 @@ QString QQmlCodeGenerator::asString(QQmlJS::AST::UiQualifiedId *node) return s; } -QStringRef QQmlCodeGenerator::asStringRef(QQmlJS::AST::Node *node) +QStringRef IRBuilder::asStringRef(QQmlJS::AST::Node *node) { if (!node) return QStringRef(); @@ -845,7 +845,7 @@ QStringRef QQmlCodeGenerator::asStringRef(QQmlJS::AST::Node *node) return textRefAt(node->firstSourceLocation(), node->lastSourceLocation()); } -void QQmlCodeGenerator::extractVersion(QStringRef string, int *maj, int *min) +void IRBuilder::extractVersion(QStringRef string, int *maj, int *min) { *maj = -1; *min = -1; @@ -863,12 +863,12 @@ void QQmlCodeGenerator::extractVersion(QStringRef string, int *maj, int *min) } } -QStringRef QQmlCodeGenerator::textRefAt(const QQmlJS::AST::SourceLocation &first, const QQmlJS::AST::SourceLocation &last) const +QStringRef IRBuilder::textRefAt(const QQmlJS::AST::SourceLocation &first, const QQmlJS::AST::SourceLocation &last) const { return QStringRef(&sourceCode, first.offset, last.offset + last.length - first.offset); } -void QQmlCodeGenerator::setBindingValue(QV4::CompiledData::Binding *binding, QQmlJS::AST::Statement *statement) +void IRBuilder::setBindingValue(QV4::CompiledData::Binding *binding, QQmlJS::AST::Statement *statement) { QQmlJS::AST::SourceLocation loc = statement->firstSourceLocation(); binding->valueLocation.line = loc.startLine; @@ -921,7 +921,7 @@ void QQmlCodeGenerator::setBindingValue(QV4::CompiledData::Binding *binding, QQm } } -void QQmlCodeGenerator::appendBinding(QQmlJS::AST::UiQualifiedId *name, QQmlJS::AST::Statement *value) +void IRBuilder::appendBinding(QQmlJS::AST::UiQualifiedId *name, QQmlJS::AST::Statement *value) { const QQmlJS::AST::SourceLocation qualifiedNameLocation = name->identifierToken; Object *object = 0; @@ -932,7 +932,7 @@ void QQmlCodeGenerator::appendBinding(QQmlJS::AST::UiQualifiedId *name, QQmlJS:: qSwap(_object, object); } -void QQmlCodeGenerator::appendBinding(QQmlJS::AST::UiQualifiedId *name, int objectIndex, bool isOnAssignment) +void IRBuilder::appendBinding(QQmlJS::AST::UiQualifiedId *name, int objectIndex, bool isOnAssignment) { const QQmlJS::AST::SourceLocation qualifiedNameLocation = name->identifierToken; Object *object = 0; @@ -943,7 +943,7 @@ void QQmlCodeGenerator::appendBinding(QQmlJS::AST::UiQualifiedId *name, int obje qSwap(_object, object); } -void QQmlCodeGenerator::appendBinding(const QQmlJS::AST::SourceLocation &qualifiedNameLocation, const QQmlJS::AST::SourceLocation &nameLocation, quint32 propertyNameIndex, QQmlJS::AST::Statement *value) +void IRBuilder::appendBinding(const QQmlJS::AST::SourceLocation &qualifiedNameLocation, const QQmlJS::AST::SourceLocation &nameLocation, quint32 propertyNameIndex, QQmlJS::AST::Statement *value) { if (stringAt(propertyNameIndex) == QStringLiteral("id")) { setId(nameLocation, value); @@ -962,7 +962,7 @@ void QQmlCodeGenerator::appendBinding(const QQmlJS::AST::SourceLocation &qualifi } } -void QQmlCodeGenerator::appendBinding(const QQmlJS::AST::SourceLocation &qualifiedNameLocation, const QQmlJS::AST::SourceLocation &nameLocation, quint32 propertyNameIndex, int objectIndex, bool isListItem, bool isOnAssignment) +void IRBuilder::appendBinding(const QQmlJS::AST::SourceLocation &qualifiedNameLocation, const QQmlJS::AST::SourceLocation &nameLocation, quint32 propertyNameIndex, int objectIndex, bool isListItem, bool isOnAssignment) { if (stringAt(propertyNameIndex) == QStringLiteral("id")) { recordError(nameLocation, tr("Invalid component id specification")); @@ -1000,14 +1000,14 @@ void QQmlCodeGenerator::appendBinding(const QQmlJS::AST::SourceLocation &qualifi } } -Object *QQmlCodeGenerator::bindingsTarget() const +Object *IRBuilder::bindingsTarget() const { if (_propertyDeclaration && _object->declarationsOverride) return _object->declarationsOverride; return _object; } -bool QQmlCodeGenerator::setId(const QQmlJS::AST::SourceLocation &idLocation, QQmlJS::AST::Statement *value) +bool IRBuilder::setId(const QQmlJS::AST::SourceLocation &idLocation, QQmlJS::AST::Statement *value) { QQmlJS::AST::SourceLocation loc = value->firstSourceLocation(); QStringRef str; @@ -1055,7 +1055,7 @@ bool QQmlCodeGenerator::setId(const QQmlJS::AST::SourceLocation &idLocation, QQm return true; } -bool QQmlCodeGenerator::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, Object **object, bool onAssignment) +bool IRBuilder::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToResolve, Object **object, bool onAssignment) { QQmlJS::AST::UiQualifiedId *qualifiedIdElement = *nameToResolve; @@ -1134,7 +1134,7 @@ bool QQmlCodeGenerator::resolveQualifiedId(QQmlJS::AST::UiQualifiedId **nameToRe return true; } -void QQmlCodeGenerator::recordError(const QQmlJS::AST::SourceLocation &location, const QString &description) +void IRBuilder::recordError(const QQmlJS::AST::SourceLocation &location, const QString &description) { QQmlError error; error.setUrl(url); @@ -1144,7 +1144,7 @@ void QQmlCodeGenerator::recordError(const QQmlJS::AST::SourceLocation &location, errors << error; } -void QQmlCodeGenerator::collectTypeReferences() +void IRBuilder::collectTypeReferences() { foreach (Object *obj, _objects) { if (obj->inheritedTypeNameIndex != emptyStringIndex) { @@ -1170,7 +1170,7 @@ void QQmlCodeGenerator::collectTypeReferences() } } -QQmlScript::LocationSpan QQmlCodeGenerator::location(QQmlJS::AST::SourceLocation start, QQmlJS::AST::SourceLocation end) +QQmlScript::LocationSpan IRBuilder::location(QQmlJS::AST::SourceLocation start, QQmlJS::AST::SourceLocation end) { QQmlScript::LocationSpan rv; rv.start.line = start.startLine; @@ -1182,7 +1182,7 @@ QQmlScript::LocationSpan QQmlCodeGenerator::location(QQmlJS::AST::SourceLocation return rv; } -bool QQmlCodeGenerator::isStatementNodeScript(QQmlJS::AST::Statement *statement) +bool IRBuilder::isStatementNodeScript(QQmlJS::AST::Statement *statement) { if (QQmlJS::AST::ExpressionStatement *stmt = QQmlJS::AST::cast<QQmlJS::AST::ExpressionStatement *>(statement)) { QQmlJS::AST::ExpressionNode *expr = stmt->expression; @@ -1207,7 +1207,7 @@ bool QQmlCodeGenerator::isStatementNodeScript(QQmlJS::AST::Statement *statement) return true; } -QV4::CompiledData::QmlUnit *QmlUnitGenerator::generate(ParsedQML &output) +QV4::CompiledData::QmlUnit *QmlUnitGenerator::generate(Document &output) { jsUnitGenerator = &output.jsGenerator; int unitSize = 0; diff --git a/src/qml/compiler/qqmlcodegenerator_p.h b/src/qml/compiler/qqmlirbuilder_p.h index 8bcadb7a54..3a0a2054db 100644 --- a/src/qml/compiler/qqmlcodegenerator_p.h +++ b/src/qml/compiler/qqmlirbuilder_p.h @@ -38,8 +38,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#ifndef QQMLCODEGENERATOR_P_H -#define QQMLCODEGENERATOR_P_H +#ifndef QQMLIRBUILDER_P_H +#define QQMLIRBUILDER_P_H #include <private/qqmljsast_p.h> #include <private/qqmlpool_p.h> @@ -223,7 +223,7 @@ struct Function Function *next; }; -struct CompiledFunctionOrExpression +struct Q_QML_EXPORT CompiledFunctionOrExpression { CompiledFunctionOrExpression() : node(0) @@ -243,7 +243,7 @@ struct CompiledFunctionOrExpression CompiledFunctionOrExpression *next; }; -struct Object +struct Q_QML_EXPORT Object { Q_DECLARE_TR_FUNCTIONS(Object) public: @@ -290,7 +290,7 @@ private: PoolList<Function> *functions; }; -struct Pragma +struct Q_QML_EXPORT Pragma { enum PragmaType { PragmaSingleton = 0x1 @@ -300,9 +300,9 @@ struct Pragma QV4::CompiledData::Location location; }; -struct ParsedQML +struct Q_QML_EXPORT Document { - ParsedQML(bool debugMode) + Document(bool debugMode) : jsModule(debugMode) , jsGenerator(&jsModule, sizeof(QV4::CompiledData::QmlUnit)) {} @@ -321,13 +321,12 @@ struct ParsedQML QString stringAt(int index) const { return jsGenerator.strings.value(index); } }; -// Doesn't really generate code per-se, but more the data structure -struct Q_QML_EXPORT QQmlCodeGenerator : public QQmlJS::AST::Visitor +struct Q_QML_EXPORT IRBuilder : public QQmlJS::AST::Visitor { Q_DECLARE_TR_FUNCTIONS(QQmlCodeGenerator) public: - QQmlCodeGenerator(const QSet<QString> &illegalNames); - bool generateFromQml(const QString &code, const QUrl &url, const QString &urlString, ParsedQML *output); + IRBuilder(const QSet<QString> &illegalNames); + bool generateFromQml(const QString &code, const QUrl &url, const QString &urlString, Document *output); static bool isSignalPropertyName(const QString &name); @@ -423,7 +422,7 @@ struct Q_QML_EXPORT QmlUnitGenerator { } - QV4::CompiledData::QmlUnit *generate(ParsedQML &output); + QV4::CompiledData::QmlUnit *generate(Document &output); private: typedef bool (Binding::*BindingFilter)() const; @@ -434,7 +433,7 @@ private: QV4::Compiler::JSUnitGenerator *jsUnitGenerator; }; -struct PropertyResolver +struct Q_QML_EXPORT PropertyResolver { PropertyResolver(QQmlPropertyCache *cache) : cache(cache) @@ -496,8 +495,8 @@ private: int _idArrayTemp; }; -} // namespace QtQml +} // namespace QmlIR QT_END_NAMESPACE -#endif // QQMLCODEGENERATOR_P_H +#endif // QQMLIRBUILDER_P_H diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 9a132dcbbc..43157930fd 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -41,7 +41,7 @@ #include "qqmltypecompiler_p.h" -#include <private/qqmlcompiler_p.h> +#include <private/qqmlirbuilder_p.h> #include <private/qqmlobjectcreator_p.h> #include <private/qqmlcustomparser_p.h> #include <private/qqmlvmemetaobject_p.h> @@ -57,11 +57,11 @@ QT_BEGIN_NAMESPACE -QQmlTypeCompiler::QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlCompiledData *compiledData, QQmlTypeData *typeData, QmlIR::ParsedQML *parsedQML) +QQmlTypeCompiler::QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlCompiledData *compiledData, QQmlTypeData *typeData, QmlIR::Document *parsedQML) : engine(engine) , compiledData(compiledData) , typeData(typeData) - , parsedQML(parsedQML) + , document(parsedQML) { } @@ -140,8 +140,8 @@ bool QQmlTypeCompiler::compile() customParsers.insert(it.key(), customParser); } - compiledData->datas.reserve(parsedQML->objects.count()); - compiledData->propertyCaches.reserve(parsedQML->objects.count()); + compiledData->datas.reserve(document->objects.count()); + compiledData->propertyCaches.reserve(document->objects.count()); { QQmlPropertyCacheCreator propertyCacheBuilder(this); @@ -203,7 +203,7 @@ bool QQmlTypeCompiler::compile() // Compile JS binding expressions and signal handlers { - QmlIR::JSCodeGen v4CodeGenerator(typeData->finalUrlString(), parsedQML->code, &parsedQML->jsModule, &parsedQML->jsParserEngine, parsedQML->program, compiledData->importCache, parsedQML->jsGenerator.strings); + QmlIR::JSCodeGen v4CodeGenerator(typeData->finalUrlString(), document->code, &document->jsModule, &document->jsParserEngine, document->program, compiledData->importCache, document->jsGenerator.strings); QQmlJSCodeGenerator jsCodeGen(this, &v4CodeGenerator); if (!jsCodeGen.generateCodeForComponents()) return false; @@ -216,14 +216,14 @@ bool QQmlTypeCompiler::compile() QV4::ExecutionEngine *v4 = engine->v4engine(); - QScopedPointer<QV4::EvalInstructionSelection> isel(v4->iselFactory->create(engine, v4->executableAllocator, &parsedQML->jsModule, &parsedQML->jsGenerator)); + QScopedPointer<QV4::EvalInstructionSelection> isel(v4->iselFactory->create(engine, v4->executableAllocator, &document->jsModule, &document->jsGenerator)); isel->setUseFastLookups(false); QV4::CompiledData::CompilationUnit *jsUnit = isel->compile(/*generated unit data*/false); // Generate QML compiled type data structures QmlIR::QmlUnitGenerator qmlGenerator; - QV4::CompiledData::QmlUnit *qmlUnit = qmlGenerator.generate(*parsedQML); + QV4::CompiledData::QmlUnit *qmlUnit = qmlGenerator.generate(*document); if (jsUnit) { Q_ASSERT(!jsUnit->data); @@ -295,17 +295,17 @@ void QQmlTypeCompiler::recordError(const QQmlError &error) QString QQmlTypeCompiler::stringAt(int idx) const { - return parsedQML->stringAt(idx); + return document->stringAt(idx); } int QQmlTypeCompiler::registerString(const QString &str) { - return parsedQML->jsGenerator.registerString(str); + return document->jsGenerator.registerString(str); } QV4::IR::Module *QQmlTypeCompiler::jsIRModule() const { - return &parsedQML->jsModule; + return &document->jsModule; } const QV4::CompiledData::QmlUnit *QQmlTypeCompiler::qmlUnit() const @@ -325,20 +325,20 @@ QHash<int, QQmlCompiledData::TypeReference*> *QQmlTypeCompiler::resolvedTypes() QList<QmlIR::Object *> *QQmlTypeCompiler::qmlObjects() { - return &parsedQML->objects; + return &document->objects; } int QQmlTypeCompiler::rootObjectIndex() const { - return parsedQML->indexOfRootObject; + return document->indexOfRootObject; } void QQmlTypeCompiler::setPropertyCaches(const QVector<QQmlPropertyCache *> &caches) { Q_ASSERT(compiledData->propertyCaches.isEmpty()); compiledData->propertyCaches = caches; - Q_ASSERT(caches.count() >= parsedQML->indexOfRootObject); - compiledData->rootPropertyCache = caches.at(parsedQML->indexOfRootObject); + Q_ASSERT(caches.count() >= document->indexOfRootObject); + compiledData->rootPropertyCache = caches.at(document->indexOfRootObject); compiledData->rootPropertyCache->addref(); } @@ -375,17 +375,17 @@ QHash<int, QQmlCompiledData::CustomParserData> *QQmlTypeCompiler::customParserDa QQmlJS::MemoryPool *QQmlTypeCompiler::memoryPool() { - return parsedQML->jsParserEngine.pool(); + return document->jsParserEngine.pool(); } QStringRef QQmlTypeCompiler::newStringRef(const QString &string) { - return parsedQML->jsParserEngine.newStringRef(string); + return document->jsParserEngine.newStringRef(string); } const QStringList &QQmlTypeCompiler::stringPool() const { - return parsedQML->jsGenerator.strings; + return document->jsGenerator.strings; } void QQmlTypeCompiler::setCustomParserBindings(const QVector<int> &bindings) @@ -946,7 +946,7 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio continue; } - if (!QmlIR::QQmlCodeGenerator::isSignalPropertyName(propertyName)) + if (!QmlIR::IRBuilder::isSignalPropertyName(propertyName)) continue; QmlIR::PropertyResolver resolver(propertyCache); @@ -1749,7 +1749,7 @@ bool QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledD customParserBindings.setBit(i); continue; } - } else if (QmlIR::QQmlCodeGenerator::isSignalPropertyName(name) + } else if (QmlIR::IRBuilder::isSignalPropertyName(name) && !(customParser->flags() & QQmlCustomParser::AcceptsSignalHandlers)) { customBindings << binding; customParserBindings.setBit(i); diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h index 09e30a40f7..e21c13c5df 100644 --- a/src/qml/compiler/qqmltypecompiler_p.h +++ b/src/qml/compiler/qqmltypecompiler_p.h @@ -45,6 +45,7 @@ #include <qqmlerror.h> #include <qhash.h> #include <private/qqmlcompiler_p.h> +#include <private/qqmlirbuilder_p.h> QT_BEGIN_NAMESPACE @@ -55,7 +56,7 @@ class QQmlTypeData; class QQmlImports; namespace QmlIR { -struct ParsedQML; +struct Document; } namespace QV4 { @@ -69,7 +70,7 @@ struct QQmlTypeCompiler { Q_DECLARE_TR_FUNCTIONS(QQmlTypeCompiler) public: - QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlCompiledData *compiledData, QQmlTypeData *typeData, QmlIR::ParsedQML *parsedQML); + QQmlTypeCompiler(QQmlEnginePrivate *engine, QQmlCompiledData *compiledData, QQmlTypeData *typeData, QmlIR::Document *document); bool compile(); @@ -109,7 +110,7 @@ private: QQmlEnginePrivate *engine; QQmlCompiledData *compiledData; QQmlTypeData *typeData; - QmlIR::ParsedQML *parsedQML; + QmlIR::Document *document; // index is string index of type name (use obj->inheritedTypeNameIndex) QHash<int, QQmlCustomParser*> customParsers; }; @@ -154,7 +155,7 @@ protected: // to the final signal name (onTextChanged -> textChanged) and sets the IsSignalExpression flag. struct SignalHandlerConverter : public QQmlCompilePass { - Q_DECLARE_TR_FUNCTIONS(QQmlCodeGenerator) + Q_DECLARE_TR_FUNCTIONS(SignalHandlerConverter) public: SignalHandlerConverter(QQmlTypeCompiler *typeCompiler); diff --git a/src/qml/qml/qqmlcompiler_p.h b/src/qml/qml/qqmlcompiler_p.h index 98d308aa5c..e30fa389f6 100644 --- a/src/qml/qml/qqmlcompiler_p.h +++ b/src/qml/qml/qqmlcompiler_p.h @@ -61,7 +61,6 @@ #include "qqmlpropertycache_p.h" #include "qqmltypenamecache_p.h" #include "qqmltypeloader_p.h" -#include <private/qqmlcodegenerator_p.h> #include "private/qv4identifier_p.h" #include <private/qqmljsastfwd_p.h> #include "qqmlcustomparser_p.h" diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index 6b01a64c40..25e98d13a6 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -51,7 +51,7 @@ #include <private/qqmlcomponent_p.h> #include <private/qqmlprofiler_p.h> #include <private/qqmlmemoryprofiler_p.h> -#include <private/qqmlcodegenerator_p.h> +#include <private/qqmlirbuilder_p.h> #include <private/qqmltypecompiler_p.h> #include <QtCore/qdir.h> @@ -1173,7 +1173,7 @@ void QQmlDataLoader::shutdownThread() } QQmlTypeLoader::Blob::Blob(const QUrl &url, QQmlDataBlob::Type type, QQmlTypeLoader *loader) - : QQmlDataBlob(url, type), m_typeLoader(loader), m_imports(loader), m_isSingleton(false) + : QQmlDataBlob(url, type), m_typeLoader(loader), m_importCache(loader), m_isSingleton(false) { } @@ -1211,7 +1211,7 @@ bool QQmlTypeLoader::Blob::updateQmldir(QQmlQmldirData *data, const QQmlScript:: typeLoader()->setQmldirContent(qmldirIdentifier, data->content()); - if (!m_imports.updateQmldirContent(typeLoader()->importDatabase(), import->uri, import->qualifier, qmldirIdentifier, qmldirUrl, errors)) + if (!m_importCache.updateQmldirContent(typeLoader()->importDatabase(), import->uri, import->qualifier, qmldirIdentifier, qmldirUrl, errors)) return false; QHash<const QQmlScript::Import *, int>::iterator it = m_unresolvedImports.find(import); @@ -1256,14 +1256,14 @@ bool QQmlTypeLoader::Blob::addImport(const QQmlScript::Import &import, QList<QQm if (QQmlMetaType::isLockedModule(import.uri, import.majorVersion)) { //Locked modules are checked first, to save on filesystem checks - if (!m_imports.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion, + if (!m_importCache.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion, import.minorVersion, QString(), QString(), false, errors)) return false; - } else if (m_imports.locateQmldir(importDatabase, import.uri, import.majorVersion, import.minorVersion, + } else if (m_importCache.locateQmldir(importDatabase, import.uri, import.majorVersion, import.minorVersion, &qmldirFilePath, &qmldirUrl)) { // This is a local library import - if (!m_imports.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion, + if (!m_importCache.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion, import.minorVersion, qmldirFilePath, qmldirUrl, false, errors)) return false; @@ -1282,7 +1282,7 @@ bool QQmlTypeLoader::Blob::addImport(const QQmlScript::Import &import, QList<QQm } else { // Is this a module? if (QQmlMetaType::isAnyModule(import.uri)) { - if (!m_imports.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion, + if (!m_importCache.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion, import.minorVersion, QString(), QString(), false, errors)) return false; } else { @@ -1293,7 +1293,7 @@ bool QQmlTypeLoader::Blob::addImport(const QQmlScript::Import &import, QList<QQm QStringList remotePathList = importDatabase->importPathList(QQmlImportDatabase::Remote); if (!remotePathList.isEmpty()) { // Add this library and request the possible locations for it - if (!m_imports.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion, + if (!m_importCache.addLibraryImport(importDatabase, import.uri, import.qualifier, import.majorVersion, import.minorVersion, QString(), QString(), true, errors)) return false; @@ -1324,7 +1324,7 @@ bool QQmlTypeLoader::Blob::addImport(const QQmlScript::Import &import, QList<QQm } } - if (!m_imports.addFileImport(importDatabase, import.uri, import.qualifier, import.majorVersion, + if (!m_importCache.addFileImport(importDatabase, import.uri, import.qualifier, import.majorVersion, import.minorVersion, incomplete, errors)) return false; @@ -1401,7 +1401,7 @@ void QQmlTypeLoader::Blob::dependencyComplete(QQmlDataBlob *blob) if (!qmldirDataAvailable(data, &errors)) { Q_ASSERT(errors.size()); QQmlError error(errors.takeFirst()); - error.setUrl(m_imports.baseUrl()); + error.setUrl(m_importCache.baseUrl()); error.setLine(import->location.start.line); error.setColumn(import->location.start.column); errors.prepend(error); // put it back on the list after filling out information. @@ -2045,7 +2045,7 @@ void QQmlTypeData::done() const TypeReference &type = *it; Q_ASSERT(!type.typeData || type.typeData->isCompleteOrError()); if (type.typeData && type.typeData->isError()) { - QString typeName = parsedQML->jsGenerator.strings.at(it.key()); + QString typeName = m_document->jsGenerator.strings.at(it.key()); QList<QQmlError> errors = type.typeData->errors(); QQmlError error; @@ -2092,7 +2092,7 @@ void QQmlTypeData::done() if (!isError()) compile(); - parsedQML.reset(); + m_document.reset(); } void QQmlTypeData::completed() @@ -2108,14 +2108,14 @@ bool QQmlTypeData::loadImplicitImport() { m_implicitImportLoaded = true; // Even if we hit an error, count as loaded (we'd just keep hitting the error) - m_imports.setBaseUrl(finalUrl(), finalUrlString()); + m_importCache.setBaseUrl(finalUrl(), finalUrlString()); QQmlImportDatabase *importDatabase = typeLoader()->importDatabase(); // For local urls, add an implicit import "." as most overridden lookup. // This will also trigger the loading of the qmldir and the import of any native // types from available plugins. QList<QQmlError> implicitImportErrors; - m_imports.addImplicitImport(importDatabase, &implicitImportErrors); + m_importCache.addImplicitImport(importDatabase, &implicitImportErrors); if (!implicitImportErrors.isEmpty()) { setError(implicitImportErrors); @@ -2133,14 +2133,14 @@ void QQmlTypeData::dataReceived(const Data &data) if (data.isFile()) preparseData = data.asFile()->metaData(QLatin1String("qml:preparse")); QQmlEngine *qmlEngine = typeLoader()->engine(); - parsedQML.reset(new QmlIR::ParsedQML(QV8Engine::getV4(qmlEngine)->debugger != 0)); - QmlIR::QQmlCodeGenerator compiler(QV8Engine::get(qmlEngine)->illegalNames()); - if (!compiler.generateFromQml(code, finalUrl(), finalUrlString(), parsedQML.data())) { + m_document.reset(new QmlIR::Document(QV8Engine::getV4(qmlEngine)->debugger != 0)); + QmlIR::IRBuilder compiler(QV8Engine::get(qmlEngine)->illegalNames()); + if (!compiler.generateFromQml(code, finalUrl(), finalUrlString(), m_document.data())) { setError(compiler.errors); return; } - m_imports.setBaseUrl(finalUrl(), finalUrlString()); + m_importCache.setBaseUrl(finalUrl(), finalUrlString()); // For remote URLs, we don't delay the loading of the implicit import // because the loading probably requires an asynchronous fetch of the @@ -2167,13 +2167,12 @@ void QQmlTypeData::dataReceived(const Data &data) QList<QQmlError> errors; - // ### convert to use new data structure once old compiler is gone. - if (m_newImports.isEmpty()) { - m_newImports.reserve(parsedQML->imports.size()); - foreach (QV4::CompiledData::Import *i, parsedQML->imports) { + if (m_imports.isEmpty()) { + m_imports.reserve(m_document->imports.count()); + foreach (QV4::CompiledData::Import *i, m_document->imports) { QQmlScript::Import import; - import.uri = parsedQML->stringAt(i->uriIndex); - import.qualifier = parsedQML->stringAt(i->qualifierIndex); + import.uri = m_document->stringAt(i->uriIndex); + import.qualifier = m_document->stringAt(i->qualifierIndex); import.majorVersion = i->majorVersion; import.minorVersion = i->minorVersion; import.location.start.line = i->location.line; @@ -2185,17 +2184,15 @@ void QQmlTypeData::dataReceived(const Data &data) case QV4::CompiledData::Import::ImportScript: import.type = QQmlScript::Import::Script; break; default: break; } - - - m_newImports << import; + m_imports << import; } } - foreach (const QQmlScript::Import &import, m_newImports) { + foreach (const QQmlScript::Import &import, m_imports) { if (!addImport(import, &errors)) { Q_ASSERT(errors.size()); QQmlError error(errors.takeFirst()); - error.setUrl(m_imports.baseUrl()); + error.setUrl(m_importCache.baseUrl()); error.setLine(import.location.start.line); error.setColumn(import.location.start.column); errors.prepend(error); // put it back on the list after filling out information. @@ -2204,10 +2201,9 @@ void QQmlTypeData::dataReceived(const Data &data) } } - // ### convert to use new data structure once old compiler is gone. - if (m_newPragmas.isEmpty()) { - m_newPragmas.reserve(parsedQML->pragmas.size()); - foreach (QmlIR::Pragma *p, parsedQML->pragmas) { + if (m_pragmas.isEmpty()) { + m_pragmas.reserve(m_document->pragmas.count()); + foreach (QmlIR::Pragma *p, m_document->pragmas) { QQmlScript::Pragma pragma; pragma.location.start.line = p->location.line; pragma.location.start.column = p->location.column; @@ -2217,17 +2213,18 @@ void QQmlTypeData::dataReceived(const Data &data) default: break; } - m_newPragmas << pragma; + m_pragmas << pragma; } } - foreach (const QQmlScript::Pragma &pragma, m_newPragmas) { + foreach (const QQmlScript::Pragma &pragma, m_pragmas) { if (!addPragma(pragma, &errors)) { Q_ASSERT(errors.size()); setError(errors); return; } } + } void QQmlTypeData::allDependenciesDone() @@ -2242,7 +2239,7 @@ void QQmlTypeData::allDependenciesDone() foreach (const QQmlScript::Import *import, m_unresolvedImports.keys()) { QQmlError error; error.setDescription(QQmlTypeLoader::tr("module \"%1\" is not installed").arg(import->uri)); - error.setUrl(m_imports.baseUrl()); + error.setUrl(m_importCache.baseUrl()); error.setLine(import->location.start.line); error.setColumn(import->location.start.column); errors.prepend(error); @@ -2277,7 +2274,7 @@ void QQmlTypeData::compile() QQmlCompilingProfiler prof(QQmlEnginePrivate::get(typeLoader()->engine())->profiler, m_compiledData->name); - QQmlTypeCompiler compiler(QQmlEnginePrivate::get(typeLoader()->engine()), m_compiledData, this, parsedQML.data()); + QQmlTypeCompiler compiler(QQmlEnginePrivate::get(typeLoader()->engine()), m_compiledData, this, m_document.data()); if (!compiler.compile()) { setError(compiler.compilationErrors()); m_compiledData->release(); @@ -2288,7 +2285,7 @@ void QQmlTypeData::compile() void QQmlTypeData::resolveTypes() { // Add any imported scripts to our resolved set - foreach (const QQmlImports::ScriptReference &script, m_imports.resolvedScripts()) + foreach (const QQmlImports::ScriptReference &script, m_importCache.resolvedScripts()) { QQmlScriptBlob *blob = typeLoader()->getScript(script.location); addDependency(blob); @@ -2309,7 +2306,7 @@ void QQmlTypeData::resolveTypes() } // Lets handle resolved composite singleton types - foreach (const QQmlImports::CompositeSingletonReference &csRef, m_imports.resolvedCompositeSingletons()) { + foreach (const QQmlImports::CompositeSingletonReference &csRef, m_importCache.resolvedCompositeSingletons()) { TypeReference ref; QQmlScript::TypeReference parserRef; parserRef.name = csRef.typeName; @@ -2337,9 +2334,9 @@ void QQmlTypeData::resolveTypes() QV4::CompiledData::TypeReferenceMap typeReferences; QStringList names; - if (parsedQML) { - typeReferences = parsedQML->typeReferences; - names = parsedQML->jsGenerator.strings; + if (m_document) { + typeReferences = m_document->typeReferences; + names = m_document->jsGenerator.strings; } else { // ### collect from available QV4::CompiledData::QmlUnit } @@ -2356,14 +2353,14 @@ void QQmlTypeData::resolveTypes() QList<QQmlError> errors; const QString name = names.at(unresolvedRef.key()); - bool typeFound = m_imports.resolveType(name, &ref.type, + bool typeFound = m_importCache.resolveType(name, &ref.type, &majorVersion, &minorVersion, &typeNamespace, &errors); if (!typeNamespace && !typeFound && !m_implicitImportLoaded) { // Lazy loading of implicit import if (loadImplicitImport()) { // Try again to find the type errors.clear(); - typeFound = m_imports.resolveType(name, &ref.type, + typeFound = m_importCache.resolveType(name, &ref.type, &majorVersion, &minorVersion, &typeNamespace, &errors); } else { return; //loadImplicitImport() hit an error, and called setError already @@ -2385,7 +2382,7 @@ void QQmlTypeData::resolveTypes() // Description should come from error provided by addImport() function. error.setDescription(QQmlTypeLoader::tr("Unreported error adding script import to import database")); } - error.setUrl(m_imports.baseUrl()); + error.setUrl(m_importCache.baseUrl()); error.setDescription(QQmlTypeLoader::tr("%1 %2").arg(name).arg(error.description())); } @@ -2418,14 +2415,14 @@ bool QQmlTypeData::resolveType(const QQmlScript::TypeReference *parserRef, int & QQmlImportNamespace *typeNamespace = 0; QList<QQmlError> errors; - bool typeFound = m_imports.resolveType(parserRef->name, &ref.type, + bool typeFound = m_importCache.resolveType(parserRef->name, &ref.type, &majorVersion, &minorVersion, &typeNamespace, &errors); if (!typeNamespace && !typeFound && !m_implicitImportLoaded) { // Lazy loading of implicit import if (loadImplicitImport()) { // Try again to find the type errors.clear(); - typeFound = m_imports.resolveType(parserRef->name, &ref.type, + typeFound = m_importCache.resolveType(parserRef->name, &ref.type, &majorVersion, &minorVersion, &typeNamespace, &errors); } else { return false; //loadImplicitImport() hit an error, and called setError already @@ -2447,7 +2444,7 @@ bool QQmlTypeData::resolveType(const QQmlScript::TypeReference *parserRef, int & // Description should come from error provided by addImport() function. error.setDescription(QQmlTypeLoader::tr("Unreported error adding script import to import database")); } - error.setUrl(m_imports.baseUrl()); + error.setUrl(m_importCache.baseUrl()); error.setDescription(QQmlTypeLoader::tr("%1 %2").arg(parserRef->name).arg(error.description())); } @@ -2647,7 +2644,7 @@ void QQmlScriptBlob::dataReceived(const Data &data) return; } - m_imports.setBaseUrl(finalUrl(), finalUrlString()); + m_importCache.setBaseUrl(finalUrl(), finalUrlString()); QList<QQmlError> errors; @@ -2655,7 +2652,7 @@ void QQmlScriptBlob::dataReceived(const Data &data) if (!addImport(import, &errors)) { Q_ASSERT(errors.size()); QQmlError error(errors.takeFirst()); - error.setUrl(m_imports.baseUrl()); + error.setUrl(m_importCache.baseUrl()); error.setLine(import.location.start.line); error.setColumn(import.location.start.column); errors.prepend(error); // put it back on the list after filling out information. @@ -2704,7 +2701,7 @@ void QQmlScriptBlob::done() m_scriptData->importCache->add(script.qualifier, scriptIndex, script.nameSpace); } - m_imports.populateCache(m_scriptData->importCache); + m_importCache.populateCache(m_scriptData->importCache); m_scriptData->pragmas = m_metadata.pragmas; diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index adb998d1f8..6e759266ef 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -85,7 +85,7 @@ class QQmlDataLoader; class QQmlExtensionInterface; namespace QmlIR { -struct ParsedQML; +struct Document; } class Q_QML_PRIVATE_EXPORT QQmlDataBlob : public QQmlRefCount @@ -275,7 +275,7 @@ public: ~Blob(); QQmlTypeLoader *typeLoader() const { return m_typeLoader; } - const QQmlImports &imports() const { return m_imports; } + const QQmlImports &imports() const { return m_importCache; } protected: bool addImport(const QQmlScript::Import &import, QList<QQmlError> *errors); @@ -294,7 +294,7 @@ public: protected: QQmlTypeLoader *m_typeLoader; - QQmlImports m_imports; + QQmlImports m_importCache; bool m_isSingleton; QHash<const QQmlScript::Import *, int> m_unresolvedImports; QList<QQmlQmldirData *> m_qmldirs; @@ -455,9 +455,9 @@ private: virtual void scriptImported(QQmlScriptBlob *blob, const QQmlScript::Location &location, const QString &qualifier, const QString &nameSpace); - QScopedPointer<QmlIR::ParsedQML> parsedQML; - QList<QQmlScript::Import> m_newImports; - QList<QQmlScript::Pragma> m_newPragmas; + QScopedPointer<QmlIR::Document> m_document; + QList<QQmlScript::Import> m_imports; + QList<QQmlScript::Pragma> m_pragmas; QList<ScriptReference> m_scripts; |