2014-08-22 08:42:04 +02:00
|
|
|
/****************************************************************************
|
|
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2014-08-22 08:42:04 +02:00
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator.
|
|
|
|
|
**
|
|
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
2016-01-15 14:57:40 +01:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
2014-08-22 08:42:04 +02:00
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** GNU General Public License Usage
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
2014-08-22 08:42:04 +02:00
|
|
|
**
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
2012-11-23 11:47:39 +01:00
|
|
|
#include "builtinindexingsupport.h"
|
2013-03-27 18:54:03 +01:00
|
|
|
|
2014-08-19 15:46:50 +02:00
|
|
|
#include "builtineditordocumentparser.h"
|
2014-08-05 11:34:52 +02:00
|
|
|
#include "cppchecksymbols.h"
|
2012-11-23 11:47:39 +01:00
|
|
|
#include "cppmodelmanager.h"
|
2014-08-05 11:34:52 +02:00
|
|
|
#include "cppprojectfile.h"
|
2014-05-16 15:51:04 -04:00
|
|
|
#include "cppsourceprocessor.h"
|
2013-03-27 10:32:28 +04:00
|
|
|
#include "cpptoolsconstants.h"
|
2014-02-25 16:16:11 +01:00
|
|
|
#include "cpptoolsplugin.h"
|
2016-08-16 13:37:49 +02:00
|
|
|
#include "cpptoolsreuse.h"
|
2014-08-05 11:34:52 +02:00
|
|
|
#include "searchsymbols.h"
|
2012-11-23 11:47:39 +01:00
|
|
|
|
|
|
|
|
#include <coreplugin/icore.h>
|
2015-03-05 08:22:48 +01:00
|
|
|
#include <coreplugin/find/searchresultwindow.h>
|
2012-11-23 11:47:39 +01:00
|
|
|
#include <coreplugin/progressmanager/progressmanager.h>
|
2013-03-27 18:54:03 +01:00
|
|
|
|
2014-08-05 11:34:52 +02:00
|
|
|
#include <cplusplus/LookupContext.h>
|
|
|
|
|
#include <utils/qtcassert.h>
|
2012-11-23 11:47:39 +01:00
|
|
|
#include <utils/runextensions.h>
|
|
|
|
|
|
|
|
|
|
#include <QCoreApplication>
|
2015-03-05 08:22:48 +01:00
|
|
|
#include <QDir>
|
2014-08-05 11:34:52 +02:00
|
|
|
#include <QElapsedTimer>
|
2016-11-22 13:59:54 +01:00
|
|
|
#include <QRegularExpression>
|
2012-11-23 11:47:39 +01:00
|
|
|
|
|
|
|
|
using namespace CppTools;
|
|
|
|
|
using namespace CppTools::Internal;
|
|
|
|
|
|
2014-08-05 11:34:52 +02:00
|
|
|
static const bool FindErrorsIndexing = qgetenv("QTC_FIND_ERRORS_INDEXING") == "1";
|
2014-03-06 14:42:01 -03:00
|
|
|
|
2012-11-23 11:47:39 +01:00
|
|
|
namespace {
|
|
|
|
|
|
2014-08-05 11:04:37 +02:00
|
|
|
class ParseParams
|
2012-11-23 11:47:39 +01:00
|
|
|
{
|
2014-08-05 11:04:37 +02:00
|
|
|
public:
|
2016-01-13 14:12:15 +01:00
|
|
|
ProjectPartHeaderPaths headerPaths;
|
2014-07-30 16:29:02 +02:00
|
|
|
WorkingCopy workingCopy;
|
2014-09-04 14:59:50 +02:00
|
|
|
QSet<QString> sourceFiles;
|
2016-08-16 13:37:49 +02:00
|
|
|
int indexerFileSizeLimitInMb = -1;
|
2014-08-05 11:04:37 +02:00
|
|
|
};
|
|
|
|
|
|
2014-08-05 11:34:52 +02:00
|
|
|
class WriteTaskFileForDiagnostics
|
2014-08-05 11:04:37 +02:00
|
|
|
{
|
2014-08-05 11:34:52 +02:00
|
|
|
Q_DISABLE_COPY(WriteTaskFileForDiagnostics)
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
WriteTaskFileForDiagnostics()
|
|
|
|
|
: m_processedDiagnostics(0)
|
|
|
|
|
{
|
|
|
|
|
const QString fileName = QDir::tempPath()
|
|
|
|
|
+ QLatin1String("/qtc_findErrorsIndexing.diagnostics.")
|
|
|
|
|
+ QDateTime::currentDateTime().toString(QLatin1String("yyMMdd_HHmm"))
|
|
|
|
|
+ QLatin1String(".tasks");
|
|
|
|
|
|
|
|
|
|
m_file.setFileName(fileName);
|
|
|
|
|
Q_ASSERT(m_file.open(QIODevice::WriteOnly | QIODevice::Text));
|
|
|
|
|
m_out.setDevice(&m_file);
|
|
|
|
|
|
|
|
|
|
qDebug("FindErrorsIndexing: Task file for diagnostics is \"%s\".",
|
|
|
|
|
qPrintable(m_file.fileName()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~WriteTaskFileForDiagnostics()
|
|
|
|
|
{
|
|
|
|
|
qDebug("FindErrorsIndexing: %d diagnostic messages written to \"%s\".",
|
|
|
|
|
m_processedDiagnostics, qPrintable(m_file.fileName()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void process(const CPlusPlus::Document::Ptr document)
|
|
|
|
|
{
|
|
|
|
|
using namespace CPlusPlus;
|
|
|
|
|
const QString fileName = document->fileName();
|
|
|
|
|
|
|
|
|
|
foreach (const Document::DiagnosticMessage &message, document->diagnosticMessages()) {
|
|
|
|
|
++m_processedDiagnostics;
|
|
|
|
|
|
|
|
|
|
QString type;
|
|
|
|
|
switch (message.level()) {
|
|
|
|
|
case Document::DiagnosticMessage::Warning:
|
|
|
|
|
type = QLatin1String("warn"); break;
|
|
|
|
|
case Document::DiagnosticMessage::Error:
|
|
|
|
|
case Document::DiagnosticMessage::Fatal:
|
|
|
|
|
type = QLatin1String("err"); break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// format: file\tline\ttype\tdescription
|
|
|
|
|
m_out << fileName << "\t"
|
|
|
|
|
<< message.line() << "\t"
|
|
|
|
|
<< type << "\t"
|
|
|
|
|
<< message.text() << "\n";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QFile m_file;
|
|
|
|
|
QTextStream m_out;
|
|
|
|
|
int m_processedDiagnostics;
|
|
|
|
|
};
|
|
|
|
|
|
2014-09-04 14:59:50 +02:00
|
|
|
void classifyFiles(const QSet<QString> &files, QStringList *headers, QStringList *sources)
|
2014-08-05 11:34:52 +02:00
|
|
|
{
|
|
|
|
|
foreach (const QString &file, files) {
|
|
|
|
|
if (ProjectFile::isSource(ProjectFile::classify(file)))
|
|
|
|
|
sources->append(file);
|
|
|
|
|
else
|
|
|
|
|
headers->append(file);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void indexFindErrors(QFutureInterface<void> &future, const ParseParams params)
|
|
|
|
|
{
|
|
|
|
|
QStringList sources, headers;
|
2014-09-04 14:59:50 +02:00
|
|
|
classifyFiles(params.sourceFiles, &headers, &sources);
|
|
|
|
|
sources.sort();
|
|
|
|
|
headers.sort();
|
|
|
|
|
QStringList files = sources + headers;
|
2014-08-05 11:34:52 +02:00
|
|
|
|
|
|
|
|
WriteTaskFileForDiagnostics taskFileWriter;
|
|
|
|
|
QElapsedTimer timer;
|
|
|
|
|
timer.start();
|
|
|
|
|
|
|
|
|
|
for (int i = 0, end = files.size(); i < end ; ++i) {
|
|
|
|
|
if (future.isPaused())
|
|
|
|
|
future.waitForResume();
|
|
|
|
|
if (future.isCanceled())
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
const QString file = files.at(i);
|
|
|
|
|
qDebug("FindErrorsIndexing: \"%s\"", qPrintable(file));
|
|
|
|
|
|
|
|
|
|
// Parse the file as precisely as possible
|
2014-08-19 15:46:50 +02:00
|
|
|
BuiltinEditorDocumentParser parser(file);
|
|
|
|
|
parser.setReleaseSourceAndAST(false);
|
2016-12-15 11:21:44 +01:00
|
|
|
parser.update({CppModelManager::instance()->workingCopy(), nullptr, false});
|
2014-08-19 15:46:50 +02:00
|
|
|
CPlusPlus::Document::Ptr document = parser.document();
|
2014-08-05 11:34:52 +02:00
|
|
|
QTC_ASSERT(document, return);
|
2012-11-23 11:47:39 +01:00
|
|
|
|
2014-08-05 11:34:52 +02:00
|
|
|
// Write diagnostic messages
|
|
|
|
|
taskFileWriter.process(document);
|
|
|
|
|
|
|
|
|
|
// Look up symbols
|
2014-08-19 15:46:50 +02:00
|
|
|
CPlusPlus::LookupContext context(document, parser.snapshot());
|
2014-08-05 11:34:52 +02:00
|
|
|
CheckSymbols::go(document, context, QList<CheckSymbols::Result>()).waitForFinished();
|
|
|
|
|
|
|
|
|
|
document->releaseSourceAndAST();
|
|
|
|
|
|
|
|
|
|
future.setProgressValue(files.size() - (files.size() - (i + 1)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const QTime format = QTime(0, 0, 0, 0).addMSecs(timer.elapsed() + 500);
|
|
|
|
|
const QString time = format.toString(QLatin1String("hh:mm:ss"));
|
|
|
|
|
qDebug("FindErrorsIndexing: Finished after %s.", qPrintable(time));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void index(QFutureInterface<void> &future, const ParseParams params)
|
|
|
|
|
{
|
2014-08-05 11:04:37 +02:00
|
|
|
QScopedPointer<CppSourceProcessor> sourceProcessor(CppModelManager::createSourceProcessor());
|
2016-08-16 13:37:49 +02:00
|
|
|
sourceProcessor->setFileSizeLimitInMb(params.indexerFileSizeLimitInMb);
|
2014-08-05 11:04:37 +02:00
|
|
|
sourceProcessor->setHeaderPaths(params.headerPaths);
|
|
|
|
|
sourceProcessor->setWorkingCopy(params.workingCopy);
|
|
|
|
|
|
2012-11-23 11:47:39 +01:00
|
|
|
QStringList sources;
|
|
|
|
|
QStringList headers;
|
2014-09-04 14:59:50 +02:00
|
|
|
classifyFiles(params.sourceFiles, &headers, &sources);
|
2012-11-23 11:47:39 +01:00
|
|
|
|
2014-09-04 14:59:50 +02:00
|
|
|
foreach (const QString &file, params.sourceFiles)
|
2014-05-16 15:51:04 -04:00
|
|
|
sourceProcessor->removeFromCache(file);
|
2012-11-23 11:47:39 +01:00
|
|
|
|
|
|
|
|
const int sourceCount = sources.size();
|
2014-09-04 14:59:50 +02:00
|
|
|
QStringList files = sources + headers;
|
2012-11-23 11:47:39 +01:00
|
|
|
|
2014-09-04 14:59:50 +02:00
|
|
|
sourceProcessor->setTodo(files.toSet());
|
2012-11-23 11:47:39 +01:00
|
|
|
|
2014-09-15 00:12:27 +02:00
|
|
|
const QString conf = CppModelManager::configurationFileName();
|
2012-11-23 11:47:39 +01:00
|
|
|
bool processingHeaders = false;
|
|
|
|
|
|
2014-03-10 15:22:46 -03:00
|
|
|
CppModelManager *cmm = CppModelManager::instance();
|
2016-01-13 14:12:15 +01:00
|
|
|
const ProjectPartHeaderPaths fallbackHeaderPaths = cmm->headerPaths();
|
2015-02-15 23:43:26 +02:00
|
|
|
const CPlusPlus::LanguageFeatures defaultFeatures =
|
|
|
|
|
CPlusPlus::LanguageFeatures::defaultFeatures();
|
2012-11-23 11:47:39 +01:00
|
|
|
for (int i = 0; i < files.size(); ++i) {
|
|
|
|
|
if (future.isPaused())
|
|
|
|
|
future.waitForResume();
|
|
|
|
|
|
|
|
|
|
if (future.isCanceled())
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
const QString fileName = files.at(i);
|
2015-02-15 23:43:26 +02:00
|
|
|
const QList<ProjectPart::Ptr> parts = cmm->projectPart(fileName);
|
|
|
|
|
const CPlusPlus::LanguageFeatures languageFeatures = parts.isEmpty()
|
|
|
|
|
? defaultFeatures
|
|
|
|
|
: parts.first()->languageFeatures;
|
|
|
|
|
sourceProcessor->setLanguageFeatures(languageFeatures);
|
2012-11-23 11:47:39 +01:00
|
|
|
|
|
|
|
|
const bool isSourceFile = i < sourceCount;
|
2013-07-17 00:01:45 +03:00
|
|
|
if (isSourceFile) {
|
2014-05-16 15:51:04 -04:00
|
|
|
(void) sourceProcessor->run(conf);
|
2013-07-24 11:59:39 +02:00
|
|
|
} else if (!processingHeaders) {
|
2014-05-16 15:51:04 -04:00
|
|
|
(void) sourceProcessor->run(conf);
|
2012-11-23 11:47:39 +01:00
|
|
|
|
|
|
|
|
processingHeaders = true;
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-13 14:12:15 +01:00
|
|
|
ProjectPartHeaderPaths headerPaths = parts.isEmpty()
|
2014-06-25 17:23:19 +02:00
|
|
|
? fallbackHeaderPaths
|
|
|
|
|
: parts.first()->headerPaths;
|
|
|
|
|
sourceProcessor->setHeaderPaths(headerPaths);
|
2014-05-16 15:51:04 -04:00
|
|
|
sourceProcessor->run(fileName);
|
2012-11-23 11:47:39 +01:00
|
|
|
|
2014-05-16 15:51:04 -04:00
|
|
|
future.setProgressValue(files.size() - sourceProcessor->todo().size());
|
2012-11-23 11:47:39 +01:00
|
|
|
|
|
|
|
|
if (isSourceFile)
|
2014-05-16 15:51:04 -04:00
|
|
|
sourceProcessor->resetEnvironment();
|
2012-11-23 11:47:39 +01:00
|
|
|
}
|
2014-08-05 11:34:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void parse(QFutureInterface<void> &future, const ParseParams params)
|
|
|
|
|
{
|
2014-09-04 14:59:50 +02:00
|
|
|
const QSet<QString> &files = params.sourceFiles;
|
2014-08-05 11:34:52 +02:00
|
|
|
if (files.isEmpty())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
future.setProgressRange(0, files.size());
|
|
|
|
|
|
|
|
|
|
if (FindErrorsIndexing)
|
|
|
|
|
indexFindErrors(future, params);
|
|
|
|
|
else
|
|
|
|
|
index(future, params);
|
2012-11-23 11:47:39 +01:00
|
|
|
|
|
|
|
|
future.setProgressValue(files.size());
|
2014-08-05 11:34:52 +02:00
|
|
|
CppModelManager::instance()->finishedRefreshingSourceFiles(files);
|
2012-11-23 11:47:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class BuiltinSymbolSearcher: public SymbolSearcher
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
BuiltinSymbolSearcher(const CPlusPlus::Snapshot &snapshot,
|
|
|
|
|
Parameters parameters, QSet<QString> fileNames)
|
|
|
|
|
: m_snapshot(snapshot)
|
|
|
|
|
, m_parameters(parameters)
|
|
|
|
|
, m_fileNames(fileNames)
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
~BuiltinSymbolSearcher()
|
|
|
|
|
{}
|
|
|
|
|
|
2014-01-13 16:17:34 +01:00
|
|
|
void runSearch(QFutureInterface<Core::SearchResultItem> &future)
|
2012-11-23 11:47:39 +01:00
|
|
|
{
|
|
|
|
|
future.setProgressRange(0, m_snapshot.size());
|
|
|
|
|
future.setProgressValue(0);
|
|
|
|
|
int progress = 0;
|
|
|
|
|
|
2014-02-25 16:16:11 +01:00
|
|
|
SearchSymbols search(CppToolsPlugin::stringTable());
|
2012-11-23 11:47:39 +01:00
|
|
|
search.setSymbolsToSearchFor(m_parameters.types);
|
|
|
|
|
CPlusPlus::Snapshot::const_iterator it = m_snapshot.begin();
|
|
|
|
|
|
2014-01-13 16:17:34 +01:00
|
|
|
QString findString = (m_parameters.flags & Core::FindRegularExpression
|
2016-11-22 13:59:54 +01:00
|
|
|
? m_parameters.text : QRegularExpression::escape(m_parameters.text));
|
2014-01-13 16:17:34 +01:00
|
|
|
if (m_parameters.flags & Core::FindWholeWords)
|
2012-11-23 11:47:39 +01:00
|
|
|
findString = QString::fromLatin1("\\b%1\\b").arg(findString);
|
2016-11-22 13:59:54 +01:00
|
|
|
QRegularExpression matcher(findString, (m_parameters.flags & Core::FindCaseSensitively
|
|
|
|
|
? QRegularExpression::NoPatternOption
|
|
|
|
|
: QRegularExpression::CaseInsensitiveOption));
|
|
|
|
|
matcher.optimize();
|
2012-11-23 11:47:39 +01:00
|
|
|
while (it != m_snapshot.end()) {
|
|
|
|
|
if (future.isPaused())
|
|
|
|
|
future.waitForResume();
|
|
|
|
|
if (future.isCanceled())
|
|
|
|
|
break;
|
|
|
|
|
if (m_fileNames.isEmpty() || m_fileNames.contains(it.value()->fileName())) {
|
2014-01-13 16:17:34 +01:00
|
|
|
QVector<Core::SearchResultItem> resultItems;
|
2014-03-14 13:54:31 +01:00
|
|
|
auto filter = [&](const IndexItem::Ptr &info) -> IndexItem::VisitorResult {
|
2016-11-22 13:59:54 +01:00
|
|
|
if (matcher.match(info->symbolName()).hasMatch()) {
|
2014-03-13 14:15:58 +01:00
|
|
|
QString text = info->symbolName();
|
|
|
|
|
QString scope = info->symbolScope();
|
2014-04-14 16:52:01 +02:00
|
|
|
if (info->type() == IndexItem::Function) {
|
2013-09-12 15:26:55 +02:00
|
|
|
QString name;
|
2014-03-13 14:15:58 +01:00
|
|
|
info->unqualifiedNameAndScope(info->symbolName(), &name, &scope);
|
|
|
|
|
text = name + info->symbolType();
|
2014-04-14 16:52:01 +02:00
|
|
|
} else if (info->type() == IndexItem::Declaration){
|
2014-09-01 11:18:21 +02:00
|
|
|
text = info->representDeclaration();
|
2013-09-12 15:26:55 +02:00
|
|
|
}
|
2013-08-20 17:16:25 +02:00
|
|
|
|
2014-01-13 16:17:34 +01:00
|
|
|
Core::SearchResultItem item;
|
2013-09-12 15:26:55 +02:00
|
|
|
item.path = scope.split(QLatin1String("::"), QString::SkipEmptyParts);
|
2013-08-20 17:16:25 +02:00
|
|
|
item.text = text;
|
2014-03-13 14:15:58 +01:00
|
|
|
item.icon = info->icon();
|
2012-11-23 11:47:39 +01:00
|
|
|
item.userData = qVariantFromValue(info);
|
|
|
|
|
resultItems << item;
|
|
|
|
|
}
|
2014-03-14 13:54:31 +01:00
|
|
|
|
|
|
|
|
return IndexItem::Recurse;
|
|
|
|
|
};
|
|
|
|
|
search(it.value())->visitAllChildren(filter);
|
2012-11-23 11:47:39 +01:00
|
|
|
if (!resultItems.isEmpty())
|
|
|
|
|
future.reportResults(resultItems);
|
|
|
|
|
}
|
|
|
|
|
++it;
|
|
|
|
|
++progress;
|
|
|
|
|
future.setProgressValue(progress);
|
|
|
|
|
}
|
|
|
|
|
if (future.isPaused())
|
|
|
|
|
future.waitForResume();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
const CPlusPlus::Snapshot m_snapshot;
|
|
|
|
|
const Parameters m_parameters;
|
|
|
|
|
const QSet<QString> m_fileNames;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // anonymous namespace
|
|
|
|
|
|
2012-11-28 09:52:19 +01:00
|
|
|
BuiltinIndexingSupport::BuiltinIndexingSupport()
|
2012-11-23 11:47:39 +01:00
|
|
|
{
|
|
|
|
|
m_synchronizer.setCancelOnWait(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BuiltinIndexingSupport::~BuiltinIndexingSupport()
|
|
|
|
|
{}
|
|
|
|
|
|
2014-09-04 14:59:50 +02:00
|
|
|
QFuture<void> BuiltinIndexingSupport::refreshSourceFiles(const QSet<QString> &sourceFiles,
|
2014-09-15 00:12:27 +02:00
|
|
|
CppModelManager::ProgressNotificationMode mode)
|
2012-11-23 11:47:39 +01:00
|
|
|
{
|
|
|
|
|
CppModelManager *mgr = CppModelManager::instance();
|
|
|
|
|
|
2014-08-05 11:04:37 +02:00
|
|
|
ParseParams params;
|
2016-08-16 13:37:49 +02:00
|
|
|
params.indexerFileSizeLimitInMb = indexerFileSizeLimitInMb();
|
2014-08-05 11:04:37 +02:00
|
|
|
params.headerPaths = mgr->headerPaths();
|
|
|
|
|
params.workingCopy = mgr->workingCopy();
|
2016-12-06 11:00:27 +01:00
|
|
|
params.workingCopy.insert(mgr->configurationFileName(), mgr->definedMacros());
|
2014-08-05 11:04:37 +02:00
|
|
|
params.sourceFiles = sourceFiles;
|
2012-11-23 11:47:39 +01:00
|
|
|
|
2016-02-17 23:27:41 +02:00
|
|
|
QFuture<void> result = Utils::runAsync(mgr->sharedThreadPool(), parse, params);
|
2012-11-23 11:47:39 +01:00
|
|
|
|
|
|
|
|
if (m_synchronizer.futures().size() > 10) {
|
|
|
|
|
QList<QFuture<void> > futures = m_synchronizer.futures();
|
|
|
|
|
|
|
|
|
|
m_synchronizer.clearFutures();
|
|
|
|
|
|
|
|
|
|
foreach (const QFuture<void> &future, futures) {
|
2013-07-24 11:59:39 +02:00
|
|
|
if (!(future.isFinished() || future.isCanceled()))
|
2012-11-23 11:47:39 +01:00
|
|
|
m_synchronizer.addFuture(future);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_synchronizer.addFuture(result);
|
|
|
|
|
|
2014-09-15 00:12:27 +02:00
|
|
|
if (mode == CppModelManager::ForcedProgressNotification || sourceFiles.count() > 1) {
|
2014-04-17 15:14:14 +02:00
|
|
|
Core::ProgressManager::addTask(result, QCoreApplication::translate("CppTools::Internal::BuiltinIndexingSupport", "Parsing C/C++ Files"),
|
2013-09-03 15:18:37 +02:00
|
|
|
CppTools::Constants::TASK_INDEX);
|
2012-11-23 11:47:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SymbolSearcher *BuiltinIndexingSupport::createSymbolSearcher(SymbolSearcher::Parameters parameters, QSet<QString> fileNames)
|
|
|
|
|
{
|
|
|
|
|
return new BuiltinSymbolSearcher(CppModelManager::instance()->snapshot(), parameters, fileNames);
|
|
|
|
|
}
|
2014-08-05 11:34:52 +02:00
|
|
|
|
|
|
|
|
bool BuiltinIndexingSupport::isFindErrorsIndexingActive()
|
|
|
|
|
{
|
|
|
|
|
return FindErrorsIndexing;
|
|
|
|
|
}
|