Skip to content
Snippets Groups Projects
Commit 31522c55 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Improved the semantic search for class declarations.

parent 769d6282
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment