diff options
30 files changed, 308 insertions, 396 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 diff --git a/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp index f8a9c2c6a0..d9e8eff439 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp @@ -56,10 +56,10 @@ void AddArrayMemberVisitor::findArrayBindingAndInsert(const QString &m_propertyN { for (UiObjectMemberList *iter = ast; iter; iter = iter->next) { if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(iter->member)) { - if (flatten(arrayBinding->qualifiedId) == m_propertyName) + if (toString(arrayBinding->qualifiedId) == m_propertyName) insertInto(arrayBinding); } else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(iter->member)) { - if (flatten(objectBinding->qualifiedId) == m_propertyName && willConvertObjectBindingIntoArrayBinding()) + if (toString(objectBinding->qualifiedId) == m_propertyName && willConvertObjectBindingIntoArrayBinding()) convertAndAdd(objectBinding); } } diff --git a/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp index b3bf51829f..196f30fe10 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp @@ -97,7 +97,7 @@ bool ChangeImportsVisitor::remove(QmlJS::AST::UiProgram *ast, const Import &impo bool ChangeImportsVisitor::equals(QmlJS::AST::UiImport *ast, const Import &import) { if (import.isLibraryImport()) { - return flatten(ast->importUri) == import.url(); + return toString(ast->importUri) == import.url(); } else if (import.isFileImport()) { return ast->fileName == import.file(); } else { diff --git a/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp index 85bfb739bd..0ad66a3f4b 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp @@ -123,7 +123,7 @@ void ChangePropertyVisitor::replaceInMembers(UiObjectInitializer *initializer, // for grouped properties: else if (!prefix.isEmpty()) { if (UiObjectDefinition *def = cast<UiObjectDefinition *>(member)) { - if (flatten(def->qualifiedTypeNameId) == prefix) { + if (toString(def->qualifiedTypeNameId) == prefix) { replaceInMembers(def->initializer, suffix); } } @@ -176,11 +176,11 @@ bool ChangePropertyVisitor::isMatchingPropertyMember(const QString &propName, UiObjectMember *member) { if (UiObjectBinding *objectBinding = AST::cast<UiObjectBinding *>(member)) { - return propName == flatten(objectBinding->qualifiedId); + return propName == toString(objectBinding->qualifiedId); } else if (UiScriptBinding *scriptBinding = AST::cast<UiScriptBinding *>(member)) { - return propName == flatten(scriptBinding->qualifiedId); + return propName == toString(scriptBinding->qualifiedId); } else if (UiArrayBinding *arrayBinding = AST::cast<UiArrayBinding *>(member)) { - return propName == flatten(arrayBinding->qualifiedId); + return propName == toString(arrayBinding->qualifiedId); } else if (UiPublicMember *publicMember = AST::cast<UiPublicMember *>(member)) { return propName == publicMember->name; } else { diff --git a/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp index a04830ccd6..99ba1a0325 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp @@ -111,7 +111,7 @@ private: UiObjectMember *member = iter->member; if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(member)) { - if (flatten(arrayBinding->qualifiedId) == targetPropertyName) { + if (toString(arrayBinding->qualifiedId) == targetPropertyName) { appendToArray(arrayBinding); setDidRewriting(true); diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp index ca169c67dd..af49990d30 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp @@ -199,21 +199,6 @@ bool QMLRewriter::isMissingSemicolon(QmlJS::AST::Statement *stmt) } // FIXME: duplicate code in the QmlJS::Rewriter class, remove this -QString QMLRewriter::flatten(UiQualifiedId *first) -{ - QString flatId; - - for (UiQualifiedId* current = first; current; current = current->next) { - if (current != first) - flatId += '.'; - - flatId += current->name; - } - - return flatId; -} - -// FIXME: duplicate code in the QmlJS::Rewriter class, remove this bool QMLRewriter::includeSurroundingWhitespace(int &start, int &end) const { QTextDocument *doc = m_textModifier->textDocument(); @@ -294,11 +279,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")); @@ -324,13 +309,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/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h index 78bc09e9cc..f2f537a453 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h @@ -36,6 +36,7 @@ #include "textmodifier.h" #include <qmljs/parser/qmljsastvisitor_p.h> +#include <qmljs/qmljsutils.h> #include <QtCore/QStack> #include <QtCore/QString> @@ -74,7 +75,6 @@ protected: static QmlJS::AST::SourceLocation calculateLocation(QmlJS::AST::UiQualifiedId *id); static bool isMissingSemicolon(QmlJS::AST::UiObjectMember *member); static bool isMissingSemicolon(QmlJS::AST::Statement *stmt); - static QString flatten(QmlJS::AST::UiQualifiedId *first); QmlDesigner::TextModifier *textModifier() const { return m_textModifier; } diff --git a/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp index e21664a566..a753a3bbdd 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp @@ -93,7 +93,7 @@ void RemovePropertyVisitor::removeFrom(QmlJS::AST::UiObjectInitializer *ast) // 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); } } @@ -147,11 +147,11 @@ bool RemovePropertyVisitor::memberNameMatchesPropertyName(const QString &propert if (UiPublicMember *publicMember = cast<UiPublicMember*>(ast)) return publicMember->name == propertyName; else if (UiObjectBinding *objectBinding = cast<UiObjectBinding*>(ast)) - return flatten(objectBinding->qualifiedId) == propertyName; + return toString(objectBinding->qualifiedId) == propertyName; else if (UiScriptBinding *scriptBinding = cast<UiScriptBinding*>(ast)) - return flatten(scriptBinding->qualifiedId) == propertyName; + return toString(scriptBinding->qualifiedId) == propertyName; else if (UiArrayBinding *arrayBinding = cast<UiArrayBinding*>(ast)) - return flatten(arrayBinding->qualifiedId) == propertyName; + return toString(arrayBinding->qualifiedId) == propertyName; else return false; } diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 58ceb3e2da..30da2a8e80 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -53,6 +53,7 @@ #include <qmljs/qmljsscopechain.h> #include <qmljs/parser/qmljsast_p.h> #include <qmljs/qmljscheck.h> +#include <qmljs/qmljsutils.h> #include <qmljs/qmljsmodelmanagerinterface.h> #include <QtCore/QSet> @@ -171,23 +172,6 @@ static inline QVariant cleverConvert(const QString &value) return QVariant(value); } -static 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 isLiteralValue(ExpressionNode *expr) { if (cast<NumericLiteral*>(expr)) @@ -532,7 +516,7 @@ public: const ObjectValue *containingObject = 0; QString name; if (!lookupProperty(propertyPrefix, propertyId, &property, &containingObject, &name)) { - qWarning() << "Unknown property" << propertyPrefix + QLatin1Char('.') + flatten(propertyId) + qWarning() << "Unknown property" << propertyPrefix + QLatin1Char('.') + toString(propertyId) << "on line" << propertyId->identifierToken.startLine << "column" << propertyId->identifierToken.startColumn; return hasQuotes ? QVariant(cleanedValue) : cleverConvert(cleanedValue); @@ -718,7 +702,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, if (!existingImports.removeOne(newImport)) differenceHandler.modelMissesImport(newImport); } else { - QString importUri = flatten(import->importUri); + QString importUri = toString(import->importUri); if (importUri == QLatin1String("Qt") && version == QLatin1String("4.7")) { importUri = QLatin1String("QtQuick"); version = QLatin1String("1.0"); @@ -824,15 +808,8 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, ReadingContext *context, DifferenceHandler &differenceHandler) { - UiQualifiedId *astObjectType = 0; - UiObjectInitializer *astInitializer = 0; - if (UiObjectDefinition *def = cast<UiObjectDefinition *>(astNode)) { - astObjectType = def->qualifiedTypeNameId; - astInitializer = def->initializer; - } else if (UiObjectBinding *bin = cast<UiObjectBinding *>(astNode)) { - astObjectType = bin->qualifiedTypeNameId; - astInitializer = bin->initializer; - } + UiQualifiedId *astObjectType = qualifiedTypeNameId(astNode); + UiObjectInitializer *astInitializer = initializerOfObject(astNode); if (!astObjectType || !astInitializer) return; @@ -847,7 +824,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, defaultPropertyName = modelNode.metaInfo().defaultPropertyName(); if (typeName.isEmpty()) { - qWarning() << "Skipping node with unknown type" << flatten(astObjectType); + qWarning() << "Skipping node with unknown type" << toString(astObjectType); return; } @@ -893,7 +870,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, continue; if (UiArrayBinding *array = cast<UiArrayBinding *>(member)) { - const QString astPropertyName = flatten(array->qualifiedId); + const QString astPropertyName = toString(array->qualifiedId); if (isPropertyChangesType(typeName) || context->lookupProperty(QString(), array->qualifiedId)) { AbstractProperty modelProperty = modelNode.property(astPropertyName); QList<UiObjectMember *> arrayMembers; @@ -921,7 +898,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, defaultPropertyItems.append(member); } } else if (UiObjectBinding *binding = cast<UiObjectBinding *>(member)) { - const QString astPropertyName = flatten(binding->qualifiedId); + const QString astPropertyName = toString(binding->qualifiedId); if (binding->hasOnToken) { // skip value sources } else { @@ -1009,7 +986,7 @@ QString TextToModelMerger::syncScriptBinding(ModelNode &modelNode, ReadingContext *context, DifferenceHandler &differenceHandler) { - QString astPropertyName = flatten(script->qualifiedId); + QString astPropertyName = toString(script->qualifiedId); if (!prefix.isEmpty()) astPropertyName.prepend(prefix + QLatin1Char('.')); @@ -1101,7 +1078,7 @@ void TextToModelMerger::syncNodeProperty(AbstractProperty &modelProperty, context->lookup(binding->qualifiedTypeNameId, typeName, majorVersion, minorVersion, dummy); if (typeName.isEmpty()) { - qWarning() << "Skipping node with unknown type" << flatten(binding->qualifiedTypeNameId); + qWarning() << "Skipping node with unknown type" << toString(binding->qualifiedTypeNameId); return; } @@ -1206,12 +1183,7 @@ ModelNode TextToModelMerger::createModelNode(const QString &typeName, { QString nodeSource; - UiQualifiedId *astObjectType = 0; - if (UiObjectDefinition *def = cast<UiObjectDefinition *>(astNode)) { - astObjectType = def->qualifiedTypeNameId; - } else if (UiObjectBinding *bin = cast<UiObjectBinding *>(astNode)) { - astObjectType = bin->qualifiedTypeNameId; - } + UiQualifiedId *astObjectType = qualifiedTypeNameId(astNode); if (isCustomParserType(typeName)) nodeSource = textAt(context->doc(), @@ -1525,7 +1497,7 @@ ModelNode ModelAmender::listPropertyMissingModelNode(NodeListProperty &modelProp context->lookup(astObjectType, typeName, majorVersion, minorVersion, dummy); if (typeName.isEmpty()) { - qWarning() << "Skipping node with unknown type" << flatten(astObjectType); + qWarning() << "Skipping node with unknown type" << toString(astObjectType); return ModelNode(); } diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index 73b0263f77..95f6eeb331 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -38,6 +38,7 @@ #include <qmljs/parser/qmljsast_p.h> #include <qmljs/qmljsdocument.h> +#include <qmljs/qmljsutils.h> #include <qmljstools/qmljsrefactoringchanges.h> #include <QtCore/QCoreApplication> @@ -51,43 +52,6 @@ using namespace QmlJSTools; namespace { -static QString toString(Statement *statement) -{ - ExpressionStatement *expStmt = cast<ExpressionStatement *>(statement); - if (!expStmt) - return QString(); - if (IdentifierExpression *idExp = cast<IdentifierExpression *>(expStmt->expression)) { - return idExp->name.toString(); - } else if (StringLiteral *strExp = cast<StringLiteral *>(expStmt->expression)) { - return strExp->value.toString(); - } - return QString(); -} - -static QString getIdProperty(UiObjectDefinition *def) -{ - QString objectName; - - if (def && def->initializer) { - for (UiObjectMemberList *iter = def->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.isEmpty()) { - if (script->qualifiedId->name == QLatin1String("id")) - return toString(script->statement); - if (script->qualifiedId->name == QLatin1String("objectName")) - objectName = toString(script->statement); - } - } - } - } - - return objectName; -} - class Operation: public QmlJSQuickFixOperation { UiObjectDefinition *m_objDef; @@ -101,7 +65,7 @@ public: { Q_ASSERT(m_objDef != 0); - m_idName = getIdProperty(m_objDef); + m_idName = idOfObject(m_objDef); if (m_idName.isEmpty()) { setDescription(QCoreApplication::translate("QmlJSEditor::ComponentFromObjectDef", diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 0205faeb42..20249d7ebf 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -49,6 +49,7 @@ #include <qmljs/qmljsicontextpane.h> #include <qmljs/qmljsmodelmanagerinterface.h> #include <qmljs/qmljsscopebuilder.h> +#include <qmljs/qmljsutils.h> #include <qmljs/parser/qmljsastvisitor_p.h> #include <qmljs/parser/qmljsast_p.h> #include <qmljs/parser/qmljsengine_p.h> @@ -944,15 +945,6 @@ void QmlJSTextEditorWidget::updateOutlineIndexNow() } } -static UiQualifiedId *qualifiedTypeNameId(Node *m) -{ - if (UiObjectDefinition *def = cast<UiObjectDefinition *>(m)) - return def->qualifiedTypeNameId; - else if (UiObjectBinding *binding = cast<UiObjectBinding *>(m)) - return binding->qualifiedTypeNameId; - return 0; -} - class QtQuickToolbarMarker {}; Q_DECLARE_METATYPE(QtQuickToolbarMarker) @@ -1078,12 +1070,7 @@ protected: bool isSelectable(UiObjectMember *member) const { - UiQualifiedId *id = 0; - if (UiObjectDefinition *def = cast<UiObjectDefinition *>(member)) - id = def->qualifiedTypeNameId; - else if (UiObjectBinding *binding = cast<UiObjectBinding *>(member)) - id = binding->qualifiedTypeNameId; - + UiQualifiedId *id = qualifiedTypeNameId(member); if (id) { const QStringRef &name = id->name; if (!name.isEmpty() && name.at(0).isUpper()) { @@ -1094,15 +1081,6 @@ protected: return false; } - inline UiObjectInitializer *initializer(UiObjectMember *member) const - { - if (UiObjectDefinition *def = cast<UiObjectDefinition *>(member)) - return def->initializer; - else if (UiObjectBinding *binding = cast<UiObjectBinding *>(member)) - return binding->initializer; - return 0; - } - inline bool isIdBinding(UiObjectMember *member) const { if (UiScriptBinding *script = cast<UiScriptBinding *>(member)) { @@ -1149,7 +1127,7 @@ protected: if ((isRangeSelected() && intersectsCursor(begin, end)) || (!isRangeSelected() && containsCursor(begin, end))) { - if (initializer(member) && isSelectable(member)) { + if (initializerOfObject(member) && isSelectable(member)) { m_selectedMembers << member; // move start towards end; this facilitates multiselection so that root is usually ignored. m_cursorPositionStart = qMin(end, m_cursorPositionEnd); diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp index 0edf04767e..bc005757dd 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.cpp +++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp @@ -45,7 +45,7 @@ #include <qmljs/qmljsinterpreter.h> #include <qmljs/parser/qmljsast_p.h> #include <qmljs/parser/qmljsastfwd_p.h> -#include <qmljs/qmljscheck.h> +#include <qmljs/qmljsutils.h> #include <texteditor/itexteditor.h> #include <texteditor/basetexteditor.h> #include <texteditor/helpitem.h> diff --git a/src/plugins/qmljseditor/qmljssemantichighlighter.cpp b/src/plugins/qmljseditor/qmljssemantichighlighter.cpp index 229ecc0eb2..b9002403f4 100644 --- a/src/plugins/qmljseditor/qmljssemantichighlighter.cpp +++ b/src/plugins/qmljseditor/qmljssemantichighlighter.cpp @@ -40,7 +40,7 @@ #include <qmljs/qmljsevaluate.h> #include <qmljs/qmljscontext.h> #include <qmljs/qmljsbind.h> -#include <qmljs/qmljscheck.h> +#include <qmljs/qmljsutils.h> #include <qmljs/parser/qmljsast_p.h> #include <qmljs/parser/qmljsastvisitor_p.h> #include <texteditor/syntaxhighlighter.h> diff --git a/src/plugins/qmljseditor/quicktoolbar.cpp b/src/plugins/qmljseditor/quicktoolbar.cpp index 87b19b013e..c83610d2cc 100644 --- a/src/plugins/qmljseditor/quicktoolbar.cpp +++ b/src/plugins/qmljseditor/quicktoolbar.cpp @@ -44,6 +44,7 @@ #include <qmljs/qmljsbind.h> #include <qmljs/qmljsscopebuilder.h> #include <qmljs/qmljsevaluate.h> +#include <qmljs/qmljsutils.h> #include <texteditor/basetexteditor.h> #include <texteditor/tabsettings.h> #include <coreplugin/icore.h> @@ -66,11 +67,7 @@ static inline QString textAt(const Document* doc, static inline const ObjectValue * getPropertyChangesTarget(Node *node, const ScopeChain &scopeChain) { - 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 *members = initializer->members; members; members = members->next) { if (UiScriptBinding *scriptBinding = cast<UiScriptBinding *>(members->member)) { diff --git a/src/plugins/qmljstools/qmljslocatordata.cpp b/src/plugins/qmljstools/qmljslocatordata.cpp index 1c741b59a2..672a3e360c 100644 --- a/src/plugins/qmljstools/qmljslocatordata.cpp +++ b/src/plugins/qmljstools/qmljslocatordata.cpp @@ -33,10 +33,12 @@ #include "qmljslocatordata.h" #include <qmljs/qmljsmodelmanagerinterface.h> -#include <qmljs/qmljsbind.h> +#include <qmljs/qmljsutils.h> //#include <qmljs/qmljsinterpreter.h> #include <qmljs/parser/qmljsast_p.h> +#include <QtCore/QFileInfo> + using namespace QmlJSTools::Internal; using namespace QmlJS; using namespace QmlJS::AST; @@ -56,26 +58,6 @@ LocatorData::~LocatorData() {} namespace { -static QString findId(UiObjectInitializer *initializer) -{ - if (!initializer) - return QString(); - for (UiObjectMemberList *member = initializer->members; member; member = member->next) { - if (UiScriptBinding *script = cast<UiScriptBinding *>(member->member)) { - if (!script->qualifiedId || script->qualifiedId->name.isEmpty() || script->qualifiedId->next) - continue; - if (script->qualifiedId->name != QLatin1String("id")) - continue; - if (ExpressionStatement *expStmt = cast<ExpressionStatement *>(script->statement)) { - if (IdentifierExpression *identExp = cast<IdentifierExpression *>(expStmt->expression)) { - if (!identExp->name.isEmpty()) - return identExp->name.toString(); - } - } - } - } - return QString(); -} class FunctionFinder : protected AST::Visitor { @@ -159,7 +141,7 @@ protected: { if (!ast->qualifiedId) return true; - const QString qualifiedIdString = Bind::toString(ast->qualifiedId); + const QString qualifiedIdString = toString(ast->qualifiedId); if (cast<Block *>(ast->statement)) { LocatorData::Entry entry = basicEntry(ast->qualifiedId->identifierToken); @@ -168,7 +150,7 @@ protected: m_entries += entry; } - accept(ast->statement, contextString(Bind::toString(ast->qualifiedId))); + accept(ast->statement, contextString(toString(ast->qualifiedId))); return false; } @@ -177,8 +159,8 @@ protected: if (!ast->qualifiedTypeNameId) return true; - QString context = Bind::toString(ast->qualifiedTypeNameId); - const QString id = findId(ast->initializer); + QString context = toString(ast->qualifiedTypeNameId); + const QString id = idOfObject(ast->initializer); if (!id.isEmpty()) context = QString("%1 (%2)").arg(id, context); accept(ast->initializer, contextString(context)); @@ -190,8 +172,8 @@ protected: if (!ast->qualifiedTypeNameId) return true; - QString context = Bind::toString(ast->qualifiedTypeNameId); - const QString id = findId(ast->initializer); + QString context = toString(ast->qualifiedTypeNameId); + const QString id = idOfObject(ast->initializer); if (!id.isEmpty()) context = QString("%1 (%2)").arg(id, context); accept(ast->initializer, contextString(context)); |