summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/DependencyTable.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-03-17 12:34:29 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-03-17 14:20:17 +0100
commit1cc5e1fe01d83ead385ec14411e744b6cd145c85 (patch)
tree2756facd84b1919e59b70335634518beee1f09f0 /src/libs/cplusplus/DependencyTable.cpp
parent6ed0cd5d32febfce07ae43d6d67624a46ce2fa82 (diff)
downloadqt-creator-1cc5e1fe01d83ead385ec14411e744b6cd145c85.tar.gz
Put the include depenency table into a separate class, and cache it when possible.
Diffstat (limited to 'src/libs/cplusplus/DependencyTable.cpp')
-rw-r--r--src/libs/cplusplus/DependencyTable.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/libs/cplusplus/DependencyTable.cpp b/src/libs/cplusplus/DependencyTable.cpp
new file mode 100644
index 0000000000..20871e5b52
--- /dev/null
+++ b/src/libs/cplusplus/DependencyTable.cpp
@@ -0,0 +1,150 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "DependencyTable.h"
+#include "CppDocument.h"
+
+#include <QtCore/QDebug>
+
+using namespace CPlusPlus;
+
+QStringList DependencyTable::filesDependingOn(const QString &fileName) const
+{
+ int index = fileIndex.value(fileName, -1);
+ if (index == -1) {
+ qWarning() << fileName << "not in the snapshot";
+ return QStringList();
+ }
+
+ 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;
+}
+
+QHash<QString, QStringList> DependencyTable::dependencyTable() const
+{
+ QHash<QString, QStringList> depMap;
+
+ for (int index = 0; index < files.size(); ++index) {
+ 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));
+ }
+ depMap[files.at(index)] = deps;
+ }
+
+ return depMap;
+}
+
+bool DependencyTable::isValidFor(const Snapshot &snapshot) const
+{
+ const int documentCount = snapshot.size();
+ if (documentCount != files.size()
+ || documentCount != includesPerFile.size()
+ || documentCount != includeMap.size())
+ return false;
+
+ for (Snapshot::const_iterator it = snapshot.begin(); it != snapshot.end(); ++it) {
+ QHash<QString, QStringList>::const_iterator i = includesPerFile.find(it.key());
+ if (i == includesPerFile.end())
+ return false;
+
+ if (i.value() != it.value()->includedFiles())
+ return false;
+ }
+
+ return true;
+}
+
+void DependencyTable::build(const Snapshot &snapshot)
+{
+ const int documentCount = snapshot.size();
+ files.resize(documentCount);
+ includeMap.resize(documentCount);
+
+ int i = 0;
+ for (Snapshot::const_iterator it = snapshot.begin(); it != snapshot.end();
+ ++it, ++i) {
+ files[i] = it.key();
+ fileIndex[it.key()] = i;
+ }
+
+ for (int i = 0; i < files.size(); ++i) {
+ const QString fileName = files.at(i);
+ if (Document::Ptr doc = snapshot.document(files.at(i))) {
+ QBitArray bitmap(files.size());
+ QList<int> directIncludes;
+ const QStringList documentIncludes = doc->includedFiles();
+ includesPerFile.insert(fileName, documentIncludes);
+
+ foreach (const QString &includedFile, documentIncludes) {
+ 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);
+}