diff --git a/src/plugins/duieditor/duidocument.cpp b/src/plugins/duieditor/duidocument.cpp index 02680b08f5b43098a42faa10e474dce65b063adb..3441406b207524fe4f3f9a758e7b30b2e32b8bbf 100644 --- a/src/plugins/duieditor/duidocument.cpp +++ b/src/plugins/duieditor/duidocument.cpp @@ -123,7 +123,7 @@ void Snapshot::insert(const DuiDocument::Ptr &document) QMap<QString, DuiDocument::Ptr>::insert(document->fileName(), document); } -DuiDocument::PtrList Snapshot::importedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) +DuiDocument::PtrList Snapshot::importedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) const { DuiDocument::PtrList result; @@ -142,7 +142,7 @@ DuiDocument::PtrList Snapshot::importedDocuments(const DuiDocument::Ptr &doc, co return result; } -QMap<QString, DuiDocument::Ptr> Snapshot::componentsDefinedByImportedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) +QMap<QString, DuiDocument::Ptr> Snapshot::componentsDefinedByImportedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) const { QMap<QString, DuiDocument::Ptr> result; diff --git a/src/plugins/duieditor/duidocument.h b/src/plugins/duieditor/duidocument.h index dd99c97ab2df751d4ed80607394e0237590c6a0a..3295956012a81358df4e711e3a330c9b3a9353b5 100644 --- a/src/plugins/duieditor/duidocument.h +++ b/src/plugins/duieditor/duidocument.h @@ -100,8 +100,8 @@ public: DuiDocument::Ptr document(const QString &fileName) const { return value(fileName); } - DuiDocument::PtrList importedDocuments(const DuiDocument::Ptr &doc, const QString &importPath); - QMap<QString, DuiDocument::Ptr> componentsDefinedByImportedDocuments(const DuiDocument::Ptr &doc, const QString &importPath); + DuiDocument::PtrList importedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) const; + QMap<QString, DuiDocument::Ptr> componentsDefinedByImportedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) const; }; } // emd of namespace DuiEditor diff --git a/src/plugins/duieditor/navigationtokenfinder.cpp b/src/plugins/duieditor/navigationtokenfinder.cpp index 0dda0f8e372d76ecba896e875664e09b912a33ee..d6a7203e8cc44f41ab208e4f3cbc96aff9bc378a 100644 --- a/src/plugins/duieditor/navigationtokenfinder.cpp +++ b/src/plugins/duieditor/navigationtokenfinder.cpp @@ -283,7 +283,24 @@ bool NavigationTokenFinder::findProperty(const QStringList &qualifiedId, QmlJS:: // 3. if the type is a custom type, search properties there: { - // TODO + // TODO: when things around the "import as" clear up a bit, revise this resolving: + + QStringList qualifiedTypeId; + for (UiQualifiedId *iter = typeId; iter; iter = iter->next) + qualifiedTypeId.append(iter->name->asString()); + + DuiDocument::Ptr doc = findCustomType(qualifiedTypeId); + if (!doc.isNull() && doc->isParsedCorrectly()) { + UiProgram *prog = doc->program(); + + if (prog && prog->members && prog->members->member) { + if (UiObjectBinding *binding = cast<UiObjectBinding*>(prog->members->member)) { + findProperty(qualifiedId, binding->qualifiedTypeNameId, binding->initializer->members, -1); + } else if (UiObjectDefinition *definition = cast<UiObjectDefinition*>(prog->members->member)) { + findProperty(qualifiedId, definition->qualifiedTypeNameId, definition->initializer->members, -1); + } + } + } } // all failed, so: @@ -298,13 +315,15 @@ void NavigationTokenFinder::findAsId(const QStringList &qualifiedId) QPair<SourceLocation, Node*> idInfo = ids[qualifiedId.first()]; if (qualifiedId.size() == 1) { rememberLocation(idInfo.first); - } else if (qualifiedId.size() == 2) { + } else { Node *parent = idInfo.second; + QStringList newQualifiedId(qualifiedId); + newQualifiedId.removeFirst(); if (UiObjectBinding *binding = cast<UiObjectBinding*>(parent)) { - findProperty(QStringList() << qualifiedId[1], binding->qualifiedTypeNameId, binding->initializer->members, -1); + findProperty(newQualifiedId, binding->qualifiedTypeNameId, binding->initializer->members, -1); } else if (UiObjectDefinition *definition = cast<UiObjectDefinition*>(parent)) { - findProperty(QStringList() << qualifiedId[1], definition->qualifiedTypeNameId, definition->initializer->members, -1); + findProperty(newQualifiedId, definition->qualifiedTypeNameId, definition->initializer->members, -1); } } } @@ -344,7 +363,18 @@ void NavigationTokenFinder::findDeclaration(const QStringList &id) void NavigationTokenFinder::findTypeDeclaration(const QStringList &id) { - // TODO + DuiDocument::Ptr doc = findCustomType(id); + if (doc.isNull() || !doc->isParsedCorrectly()) + return; + + UiProgram *prog = doc->program(); + if (!prog || !(prog->members) || !(prog->members->member)) + return; + + _fileName = doc->fileName(); + const SourceLocation loc = prog->members->member->firstSourceLocation(); + _targetLine = loc.startLine; + _targetColumn = loc.startColumn; } void NavigationTokenFinder::rememberLocation(const QmlJS::AST::SourceLocation &loc) @@ -353,3 +383,32 @@ void NavigationTokenFinder::rememberLocation(const QmlJS::AST::SourceLocation &l _targetLine = loc.startLine; _targetColumn = loc.startColumn; } + +DuiDocument::Ptr NavigationTokenFinder::findCustomType(const QStringList& qualifiedId) const +{ + // TODO: when things around the "import as" clear up a bit, revise this resolving: + + UiProgram *program = _doc->program(); + if (!program) + return DuiDocument::Ptr(); + UiImportList *imports = program->imports; + if (!imports) + return DuiDocument::Ptr(); + + for (UiImportList *iter = imports; iter; iter = iter->next) { + if (!(iter->import)) + continue; + + UiImport *import = iter->import; + if (!(import->fileName)) + continue; + + const QString path = import->fileName->asString(); + const QMap<QString, DuiDocument::Ptr> compToDoc = _snapshot.componentsDefinedByImportedDocuments(_doc, path); + + if (compToDoc.contains(qualifiedId[0])) + return compToDoc[qualifiedId[0]]; + } + + return DuiDocument::Ptr(); +} diff --git a/src/plugins/duieditor/navigationtokenfinder.h b/src/plugins/duieditor/navigationtokenfinder.h index c05b4026148e94faa03cb5cbe648683099baefb7..a79b8adcda0736a5736d90805fa3453759fe7542 100644 --- a/src/plugins/duieditor/navigationtokenfinder.h +++ b/src/plugins/duieditor/navigationtokenfinder.h @@ -55,6 +55,7 @@ private: void findDeclaration(const QStringList &id); void findTypeDeclaration(const QStringList &id); void rememberLocation(const QmlJS::AST::SourceLocation &loc); + DuiDocument::Ptr findCustomType(const QStringList& qualifiedId) const; private: quint32 _pos;