diff --git a/src/plugins/duieditor/duidocument.cpp b/src/plugins/duieditor/duidocument.cpp index 02680b08f5b..3441406b207 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::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 Snapshot::componentsDefinedByImportedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) +QMap Snapshot::componentsDefinedByImportedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) const { QMap result; diff --git a/src/plugins/duieditor/duidocument.h b/src/plugins/duieditor/duidocument.h index dd99c97ab2d..3295956012a 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 componentsDefinedByImportedDocuments(const DuiDocument::Ptr &doc, const QString &importPath); + DuiDocument::PtrList importedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) const; + QMap 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 0dda0f8e372..d6a7203e8cc 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(prog->members->member)) { + findProperty(qualifiedId, binding->qualifiedTypeNameId, binding->initializer->members, -1); + } else if (UiObjectDefinition *definition = cast(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 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(parent)) { - findProperty(QStringList() << qualifiedId[1], binding->qualifiedTypeNameId, binding->initializer->members, -1); + findProperty(newQualifiedId, binding->qualifiedTypeNameId, binding->initializer->members, -1); } else if (UiObjectDefinition *definition = cast(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 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 c05b4026148..a79b8adcda0 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;