From e4fb53e8d9e550181bc52c72a87c130f8fa4ff83 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Tue, 18 May 2010 16:18:25 +0200
Subject: [PATCH] Added #preprocessor directive completion.

---
 src/plugins/cpptools/cppcodecompletion.cpp | 36 ++++++++++++++++++++++
 src/plugins/cpptools/cppcodecompletion.h   |  1 +
 2 files changed, 37 insertions(+)

diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 19e8e94cdf9..8e8bc3d831e 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -518,6 +518,10 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
         completionKind = T_SLASH;
         --start;
         break;
+    case '#':
+        completionKind = T_POUND;
+        --start;
+        break;
     }
 
     if (start == pos)
@@ -673,6 +677,13 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
         return m_startPosition;
     }
 
+    // Pre-processor completion
+    if (m_completionOperator == T_POUND) {
+        completePreprocessor();
+        m_startPosition = startOfName;
+        return m_startPosition;
+    }
+
     // Include completion
     if (m_completionOperator == T_STRING_LITERAL
         || m_completionOperator == T_ANGLE_STRING_LITERAL
@@ -1252,6 +1263,31 @@ bool CppCodeCompletion::completeInclude(const QTextCursor &cursor)
     return !m_completions.isEmpty();
 }
 
+void CppCodeCompletion::completePreprocessor()
+{
+    TextEditor::CompletionItem item(this);
+
+    item.text = QLatin1String("define");  m_completions.append(item);
+    item.text = QLatin1String("error"); m_completions.append(item);
+    item.text = QLatin1String("include"); m_completions.append(item);
+    item.text = QLatin1String("line"); m_completions.append(item);
+    item.text = QLatin1String("pragma"); m_completions.append(item);
+    item.text = QLatin1String("undef"); m_completions.append(item);
+
+    item.text = QLatin1String("if"); m_completions.append(item);
+    item.text = QLatin1String("ifdef"); m_completions.append(item);
+    item.text = QLatin1String("ifndef"); m_completions.append(item);
+    item.text = QLatin1String("elif"); m_completions.append(item);
+    item.text = QLatin1String("else"); m_completions.append(item);
+    item.text = QLatin1String("endif"); m_completions.append(item);
+
+    if (objcKeywordsWanted()) {
+        TextEditor::CompletionItem item(this);
+        item.text = QLatin1String("import");
+        m_completions.append(item);
+    }
+}
+
 void CppCodeCompletion::completeNamespace(const QList<Symbol *> &candidates,
                                           const LookupContext &context)
 {
diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h
index b4bff01fba8..7c92bfe43d5 100644
--- a/src/plugins/cpptools/cppcodecompletion.h
+++ b/src/plugins/cpptools/cppcodecompletion.h
@@ -89,6 +89,7 @@ private:
     void addCompletionItem(CPlusPlus::Symbol *symbol);
 
     bool completeInclude(const QTextCursor &cursor);
+    void completePreprocessor();
 
     int globalCompletion(CPlusPlus::Symbol *lastVisibleSymbol,
                          CPlusPlus::Document::Ptr thisDocument,
-- 
GitLab