From f006183b3d836627ccd9e85d0e9725ddfa45a8a9 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Thu, 1 Oct 2009 17:01:13 +0200
Subject: [PATCH] Support include completion for frameworks on Mac.

Which is 'quite' important, since Qt builds by default generate
frameworks.
---
 src/plugins/cpptools/cppcodecompletion.cpp | 17 +++++++++++++++++
 src/plugins/cpptools/cppmodelmanager.cpp   | 20 ++++++++++++++++++++
 src/plugins/cpptools/cppmodelmanager.h     |  1 +
 3 files changed, 38 insertions(+)

diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index ada7f48ab77..988bba99665 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -1239,6 +1239,23 @@ bool CppCodeCompletion::completeInclude(const QTextCursor &cursor)
                 m_completions.append(item);
             }
         }
+
+        QStringList frameworkPaths = m_manager->projectInfo(project).frameworkPaths;
+        foreach (const QString &frameworkPath, frameworkPaths) {
+            QString realPath = frameworkPath;
+            if (!directoryPrefix.isEmpty()) {
+                realPath += QLatin1Char('/');
+                realPath += directoryPrefix;
+                realPath += QLatin1String(".framework/Headers");
+            }
+            foreach (const QString &itemText, m_manager->includesInPath(realPath)) {
+                TextEditor::CompletionItem item(this);
+                item.m_text += itemText;
+                // TODO: Icon for include files
+                item.m_icon = m_icons.keywordIcon();
+                m_completions.append(item);
+            }
+        }
     }
 
     return !m_completions.isEmpty();
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index efb5e43ba20..8aa6bdf7672 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -809,6 +809,7 @@ void CppModelManager::updateProjectInfo(const ProjectInfo &pinfo)
         QFuture<void> result = QtConcurrent::run(&CppModelManager::updateIncludesInPaths,
                                                  this,
                                                  pinfo.includePaths,
+                                                 pinfo.frameworkPaths,
                                                  m_headerSuffixes);
 
         if (pinfo.includePaths.size() > 1) {
@@ -1127,6 +1128,7 @@ void CppModelManager::onAboutToUnloadSession()
 void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
                                             CppModelManager *manager,
                                             QStringList paths,
+                                            QStringList frameworkPaths,
                                             QStringList suffixes)
 {
     QMap<QString, QStringList> entriesInPaths;
@@ -1137,6 +1139,24 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
 
     future.setProgressRange(0, paths.size());
 
+    // Add framework header directories to path list
+    QStringList frameworkFilter;
+    frameworkFilter << QLatin1String("*.framework");
+    QStringListIterator fwPathIt(frameworkPaths);
+    while (fwPathIt.hasNext()) {
+        const QString &fwPath = fwPathIt.next();
+        QStringList entriesInFrameworkPath;
+        const QStringList &frameworks = QDir(fwPath).entryList(frameworkFilter, QDir::Dirs | QDir::NoDotAndDotDot);
+        QStringListIterator fwIt(frameworks);
+        while (fwIt.hasNext()) {
+            QString framework = fwIt.next();
+            paths.append(fwPath + QLatin1Char('/') + framework + QLatin1String("/Headers"));
+            framework.chop(10); // remove the ".framework"
+            entriesInFrameworkPath.append(framework + QLatin1Char('/'));
+        }
+        entriesInPaths.insert(fwPath, entriesInFrameworkPath);
+    }
+
     while (!paths.isEmpty()) {
         if (future.isPaused())
             future.waitForResume();
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index f1c7eb52db3..0f6911f97fe 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -166,6 +166,7 @@ private:
     static void updateIncludesInPaths(QFutureInterface<void> &future,
                                       CppModelManager *manager,
                                       QStringList paths,
+                                      QStringList frameworkPaths,
                                       QStringList suffixes);
 
     static void parse(QFutureInterface<void> &future,
-- 
GitLab