diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index ea1eed01fbfdb6d40821e4337aed648446c4af35..441fd99c7e56b95e4ba56f54d022ec0154209d93 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -211,6 +211,31 @@ private: m_model->leaveObjectDefiniton(); } + bool visit(AST::UiObjectBinding *objBinding) + { + QModelIndex index = m_model->enterObjectBinding(objBinding); + m_nodeToIndex.insert(objBinding, index); + return true; + } + + void endVisit(AST::UiObjectBinding * /*objBinding*/) + { + m_model->leaveObjectBinding(); + } + + bool visit(AST::UiArrayBinding *arrayBinding) + { + QModelIndex index = m_model->enterArrayBinding(arrayBinding); + m_nodeToIndex.insert(arrayBinding, index); + + return true; + } + + void endVisit(AST::UiArrayBinding * /*arrayBinding*/) + { + m_model->leaveArrayBinding(); + } + bool visit(AST::UiScriptBinding *scriptBinding) { QModelIndex index = m_model->enterScriptBinding(scriptBinding); @@ -373,9 +398,9 @@ QModelIndex QmlOutlineModel::enterObjectDefinition(AST::UiObjectDefinition *objD if (typeName.at(0).isUpper()) { prototype.setText(typeName); - prototype.setAnnotation(getAnnotation(objDef)); + prototype.setAnnotation(getAnnotation(objDef->initializer)); if (!m_typeToIcon.contains(typeName)) { - m_typeToIcon.insert(typeName, getIcon(objDef)); + m_typeToIcon.insert(typeName, getIcon(objDef->qualifiedTypeNameId)); } prototype.setIcon(m_typeToIcon.value(typeName)); prototype.setData(ElementType, ItemTypeRole); @@ -397,6 +422,65 @@ void QmlOutlineModel::leaveObjectDefiniton() leaveNode(); } +QModelIndex QmlOutlineModel::enterObjectBinding(AST::UiObjectBinding *objBinding) +{ + QmlOutlineItem bindingPrototype(this); + + bindingPrototype.setText(asString(objBinding->qualifiedId)); + bindingPrototype.setIcon(m_icons->scriptBindingIcon()); + bindingPrototype.setData(PropertyType, ItemTypeRole); + bindingPrototype.setNode(objBinding); + bindingPrototype.setSourceLocation(getLocation(objBinding)); + bindingPrototype.setIdNode(objBinding->qualifiedId); + + enterNode(bindingPrototype); + + QmlOutlineItem objectPrototype(this); + + const QString typeName = asString(objBinding->qualifiedTypeNameId); + objectPrototype.setText(typeName); + objectPrototype.setAnnotation(getAnnotation(objBinding->initializer)); + if (!m_typeToIcon.contains(typeName)) { + m_typeToIcon.insert(typeName, getIcon(objBinding->qualifiedTypeNameId)); + } + objectPrototype.setIcon(m_typeToIcon.value(typeName)); + objectPrototype.setData(ElementType, ItemTypeRole); + objectPrototype.setIdNode(objBinding->qualifiedTypeNameId); + objectPrototype.setNode(objBinding); + objectPrototype.setSourceLocation(getLocation(objBinding)); + + enterNode(objectPrototype); + + return bindingPrototype.index(); +} + +void QmlOutlineModel::leaveObjectBinding() +{ + leaveNode(); + leaveNode(); +} + +QModelIndex QmlOutlineModel::enterArrayBinding(AST::UiArrayBinding *arrayBinding) +{ + QmlOutlineItem bindingPrototype(this); + + bindingPrototype.setText(asString(arrayBinding->qualifiedId)); + bindingPrototype.setIcon(m_icons->scriptBindingIcon()); + bindingPrototype.setData(PropertyType, ItemTypeRole); + bindingPrototype.setNode(arrayBinding); + bindingPrototype.setSourceLocation(getLocation(arrayBinding)); + bindingPrototype.setIdNode(arrayBinding->qualifiedId); + + enterNode(bindingPrototype); + + return bindingPrototype.index(); +} + +void QmlOutlineModel::leaveArrayBinding() +{ + leaveNode(); +} + QModelIndex QmlOutlineModel::enterScriptBinding(AST::UiScriptBinding *scriptBinding) { QmlOutlineItem prototype(this); @@ -666,8 +750,8 @@ AST::SourceLocation QmlOutlineModel::getLocation(AST::UiObjectMember *objMember) return location; } -QIcon QmlOutlineModel::getIcon(AST::UiObjectDefinition *objDef) { - const QmlJS::Interpreter::Value *value = m_context->evaluate(objDef->qualifiedTypeNameId); +QIcon QmlOutlineModel::getIcon(AST::UiQualifiedId *qualifiedId) { + const QmlJS::Interpreter::Value *value = m_context->evaluate(qualifiedId); if (const Interpreter::ObjectValue *objectValue = value->asObjectValue()) { do { @@ -689,8 +773,8 @@ QIcon QmlOutlineModel::getIcon(AST::UiObjectDefinition *objDef) { return QIcon(); } -QString QmlOutlineModel::getAnnotation(AST::UiObjectDefinition *objDef) { - const QHash<QString,QString> bindings = getScriptBindings(objDef); +QString QmlOutlineModel::getAnnotation(AST::UiObjectInitializer *objectInitializer) { + const QHash<QString,QString> bindings = getScriptBindings(objectInitializer); if (bindings.contains("id")) return bindings.value("id"); @@ -701,12 +785,13 @@ QString QmlOutlineModel::getAnnotation(AST::UiObjectDefinition *objDef) { if (bindings.contains("target")) return bindings.value("target"); + return QString(); } -QHash<QString,QString> QmlOutlineModel::getScriptBindings(AST::UiObjectDefinition *objDef) { +QHash<QString,QString> QmlOutlineModel::getScriptBindings(AST::UiObjectInitializer *objectInitializer) { QHash <QString,QString> scriptBindings; - for (AST::UiObjectMemberList *it = objDef->initializer->members; it; it = it->next) { + for (AST::UiObjectMemberList *it = objectInitializer->members; it; it = it->next) { if (AST::UiScriptBinding *binding = AST::cast<AST::UiScriptBinding*>(it->member)) { const QString bindingName = asString(binding->qualifiedId); AST::ExpressionStatement *expr = AST::cast<AST::ExpressionStatement*>(binding->statement); diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h index 647a382b30853b0fe5134810ecc793aeb07fbebe..f65bf4c3ca99c00a6472867664a3aac72e64f444 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.h +++ b/src/plugins/qmljseditor/qmloutlinemodel.h @@ -88,6 +88,12 @@ private: QModelIndex enterObjectDefinition(QmlJS::AST::UiObjectDefinition *objectDefinition); void leaveObjectDefiniton(); + QModelIndex enterObjectBinding(QmlJS::AST::UiObjectBinding *objectBinding); + void leaveObjectBinding(); + + QModelIndex enterArrayBinding(QmlJS::AST::UiArrayBinding *arrayBinding); + void leaveArrayBinding(); + QModelIndex enterScriptBinding(QmlJS::AST::UiScriptBinding *scriptBinding); void leaveScriptBinding(); @@ -107,10 +113,10 @@ private: static QString asString(QmlJS::AST::UiQualifiedId *id); static QmlJS::AST::SourceLocation getLocation(QmlJS::AST::UiObjectMember *objMember); - QIcon getIcon(QmlJS::AST::UiObjectDefinition *objDef); + QIcon getIcon(QmlJS::AST::UiQualifiedId *objDef); - static QString getAnnotation(QmlJS::AST::UiObjectDefinition *objDef); - static QHash<QString,QString> getScriptBindings(QmlJS::AST::UiObjectDefinition *objDefinition); + static QString getAnnotation(QmlJS::AST::UiObjectInitializer *objInitializer); + static QHash<QString,QString> getScriptBindings(QmlJS::AST::UiObjectInitializer *objInitializer); SemanticInfo m_semanticInfo;