Fixed ObjectLengthCalculator to handle incorrect QML.

Task-number: QTCREATORBUG-961
This commit is contained in:
Erik Verbruggen
2010-03-26 13:53:46 +01:00
parent b2bb919e45
commit aa78a1fc5d
4 changed files with 40 additions and 19 deletions

View File

@@ -35,23 +35,28 @@ using namespace QmlJS;
using namespace QmlDesigner; using namespace QmlDesigner;
using namespace QmlJS::AST; using namespace QmlJS::AST;
ObjectLengthCalculator::ObjectLengthCalculator(const QString &text): ObjectLengthCalculator::ObjectLengthCalculator():
m_doc(Document::create("<internal>")) 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_offset = offset;
m_length = 0; m_length = 0;
m_doc->setSource(text);
if (!m_doc->parseQml())
return false;
Node::accept(m_doc->qmlProgram(), this); Node::accept(m_doc->qmlProgram(), this);
if (m_length) {
return m_length; length = m_length;
return true;
} else {
return false;
}
} }
bool ObjectLengthCalculator::visit(QmlJS::AST::UiObjectBinding *ast) bool ObjectLengthCalculator::visit(QmlJS::AST::UiObjectBinding *ast)

View File

@@ -38,9 +38,9 @@ namespace QmlDesigner {
class ObjectLengthCalculator: protected QmlJS::AST::Visitor class ObjectLengthCalculator: protected QmlJS::AST::Visitor
{ {
public: public:
ObjectLengthCalculator(const QString &text); ObjectLengthCalculator();
quint32 operator()(quint32 offset); bool operator()(const QString &text, quint32 offset, quint32 &length);
protected: protected:
using QmlJS::AST::Visitor::visit; using QmlJS::AST::Visitor::visit;

View File

@@ -477,10 +477,18 @@ int RewriterView::nodeOffset(const ModelNode &node) const
return m_positionStorage->nodeOffset(node); 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 int RewriterView::nodeLength(const ModelNode &node) const
{ {
ObjectLengthCalculator objectLengthCalculator(m_textModifier->text()); ObjectLengthCalculator objectLengthCalculator;
return objectLengthCalculator(nodeOffset(node)); unsigned length;
if (objectLengthCalculator(m_textModifier->text(), nodeOffset(node), length))
return (int) length;
else
return -1;
} }
int RewriterView::firstDefinitionInsideOffset(const ModelNode &node) const 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 int RewriterView::firstDefinitionInsideLength(const ModelNode &node) const
{ {
FirstDefinitionFinder firstDefinitionFinder(m_textModifier->text()); FirstDefinitionFinder firstDefinitionFinder(m_textModifier->text());
int offset = firstDefinitionFinder(nodeOffset(node)); const int offset = firstDefinitionFinder(nodeOffset(node));
ObjectLengthCalculator objectLengthCalculator(m_textModifier->text());
return objectLengthCalculator(offset); ObjectLengthCalculator objectLengthCalculator;
unsigned length;
if (objectLengthCalculator(m_textModifier->text(), offset, length))
return length;
else
return -1;
} }
bool RewriterView::modificationGroupActive() bool RewriterView::modificationGroupActive()

View File

@@ -952,10 +952,13 @@ void TextToModelMerger::setupComponent(const ModelNode &node)
if (componentText.contains("Component")) { //explicit component if (componentText.contains("Component")) { //explicit component
FirstDefinitionFinder firstDefinitionFinder(componentText); FirstDefinitionFinder firstDefinitionFinder(componentText);
int offset = firstDefinitionFinder(0); int offset = firstDefinitionFinder(0);
ObjectLengthCalculator objectLengthCalculator(componentText); ObjectLengthCalculator objectLengthCalculator;
int length = objectLengthCalculator(offset); unsigned length;
for (int i = offset;i<offset + length;i++) if (objectLengthCalculator(componentText, offset, length)) {
result.append(componentText.at(i)); result = componentText.mid(offset, length);
} else {
result = componentText;
}
} else { } else {
result = componentText; //implicit component result = componentText; //implicit component
} }