OSDN Git Service

QmlJS: Move commonly used functions to qmlutils.h.
authorChristian Kamm <christian.d.kamm@nokia.com>
Fri, 7 Oct 2011 12:04:06 +0000 (14:04 +0200)
committerChristian Kamm <christian.d.kamm@nokia.com>
Mon, 10 Oct 2011 07:36:12 +0000 (09:36 +0200)
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>
30 files changed:
src/libs/qmleditorwidgets/contextpanewidgetrectangle.cpp
src/libs/qmljs/qmljs-lib.pri
src/libs/qmljs/qmljsbind.cpp
src/libs/qmljs/qmljsbind.h
src/libs/qmljs/qmljscheck.cpp
src/libs/qmljs/qmljscheck.h
src/libs/qmljs/qmljsdelta.cpp
src/libs/qmljs/qmljslink.cpp
src/libs/qmljs/qmljsmodelmanagerinterface.h
src/libs/qmljs/qmljspropertyreader.cpp
src/libs/qmljs/qmljsrewriter.cpp
src/libs/qmljs/qmljsrewriter.h
src/libs/qmljs/qmljsscopebuilder.cpp
src/libs/qmljs/qmljstypedescriptionreader.cpp
src/libs/qmljs/qmljsutils.cpp [new file with mode: 0644]
src/libs/qmljs/qmljsutils.h [new file with mode: 0644]
src/plugins/qmldesigner/designercore/filemanager/addarraymembervisitor.cpp
src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp
src/plugins/qmldesigner/designercore/filemanager/changepropertyvisitor.cpp
src/plugins/qmldesigner/designercore/filemanager/moveobjectvisitor.cpp
src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.cpp
src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h
src/plugins/qmldesigner/designercore/filemanager/removepropertyvisitor.cpp
src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp
src/plugins/qmljseditor/qmljseditor.cpp
src/plugins/qmljseditor/qmljshoverhandler.cpp
src/plugins/qmljseditor/qmljssemantichighlighter.cpp
src/plugins/qmljseditor/quicktoolbar.cpp
src/plugins/qmljstools/qmljslocatordata.cpp

index df55ab6..0892770 100644 (file)
@@ -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>
 
index 62a06ec..883ebd3 100644 (file)
@@ -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
index 1f4915f..99431b5 100644 (file)
@@ -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;
index 600b33f..73cad7f 100644 (file)
@@ -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;
 
index d005978..528c49a 100644 (file)
@@ -34,6 +34,7 @@
 #include "qmljsbind.h"
 #include "qmljscontext.h"
 #include "qmljsevaluate.h"
+#include "qmljsutils.h"
 #include "parser/qmljsast_p.h"
 
 #include <QtCore/QDebug>
 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(
index 031dceb..11ac979 100644 (file)
@@ -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
index 076d8ab..76667ac 100644 (file)
@@ -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;
 }
index 1ff7504..147b264 100644 (file)
@@ -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));
index 316c6d5..c5bb8d2 100644 (file)
@@ -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;
index 3eb8302..ad14236 100644 (file)
@@ -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()));
index c95a7e8..6dbf08e 100644 (file)
@@ -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;
     }
index 7063d46..4a747c1 100644 (file)
@@ -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);
index 92f90ab..ed52edb 100644 (file)
@@ -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)) {
index 318d98d..0410fee 100644 (file)
@@ -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 (file)
index 0000000..fe5bd19
--- /dev/null
@@ -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 (file)
index 0000000..776b9a4
--- /dev/null
@@ -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
index f8a9c2c..d9e8eff 100644 (file)
@@ -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);
         }
     }
index b3bf518..196f30f 100644 (file)
@@ -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 {
index 85bfb73..0ad66a3 100644 (file)
@@ -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 {
index a04830c..99ba1a0 100644 (file)
@@ -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);
index ca169c6..af49990 100644 (file)
@@ -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;
     }
index 78bc09e..f2f537a 100644 (file)
@@ -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; }
index e21664a..a753a3b 100644 (file)
@@ -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;
 }
index 58ceb3e..30da2a8 100644 (file)
@@ -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();
     }
 
index 73b0263..95f6eeb 100644 (file)
@@ -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",
index 0205fae..20249d7 100644 (file)
@@ -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);
index 0edf047..bc00575 100644 (file)
@@ -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>
index 229ecc0..b900240 100644 (file)
@@ -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>
index 87b19b0..c83610d 100644 (file)
@@ -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)) {
index 1c741b5..672a3e3 100644 (file)
 #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));