forked from qt-creator/qt-creator
Merge branch 'master' of git@scm.dev.nokia.troll.no:creator/mainline
This commit is contained in:
@@ -40,9 +40,9 @@
|
|||||||
#include <AST.h>
|
#include <AST.h>
|
||||||
#include <Scope.h>
|
#include <Scope.h>
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QtCore/QByteArray>
|
||||||
#include <QFile>
|
#include <QtCore/QBitArray>
|
||||||
#include <QtDebug>
|
#include <QtCore/QtDebug>
|
||||||
|
|
||||||
using namespace CPlusPlus;
|
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<QString> files(n);
|
||||||
|
QHash<QString, int> fileIndex;
|
||||||
|
QHash<int, QList<int> > includes;
|
||||||
|
|
||||||
|
QMapIterator<QString, Document::Ptr> 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<QBitArray> includeMap(files.size());
|
||||||
|
|
||||||
|
for (int i = 0; i < files.size(); ++i) {
|
||||||
|
if (Document::Ptr doc = value(files.at(i))) {
|
||||||
|
QBitArray bitmap(files.size());
|
||||||
|
QList<int> 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;
|
||||||
|
}
|
||||||
|
@@ -291,6 +291,8 @@ public:
|
|||||||
|
|
||||||
QSharedPointer<NamespaceBinding> globalNamespaceBinding(Document::Ptr doc) const;
|
QSharedPointer<NamespaceBinding> globalNamespaceBinding(Document::Ptr doc) const;
|
||||||
|
|
||||||
|
QStringList dependsOn(const QString &fileName) const;
|
||||||
|
|
||||||
void insert(Document::Ptr doc);
|
void insert(Document::Ptr doc);
|
||||||
|
|
||||||
using _Base::insert;
|
using _Base::insert;
|
||||||
|
Reference in New Issue
Block a user