forked from qt-creator/qt-creator
Added navigation between files.
This commit is contained in:
@@ -123,7 +123,7 @@ void Snapshot::insert(const DuiDocument::Ptr &document)
|
|||||||
QMap<QString, DuiDocument::Ptr>::insert(document->fileName(), 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;
|
DuiDocument::PtrList result;
|
||||||
|
|
||||||
@@ -142,7 +142,7 @@ DuiDocument::PtrList Snapshot::importedDocuments(const DuiDocument::Ptr &doc, co
|
|||||||
return result;
|
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;
|
QMap<QString, DuiDocument::Ptr> result;
|
||||||
|
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ public:
|
|||||||
DuiDocument::Ptr document(const QString &fileName) const
|
DuiDocument::Ptr document(const QString &fileName) const
|
||||||
{ return value(fileName); }
|
{ return value(fileName); }
|
||||||
|
|
||||||
DuiDocument::PtrList importedDocuments(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);
|
QMap<QString, DuiDocument::Ptr> componentsDefinedByImportedDocuments(const DuiDocument::Ptr &doc, const QString &importPath) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // emd of namespace DuiEditor
|
} // emd of namespace DuiEditor
|
||||||
|
|||||||
@@ -283,7 +283,24 @@ bool NavigationTokenFinder::findProperty(const QStringList &qualifiedId, QmlJS::
|
|||||||
|
|
||||||
// 3. if the type is a custom type, search properties there:
|
// 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:
|
// all failed, so:
|
||||||
@@ -298,13 +315,15 @@ void NavigationTokenFinder::findAsId(const QStringList &qualifiedId)
|
|||||||
QPair<SourceLocation, Node*> idInfo = ids[qualifiedId.first()];
|
QPair<SourceLocation, Node*> idInfo = ids[qualifiedId.first()];
|
||||||
if (qualifiedId.size() == 1) {
|
if (qualifiedId.size() == 1) {
|
||||||
rememberLocation(idInfo.first);
|
rememberLocation(idInfo.first);
|
||||||
} else if (qualifiedId.size() == 2) {
|
} else {
|
||||||
Node *parent = idInfo.second;
|
Node *parent = idInfo.second;
|
||||||
|
QStringList newQualifiedId(qualifiedId);
|
||||||
|
newQualifiedId.removeFirst();
|
||||||
|
|
||||||
if (UiObjectBinding *binding = cast<UiObjectBinding*>(parent)) {
|
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)) {
|
} 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)
|
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)
|
void NavigationTokenFinder::rememberLocation(const QmlJS::AST::SourceLocation &loc)
|
||||||
@@ -353,3 +383,32 @@ void NavigationTokenFinder::rememberLocation(const QmlJS::AST::SourceLocation &l
|
|||||||
_targetLine = loc.startLine;
|
_targetLine = loc.startLine;
|
||||||
_targetColumn = loc.startColumn;
|
_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();
|
||||||
|
}
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ private:
|
|||||||
void findDeclaration(const QStringList &id);
|
void findDeclaration(const QStringList &id);
|
||||||
void findTypeDeclaration(const QStringList &id);
|
void findTypeDeclaration(const QStringList &id);
|
||||||
void rememberLocation(const QmlJS::AST::SourceLocation &loc);
|
void rememberLocation(const QmlJS::AST::SourceLocation &loc);
|
||||||
|
DuiDocument::Ptr findCustomType(const QStringList& qualifiedId) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
quint32 _pos;
|
quint32 _pos;
|
||||||
|
|||||||
Reference in New Issue
Block a user