From a30c016189865656947107f6cc4d9a69c2568a95 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Thu, 14 Oct 2010 15:14:35 +0200
Subject: [PATCH] QmlJS: Fix several crashes when UiQualifiedId::name is 0.

Task-number: QTCREATORBUG-2737
Reviewed-by: Kai Koehne
---
 src/libs/qmljs/qmljsbind.cpp                    | 2 +-
 src/libs/qmljs/qmljsrewriter.cpp                | 3 ++-
 src/libs/qmljs/qmljsscopebuilder.cpp            | 4 +++-
 src/plugins/qmljseditor/qmljsfindreferences.cpp | 2 +-
 4 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/libs/qmljs/qmljsbind.cpp b/src/libs/qmljs/qmljsbind.cpp
index 1cdf8e2b5e0..bc56065463b 100644
--- a/src/libs/qmljs/qmljsbind.cpp
+++ b/src/libs/qmljs/qmljsbind.cpp
@@ -241,7 +241,7 @@ bool Bind::visit(UiObjectDefinition *ast)
     // think anchors { ... }
     bool isGroupedBinding = false;
     for (UiQualifiedId *it = ast->qualifiedTypeNameId; it; it = it->next) {
-        if (!it->next)
+        if (!it->next && it->name)
             isGroupedBinding = it->name->asString().at(0).isLower();
     }
 
diff --git a/src/libs/qmljs/qmljsrewriter.cpp b/src/libs/qmljs/qmljsrewriter.cpp
index 17293b34f6e..aad4b650abf 100644
--- a/src/libs/qmljs/qmljsrewriter.cpp
+++ b/src/libs/qmljs/qmljsrewriter.cpp
@@ -256,7 +256,8 @@ QString Rewriter::flatten(UiQualifiedId *first)
         if (current != first)
             flatId += '.';
 
-        flatId += current->name->asString();
+        if (current->name)
+            flatId += current->name->asString();
     }
 
     return flatId;
diff --git a/src/libs/qmljs/qmljsscopebuilder.cpp b/src/libs/qmljs/qmljsscopebuilder.cpp
index 2fbdc0403c6..e1b42833300 100644
--- a/src/libs/qmljs/qmljsscopebuilder.cpp
+++ b/src/libs/qmljs/qmljsscopebuilder.cpp
@@ -228,7 +228,7 @@ void ScopeBuilder::setQmlScopeObject(Node *node)
         if (initializer) {
             for (UiObjectMemberList *m = initializer->members; m; m = m->next) {
                 if (UiScriptBinding *scriptBinding = cast<UiScriptBinding *>(m->member)) {
-                    if (scriptBinding->qualifiedId
+                    if (scriptBinding->qualifiedId && scriptBinding->qualifiedId->name
                             && scriptBinding->qualifiedId->name->asString() == QLatin1String("target")
                             && ! scriptBinding->qualifiedId->next) {
                         // ### make Evaluate understand statements.
@@ -256,6 +256,8 @@ const Value *ScopeBuilder::scopeObjectLookup(AST::UiQualifiedId *id)
     foreach (const ObjectValue *scopeObject, _context->scopeChain().qmlScopeObjects) {
         const ObjectValue *object = scopeObject;
         for (UiQualifiedId *it = id; it; it = it->next) {
+            if (!it->name)
+                return 0;
             result = object->property(it->name->asString(), _context);
             if (!result)
                 break;
diff --git a/src/plugins/qmljseditor/qmljsfindreferences.cpp b/src/plugins/qmljseditor/qmljsfindreferences.cpp
index d3f9de96a00..ff7f106c7b0 100644
--- a/src/plugins/qmljseditor/qmljsfindreferences.cpp
+++ b/src/plugins/qmljseditor/qmljsfindreferences.cpp
@@ -468,7 +468,7 @@ private:
 
     bool checkBindingName(UiQualifiedId *id)
     {
-        if (id && !id->next && containsOffset(id->identifierToken)) {
+        if (id && id->name && !id->next && containsOffset(id->identifierToken)) {
             _result.second = id->name->asString();
             return true;
         }
-- 
GitLab