From 0b9b704584e68bb69df788649cef07d236f2838c Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Thu, 28 Apr 2011 14:02:54 +0200
Subject: [PATCH] QmlDesigner.rewriter: crash fix

When pasting or reading in a Component that has no object definition
inside we crashed.

I added an explicit check in the FirstDefinitionFinder.
In the TextToModelMerger we then handle this case.

Task-Nr: QTCREATORBUG-4730
Reviewed-by: Erik Verbruggen
---
 .../designercore/filemanager/firstdefinitionfinder.cpp       | 5 ++++-
 .../designercore/filemanager/firstdefinitionfinder.h         | 2 +-
 .../qmldesigner/designercore/model/texttomodelmerger.cpp     | 4 ++++
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp
index 2e5d887254c..1edac108ad2 100644
--- a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp
+++ b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.cpp
@@ -54,13 +54,16 @@ FirstDefinitionFinder::FirstDefinitionFinder(const QString &text):
   \arg the offset of the object to search in
   \return the offset of the first object definition
   */
-quint32 FirstDefinitionFinder::operator()(quint32 offset)
+qint32 FirstDefinitionFinder::operator()(quint32 offset)
 {
     m_offset = offset;
     m_firstObjectDefinition = 0;
 
     Node::accept(m_doc->qmlProgram(), this);
 
+    if (!m_firstObjectDefinition)
+        return -1;
+
     return m_firstObjectDefinition->firstSourceLocation().offset;
 }
 
diff --git a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h
index 867ed1006ba..aaf00c754ce 100644
--- a/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h
+++ b/src/plugins/qmldesigner/designercore/filemanager/firstdefinitionfinder.h
@@ -43,7 +43,7 @@ class FirstDefinitionFinder: protected QmlJS::AST::Visitor
 public:
     FirstDefinitionFinder(const QString &text);
 
-    quint32 operator()(quint32 offset);
+    qint32 operator()(quint32 offset);
 
 protected:
     using QmlJS::AST::Visitor::visit;
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
index 6e3f387da5d..b6b4e3b64ff 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
@@ -1397,6 +1397,10 @@ void TextToModelMerger::setupComponent(const ModelNode &node)
     if (componentText.contains("Component")) { //explicit component
         FirstDefinitionFinder firstDefinitionFinder(componentText);
         int offset = firstDefinitionFinder(0);
+        if (offset < 0) {
+            node.variantProperty("__component_data").setValue(QLatin1String(""));
+            return; //No object definition found
+        }
         ObjectLengthCalculator objectLengthCalculator;
         unsigned length;
         if (objectLengthCalculator(componentText, offset, length)) {
-- 
GitLab