diff options
author | Finn Brudal <Finn.Brudal@kongsberg.com> | 2016-03-11 15:10:28 +0100 |
---|---|---|
committer | Finn Brudal <Finn.Brudal@kongsberg.com> | 2016-05-24 07:46:24 +0000 |
commit | e6729c487d57a45341b8e1baa0e0a650520fd32e (patch) | |
tree | 24bed0ad1cbe28d5752bf9103fa4eb90fcca751f | |
parent | 5ee38fda5babeb0907508b1a5d87eb0d324b8c0a (diff) | |
download | qt-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.cpp | 39 | ||||
-rw-r--r-- | src/plugins/cpptools/cppsourceprocessor.h | 3 |
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); |