summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppsourceprocessor.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2014-12-05 11:56:06 +0100
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2014-12-15 15:37:36 +0100
commite3977de08eb5577222f01a9013185b036dee4564 (patch)
treebc58bd81c04272fe403c341bad59d4aa1718c8f7 /src/plugins/cpptools/cppsourceprocessor.cpp
parentb18c0f6af5d97f1fbf999096a44c63704f3a5d3d (diff)
downloadqt-creator-e3977de08eb5577222f01a9013185b036dee4564.tar.gz
C++: Finish gcc's include_next support
This implements the actual include_next logic and thus completes commit b934cc1 C++: pass #include_next down to CppPreprocessor::tryIncludeFile commmit 140b502 C++: Highlight argument to gcc's #include_next extension Based on https://gcc.gnu.org/onlinedocs/cpp/Wrapper-Headers.html Task-number: QTCREATORBUG-10225 Change-Id: I7eef7f5ea64a114f6d092304d32b72c55c2ce134 Reviewed-by: hjk <hjk121@nokiamail.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
Diffstat (limited to 'src/plugins/cpptools/cppsourceprocessor.cpp')
-rw-r--r--src/plugins/cpptools/cppsourceprocessor.cpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/plugins/cpptools/cppsourceprocessor.cpp b/src/plugins/cpptools/cppsourceprocessor.cpp
index cd56dae3c9..a8ad8d254a 100644
--- a/src/plugins/cpptools/cppsourceprocessor.cpp
+++ b/src/plugins/cpptools/cppsourceprocessor.cpp
@@ -272,19 +272,33 @@ QString CppSourceProcessor::resolveFile_helper(const QString &fileName, IncludeT
if (QFileInfo(fileName).isAbsolute())
return checkFile(fileName) ? fileName : QString();
- if (type == IncludeLocal && m_currentDoc) {
- const QFileInfo currentFileInfo(m_currentDoc->fileName());
- const QString path = cleanPath(currentFileInfo.absolutePath()) + fileName;
- if (checkFile(path))
- return path;
- // Fall through! "16.2 Source file inclusion" from the standard states to continue
- // searching as if this would be a global include.
+ auto headerPathsIt = m_headerPaths.begin();
+ auto headerPathsEnd = m_headerPaths.end();
+ if (m_currentDoc) {
+ if (type == IncludeLocal) {
+ const QFileInfo currentFileInfo(m_currentDoc->fileName());
+ const QString path = cleanPath(currentFileInfo.absolutePath()) + fileName;
+ if (checkFile(path))
+ return path;
+ // Fall through! "16.2 Source file inclusion" from the standard states to continue
+ // searching as if this would be a global include.
+
+ } else if (type == IncludeNext) {
+ const QFileInfo currentFileInfo(m_currentDoc->fileName());
+ const QString currentDirPath = cleanPath(currentFileInfo.dir().path());
+ for (; headerPathsIt != headerPathsEnd; ++headerPathsIt) {
+ if (headerPathsIt->path == currentDirPath) {
+ ++headerPathsIt;
+ break;
+ }
+ }
+ }
}
- foreach (const ProjectPart::HeaderPath &headerPath, m_headerPaths) {
- if (headerPath.isFrameworkPath())
+ for (; headerPathsIt != headerPathsEnd; ++headerPathsIt) {
+ if (headerPathsIt->isFrameworkPath())
continue;
- const QString path = headerPath.path + fileName;
+ const QString path = headerPathsIt->path + fileName;
if (m_workingCopy.contains(path) || checkFile(path))
return path;
}