diff --git a/src/plugins/cpptools/cppsemanticsearch.cpp b/src/plugins/cpptools/cppsemanticsearch.cpp index 68fb581a3408ba30a738be068c4914ed717bac58..526b5b2e46843c60898b06ec09996c4b203c613b 100644 --- a/src/plugins/cpptools/cppsemanticsearch.cpp +++ b/src/plugins/cpptools/cppsemanticsearch.cpp @@ -31,6 +31,7 @@ #include "cppmodelmanager.h" #include <AST.h> +#include <Literals.h> #include <TranslationUnit.h> #include <QtCore/QDir> @@ -44,13 +45,14 @@ using namespace CPlusPlus; namespace { -class FindClass: public SemanticSearch +class SearchClass: public SemanticSearch { QString _text; QTextDocument::FindFlags _findFlags; public: - FindClass(QFutureInterface<Core::Utils::FileSearchResult> &future, Document::Ptr doc, Snapshot snapshot) + SearchClass(QFutureInterface<Core::Utils::FileSearchResult> &future, + Document::Ptr doc, Snapshot snapshot) : SemanticSearch(future, doc, snapshot) { } @@ -66,25 +68,48 @@ public: protected: using ASTVisitor::visit; - virtual bool visit(ClassSpecifierAST *ast) + bool match(NameAST *name) { - if (ast->name) { - Qt::CaseSensitivity cs = Qt::CaseInsensitive; + if (! name) + return false; + + else if (SimpleNameAST *simpleName = name->asSimpleName()) { + if (Identifier *id = identifier(simpleName->identifier_token)) { + Qt::CaseSensitivity cs = Qt::CaseInsensitive; + + if (_findFlags & QTextDocument::FindCaseSensitively) + cs = Qt::CaseSensitive; + + QString s = QString::fromUtf8(id->chars(), id->size()); + int index = s.indexOf(_text, 0, cs); + if (index != -1) { + reportResult(simpleName->identifier_token, index, _text.length()); + return true; + } + } + } - if (_findFlags & QTextDocument::FindCaseSensitively) - cs = Qt::CaseSensitive; + else if (QualifiedNameAST *q = name->asQualifiedName()) { + return match(q->unqualified_name); + } - Token start = tokenAt(ast->name->firstToken()); - Token end = tokenAt(ast->name->lastToken() - 1); - const QString className = QString::fromUtf8(source().constData() + start.begin(), - end.end() - start.begin()); + return false; + } - if (className.contains(_text, cs)) - reportResult(ast->name->firstToken()); + virtual bool visit(ElaboratedTypeSpecifierAST *ast) + { + if (tokenKind(ast->classkey_token) != T_ENUM) { + match(ast->name); } return true; } + + virtual bool visit(ClassSpecifierAST *ast) + { + match(ast->name); + return true; + } }; } // end of anonymous namespace @@ -130,7 +155,7 @@ QString SemanticSearch::matchingLine(const Token &tk) const return matchingLine; } -void SemanticSearch::reportResult(unsigned tokenIndex) +void SemanticSearch::reportResult(unsigned tokenIndex, int offset, int len) { const Token &tk = tokenAt(tokenIndex); const QString lineText = matchingLine(tk); @@ -142,14 +167,14 @@ void SemanticSearch::reportResult(unsigned tokenIndex) --col; // adjust the column position. _future.reportResult(Core::Utils::FileSearchResult(QDir::toNativeSeparators(_doc->fileName()), - line, lineText, col, tk.length)); + line, lineText, col + offset, len)); } SemanticSearch *SearchClassDeclarationsFactory::create(QFutureInterface<Core::Utils::FileSearchResult> &future, Document::Ptr doc, Snapshot snapshot) { - FindClass *findClass = new FindClass(future, doc, snapshot); + SearchClass *findClass = new SearchClass(future, doc, snapshot); findClass->setText(_text); findClass->setFindFlags(_findFlags); return findClass; diff --git a/src/plugins/cpptools/cppsemanticsearch.h b/src/plugins/cpptools/cppsemanticsearch.h index 68c233c8474bb6ffb6a144e236a5ce2e384848f5..7bd10b5cc3b0db132ad7b731a7b614e86bcef2ae 100644 --- a/src/plugins/cpptools/cppsemanticsearch.h +++ b/src/plugins/cpptools/cppsemanticsearch.h @@ -68,7 +68,7 @@ public: protected: QString matchingLine(const CPlusPlus::Token &tk) const; - void reportResult(unsigned tokenIndex); + void reportResult(unsigned tokenIndex, int offset, int len); }; class SemanticSearchFactory