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