diff options
author | Thomas Hartmann <Thomas.Hartmann@nokia.com> | 2011-04-28 14:02:54 +0200 |
---|---|---|
committer | con <qtc-committer@nokia.com> | 2011-04-28 16:52:38 +0200 |
commit | 0b9b704584e68bb69df788649cef07d236f2838c (patch) | |
tree | 7f9367ed29355c72ea28dcd19d333dd1a339f5b3 | |
parent | 98410507911325bf5fc73791e736467ebe1e49a8 (diff) | |
download | qt-creator-0b9b704584e68bb69df788649cef07d236f2838c.tar.gz |
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
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 2e5d887254..1edac108ad 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 867ed1006b..aaf00c754c 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 6e3f387da5..b6b4e3b64f 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)) { |