diff options
Diffstat (limited to 'src/qml/compiler/qqmlcodegenerator_p.h')
-rw-r--r-- | src/qml/compiler/qqmlcodegenerator_p.h | 143 |
1 files changed, 107 insertions, 36 deletions
diff --git a/src/qml/compiler/qqmlcodegenerator_p.h b/src/qml/compiler/qqmlcodegenerator_p.h index 0a0e4f2d5b..7c09b8bfa2 100644 --- a/src/qml/compiler/qqmlcodegenerator_p.h +++ b/src/qml/compiler/qqmlcodegenerator_p.h @@ -93,15 +93,49 @@ struct PoolList T *last; int count; - void append(T *item) { + int append(T *item) { item->next = 0; if (last) last->next = item; else first = item; last = item; + return count++; + } + + void prepend(T *item) { + item->next = first; + first = item; + if (!last) + last = first; ++count; } + + template <typename Sortable, typename Base, Sortable Base::*sortMember> + T *findSortedInsertionPoint(T *item) const + { + T *insertPos = 0; + + for (T *it = first; it; it = it->next) { + if (!(it->*sortMember < item->*sortMember)) + break; + insertPos = it; + } + + return insertPos; + } + + void insertAfter(T *insertionPoint, T *item) { + if (!insertionPoint) { + prepend(item); + } else if (insertionPoint == last) { + append(item); + } else { + item->next = insertionPoint->next; + insertionPoint->next = item; + ++count; + } + } }; struct QmlObject; @@ -135,25 +169,73 @@ struct Binding : public QV4::CompiledData::Binding struct Function { + AST::FunctionDeclaration *functionDeclaration; + QV4::CompiledData::Location location; + int nameIndex; int index; // index in parsedQML::functions Function *next; }; +struct CompiledFunctionOrExpression +{ + CompiledFunctionOrExpression() + : node(0) + , disableAcceleratedLookups(false) + {} + CompiledFunctionOrExpression(AST::Node *n) + : node(n) + , disableAcceleratedLookups(false) + {} + AST::Node *node; // FunctionDeclaration, Statement or Expression + QString name; + bool disableAcceleratedLookups; +}; + struct QmlObject { - int inheritedTypeNameIndex; - int idIndex; + Q_DECLARE_TR_FUNCTIONS(QmlObject) +public: + quint32 inheritedTypeNameIndex; + quint32 idIndex; int indexOfDefaultProperty; QV4::CompiledData::Location location; QV4::CompiledData::Location locationOfIdProperty; + const QmlProperty *firstProperty() const { return properties->first; } + int propertyCount() const { return properties->count; } + const Signal *firstSignal() const { return qmlSignals->first; } + int signalCount() const { return qmlSignals->count; } + Binding *firstBinding() const { return bindings->first; } + int bindingCount() const { return bindings->count; } + const Function *firstFunction() const { return functions->first; } + int functionCount() const { return functions->count; } + + // If set, then declarations for this object (and init bindings for these) should go into the + // specified object. Used for declarations inside group properties. + QmlObject *declarationsOverride; + + void init(QQmlJS::MemoryPool *pool, int typeNameIndex, int id, const AST::SourceLocation &location = AST::SourceLocation()); + + void dump(DebugStream &out); + + QString sanityCheckFunctionNames(const QList<CompiledFunctionOrExpression> &allFunctions, const QSet<QString> &illegalNames, AST::SourceLocation *errorLocation); + + QString appendSignal(Signal *signal); + QString appendProperty(QmlProperty *prop, const QString &propertyName, bool isDefaultProperty, const AST::SourceLocation &defaultToken, AST::SourceLocation *errorLocation); + void appendFunction(Function *f); + + QString appendBinding(Binding *b, bool isListBinding); + +private: PoolList<QmlProperty> *properties; PoolList<Signal> *qmlSignals; PoolList<Binding> *bindings; PoolList<Function> *functions; - void dump(DebugStream &out); + QSet<int> propertyNames; + QSet<int> bindingNames; + QSet<int> signalNames; }; struct Pragma @@ -166,20 +248,6 @@ struct Pragma QV4::CompiledData::Location location; }; -struct CompiledFunctionOrExpression -{ - CompiledFunctionOrExpression() - : disableAcceleratedLookups(false) - {} - CompiledFunctionOrExpression(AST::Node *n) - : node(n) - , disableAcceleratedLookups(false) - {} - AST::Node *node; // FunctionDeclaration, Statement or Expression - QString name; - bool disableAcceleratedLookups; -}; - struct ParsedQML { ParsedQML(bool debugMode) @@ -207,7 +275,7 @@ struct Q_QML_EXPORT QQmlCodeGenerator : public AST::Visitor { Q_DECLARE_TR_FUNCTIONS(QQmlCodeGenerator) public: - QQmlCodeGenerator(); + QQmlCodeGenerator(const QSet<QString> &illegalNames); bool generateFromQml(const QString &code, const QUrl &url, const QString &urlString, ParsedQML *output); static bool isSignalPropertyName(const QString &name); @@ -234,9 +302,9 @@ public: void accept(AST::Node *node); // returns index in _objects - int defineQMLObject(AST::UiQualifiedId *qualifiedTypeNameId, AST::UiObjectInitializer *initializer); - int defineQMLObject(AST::UiObjectDefinition *node) - { return defineQMLObject(node->qualifiedTypeNameId, node->initializer); } + int defineQMLObject(AST::UiQualifiedId *qualifiedTypeNameId, const AST::SourceLocation &location, AST::UiObjectInitializer *initializer, QmlObject *declarationsOverride = 0); + int defineQMLObject(AST::UiObjectDefinition *node, QmlObject *declarationsOverride = 0) + { return defineQMLObject(node->qualifiedTypeNameId, node->qualifiedTypeNameId->firstSourceLocation(), node->initializer, declarationsOverride); } static QString asString(AST::UiQualifiedId *node); QStringRef asStringRef(AST::Node *node); @@ -253,26 +321,26 @@ public: void setBindingValue(QV4::CompiledData::Binding *binding, AST::Statement *statement); void appendBinding(AST::UiQualifiedId *name, AST::Statement *value); - void appendBinding(AST::UiQualifiedId *name, int objectIndex); - void appendBinding(const AST::SourceLocation &nameLocation, int propertyNameIndex, AST::Statement *value); - void appendBinding(const AST::SourceLocation &nameLocation, int propertyNameIndex, int objectIndex, bool isListItem = false); + void appendBinding(AST::UiQualifiedId *name, int objectIndex, bool isOnAssignment = false); + void appendBinding(const AST::SourceLocation &nameLocation, quint32 propertyNameIndex, AST::Statement *value); + void appendBinding(const AST::SourceLocation &nameLocation, quint32 propertyNameIndex, int objectIndex, bool isListItem = false, bool isOnAssignment = false); + + QmlObject *bindingsTarget() const; - bool setId(AST::Statement *value); + bool setId(const AST::SourceLocation &idLocation, AST::Statement *value); // resolves qualified name (font.pixelSize for example) and returns the last name along // with the object any right-hand-side of a binding should apply to. bool resolveQualifiedId(AST::UiQualifiedId **nameToResolve, QmlObject **object); - bool sanityCheckPropertyName(const AST::SourceLocation &nameLocation, int nameIndex, bool isListItem = false); - void recordError(const AST::SourceLocation &location, const QString &description); void collectTypeReferences(); static QQmlScript::LocationSpan location(AST::SourceLocation start, AST::SourceLocation end); - int registerString(const QString &str) const { return jsGenerator->registerString(str); } - template <typename _Tp> _Tp *New() { return new (pool->allocate(sizeof(_Tp))) _Tp(); } + quint32 registerString(const QString &str) const { return jsGenerator->registerString(str); } + template <typename _Tp> _Tp *New() { return pool->New<_Tp>(); } QString stringAt(int index) const { return jsGenerator->strings.at(index); } @@ -280,6 +348,8 @@ public: QList<QQmlError> errors; + QSet<QString> illegalNames; + QList<QV4::CompiledData::Import*> _imports; QList<Pragma*> _pragmas; QList<QmlObject*> _objects; @@ -288,15 +358,12 @@ public: QV4::CompiledData::TypeReferenceMap _typeReferences; QmlObject *_object; - QSet<QString> _propertyNames; - QSet<QString> _signalNames; + QmlProperty *_propertyDeclaration; QQmlJS::MemoryPool *pool; QString sourceCode; QUrl url; QV4::Compiler::JSUnitGenerator *jsGenerator; - int emptyStringIndex; - bool sanityCheckFunctionNames(); }; struct Q_QML_EXPORT QmlUnitGenerator @@ -309,6 +376,9 @@ struct Q_QML_EXPORT QmlUnitGenerator QV4::CompiledData::QmlUnit *generate(ParsedQML &output, const QVector<int> &runtimeFunctionIndices); private: + typedef bool (Binding::*BindingFilter)() const; + char *writeBindings(char *bindingPtr, QmlObject *o, const QVector<int> &runtimeFunctionIndices, BindingFilter filter) const; + int getStringId(const QString &str) const; QV4::Compiler::JSUnitGenerator *jsUnitGenerator; @@ -325,10 +395,10 @@ struct PropertyResolver return cache->property(index); } - QQmlPropertyData *property(const QString &name, bool *notInRevision = 0); + QQmlPropertyData *property(const QString &name, bool *notInRevision = 0, QObject *object = 0, QQmlContextData *context = 0); // This code must match the semantics of QQmlPropertyPrivate::findSignalByName - QQmlPropertyData *signal(const QString &name, bool *notInRevision); + QQmlPropertyData *signal(const QString &name, bool *notInRevision, QObject *object = 0, QQmlContextData *context = 0); QQmlPropertyCache *cache; }; @@ -357,6 +427,7 @@ private: QQmlEnginePrivate *enginePrivate; ParsedQML *parsedQML; QQmlCompiledData *unit; + const QSet<QString> &illegalNames; }; struct Q_QML_EXPORT JSCodeGen : public QQmlJS::Codegen |