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