From e6729c487d57a45341b8e1baa0e0a650520fd32e Mon Sep 17 00:00:00 2001 From: Finn Brudal Date: Fri, 11 Mar 2016 15:10:28 +0100 Subject: 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 --- src/plugins/cpptools/cppsourceprocessor.cpp | 39 +++++++++++++---------------- 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::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::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); -- cgit v1.2.1