diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2011-10-07 14:04:06 +0200 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2011-10-10 09:36:12 +0200 |
commit | a7f78991c9317471ddc85f6556be971d019f3f59 (patch) | |
tree | 51e53891d62970c14efc59e986a2459cad6267ed /src/libs | |
parent | 737aaf02b4d221d8088513fef810e0f453a737be (diff) | |
download | qt-creator-a7f78991c9317471ddc85f6556be971d019f3f59.tar.gz |
QmlJS: Move commonly used functions to qmlutils.h.
Change-Id: I22376d96fe575bc00a55094c06af80e32a5587e6
Reviewed-on: http://codereview.qt-project.org/6238
Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/qmleditorwidgets/contextpanewidgetrectangle.cpp | 2 | ||||
-rw-r--r-- | src/libs/qmljs/qmljs-lib.pri | 6 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsbind.cpp | 16 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsbind.h | 2 | ||||
-rw-r--r-- | src/libs/qmljs/qmljscheck.cpp | 92 | ||||
-rw-r--r-- | src/libs/qmljs/qmljscheck.h | 21 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsdelta.cpp | 17 | ||||
-rw-r--r-- | src/libs/qmljs/qmljslink.cpp | 14 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsmodelmanagerinterface.h | 2 | ||||
-rw-r--r-- | src/libs/qmljs/qmljspropertyreader.cpp | 22 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsrewriter.cpp | 55 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsrewriter.h | 1 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsscopebuilder.cpp | 7 | ||||
-rw-r--r-- | src/libs/qmljs/qmljstypedescriptionreader.cpp | 21 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsutils.cpp | 162 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsutils.h | 44 |
16 files changed, 259 insertions, 225 deletions
diff --git a/src/libs/qmleditorwidgets/contextpanewidgetrectangle.cpp b/src/libs/qmleditorwidgets/contextpanewidgetrectangle.cpp index df55ab639d..08927708e7 100644 --- a/src/libs/qmleditorwidgets/contextpanewidgetrectangle.cpp +++ b/src/libs/qmleditorwidgets/contextpanewidgetrectangle.cpp @@ -34,7 +34,7 @@ #include "ui_contextpanewidgetrectangle.h" #include "contextpanewidget.h" #include <qmljs/qmljspropertyreader.h> -#include <qmljs/qmljscheck.h> +#include <qmljs/qmljsutils.h> #include <customcolordialog.h> #include <QtCore/QDebug> diff --git a/src/libs/qmljs/qmljs-lib.pri b/src/libs/qmljs/qmljs-lib.pri index 62a06ecff4..883ebd3da0 100644 --- a/src/libs/qmljs/qmljs-lib.pri +++ b/src/libs/qmljs/qmljs-lib.pri @@ -30,7 +30,8 @@ HEADERS += \ $$PWD/qmljsscopeastpath.h \ $$PWD/qmljsvalueowner.h \ $$PWD/qmljscontext.h \ - $$PWD/qmljsscopechain.h + $$PWD/qmljsscopechain.h \ + $$PWD/qmljsutils.h SOURCES += \ $$PWD/qmljsbind.cpp \ @@ -52,7 +53,8 @@ SOURCES += \ $$PWD/qmljsscopeastpath.cpp \ $$PWD/qmljsvalueowner.cpp \ $$PWD/qmljscontext.cpp \ - $$PWD/qmljsscopechain.cpp + $$PWD/qmljsscopechain.cpp \ + $$PWD/qmljsutils.cpp RESOURCES += \ $$PWD/qmljs.qrc diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp index 1f4915fd64..99431b593b 100644 --- a/src/libs/qmljs/qmljsbind.cpp +++ b/src/libs/qmljs/qmljsbind.cpp @@ -32,7 +32,7 @@ #include "parser/qmljsast_p.h" #include "qmljsbind.h" -#include "qmljscheck.h" +#include "qmljsutils.h" #include "qmljsdocument.h" #include <languageutils/componentversion.h> @@ -141,20 +141,6 @@ ObjectValue *Bind::switchObjectValue(ObjectValue *newObjectValue) return oldObjectValue; } -QString Bind::toString(UiQualifiedId *qualifiedId, QChar delimiter) -{ - QString result; - - for (UiQualifiedId *iter = qualifiedId; iter; iter = iter->next) { - if (iter != qualifiedId) - result += delimiter; - - result += iter->name; - } - - return result; -} - ObjectValue *Bind::bindObject(UiQualifiedId *qualifiedTypeNameId, UiObjectInitializer *initializer) { ObjectValue *parentObjectValue = 0; diff --git a/src/libs/qmljs/qmljsbind.h b/src/libs/qmljs/qmljsbind.h index 600b33ff3c..73cad7ff29 100644 --- a/src/libs/qmljs/qmljsbind.h +++ b/src/libs/qmljs/qmljsbind.h @@ -69,8 +69,6 @@ public: ObjectValue *findAttachedJSScope(AST::Node *node) const; bool isGroupedPropertyBinding(AST::Node *node) const; - static QString toString(AST::UiQualifiedId *qualifiedId, QChar delimiter = QChar('.')); - protected: using AST::Visitor::visit; diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index d005978be2..528c49a056 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -34,6 +34,7 @@ #include "qmljsbind.h" #include "qmljscontext.h" #include "qmljsevaluate.h" +#include "qmljsutils.h" #include "parser/qmljsast_p.h" #include <QtCore/QDebug> @@ -44,93 +45,6 @@ using namespace QmlJS; using namespace QmlJS::AST; -QColor QmlJS::toQColor(const QString &qmlColorString) -{ - QColor color; - if (qmlColorString.size() == 9 && qmlColorString.at(0) == QLatin1Char('#')) { - bool ok; - const int alpha = qmlColorString.mid(1, 2).toInt(&ok, 16); - if (ok) { - QString name(qmlColorString.at(0)); - name.append(qmlColorString.right(6)); - if (QColor::isValidColor(name)) { - color.setNamedColor(name); - color.setAlpha(alpha); - } - } - } else { - if (QColor::isValidColor(qmlColorString)) - color.setNamedColor(qmlColorString); - } - return color; -} - -SourceLocation QmlJS::locationFromRange(const SourceLocation &start, - const SourceLocation &end) -{ - return SourceLocation(start.offset, - end.end() - start.begin(), - start.startLine, - start.startColumn); -} - -SourceLocation QmlJS::fullLocationForQualifiedId(AST::UiQualifiedId *qualifiedId) -{ - SourceLocation start = qualifiedId->identifierToken; - SourceLocation end = qualifiedId->identifierToken; - - for (UiQualifiedId *iter = qualifiedId; iter; iter = iter->next) { - if (iter->identifierToken.isValid()) - end = iter->identifierToken; - } - - return locationFromRange(start, end); -} - - -DiagnosticMessage QmlJS::errorMessage(const AST::SourceLocation &loc, const QString &message) -{ - return DiagnosticMessage(DiagnosticMessage::Error, loc, message); -} - -namespace { -class SharedData -{ -public: - SharedData() - { - validBuiltinPropertyNames.insert(QLatin1String("action")); - validBuiltinPropertyNames.insert(QLatin1String("bool")); - validBuiltinPropertyNames.insert(QLatin1String("color")); - validBuiltinPropertyNames.insert(QLatin1String("date")); - validBuiltinPropertyNames.insert(QLatin1String("double")); - validBuiltinPropertyNames.insert(QLatin1String("enumeration")); - validBuiltinPropertyNames.insert(QLatin1String("font")); - validBuiltinPropertyNames.insert(QLatin1String("int")); - validBuiltinPropertyNames.insert(QLatin1String("list")); - validBuiltinPropertyNames.insert(QLatin1String("point")); - validBuiltinPropertyNames.insert(QLatin1String("real")); - validBuiltinPropertyNames.insert(QLatin1String("rect")); - validBuiltinPropertyNames.insert(QLatin1String("size")); - validBuiltinPropertyNames.insert(QLatin1String("string")); - validBuiltinPropertyNames.insert(QLatin1String("time")); - validBuiltinPropertyNames.insert(QLatin1String("url")); - validBuiltinPropertyNames.insert(QLatin1String("var")); - validBuiltinPropertyNames.insert(QLatin1String("variant")); // obsolete in Qt 5 - validBuiltinPropertyNames.insert(QLatin1String("vector3d")); - validBuiltinPropertyNames.insert(QLatin1String("alias")); - } - - QSet<QString> validBuiltinPropertyNames; -}; -} // anonymous namespace -Q_GLOBAL_STATIC(SharedData, sharedData) - -bool QmlJS::isValidBuiltinPropertyType(const QString &name) -{ - return sharedData()->validBuiltinPropertyNames.contains(name); -} - namespace { class AssignmentCheck : public ValueVisitor @@ -666,7 +580,7 @@ void Check::endVisit(UiObjectInitializer *) void Check::checkProperty(UiQualifiedId *qualifiedId) { - const QString id = Bind::toString(qualifiedId); + const QString id = toString(qualifiedId); if (id.at(0).isLower()) { if (m_propertyStack.top().contains(id)) { error(fullLocationForQualifiedId(qualifiedId), @@ -723,7 +637,7 @@ void Check::visitQmlObject(Node *ast, UiQualifiedId *typeId, dynamic_cast<const QmlPrototypeReference *>(lastPrototype->prototype())) { error(typeErrorLocation, Check::tr("could not resolve the prototype %1 of %2").arg( - Bind::toString(ref->qmlTypeName()), lastPrototype->className())); + toString(ref->qmlTypeName()), lastPrototype->className())); } else { error(typeErrorLocation, Check::tr("could not resolve the prototype of %1").arg( diff --git a/src/libs/qmljs/qmljscheck.h b/src/libs/qmljs/qmljscheck.h index 031dceb84c..11ac979ca4 100644 --- a/src/libs/qmljs/qmljscheck.h +++ b/src/libs/qmljs/qmljscheck.h @@ -151,27 +151,6 @@ private: QStack<StringSet> m_propertyStack; }; -QMLJS_EXPORT QColor toQColor(const QString &qmlColorString); - -QMLJS_EXPORT AST::SourceLocation locationFromRange(const AST::SourceLocation &start, - const AST::SourceLocation &end); - -QMLJS_EXPORT AST::SourceLocation fullLocationForQualifiedId(AST::UiQualifiedId *); - -QMLJS_EXPORT DiagnosticMessage errorMessage(const AST::SourceLocation &loc, - const QString &message); - -QMLJS_EXPORT bool isValidBuiltinPropertyType(const QString &name); - -template <class T> -DiagnosticMessage errorMessage(const T *node, const QString &message) -{ - return DiagnosticMessage(DiagnosticMessage::Error, - locationFromRange(node->firstSourceLocation(), - node->lastSourceLocation()), - message); -} - } // namespace QmlJS #endif // QMLJSCHECK_H diff --git a/src/libs/qmljs/qmljsdelta.cpp b/src/libs/qmljs/qmljsdelta.cpp index 076d8ab252..76667ac00d 100644 --- a/src/libs/qmljs/qmljsdelta.cpp +++ b/src/libs/qmljs/qmljsdelta.cpp @@ -31,6 +31,7 @@ **************************************************************************/ #include "qmljsdelta.h" +#include "qmljsutils.h" #include <qmljs/parser/qmljsast_p.h> #include <qmljs/parser/qmljsastvisitor_p.h> @@ -168,14 +169,8 @@ struct Map { static QList<UiObjectMember *> children(UiObjectMember *ast) { QList<UiObjectMember *> ret; - if (UiObjectDefinition* foo = cast<UiObjectDefinition *>(ast)) { - UiObjectMemberList* list = foo->initializer->members; - while (list) { - ret.append(list->member); - list = list->next; - } - } else if(UiObjectBinding *foo = cast<UiObjectBinding *>(ast)) { - UiObjectMemberList* list = foo->initializer->members; + if (UiObjectInitializer * foo = QmlJS::initializerOfObject(ast)) { + UiObjectMemberList* list = foo->members; while (list) { ret.append(list->member); list = list->next; @@ -308,10 +303,8 @@ static QString _methodName(UiSourceElement *source) static UiObjectMemberList *objectMembers(UiObjectMember *object) { - if (UiObjectDefinition *def = cast<UiObjectDefinition *>(object)) - return def->initializer->members; - else if (UiObjectBinding *binding = cast<UiObjectBinding *>(object)) - return binding->initializer->members; + if (UiObjectInitializer *init = QmlJS::initializerOfObject(object)) + return init->members; return 0; } diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index 1ff75045e0..147b264373 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -35,7 +35,7 @@ #include "parser/qmljsast_p.h" #include "qmljsdocument.h" #include "qmljsbind.h" -#include "qmljscheck.h" +#include "qmljsutils.h" #include "qmljsmodelmanagerinterface.h" #include <QtCore/QFileInfo> @@ -94,8 +94,6 @@ public: QHash<QString, QList<DiagnosticMessage> > *allDiagnosticMessages; - static AST::UiQualifiedId *qualifiedTypeNameId(AST::Node *node); - Context::ImportsPerDocument linkImports(); void populateImportedTypes(Imports *imports, Document::Ptr doc); @@ -446,16 +444,6 @@ bool LinkPrivate::importLibrary(Document::Ptr doc, return true; } -UiQualifiedId *LinkPrivate::qualifiedTypeNameId(Node *node) -{ - if (UiObjectBinding *binding = AST::cast<UiObjectBinding *>(node)) - return binding->qualifiedTypeNameId; - else if (UiObjectDefinition *binding = AST::cast<UiObjectDefinition *>(node)) - return binding->qualifiedTypeNameId; - else - return 0; -} - void LinkPrivate::error(const Document::Ptr &doc, const AST::SourceLocation &loc, const QString &message) { appendDiagnostic(doc, DiagnosticMessage(DiagnosticMessage::Error, loc, message)); diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.h b/src/libs/qmljs/qmljsmodelmanagerinterface.h index 316c6d52cf..c5bb8d2292 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.h +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.h @@ -85,7 +85,7 @@ public: // whether trying to run qmldump makes sense bool tryQmlDump; QString qmlDumpPath; - Utils::Environment qmlDumpEnvironment; + ::Utils::Environment qmlDumpEnvironment; QString qtImportsPath; QString qtVersionString; diff --git a/src/libs/qmljs/qmljspropertyreader.cpp b/src/libs/qmljs/qmljspropertyreader.cpp index 3eb8302de8..ad1423645b 100644 --- a/src/libs/qmljs/qmljspropertyreader.cpp +++ b/src/libs/qmljs/qmljspropertyreader.cpp @@ -33,7 +33,7 @@ #include "qmljspropertyreader.h" #include "qmljsdocument.h" #include <qmljs/parser/qmljsast_p.h> -#include <qmljs/qmljscheck.h> +#include <qmljs/qmljsutils.h> #include <QtGui/QLinearGradient> @@ -126,22 +126,6 @@ static inline int propertyType(const QString &typeName) return -1; } -static inline QString flatten(UiQualifiedId *qualifiedId) -{ - QString result; - - for (UiQualifiedId *iter = qualifiedId; iter; iter = iter->next) { - if (iter->name.isEmpty()) - continue; - - if (!result.isEmpty()) - result.append(QLatin1Char('.')); - - result.append(iter->name); - } - return result; -} - static bool isEnum(AST::Statement *ast); bool isEnum(AST::ExpressionNode *ast) @@ -192,7 +176,7 @@ PropertyReader::PropertyReader(Document::Ptr doc, AST::UiObjectInitializer *ast) if (UiScriptBinding *property = AST::cast<UiScriptBinding *>(member)) { if (!property->qualifiedId) continue; // better safe than sorry. - const QString propertyName = flatten(property->qualifiedId); + const QString propertyName = toString(property->qualifiedId); const QString astValue = cleanupSemicolon(textAt(doc, property->statement->firstSourceLocation(), property->statement->lastSourceLocation())); @@ -208,7 +192,7 @@ PropertyReader::PropertyReader(Document::Ptr doc, AST::UiObjectInitializer *ast) for (UiObjectMemberList *iter = objectDefinition->initializer->members; iter; iter = iter->next) { UiObjectMember *objectMember = iter->member; if (UiScriptBinding *property = cast<UiScriptBinding *>(objectMember)) { - const QString propertyNamePart2 = flatten(property->qualifiedId); + const QString propertyNamePart2 = toString(property->qualifiedId); const QString astValue = cleanupSemicolon(textAt(doc, property->statement->firstSourceLocation(), property->statement->lastSourceLocation())); diff --git a/src/libs/qmljs/qmljsrewriter.cpp b/src/libs/qmljs/qmljsrewriter.cpp index c95a7e82a9..6dbf08e675 100644 --- a/src/libs/qmljs/qmljsrewriter.cpp +++ b/src/libs/qmljs/qmljsrewriter.cpp @@ -34,6 +34,7 @@ #include <qmljs/parser/qmljsast_p.h> #include <qmljs/parser/qmljsengine_p.h> +#include <qmljs/qmljsutils.h> #include <utils/changeset.h> // ### FIXME: remove these includes: @@ -160,11 +161,11 @@ UiObjectMemberList *Rewriter::searchMemberToInsertAfter(UiObjectMemberList *memb if (cast<UiObjectDefinition*>(member)) lastObjectDef = iter; else if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) - idx = propertyOrder.indexOf(flatten(arrayBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(arrayBinding->qualifiedId)); else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member)) - idx = propertyOrder.indexOf(flatten(objectBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(objectBinding->qualifiedId)); else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member)) - idx = propertyOrder.indexOf(flatten(scriptBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(scriptBinding->qualifiedId)); else if (cast<UiPublicMember*>(member)) idx = propertyOrder.indexOf(QLatin1String("property")); @@ -193,11 +194,11 @@ UiArrayMemberList *Rewriter::searchMemberToInsertAfter(UiArrayMemberList *member if (cast<UiObjectDefinition*>(member)) lastObjectDef = iter; else if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) - idx = propertyOrder.indexOf(flatten(arrayBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(arrayBinding->qualifiedId)); else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member)) - idx = propertyOrder.indexOf(flatten(objectBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(objectBinding->qualifiedId)); else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member)) - idx = propertyOrder.indexOf(flatten(scriptBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(scriptBinding->qualifiedId)); else if (cast<UiPublicMember*>(member)) idx = propertyOrder.indexOf(QLatin1String("property")); @@ -224,13 +225,13 @@ UiObjectMemberList *Rewriter::searchMemberToInsertAfter(UiObjectMemberList *memb UiObjectMember *member = iter->member; if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) - orderedMembers[flatten(arrayBinding->qualifiedId)] = iter; + orderedMembers[toString(arrayBinding->qualifiedId)] = iter; else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member)) - orderedMembers[flatten(objectBinding->qualifiedId)] = iter; + orderedMembers[toString(objectBinding->qualifiedId)] = iter; else if (cast<UiObjectDefinition*>(member)) orderedMembers[QString::null] = iter; else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member)) - orderedMembers[flatten(scriptBinding->qualifiedId)] = iter; + orderedMembers[toString(scriptBinding->qualifiedId)] = iter; else if (cast<UiPublicMember*>(member)) orderedMembers[QLatin1String("property")] = iter; } @@ -251,20 +252,6 @@ UiObjectMemberList *Rewriter::searchMemberToInsertAfter(UiObjectMemberList *memb return 0; } -QString Rewriter::flatten(UiQualifiedId *first) -{ - QString flatId; - - for (UiQualifiedId* current = first; current; current = current->next) { - if (current != first) - flatId += '.'; - - flatId += current->name; - } - - return flatId; -} - void Rewriter::changeBinding(UiObjectInitializer *ast, const QString &propertyName, const QString &newValue, @@ -304,7 +291,7 @@ void Rewriter::changeBinding(UiObjectInitializer *ast, // for grouped properties: else if (!prefix.isEmpty()) { if (UiObjectDefinition *def = cast<UiObjectDefinition *>(member)) { - if (flatten(def->qualifiedTypeNameId) == prefix) { + if (toString(def->qualifiedTypeNameId) == prefix) { changeBinding(def->initializer, suffix, newValue, binding); } } @@ -358,11 +345,11 @@ bool Rewriter::isMatchingPropertyMember(const QString &propertyName, if (UiPublicMember *publicMember = cast<UiPublicMember*>(member)) return publicMember->name == propertyName; else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member)) - return flatten(objectBinding->qualifiedId) == propertyName; + return toString(objectBinding->qualifiedId) == propertyName; else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member)) - return flatten(scriptBinding->qualifiedId) == propertyName; + return toString(scriptBinding->qualifiedId) == propertyName; else if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) - return flatten(arrayBinding->qualifiedId) == propertyName; + return toString(arrayBinding->qualifiedId) == propertyName; else return false; } @@ -410,7 +397,7 @@ void Rewriter::removeBindingByName(UiObjectInitializer *ast, const QString &prop // check for grouped properties: else if (!prefix.isEmpty()) { if (UiObjectDefinition *def = cast<UiObjectDefinition *>(member)) { - if (flatten(def->qualifiedTypeNameId) == prefix) { + if (toString(def->qualifiedTypeNameId) == prefix) { removeGroupedProperty(def, propertyName); } } @@ -558,11 +545,11 @@ UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(UiObjectMemberList *m if (cast<UiObjectDefinition*>(member)) lastObjectDef = iter; else if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) - idx = propertyOrder.indexOf(flatten(arrayBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(arrayBinding->qualifiedId)); else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member)) - idx = propertyOrder.indexOf(flatten(objectBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(objectBinding->qualifiedId)); else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member)) - idx = propertyOrder.indexOf(flatten(scriptBinding->qualifiedId)); + idx = propertyOrder.indexOf(toString(scriptBinding->qualifiedId)); else if (cast<UiPublicMember*>(member)) idx = propertyOrder.indexOf(QLatin1String("property")); @@ -587,13 +574,13 @@ UiObjectMemberList *QMLRewriter::searchMemberToInsertAfter(UiObjectMemberList *m UiObjectMember *member = iter->member; if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) - orderedMembers[flatten(arrayBinding->qualifiedId)] = iter; + orderedMembers[toString(arrayBinding->qualifiedId)] = iter; else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(member)) - orderedMembers[flatten(objectBinding->qualifiedId)] = iter; + orderedMembers[toString(objectBinding->qualifiedId)] = iter; else if (cast<UiObjectDefinition*>(member)) orderedMembers[QString::null] = iter; else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(member)) - orderedMembers[flatten(scriptBinding->qualifiedId)] = iter; + orderedMembers[toString(scriptBinding->qualifiedId)] = iter; else if (cast<UiPublicMember*>(member)) orderedMembers[QLatin1String("property")] = iter; } diff --git a/src/libs/qmljs/qmljsrewriter.h b/src/libs/qmljs/qmljsrewriter.h index 7063d46bfc..4a747c1767 100644 --- a/src/libs/qmljs/qmljsrewriter.h +++ b/src/libs/qmljs/qmljsrewriter.h @@ -88,7 +88,6 @@ public: static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QStringList &propertyOrder); static AST::UiArrayMemberList *searchMemberToInsertAfter(AST::UiArrayMemberList *members, const QStringList &propertyOrder); static AST::UiObjectMemberList *searchMemberToInsertAfter(AST::UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder); - static QString flatten(AST::UiQualifiedId *first); static bool includeSurroundingWhitespace(const QString &source, int &start, int &end); static void includeLeadingEmptyLine(const QString &source, int &start); diff --git a/src/libs/qmljs/qmljsscopebuilder.cpp b/src/libs/qmljs/qmljsscopebuilder.cpp index 92f90ab4a7..ed52edb6a8 100644 --- a/src/libs/qmljs/qmljsscopebuilder.cpp +++ b/src/libs/qmljs/qmljsscopebuilder.cpp @@ -36,6 +36,7 @@ #include "qmljscontext.h" #include "qmljsevaluate.h" #include "qmljsscopechain.h" +#include "qmljsutils.h" #include "parser/qmljsast_p.h" #include <utils/qtcassert.h> @@ -174,11 +175,7 @@ void ScopeBuilder::setQmlScopeObject(Node *node) prototype = isPropertyChangesObject(_scopeChain->context(), prototype); // find the target script binding if (prototype) { - UiObjectInitializer *initializer = 0; - if (UiObjectDefinition *definition = cast<UiObjectDefinition *>(node)) - initializer = definition->initializer; - if (UiObjectBinding *binding = cast<UiObjectBinding *>(node)) - initializer = binding->initializer; + UiObjectInitializer *initializer = initializerOfObject(node); if (initializer) { for (UiObjectMemberList *m = initializer->members; m; m = m->next) { if (UiScriptBinding *scriptBinding = cast<UiScriptBinding *>(m->member)) { diff --git a/src/libs/qmljs/qmljstypedescriptionreader.cpp b/src/libs/qmljs/qmljstypedescriptionreader.cpp index 318d98d758..0410fee311 100644 --- a/src/libs/qmljs/qmljstypedescriptionreader.cpp +++ b/src/libs/qmljs/qmljstypedescriptionreader.cpp @@ -40,6 +40,7 @@ #include "qmljsbind.h" #include "qmljsinterpreter.h" +#include "qmljsutils.h" #include <QtCore/QIODevice> #include <QtCore/QBuffer> @@ -104,7 +105,7 @@ void TypeDescriptionReader::readDocument(UiProgram *ast) } UiImport *import = ast->imports->import; - if (Bind::toString(import->importUri) != QLatin1String("QtQuick.tooling")) { + if (toString(import->importUri) != QLatin1String("QtQuick.tooling")) { addError(import->importToken, "Expected import of QtQuick.tooling"); return; } @@ -132,7 +133,7 @@ void TypeDescriptionReader::readDocument(UiProgram *ast) return; } - if (Bind::toString(module->qualifiedTypeNameId) != "Module") { + if (toString(module->qualifiedTypeNameId) != "Module") { addError(SourceLocation(), "Expected document to contain a Module {} member"); return; } @@ -145,7 +146,7 @@ void TypeDescriptionReader::readModule(UiObjectDefinition *ast) for (UiObjectMemberList *it = ast->initializer->members; it; it = it->next) { UiObjectMember *member = it->member; UiObjectDefinition *component = dynamic_cast<UiObjectDefinition *>(member); - if (!component || Bind::toString(component->qualifiedTypeNameId) != "Component") { + if (!component || toString(component->qualifiedTypeNameId) != "Component") { addWarning(member->firstSourceLocation(), "Expected only 'Component' object definitions"); continue; } @@ -179,7 +180,7 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast) UiObjectDefinition *component = dynamic_cast<UiObjectDefinition *>(member); UiScriptBinding *script = dynamic_cast<UiScriptBinding *>(member); if (component) { - QString name = Bind::toString(component->qualifiedTypeNameId); + QString name = toString(component->qualifiedTypeNameId); if (name == "Property") { readProperty(component, fmo); } else if (name == "Method" || name == "Signal") { @@ -190,7 +191,7 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast) addWarning(component->firstSourceLocation(), "Expected only Property, Method, Signal and Enum object definitions"); } } else if (script) { - QString name = Bind::toString(script->qualifiedId); + QString name = toString(script->qualifiedId); if (name == "name") { fmo->setClassName(readStringBinding(script)); } else if (name == "prototype") { @@ -237,14 +238,14 @@ void TypeDescriptionReader::readSignalOrMethod(UiObjectDefinition *ast, bool isM UiObjectDefinition *component = dynamic_cast<UiObjectDefinition *>(member); UiScriptBinding *script = dynamic_cast<UiScriptBinding *>(member); if (component) { - QString name = Bind::toString(component->qualifiedTypeNameId); + QString name = toString(component->qualifiedTypeNameId); if (name == "Parameter") { readParameter(component, &fmm); } else { addWarning(component->firstSourceLocation(), "Expected only Parameter object definitions"); } } else if (script) { - QString name = Bind::toString(script->qualifiedId); + QString name = toString(script->qualifiedId); if (name == "name") { fmm.setMethodName(readStringBinding(script)); } else if (name == "type") { @@ -285,7 +286,7 @@ void TypeDescriptionReader::readProperty(UiObjectDefinition *ast, FakeMetaObject continue; } - QString id = Bind::toString(script->qualifiedId); + QString id = toString(script->qualifiedId); if (id == "name") { name = readStringBinding(script); } else if (id == "type") { @@ -323,7 +324,7 @@ void TypeDescriptionReader::readEnum(UiObjectDefinition *ast, FakeMetaObject::Pt continue; } - QString name = Bind::toString(script->qualifiedId); + QString name = toString(script->qualifiedId); if (name == "name") { fme.setName(readStringBinding(script)); } else if (name == "values") { @@ -349,7 +350,7 @@ void TypeDescriptionReader::readParameter(UiObjectDefinition *ast, FakeMetaMetho continue; } - QString id = Bind::toString(script->qualifiedId); + QString id = toString(script->qualifiedId); if (id == "name") { id = readStringBinding(script); } else if (id == "type") { diff --git a/src/libs/qmljs/qmljsutils.cpp b/src/libs/qmljs/qmljsutils.cpp new file mode 100644 index 0000000000..fe5bd1967d --- /dev/null +++ b/src/libs/qmljs/qmljsutils.cpp @@ -0,0 +1,162 @@ +#include "qmljsutils.h" + +#include "parser/qmljsast_p.h" + +using namespace QmlJS; +using namespace QmlJS::AST; + +namespace { +class SharedData +{ +public: + SharedData() + { + validBuiltinPropertyNames.insert(QLatin1String("action")); + validBuiltinPropertyNames.insert(QLatin1String("bool")); + validBuiltinPropertyNames.insert(QLatin1String("color")); + validBuiltinPropertyNames.insert(QLatin1String("date")); + validBuiltinPropertyNames.insert(QLatin1String("double")); + validBuiltinPropertyNames.insert(QLatin1String("enumeration")); + validBuiltinPropertyNames.insert(QLatin1String("font")); + validBuiltinPropertyNames.insert(QLatin1String("int")); + validBuiltinPropertyNames.insert(QLatin1String("list")); + validBuiltinPropertyNames.insert(QLatin1String("point")); + validBuiltinPropertyNames.insert(QLatin1String("real")); + validBuiltinPropertyNames.insert(QLatin1String("rect")); + validBuiltinPropertyNames.insert(QLatin1String("size")); + validBuiltinPropertyNames.insert(QLatin1String("string")); + validBuiltinPropertyNames.insert(QLatin1String("time")); + validBuiltinPropertyNames.insert(QLatin1String("url")); + validBuiltinPropertyNames.insert(QLatin1String("var")); + validBuiltinPropertyNames.insert(QLatin1String("variant")); // obsolete in Qt 5 + validBuiltinPropertyNames.insert(QLatin1String("vector3d")); + validBuiltinPropertyNames.insert(QLatin1String("alias")); + } + + QSet<QString> validBuiltinPropertyNames; +}; +} // anonymous namespace +Q_GLOBAL_STATIC(SharedData, sharedData) + +QColor QmlJS::toQColor(const QString &qmlColorString) +{ + QColor color; + if (qmlColorString.size() == 9 && qmlColorString.at(0) == QLatin1Char('#')) { + bool ok; + const int alpha = qmlColorString.mid(1, 2).toInt(&ok, 16); + if (ok) { + QString name(qmlColorString.at(0)); + name.append(qmlColorString.right(6)); + if (QColor::isValidColor(name)) { + color.setNamedColor(name); + color.setAlpha(alpha); + } + } + } else { + if (QColor::isValidColor(qmlColorString)) + color.setNamedColor(qmlColorString); + } + return color; +} + +QString QmlJS::toString(UiQualifiedId *qualifiedId, QChar delimiter) +{ + QString result; + + for (UiQualifiedId *iter = qualifiedId; iter; iter = iter->next) { + if (iter != qualifiedId) + result += delimiter; + + result += iter->name; + } + + return result; +} + + +SourceLocation QmlJS::locationFromRange(const SourceLocation &start, + const SourceLocation &end) +{ + return SourceLocation(start.offset, + end.end() - start.begin(), + start.startLine, + start.startColumn); +} + +SourceLocation QmlJS::fullLocationForQualifiedId(AST::UiQualifiedId *qualifiedId) +{ + SourceLocation start = qualifiedId->identifierToken; + SourceLocation end = qualifiedId->identifierToken; + + for (UiQualifiedId *iter = qualifiedId; iter; iter = iter->next) { + if (iter->identifierToken.isValid()) + end = iter->identifierToken; + } + + return locationFromRange(start, end); +} + +QString QmlJS::idOfObject(UiObjectDefinition *object) +{ + if (!object) + return QString(); + return idOfObject(object->initializer); +} +QString QmlJS::idOfObject(UiObjectBinding *object) +{ + if (!object) + return QString(); + return idOfObject(object->initializer); +} +QString QmlJS::idOfObject(UiObjectInitializer *initializer) +{ + if (!initializer) + return QString(); + + for (UiObjectMemberList *iter = initializer->members; iter; iter = iter->next) { + if (UiScriptBinding *script = cast<UiScriptBinding*>(iter->member)) { + if (!script->qualifiedId) + continue; + if (script->qualifiedId->next) + continue; + if (script->qualifiedId->name != QLatin1String("id")) + continue; + if (ExpressionStatement *expstmt = cast<ExpressionStatement *>(script->statement)) { + if (IdentifierExpression *idexp = cast<IdentifierExpression *>(expstmt->expression)) { + return idexp->name.toString(); + } + } + } + } + + return QString(); +} + +UiObjectInitializer *QmlJS::initializerOfObject(Node *node) +{ + if (UiObjectDefinition *definition = cast<UiObjectDefinition *>(node)) + return definition->initializer; + if (UiObjectBinding *binding = cast<UiObjectBinding *>(node)) + return binding->initializer; + return 0; +} + +UiQualifiedId *QmlJS::qualifiedTypeNameId(Node *node) +{ + if (UiObjectBinding *binding = AST::cast<UiObjectBinding *>(node)) + return binding->qualifiedTypeNameId; + else if (UiObjectDefinition *binding = AST::cast<UiObjectDefinition *>(node)) + return binding->qualifiedTypeNameId; + return 0; +} + +DiagnosticMessage QmlJS::errorMessage(const AST::SourceLocation &loc, const QString &message) +{ + return DiagnosticMessage(DiagnosticMessage::Error, loc, message); +} + +bool QmlJS::isValidBuiltinPropertyType(const QString &name) +{ + return sharedData()->validBuiltinPropertyNames.contains(name); +} + diff --git a/src/libs/qmljs/qmljsutils.h b/src/libs/qmljs/qmljsutils.h new file mode 100644 index 0000000000..776b9a45e6 --- /dev/null +++ b/src/libs/qmljs/qmljsutils.h @@ -0,0 +1,44 @@ +#ifndef QMLJS_QMLJSUTILS_H +#define QMLJS_QMLJSUTILS_H + +#include "qmljs_global.h" +#include "parser/qmljsastfwd_p.h" +#include "parser/qmljsengine_p.h" + +#include <QtGui/QColor> + +namespace QmlJS { + +QMLJS_EXPORT QColor toQColor(const QString &qmlColorString); +QMLJS_EXPORT QString toString(AST::UiQualifiedId *qualifiedId, + const QChar delimiter = QLatin1Char('.')); + +QMLJS_EXPORT AST::SourceLocation locationFromRange(const AST::SourceLocation &start, + const AST::SourceLocation &end); + +QMLJS_EXPORT AST::SourceLocation fullLocationForQualifiedId(AST::UiQualifiedId *); + +QMLJS_EXPORT QString idOfObject(AST::UiObjectDefinition *object); +QMLJS_EXPORT QString idOfObject(AST::UiObjectBinding *object); +QMLJS_EXPORT QString idOfObject(AST::UiObjectInitializer *initializer); + +QMLJS_EXPORT AST::UiObjectInitializer *initializerOfObject(AST::Node *node); +QMLJS_EXPORT AST::UiQualifiedId *qualifiedTypeNameId(AST::Node *node); + +QMLJS_EXPORT bool isValidBuiltinPropertyType(const QString &name); + +QMLJS_EXPORT DiagnosticMessage errorMessage(const AST::SourceLocation &loc, + const QString &message); + +template <class T> +DiagnosticMessage errorMessage(const T *node, const QString &message) +{ + return DiagnosticMessage(DiagnosticMessage::Error, + locationFromRange(node->firstSourceLocation(), + node->lastSourceLocation()), + message); +} + +} // namespace QmlJS + +#endif // QMLJS_QMLJSUTILS_H |