summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2014-06-06 14:41:19 +0200
committerErik Verbruggen <erik.verbruggen@digia.com>2014-06-18 11:04:35 +0200
commit13d2d499ab95de10330fdfd44d53e50bf5a853b9 (patch)
tree15b3f33646e333e44ea10c65d859f22e878c574a /src/plugins/cpptools
parent528fa525bc415a071d6a69d12f2f2c8c4f406b97 (diff)
downloadqt-creator-13d2d499ab95de10330fdfd44d53e50bf5a853b9.tar.gz
C++: move post-sourceprocessing action into callback.
Change-Id: Iac6c9fe1ada27ac0d96417e490cc5723e6969541 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r--src/plugins/cpptools/builtinindexingsupport.cpp5
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp18
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h3
-rw-r--r--src/plugins/cpptools/cppsnapshotupdater.cpp26
-rw-r--r--src/plugins/cpptools/cppsourceprocessor.cpp32
-rw-r--r--src/plugins/cpptools/cppsourceprocessor.h17
-rw-r--r--src/plugins/cpptools/cppsourceprocessor_test.cpp7
-rw-r--r--src/plugins/cpptools/includeutils.cpp6
8 files changed, 58 insertions, 56 deletions
diff --git a/src/plugins/cpptools/builtinindexingsupport.cpp b/src/plugins/cpptools/builtinindexingsupport.cpp
index ccad1e0e73..60a33ad7ad 100644
--- a/src/plugins/cpptools/builtinindexingsupport.cpp
+++ b/src/plugins/cpptools/builtinindexingsupport.cpp
@@ -84,7 +84,7 @@ static void parse(QFutureInterface<void> &future,
}
future.setProgressValue(files.size());
- sourceProcessor->modelManager()->finishedRefreshingSourceFiles(files);
+ cmm->finishedRefreshingSourceFiles(files);
delete sourceProcessor;
}
@@ -184,7 +184,8 @@ QFuture<void> BuiltinIndexingSupport::refreshSourceFiles(const QStringList &sour
CppModelManager *mgr = CppModelManager::instance();
const WorkingCopy workingCopy = mgr->workingCopy();
- CppSourceProcessor *preproc = new CppSourceProcessor(mgr, m_dumpFileNameWhileParsing);
+ CppSourceProcessor *preproc = CppModelManager::createSourceProcessor();
+ preproc->setDumpFileNameWhileParsing(m_dumpFileNameWhileParsing);
preproc->setRevision(++m_revision);
preproc->setIncludePaths(mgr->includePaths());
preproc->setFrameworkPaths(mgr->frameworkPaths());
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 98664ae287..7946163439 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -160,6 +160,24 @@ QStringList CppModelManager::timeStampModifiedFiles(const QList<Document::Ptr> &
return sourceFiles;
}
+/*!
+ * \brief createSourceProcessor Create a new source processor, which will signal the
+ * model manager when a document has been processed.
+ *
+ * Indexed file is truncated version of fully parsed document: copy of source
+ * code and full AST will be dropped when indexing is done.
+ *
+ * \return a new source processor object, which the caller needs to delete when finished.
+ */
+CppSourceProcessor *CppModelManager::createSourceProcessor()
+{
+ CppModelManager *that = instance();
+ return new CppSourceProcessor(that->snapshot(), [=](const Document::Ptr &doc) {
+ that->emitDocumentUpdated(doc);
+ doc->releaseSourceAndAST();
+ });
+}
+
void CppModelManager::updateModifiedSourceFiles()
{
const Snapshot snapshot = this->snapshot();
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 7c053c3c22..bbdb2d6e79 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -49,6 +49,7 @@ class CppEditorSupport;
namespace Internal {
class CppFindReferences;
+class CppSourceProcessor;
class CppModelManager : public CppTools::CppModelManagerInterface
{
@@ -155,6 +156,8 @@ public:
static QStringList timeStampModifiedFiles(const QList<Document::Ptr> &documentsToCheck);
+ static CppSourceProcessor *createSourceProcessor();
+
signals:
void gcFinished(); // Needed for tests.
diff --git a/src/plugins/cpptools/cppsnapshotupdater.cpp b/src/plugins/cpptools/cppsnapshotupdater.cpp
index c37473d0c7..63dc943d96 100644
--- a/src/plugins/cpptools/cppsnapshotupdater.cpp
+++ b/src/plugins/cpptools/cppsnapshotupdater.cpp
@@ -159,7 +159,17 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy)
workingCopy.insert(editorDefinesFileName, m_editorDefines);
}
- CppSourceProcessor sourceProcessor(modelManager, m_snapshot);
+ CppSourceProcessor sourceProcessor(m_snapshot, [&](const Document::Ptr &doc) {
+ const QString fileName = doc->fileName();
+ const bool isInEditor = fileName == fileInEditor();
+ Document::Ptr otherDoc = modelManager->document(fileName);
+ unsigned newRev = otherDoc.isNull() ? 1U : otherDoc->revision() + 1;
+ if (isInEditor)
+ newRev = qMax(rev + 1, newRev);
+ doc->setRevision(newRev);
+ modelManager->emitDocumentUpdated(doc);
+ doc->releaseSourceAndAST();
+ });
Snapshot globalSnapshot = modelManager->snapshot();
globalSnapshot.remove(fileInEditor());
sourceProcessor.setGlobalSnapshot(globalSnapshot);
@@ -185,20 +195,6 @@ void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy)
}
m_snapshot = newSnapshot;
m_deps.build(m_snapshot);
-
- foreach (Document::Ptr doc, m_snapshot) {
- QString fileName = doc->fileName();
- if (doc->revision() == 0) {
- Document::Ptr otherDoc = globalSnapshot.document(fileName);
- doc->setRevision(otherDoc.isNull() ? 0 : otherDoc->revision());
- }
- if (fileName != fileInEditor())
- doc->releaseSourceAndAST();
- }
-
- QTC_CHECK(document());
- if (Document::Ptr doc = document())
- doc->setRevision(rev + 1);
}
}
diff --git a/src/plugins/cpptools/cppsourceprocessor.cpp b/src/plugins/cpptools/cppsourceprocessor.cpp
index 5ddbfcfcd3..64fa8dca0b 100644
--- a/src/plugins/cpptools/cppsourceprocessor.cpp
+++ b/src/plugins/cpptools/cppsourceprocessor.cpp
@@ -17,9 +17,8 @@
* \class CppTools::Internal::CppSourceProcessor
* \brief The CppSourceProcessor class updates set of indexed C++ files.
*
- * Indexed file is truncated version of fully parsed document: copy of source
- * code and full AST will be dropped when indexing is done. Working copy ensures
- * that documents with most recent copy placed in memory will be parsed correctly.
+ * Working copy ensures that documents with most recent copy placed in memory will be parsed
+ * correctly.
*
* \sa CPlusPlus::Document
* \sa CppTools::CppModelManagerInterface::WorkingCopy
@@ -79,24 +78,10 @@ inline const Macro revision(const CppModelManagerInterface::WorkingCopy &working
} // anonymous namespace
-CppSourceProcessor::CppSourceProcessor(QPointer<CppModelManager> modelManager,
- bool dumpFileNameWhileParsing)
- : m_snapshot(modelManager->snapshot()),
- m_modelManager(modelManager),
- m_dumpFileNameWhileParsing(dumpFileNameWhileParsing),
- m_preprocess(this, &m_env),
- m_revision(0),
- m_defaultCodec(Core::EditorManager::defaultTextCodec())
-{
- m_preprocess.setKeepComments(true);
-}
-
-CppSourceProcessor::CppSourceProcessor(QPointer<CppModelManager> modelManager,
- const Snapshot &snapshot,
- bool dumpFileNameWhileParsing)
+CppSourceProcessor::CppSourceProcessor(const Snapshot &snapshot, DocumentCallback documentFinished)
: m_snapshot(snapshot),
- m_modelManager(modelManager),
- m_dumpFileNameWhileParsing(dumpFileNameWhileParsing),
+ m_documentFinished(documentFinished),
+ m_dumpFileNameWhileParsing(false),
m_preprocess(this, &m_env),
m_revision(0),
m_defaultCodec(Core::EditorManager::defaultTextCodec())
@@ -417,7 +402,7 @@ void CppSourceProcessor::sourceNeeded(unsigned line, const QString &fileName, In
}
if (m_included.contains(absoluteFileName))
return; // We've already seen this file.
- if (absoluteFileName != modelManager()->configurationFileName())
+ if (!isInjectedFile(absoluteFileName))
m_included.insert(absoluteFileName);
// Already in snapshot? Use it!
@@ -470,10 +455,7 @@ void CppSourceProcessor::sourceNeeded(unsigned line, const QString &fileName, In
document->check(m_workingCopy.contains(document->fileName()) ? Document::FullCheck
: Document::FastCheck);
- if (m_modelManager) {
- m_modelManager->emitDocumentUpdated(document);
- document->releaseSourceAndAST();
- }
+ m_documentFinished(document);
m_snapshot.insert(document);
m_todo.remove(absoluteFileName);
diff --git a/src/plugins/cpptools/cppsourceprocessor.h b/src/plugins/cpptools/cppsourceprocessor.h
index cd386fb0a0..b5db3b7f49 100644
--- a/src/plugins/cpptools/cppsourceprocessor.h
+++ b/src/plugins/cpptools/cppsourceprocessor.h
@@ -5,6 +5,7 @@
#include <cplusplus/PreprocessorEnvironment.h>
#include <cplusplus/pp-engine.h>
+#include <utils/function.h>
#include <utils/qtcoverride.h>
#include <QHash>
@@ -19,21 +20,23 @@ QT_END_NAMESPACE
namespace CppTools {
namespace Internal {
-class CppModelManager;
-
// Documentation inside.
class CppSourceProcessor: public CPlusPlus::Client
{
Q_DISABLE_COPY(CppSourceProcessor)
public:
+ typedef std::function<void (const CPlusPlus::Document::Ptr &)> DocumentCallback;
+
+public:
static QString cleanPath(const QString &path);
- CppSourceProcessor(QPointer<CppModelManager> modelManager, bool dumpFileNameWhileParsing = false);
- CppSourceProcessor(QPointer<CppModelManager> modelManager, const CPlusPlus::Snapshot &snapshot,
- bool dumpFileNameWhileParsing = false);
+ CppSourceProcessor(const CPlusPlus::Snapshot &snapshot, DocumentCallback documentFinished);
~CppSourceProcessor();
+ void setDumpFileNameWhileParsing(bool onoff)
+ { m_dumpFileNameWhileParsing = onoff; }
+
void setRevision(unsigned revision);
void setWorkingCopy(const CppTools::CppModelManagerInterface::WorkingCopy &workingCopy);
void setIncludePaths(const QStringList &includePaths);
@@ -46,12 +49,10 @@ public:
CPlusPlus::Snapshot snapshot() const { return m_snapshot; }
const QSet<QString> &todo() const { return m_todo; }
- CppModelManager *modelManager() const { return m_modelManager.data(); }
void setGlobalSnapshot(const CPlusPlus::Snapshot &snapshot) { m_globalSnapshot = snapshot; }
private:
- CppSourceProcessor();
void addFrameworkPath(const QString &frameworkPath);
CPlusPlus::Document::Ptr switchCurrentDocument(CPlusPlus::Document::Ptr doc);
@@ -84,7 +85,7 @@ private:
private:
CPlusPlus::Snapshot m_snapshot;
CPlusPlus::Snapshot m_globalSnapshot;
- QPointer<CppModelManager> m_modelManager;
+ DocumentCallback m_documentFinished;
bool m_dumpFileNameWhileParsing;
CPlusPlus::Environment m_env;
CPlusPlus::Preprocessor m_preprocess;
diff --git a/src/plugins/cpptools/cppsourceprocessor_test.cpp b/src/plugins/cpptools/cppsourceprocessor_test.cpp
index a0b4022682..57974295f1 100644
--- a/src/plugins/cpptools/cppsourceprocessor_test.cpp
+++ b/src/plugins/cpptools/cppsourceprocessor_test.cpp
@@ -69,9 +69,10 @@ public:
if (!scopedFile.writtenSuccessfully())
return Document::Ptr();
- CppSourceProcessor sourceProcessor((QPointer<CppModelManager>(m_cmm)));
- sourceProcessor.setIncludePaths(QStringList(TestIncludePaths::directoryOfTestFile()));
- sourceProcessor.run(fileName);
+ QScopedPointer<CppSourceProcessor> sourceProcessor(
+ CppModelManager::createSourceProcessor());
+ sourceProcessor->setIncludePaths(QStringList(TestIncludePaths::directoryOfTestFile()));
+ sourceProcessor->run(fileName);
Document::Ptr document = m_cmm->document(fileName);
return document;
diff --git a/src/plugins/cpptools/includeutils.cpp b/src/plugins/cpptools/includeutils.cpp
index c8077ab8de..252a217338 100644
--- a/src/plugins/cpptools/includeutils.cpp
+++ b/src/plugins/cpptools/includeutils.cpp
@@ -517,9 +517,9 @@ static QList<Include> includesForSource(const QByteArray &source)
using namespace CppTools::Internal;
CppModelManager *cmm = CppModelManager::instance();
cmm->GC();
- CppSourceProcessor sourceProcessor((QPointer<CppModelManager>(cmm)));
- sourceProcessor.setIncludePaths(QStringList(TestIncludePaths::globalIncludePath()));
- sourceProcessor.run(fileName);
+ QScopedPointer<CppSourceProcessor> sourceProcessor(CppModelManager::createSourceProcessor());
+ sourceProcessor->setIncludePaths(QStringList(TestIncludePaths::globalIncludePath()));
+ sourceProcessor->run(fileName);
Document::Ptr document = cmm->document(fileName);
return document->resolvedIncludes();