diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 69b0e48271a..39401037851 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -40,9 +40,9 @@ #include #include -#include -#include -#include +#include +#include +#include using namespace CPlusPlus; @@ -419,3 +419,78 @@ void Snapshot::simplified_helper(Document::Ptr doc, Snapshot *snapshot) const } } } + +QStringList Snapshot::dependsOn(const QString &fileName) const +{ + const int n = size(); + + QVector files(n); + QHash fileIndex; + QHash > includes; + + QMapIterator it(*this); + for (int i = 0; it.hasNext(); ++i) { + it.next(); + files[i] = it.key(); + fileIndex[it.key()] = i; + } + + int index = fileIndex.value(fileName, -1); + if (index == -1) { + qWarning() << fileName << "not in the snapshot"; + return QStringList(); + } + + QVector includeMap(files.size()); + + for (int i = 0; i < files.size(); ++i) { + if (Document::Ptr doc = value(files.at(i))) { + QBitArray bitmap(files.size()); + QList directIncludes; + + foreach (const QString &includedFile, doc->includedFiles()) { + int index = fileIndex.value(includedFile); + + if (index == -1) + continue; + else if (! directIncludes.contains(index)) + directIncludes.append(index); + + bitmap.setBit(index, true); + } + + includeMap[i] = bitmap; + includes[i] = directIncludes; + } + } + + bool changed; + + do { + changed = false; + + for (int i = 0; i < files.size(); ++i) { + QBitArray bitmap = includeMap.value(i); + QBitArray previousBitmap = bitmap; + + foreach (int includedFileIndex, includes.value(i)) { + bitmap |= includeMap.value(includedFileIndex); + } + + if (bitmap != previousBitmap) { + includeMap[i] = bitmap; + changed = true; + } + } + } while (changed); + + QStringList deps; + for (int i = 0; i < files.size(); ++i) { + const QBitArray &bits = includeMap.at(i); + + if (bits.testBit(index)) + deps.append(files.at(i)); + } + + return deps; +} diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index 4f1c96629dd..109be8e362e 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -291,6 +291,8 @@ public: QSharedPointer globalNamespaceBinding(Document::Ptr doc) const; + QStringList dependsOn(const QString &fileName) const; + void insert(Document::Ptr doc); using _Base::insert;