diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp index 2a560ec5a9c2e8242666e0fe45d5c9d6227a9659..8acb0214734dfa4eb26952f906a7f2443e7167c4 100644 --- a/src/libs/cplusplus/FindUsages.cpp +++ b/src/libs/cplusplus/FindUsages.cpp @@ -41,9 +41,8 @@ using namespace CPlusPlus; -FindUsages::FindUsages(Document::Ptr doc, const Snapshot &snapshot, QFutureInterface<Usage> *future) +FindUsages::FindUsages(Document::Ptr doc, const Snapshot &snapshot) : ASTVisitor(doc->translationUnit()), - _future(future), _doc(doc), _snapshot(snapshot), _source(_doc->source()), @@ -131,12 +130,8 @@ void FindUsages::reportResult(unsigned tokenIndex) const int len = tk.f.length; - const Usage u(_doc->fileName(), line, lineText, col, len); + const Usage u(_doc->fileName(), lineText, line, col, len); _usages.append(u); - - if (_future) - _future->reportResult(u); - _references.append(tokenIndex); } diff --git a/src/libs/cplusplus/FindUsages.h b/src/libs/cplusplus/FindUsages.h index d578f8e37785c63fa8def2d5eff479a10fd84051..1a61cca4e6c57b1aeb168860541c6fb7b9450f75 100644 --- a/src/libs/cplusplus/FindUsages.h +++ b/src/libs/cplusplus/FindUsages.h @@ -34,9 +34,8 @@ #include "CppDocument.h" #include "CppBindings.h" #include "Semantic.h" - #include <ASTVisitor.h> -#include <QtCore/QFutureInterface> +#include <QtCore/QSet> namespace CPlusPlus { @@ -46,7 +45,7 @@ public: Usage() : line(0), col(0), len(0) {} - Usage(const QString &path, int line, const QString &lineText, int col, int len) + Usage(const QString &path, const QString &lineText, int line, int col, int len) : path(path), lineText(lineText), line(line), col(col), len(len) {} public: @@ -60,7 +59,7 @@ public: class CPLUSPLUS_EXPORT FindUsages: protected ASTVisitor { public: - FindUsages(Document::Ptr doc, const Snapshot &snapshot, QFutureInterface<Usage> *future); + FindUsages(Document::Ptr doc, const Snapshot &snapshot); void setGlobalNamespaceBinding(NamespaceBindingPtr globalNamespaceBinding); @@ -103,7 +102,6 @@ protected: virtual void endVisit(SimpleDeclarationAST *); private: - QFutureInterface<Usage> *_future; const Identifier *_id; Symbol *_declSymbol; Document::Ptr _doc; diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index a1f9a31dc16caba9fc5c91f315e339047f67ae38..b7a1cdc89da1d7426bdbd85b9808033f1468c1f4 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -54,10 +54,13 @@ #include <QtCore/QTime> #include <QtCore/QtConcurrentRun> +#include <QtCore/QtConcurrentMap> #include <QtCore/QDir> #include <QtGui/QApplication> #include <qtconcurrent/runextensions.h> +#include <functional> + using namespace CppTools::Internal; using namespace CPlusPlus; @@ -81,7 +84,7 @@ QList<int> CppFindReferences::references(Symbol *symbol, { QList<int> references; - FindUsages findUsages(doc, snapshot, /*future = */ 0); + FindUsages findUsages(doc, snapshot); findUsages.setGlobalNamespaceBinding(bind(doc, snapshot)); findUsages(symbol); references = findUsages.references(); @@ -89,6 +92,77 @@ QList<int> CppFindReferences::references(Symbol *symbol, return references; } +class MyProcess: public std::unary_function<QString, QList<Usage> > +{ + const QMap<QString, QString> wl; + const Snapshot snapshot; + Symbol *symbol; + +public: + MyProcess(const QMap<QString, QString> wl, + const Snapshot snapshot, + Symbol *symbol) + : wl(wl), snapshot(snapshot), symbol(symbol) + { } + + QList<Usage> operator()(const QString &fileName) + { + QList<Usage> usages; + const Identifier *symbolId = symbol->identifier(); + + if (Document::Ptr previousDoc = snapshot.value(fileName)) { + Control *control = previousDoc->control(); + if (! control->findIdentifier(symbolId->chars(), symbolId->size())) + return usages; // skip this document, it's not using symbolId. + } + + QByteArray source; + + if (wl.contains(fileName)) + source = snapshot.preprocessedCode(wl.value(fileName), fileName); + else { + QFile file(fileName); + if (! file.open(QFile::ReadOnly)) + return usages; + + const QString contents = QTextStream(&file).readAll(); // ### FIXME + source = snapshot.preprocessedCode(contents, fileName); + } + + Document::Ptr doc = snapshot.documentFromSource(source, fileName); + doc->tokenize(); + + Control *control = doc->control(); + if (control->findIdentifier(symbolId->chars(), symbolId->size()) != 0) { + doc->check(); + + FindUsages process(doc, snapshot); + process.setGlobalNamespaceBinding(bind(doc, snapshot)); + + process(symbol); + usages = process.usages(); + } + + return usages; + } +}; + +class MyReduce: public std::binary_function<QList<Usage> &, QList<Usage>, void> +{ + QFutureInterface<Usage> *future; + +public: + MyReduce(QFutureInterface<Usage> *future): future(future) {} + + void operator()(QList<Usage> &uu, const QList<Usage> &usages) + { + foreach (const Usage &u, usages) + future->reportResult(u); + + future->setProgressValue(future->progressValue() + 1); + } +}; + static void find_helper(QFutureInterface<Usage> &future, const QMap<QString, QString> wl, Snapshot snapshot, @@ -121,49 +195,10 @@ static void find_helper(QFutureInterface<Usage> &future, future.setProgressRange(0, files.size()); - for (int i = 0; i < files.size(); ++i) { - if (future.isPaused()) - future.waitForResume(); - - if (future.isCanceled()) - break; - - const QString &fileName = files.at(i); - future.setProgressValueAndText(i, QFileInfo(fileName).fileName()); - - if (Document::Ptr previousDoc = snapshot.value(fileName)) { - Control *control = previousDoc->control(); - const Identifier *id = control->findIdentifier(symbolId->chars(), symbolId->size()); - if (! id) - continue; // skip this document, it's not using symbolId. - } - - QByteArray source; + MyProcess process(wl, snapshot, symbol); + MyReduce reduce(&future); - if (wl.contains(fileName)) - source = snapshot.preprocessedCode(wl.value(fileName), fileName); - else { - QFile file(fileName); - if (! file.open(QFile::ReadOnly)) - continue; - - const QString contents = QTextStream(&file).readAll(); // ### FIXME - source = snapshot.preprocessedCode(contents, fileName); - } - - Document::Ptr doc = snapshot.documentFromSource(source, fileName); - doc->tokenize(); - - Control *control = doc->control(); - if (control->findIdentifier(symbolId->chars(), symbolId->size()) != 0) { - doc->check(); - - FindUsages process(doc, snapshot, &future); - process.setGlobalNamespaceBinding(bind(doc, snapshot)); - - process(symbol); - } - } + QtConcurrent::blockingMappedReduced<QList<Usage> > (files, process, reduce); future.setProgressValue(files.size()); }