From 0b277f2fbe9716e2b135947c8113c3d29d03a162 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Fri, 13 Nov 2009 16:43:26 +0100
Subject: [PATCH] Show how to use the quick fix engine.

---
 src/plugins/cppeditor/cppquickfix.cpp | 63 ++++++++++++++++++++++++---
 src/plugins/cppeditor/cppquickfix.h   |  2 +-
 2 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index 4b098444ba5..601b717c65f 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -29,6 +29,9 @@
 
 #include "cppquickfix.h"
 #include "cppeditor.h"
+
+#include <cplusplus/CppDocument.h>
+
 #include <TranslationUnit.h>
 #include <Token.h>
 
@@ -38,6 +41,34 @@
 using namespace CppEditor::Internal;
 using namespace CPlusPlus;
 
+namespace {
+
+class HelloQuickFixOp: public QuickFixOperation
+{
+public:
+    HelloQuickFixOp(Document::Ptr doc, const Snapshot &snapshot)
+        : QuickFixOperation(doc, snapshot)
+    {}
+
+    virtual QString description() const
+    {
+        return QLatin1String("Hello"); // ### tr?
+    }
+
+    virtual void apply(QTextCursor cursor)
+    {
+        cursor.beginEditBlock();
+        cursor.insertBlock();
+        cursor.insertText(QLatin1String("Hello, QuickFix!\n"));
+        cursor.insertText(document()->fileName());
+        cursor.insertBlock();
+        cursor.endEditBlock();
+    }
+};
+
+} // end of anonymous namespace
+
+
 QuickFixOperation::QuickFixOperation(CPlusPlus::Document::Ptr doc, const CPlusPlus::Snapshot &snapshot)
     : _doc(doc), _snapshot(snapshot)
 { }
@@ -112,13 +143,33 @@ int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable)
 {
     qDebug() << Q_FUNC_INFO;
     Q_ASSERT(editable != 0);
+
     _editor = qobject_cast<CPPEditor *>(editable->widget());
+    Q_ASSERT(_editor != 0);
+
+    const SemanticInfo info = _editor->semanticInfo();
+
+    if (info.doc) {
+        QuickFixOperationPtr op(new HelloQuickFixOp(info.doc, info.snapshot));
+        _quickFixes.append(op);
+        return editable->position();
+    }
+
     return -1;
 }
 
-void CPPQuickFixCollector::completions(QList<TextEditor::CompletionItem> *quicFixItems)
+void CPPQuickFixCollector::completions(QList<TextEditor::CompletionItem> *quickFixItems)
 {
-    quicFixItems->append(_quickFixItems);
+    qDebug() << Q_FUNC_INFO;
+
+    for (int i = 0; i < _quickFixes.size(); ++i) {
+        QuickFixOperationPtr op = _quickFixes.at(i);
+
+        TextEditor::CompletionItem item(this);
+        item.text = op->description();
+        item.data = QVariant::fromValue(i);
+        quickFixItems->append(item);
+    }
 }
 
 void CPPQuickFixCollector::complete(const TextEditor::CompletionItem &item)
@@ -127,15 +178,13 @@ void CPPQuickFixCollector::complete(const TextEditor::CompletionItem &item)
 
     const int index = item.data.toInt();
 
-    QList<QuickFixOperationPtr> quickFixes; // ### get get the quick fixes.
-
-    if (index < quickFixes.size()) {
-        QuickFixOperationPtr quickFix = quickFixes.at(index);
+    if (index < _quickFixes.size()) {
+        QuickFixOperationPtr quickFix = _quickFixes.at(index);
         quickFix->apply(_editor->textCursor());
     }
 }
 
 void CPPQuickFixCollector::cleanup()
 {
-    _quickFixItems.clear();
+    _quickFixes.clear();
 }
diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h
index 88ffda075bb..0f4320cc5ab 100644
--- a/src/plugins/cppeditor/cppquickfix.h
+++ b/src/plugins/cppeditor/cppquickfix.h
@@ -102,7 +102,7 @@ public:
 private:
     CppTools::CppModelManagerInterface *_modelManager;
     CPPEditor *_editor;
-    QList<TextEditor::CompletionItem> _quickFixItems;
+    QList<QuickFixOperationPtr> _quickFixes;
 };
 
 } // end of namespace Internal
-- 
GitLab