Commit 31522c55 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Improved the semantic search for class declarations.

parent 769d6282
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment