diff --git a/src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.cpp b/src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.cpp index f748788aad162248566d77dd6e9798352e252247..cbd8fd9e24854265fdef2cca5368855aa9180455 100644 --- a/src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.cpp +++ b/src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.cpp @@ -35,23 +35,28 @@ using namespace QmlJS; using namespace QmlDesigner; using namespace QmlJS::AST; -ObjectLengthCalculator::ObjectLengthCalculator(const QString &text): +ObjectLengthCalculator::ObjectLengthCalculator(): m_doc(Document::create("<internal>")) { - m_doc->setSource(text); - bool ok = m_doc->parseQml(); - - Q_ASSERT(ok); } -quint32 ObjectLengthCalculator::operator()(quint32 offset) +bool ObjectLengthCalculator::operator()(const QString &text, quint32 offset, + quint32 &length) { m_offset = offset; m_length = 0; + m_doc->setSource(text); - Node::accept(m_doc->qmlProgram(), this); + if (!m_doc->parseQml()) + return false; - return m_length; + Node::accept(m_doc->qmlProgram(), this); + if (m_length) { + length = m_length; + return true; + } else { + return false; + } } bool ObjectLengthCalculator::visit(QmlJS::AST::UiObjectBinding *ast) diff --git a/src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.h b/src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.h index 957336805be46d05cf4dbd3c54b17896e2f6856e..c28d75ced3398fd781d4c8a8aa2c8c5c7c23cddf 100644 --- a/src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.h +++ b/src/plugins/qmldesigner/core/filemanager/objectlengthcalculator.h @@ -38,9 +38,9 @@ namespace QmlDesigner { class ObjectLengthCalculator: protected QmlJS::AST::Visitor { public: - ObjectLengthCalculator(const QString &text); + ObjectLengthCalculator(); - quint32 operator()(quint32 offset); + bool operator()(const QString &text, quint32 offset, quint32 &length); protected: using QmlJS::AST::Visitor::visit; diff --git a/src/plugins/qmldesigner/core/model/rewriterview.cpp b/src/plugins/qmldesigner/core/model/rewriterview.cpp index 9fa5b1e46c38092384bf6d62573f54e3a7fa4057..fc4f608af588df6cdeec3f6d04dc10eea5bca958 100644 --- a/src/plugins/qmldesigner/core/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/core/model/rewriterview.cpp @@ -477,10 +477,18 @@ int RewriterView::nodeOffset(const ModelNode &node) const return m_positionStorage->nodeOffset(node); } +/** + * \return the length of the node's text, or -1 if it wasn't found or if an error + * occurred. + */ int RewriterView::nodeLength(const ModelNode &node) const { - ObjectLengthCalculator objectLengthCalculator(m_textModifier->text()); - return objectLengthCalculator(nodeOffset(node)); + ObjectLengthCalculator objectLengthCalculator; + unsigned length; + if (objectLengthCalculator(m_textModifier->text(), nodeOffset(node), length)) + return (int) length; + else + return -1; } int RewriterView::firstDefinitionInsideOffset(const ModelNode &node) const @@ -492,9 +500,14 @@ int RewriterView::firstDefinitionInsideOffset(const ModelNode &node) const int RewriterView::firstDefinitionInsideLength(const ModelNode &node) const { FirstDefinitionFinder firstDefinitionFinder(m_textModifier->text()); - int offset = firstDefinitionFinder(nodeOffset(node)); - ObjectLengthCalculator objectLengthCalculator(m_textModifier->text()); - return objectLengthCalculator(offset); + const int offset = firstDefinitionFinder(nodeOffset(node)); + + ObjectLengthCalculator objectLengthCalculator; + unsigned length; + if (objectLengthCalculator(m_textModifier->text(), offset, length)) + return length; + else + return -1; } bool RewriterView::modificationGroupActive() diff --git a/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp index 11bbaed71158cc56826cb26622df4d1f05bfae4c..7439cbf97ba4da090283c5021df15e8e49c75262 100644 --- a/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp @@ -952,10 +952,13 @@ void TextToModelMerger::setupComponent(const ModelNode &node) if (componentText.contains("Component")) { //explicit component FirstDefinitionFinder firstDefinitionFinder(componentText); int offset = firstDefinitionFinder(0); - ObjectLengthCalculator objectLengthCalculator(componentText); - int length = objectLengthCalculator(offset); - for (int i = offset;i<offset + length;i++) - result.append(componentText.at(i)); + ObjectLengthCalculator objectLengthCalculator; + unsigned length; + if (objectLengthCalculator(componentText, offset, length)) { + result = componentText.mid(offset, length); + } else { + result = componentText; + } } else { result = componentText; //implicit component }