summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFinn Brudal <Finn.Brudal@kongsberg.com>2016-03-11 15:10:28 +0100
committerFinn Brudal <Finn.Brudal@kongsberg.com>2016-05-24 07:46:24 +0000
commite6729c487d57a45341b8e1baa0e0a650520fd32e (patch)
tree24bed0ad1cbe28d5752bf9103fa4eb90fcca751f
parent5ee38fda5babeb0907508b1a5d87eb0d324b8c0a (diff)
downloadqt-creator-e6729c487d57a45341b8e1baa0e0a650520fd32e.tar.gz
CppTools: Fix include filename cache logic
When resolution of a local include fails, a global resolution must be done. When doing so, re-use the cache. This will speed up the resolution for projects that mainly use the local include directives also for global headers. Change-Id: I7488c1977a44b881f90faa863d22f6276c20b147 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r--src/plugins/cpptools/cppsourceprocessor.cpp39
-rw-r--r--src/plugins/cpptools/cppsourceprocessor.h3
2 files changed, 20 insertions, 22 deletions
diff --git a/src/plugins/cpptools/cppsourceprocessor.cpp b/src/plugins/cpptools/cppsourceprocessor.cpp
index 390380e677..ac6ccd0950 100644
--- a/src/plugins/cpptools/cppsourceprocessor.cpp
+++ b/src/plugins/cpptools/cppsourceprocessor.cpp
@@ -237,23 +237,6 @@ bool CppSourceProcessor::checkFile(const QString &absoluteFilePath) const
return fileInfo.isFile() && fileInfo.isReadable();
}
-/// Resolve the given file name to its absolute path w.r.t. the include type.
-QString CppSourceProcessor::resolveFile(const QString &fileName, IncludeType type)
-{
- if (type == IncludeGlobal) {
- QHash<QString, QString>::ConstIterator it = m_fileNameCache.constFind(fileName);
- if (it != m_fileNameCache.constEnd())
- return it.value();
- const QString fn = resolveFile_helper(fileName, type);
- if (!fn.isEmpty())
- m_fileNameCache.insert(fileName, fn);
- return fn;
- }
-
- // IncludeLocal, IncludeNext
- return resolveFile_helper(fileName, type);
-}
-
QString CppSourceProcessor::cleanPath(const QString &path)
{
QString result = QDir::cleanPath(path);
@@ -263,7 +246,8 @@ QString CppSourceProcessor::cleanPath(const QString &path)
return result;
}
-QString CppSourceProcessor::resolveFile_helper(const QString &fileName, IncludeType type)
+/// Resolve the given file name to its absolute path w.r.t. the include type.
+QString CppSourceProcessor::resolveFile(const QString &fileName, IncludeType type)
{
if (isInjectedFile(fileName))
return fileName;
@@ -271,8 +255,6 @@ QString CppSourceProcessor::resolveFile_helper(const QString &fileName, IncludeT
if (QFileInfo(fileName).isAbsolute())
return checkFile(fileName) ? fileName : QString();
- auto headerPathsIt = m_headerPaths.begin();
- auto headerPathsEnd = m_headerPaths.end();
if (m_currentDoc) {
if (type == IncludeLocal) {
const QFileInfo currentFileInfo(m_currentDoc->fileName());
@@ -285,15 +267,30 @@ QString CppSourceProcessor::resolveFile_helper(const QString &fileName, IncludeT
} else if (type == IncludeNext) {
const QFileInfo currentFileInfo(m_currentDoc->fileName());
const QString currentDirPath = cleanPath(currentFileInfo.dir().path());
+ auto headerPathsEnd = m_headerPaths.end();
+ auto headerPathsIt = m_headerPaths.begin();
for (; headerPathsIt != headerPathsEnd; ++headerPathsIt) {
if (headerPathsIt->path == currentDirPath) {
++headerPathsIt;
- break;
+ return resolveFile_helper(fileName, headerPathsIt);
}
}
}
}
+ QHash<QString, QString>::ConstIterator it = m_fileNameCache.constFind(fileName);
+ if (it != m_fileNameCache.constEnd())
+ return it.value();
+ const QString fn = resolveFile_helper(fileName, m_headerPaths.begin());
+ if (!fn.isEmpty())
+ m_fileNameCache.insert(fileName, fn);
+ return fn;
+}
+
+QString CppSourceProcessor::resolveFile_helper(const QString &fileName,
+ ProjectPartHeaderPaths::Iterator headerPathsIt)
+{
+ auto headerPathsEnd = m_headerPaths.end();
for (; headerPathsIt != headerPathsEnd; ++headerPathsIt) {
if (headerPathsIt->isFrameworkPath())
continue;
diff --git a/src/plugins/cpptools/cppsourceprocessor.h b/src/plugins/cpptools/cppsourceprocessor.h
index ec1b9ef775..fdebc893c6 100644
--- a/src/plugins/cpptools/cppsourceprocessor.h
+++ b/src/plugins/cpptools/cppsourceprocessor.h
@@ -82,7 +82,8 @@ private:
unsigned *revision) const;
bool checkFile(const QString &absoluteFilePath) const;
QString resolveFile(const QString &fileName, IncludeType type);
- QString resolveFile_helper(const QString &fileName, IncludeType type);
+ QString resolveFile_helper(const QString &fileName,
+ ProjectPartHeaderPaths::Iterator headerPathsIt);
void mergeEnvironment(CPlusPlus::Document::Ptr doc);