summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cpptoolsplugin.cpp
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2013-08-25 22:42:37 +0300
committerOrgad Shaneh <orgads@gmail.com>2013-09-03 14:25:05 +0200
commitadee8336bbc1365149dbcd33b0e05a2096c4dfa8 (patch)
tree1cfb0a49b1ea3d770bdb2f94641bf2443ebf2ee3 /src/plugins/cpptools/cpptoolsplugin.cpp
parentd0385537b2a879590b9b34b922aaacada4995705 (diff)
downloadqt-creator-adee8336bbc1365149dbcd33b0e05a2096c4dfa8.tar.gz
C++: Custom directory list for Switch Header/Source
Some projects use separate directories for sources and headers. An example tree: * |-- src |-- foo.cpp |-- include |-- foo.h Allow the user to specify directories for finding out-of-project related header/source files, in addition to current directory Task-number: QTCREATORBUG-8883 Change-Id: I57215c8f2feffcc246d0d161798290861bcfcdd4 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cpptoolsplugin.cpp')
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.cpp57
1 files changed, 48 insertions, 9 deletions
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 066bc93e07..2d027ad091 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -52,6 +52,9 @@
#include <utils/hostosinfo.h>
#include <utils/qtcassert.h>
+#ifdef Q_OS_WIN
+#include <utils/winutils.h>
+#endif
#include <QtPlugin>
#include <QFileInfo>
@@ -88,6 +91,21 @@ CppToolsPlugin *CppToolsPlugin::instance()
return m_instance;
}
+void CppToolsPlugin::clearHeaderSourceCache()
+{
+ m_headerSourceMapping.clear();
+}
+
+const QStringList &CppToolsPlugin::headerSearchPaths()
+{
+ return m_instance->m_fileSettings->headerSearchPaths;
+}
+
+const QStringList &CppToolsPlugin::sourceSearchPaths()
+{
+ return m_instance->m_fileSettings->sourceSearchPaths;
+}
+
bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error)
{
Q_UNUSED(arguments)
@@ -231,6 +249,14 @@ static QStringList baseNameWithAllSuffixes(const QString &baseName, const QStrin
return result;
}
+static QStringList baseDirWithAllDirectories(const QDir &baseDir, const QStringList &directories)
+{
+ QStringList result;
+ foreach (const QString &dir, directories)
+ result << QDir::cleanPath(baseDir.absoluteFilePath(dir));
+ return result;
+}
+
static int commonStringLength(const QString &s1, const QString &s2)
{
int length = qMin(s1.length(), s2.length());
@@ -307,15 +333,28 @@ QString correspondingHeaderOrSource(const QString &fileName, bool *wasHeader)
}
const QDir absoluteDir = fi.absoluteDir();
-
- // Try to find a file in the same directory first
- foreach (const QString &candidateFileName, candidateFileNames) {
- const QFileInfo candidateFi(absoluteDir, candidateFileName);
- if (candidateFi.isFile()) {
- m_headerSourceMapping[fi.absoluteFilePath()] = candidateFi.absoluteFilePath();
- if (!isHeader || !baseName.endsWith(privateHeaderSuffix))
- m_headerSourceMapping[candidateFi.absoluteFilePath()] = fi.absoluteFilePath();
- return candidateFi.absoluteFilePath();
+ QStringList candidateDirs(absoluteDir.absolutePath());
+ // If directory is not root, try matching against its siblings
+ const QStringList searchPaths = isHeader ? m_instance->sourceSearchPaths()
+ : m_instance->headerSearchPaths();
+ candidateDirs += baseDirWithAllDirectories(absoluteDir, searchPaths);
+
+ // Try to find a file in the same or sibling directories first
+ foreach (const QString &candidateDir, candidateDirs) {
+ foreach (const QString &candidateFileName, candidateFileNames) {
+ const QString candidateFilePath = candidateDir + QLatin1Char('/') + candidateFileName;
+#ifdef Q_OS_WIN
+ const QString normalized = Utils::normalizePathName(candidateFilePath);
+#else
+ const QString normalized = candidateFilePath;
+#endif
+ const QFileInfo candidateFi(normalized);
+ if (candidateFi.isFile()) {
+ m_headerSourceMapping[fi.absoluteFilePath()] = candidateFi.absoluteFilePath();
+ if (!isHeader || !baseName.endsWith(privateHeaderSuffix))
+ m_headerSourceMapping[candidateFi.absoluteFilePath()] = fi.absoluteFilePath();
+ return candidateFi.absoluteFilePath();
+ }
}
}