From 5f00c4762b0aaa15c700b896398e3f94a85769b1 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@qt.io>
Date: Thu, 15 Mar 2018 10:51:45 +0100
Subject: [PATCH] qdoc: Fix Pyside2 documentation builds for shadow builds

Match interesting headers by file names in case mismatches
occur between installed headers and headers in the source tree.

Task-number: PYSIDE-620
Change-Id: Ie36fbd46fda38c86d88a00a992cac2fb58dd76bc
Reviewed-by: Martin Smith <martin.smith@qt.io>
---
 src/qdoc/clangcodeparser.cpp | 30 +++++++++++++++++++++---------
 src/qdoc/clangcodeparser.h   |  2 +-
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/src/qdoc/clangcodeparser.cpp b/src/qdoc/clangcodeparser.cpp
index 70d73a18e..77055ca9f 100644
--- a/src/qdoc/clangcodeparser.cpp
+++ b/src/qdoc/clangcodeparser.cpp
@@ -373,7 +373,7 @@ static Node *findFunctionNodeForCursor(QDocDatabase* qdb, CXCursor cur) {
 
 class ClangVisitor {
 public:
-    ClangVisitor(QDocDatabase *qdb, const QSet<QString> &allHeaders)
+    ClangVisitor(QDocDatabase *qdb, const QHash<QString, QString> &allHeaders)
         : qdb_(qdb), parent_(qdb->primaryTreeRoot()), allHeaders_(allHeaders) { }
 
     QDocDatabase* qdocDB() { return qdb_; }
@@ -392,7 +392,8 @@ public:
                 isInteresting = *it;
             } else {
                 QFileInfo fi(fromCXString(clang_getFileName(file)));
-                isInteresting = allHeaders_.contains(fi.canonicalFilePath());
+                // Match by file name in case of PCH/installed headers
+                isInteresting = allHeaders_.contains(fi.fileName());
                 isInterestingCache_[file] = isInteresting;
             }
             if (isInteresting) {
@@ -441,7 +442,7 @@ private:
 
     QDocDatabase* qdb_;
     Aggregate *parent_;
-    QSet<QString> allHeaders_;
+    const QHash<QString, QString> allHeaders_;
     QHash<CXFile, bool> isInterestingCache_; // doing a canonicalFilePath is slow, so keep a cache.
 
     /*!
@@ -1074,7 +1075,7 @@ QStringList ClangCodeParser::sourceFileNameFilter()
 void ClangCodeParser::parseHeaderFile(const Location & /*location*/, const QString &filePath)
 {
     QFileInfo fi(filePath);
-    allHeaders_.insert(fi.canonicalFilePath());
+    allHeaders_.insert(fi.fileName(), fi.canonicalPath());
 }
 
 static const char *defaultArgs_[] = {
@@ -1109,6 +1110,21 @@ void ClangCodeParser::getDefaultArgs()
         args_.push_back(p.constData());
 }
 
+static QVector<QByteArray> includePathsFromHeaders(const QHash<QString, QString> &allHeaders)
+{
+    QVector<QByteArray> result;
+    for (auto it = allHeaders.cbegin(), end = allHeaders.cend(); it != end; ++it) {
+        const QByteArray path = "-I" + it.value().toLatin1();
+        const QByteArray parent = "-I"
+            + QDir::cleanPath(it.value() + QLatin1String("/../")).toLatin1();
+        if (!result.contains(path))
+            result.append(path);
+        if (!result.contains(parent))
+            result.append(parent);
+    }
+    return result;
+}
+
 /*!
   Load the include paths into \a moreArgs.
  */
@@ -1120,16 +1136,12 @@ void ClangCodeParser::getMoreArgs()
           of reasonable places to look for include files and use
           that list instead.
          */
-        QList<QString> headers = allHeaders_.values();
         auto forest = qdb_->searchOrder();
 
         QByteArray version = qdb_->version().toUtf8();
         QString basicIncludeDir = QDir::cleanPath(QString(Config::installDir + "/../include"));
         moreArgs_ += "-I" + basicIncludeDir.toLatin1();
-        if (!headers.isEmpty()) {
-            moreArgs_ += "-I" + QDir::cleanPath(QString(headers.at(0) + "/../")).toLatin1();
-            moreArgs_ += "-I" + QDir::cleanPath(QString(headers.at(0) + "/../../")).toLatin1();
-        }
+        moreArgs_ += includePathsFromHeaders(allHeaders_);
         for (const auto &s : forest) {
             QString module = basicIncludeDir +"/" + s->camelCaseModuleName();
             moreArgs_ += QString("-I" + module).toLatin1();
diff --git a/src/qdoc/clangcodeparser.h b/src/qdoc/clangcodeparser.h
index 9b1446fda..b70fcc0e8 100644
--- a/src/qdoc/clangcodeparser.h
+++ b/src/qdoc/clangcodeparser.h
@@ -69,7 +69,7 @@ public:
     void buildPCH();
 
 private:
-    QSet<QString> allHeaders_;
+    QHash<QString, QString> allHeaders_; // file name->path
     QVector<QByteArray> includePaths_;
     QScopedPointer<QTemporaryDir> pchFileDir_;
     QByteArray pchName_;
-- 
GitLab