diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 7284438a5d52a733f94546df5c758dd83fbb692b..1516b7647aa386a92c7c5710f3ad76e546d116a2 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -1586,8 +1586,8 @@ bool CPPEditor::event(QEvent *e) void CPPEditor::performQuickFix(int index) { - CPPQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector(); - QuickFixOperationPtr op = m_quickFixes.at(index); + CppQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector(); + CppQuickFixOperationPtr op = m_quickFixes.at(index); quickFixCollector->perform(op); //op->createChangeSet(); //setChangeSet(op->changeSet()); @@ -1604,7 +1604,7 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e) Core::ActionContainer *mcontext = am->actionContainer(CppEditor::Constants::M_CONTEXT); QMenu *contextMenu = mcontext->menu(); - CPPQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector(); + CppQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector(); QSignalMapper mapper; connect(&mapper, SIGNAL(mapped(int)), this, SLOT(performQuickFix(int))); @@ -1614,7 +1614,7 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e) m_quickFixes = quickFixCollector->quickFixes(); for (int index = 0; index < m_quickFixes.size(); ++index) { - QuickFixOperationPtr op = m_quickFixes.at(index); + CppQuickFixOperationPtr op = m_quickFixes.at(index); QAction *action = menu->addAction(op->description()); mapper.setMapping(action, index); connect(action, SIGNAL(triggered()), &mapper, SLOT(map())); diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index b52d9e2d87c6204b4761451e8b29d935aca83acd..e7b8b39a149d19c36e2b9fcbb2ca79ba8d5af73f 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -309,7 +309,7 @@ private: SemanticHighlighter *m_semanticHighlighter; SemanticInfo m_lastSemanticInfo; - QList<QuickFixOperationPtr> m_quickFixes; + QList<CppQuickFixOperationPtr> m_quickFixes; bool m_initialized; }; diff --git a/src/plugins/cppeditor/cppplugin.cpp b/src/plugins/cppeditor/cppplugin.cpp index c7a1398b25665936421d3175933e66718dcf7fc2..c67b3f4f7ad84851efcd6bb0615506dc4fb21f55 100644 --- a/src/plugins/cppeditor/cppplugin.cpp +++ b/src/plugins/cppeditor/cppplugin.cpp @@ -191,7 +191,7 @@ bool CppPlugin::sortedMethodOverview() const return m_sortedMethodOverview; } -CPPQuickFixCollector *CppPlugin::quickFixCollector() const +CppQuickFixCollector *CppPlugin::quickFixCollector() const { return m_quickFixCollector; } bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage) @@ -204,7 +204,7 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess addAutoReleasedObject(new CppEditorFactory(this)); addAutoReleasedObject(new CppHoverHandler); - m_quickFixCollector = new CPPQuickFixCollector; + m_quickFixCollector = new CppQuickFixCollector; addAutoReleasedObject(m_quickFixCollector); CppFileWizard::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard); diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h index 9d7527d3ef4c3f4703e53b3311cc4bc0be92de4b..c7d4b82c3cde09b1caa29fc3aeb1a770ba43cada 100644 --- a/src/plugins/cppeditor/cppplugin.h +++ b/src/plugins/cppeditor/cppplugin.h @@ -46,7 +46,7 @@ namespace CppEditor { namespace Internal { class CPPEditor; -class CPPQuickFixCollector; +class CppQuickFixCollector; class CppPlugin : public ExtensionSystem::IPlugin { @@ -67,7 +67,7 @@ public: bool sortedMethodOverview() const; - CPPQuickFixCollector *quickFixCollector() const; + CppQuickFixCollector *quickFixCollector() const; signals: void methodOverviewSortingChanged(bool sort); @@ -98,7 +98,7 @@ private: QAction *m_findUsagesAction; QAction *m_updateCodeModelAction; - CPPQuickFixCollector *m_quickFixCollector; + CppQuickFixCollector *m_quickFixCollector; QTimer *m_quickFixTimer; QPointer<TextEditor::ITextEditable> m_currentTextEditable; diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp index 6d538f12192cda82b46204a779d213a26e5cfa3d..20b6f544a9fc778041989168fb520fbae8073772 100644 --- a/src/plugins/cppeditor/cppquickfix.cpp +++ b/src/plugins/cppeditor/cppquickfix.cpp @@ -58,17 +58,23 @@ using namespace CPlusPlus; namespace { +class CppQuickFixState: public TextEditor::QuickFixState +{ +public: + QList<CPlusPlus::AST *> path; +}; + /* Rewrite a op b -> !(a invop b) (a op b) -> !(a invop b) !(a op b) -> (a invob b) */ -class UseInverseOp: public QuickFixOperation +class UseInverseOp: public CppQuickFixOperation { public: - UseInverseOp() - : binary(0), nested(0), negation(0) + UseInverseOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), binary(0), nested(0), negation(0) {} virtual QString description() const @@ -156,11 +162,11 @@ private: As b flipop a */ -class FlipBinaryOp: public QuickFixOperation +class FlipBinaryOp: public CppQuickFixOperation { public: - FlipBinaryOp() - : binary(0) + FlipBinaryOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), binary(0) {} @@ -232,11 +238,11 @@ private: As !(a || b) */ -class RewriteLogicalAndOp: public QuickFixOperation +class RewriteLogicalAndOp: public CppQuickFixOperation { public: - RewriteLogicalAndOp() - : left(0), right(0), pattern(0) + RewriteLogicalAndOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), left(0), right(0), pattern(0) {} virtual QString description() const @@ -293,11 +299,11 @@ private: BinaryExpressionAST *pattern; }; -class SplitSimpleDeclarationOp: public QuickFixOperation +class SplitSimpleDeclarationOp: public CppQuickFixOperation { public: - SplitSimpleDeclarationOp() - : declaration(0) + SplitSimpleDeclarationOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), declaration(0) {} virtual QString description() const @@ -399,11 +405,11 @@ private: Add curly braces to a if statement that doesn't already contain a compound statement. */ -class AddBracesToIfOp: public QuickFixOperation +class AddBracesToIfOp: public CppQuickFixOperation { public: - AddBracesToIfOp() - : _statement(0) + AddBracesToIfOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), _statement(0) {} virtual QString description() const @@ -459,11 +465,11 @@ private: Type name = foo; if (name) {...} */ -class MoveDeclarationOutOfIfOp: public QuickFixOperation +class MoveDeclarationOutOfIfOp: public CppQuickFixOperation { public: - MoveDeclarationOutOfIfOp() - : condition(0), pattern(0), core(0) + MoveDeclarationOutOfIfOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), condition(0), pattern(0), core(0) {} virtual QString description() const @@ -522,11 +528,11 @@ private: Type name; while ((name = foo()) != 0) {...} */ -class MoveDeclarationOutOfWhileOp: public QuickFixOperation +class MoveDeclarationOutOfWhileOp: public CppQuickFixOperation { public: - MoveDeclarationOutOfWhileOp() - : condition(0), pattern(0), core(0) + MoveDeclarationOutOfWhileOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), condition(0), pattern(0), core(0) {} virtual QString description() const @@ -607,11 +613,11 @@ private: else if (something_else) x; */ -class SplitIfStatementOp: public QuickFixOperation +class SplitIfStatementOp: public CppQuickFixOperation { public: - SplitIfStatementOp() - : condition(0), pattern(0) + SplitIfStatementOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), condition(0), pattern(0) {} virtual QString description() const @@ -717,11 +723,11 @@ private: With QLatin1String("abcd") */ -class WrapStringLiteral: public QuickFixOperation +class WrapStringLiteral: public CppQuickFixOperation { public: - WrapStringLiteral() - : stringLiteral(0), isObjCStringLiteral(false) + WrapStringLiteral(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), stringLiteral(0), isObjCStringLiteral(false) {} virtual QString description() const @@ -785,11 +791,11 @@ private: bool isObjCStringLiteral; }; -class CStringToNSString: public QuickFixOperation +class CStringToNSString: public CppQuickFixOperation { public: - CStringToNSString() - : stringLiteral(0), qlatin1Call(0) + CStringToNSString(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), stringLiteral(0), qlatin1Call(0) {} virtual QString description() const @@ -856,91 +862,82 @@ private: } // end of anonymous namespace -QuickFixOperation::QuickFixOperation() - : _editor(0), _topLevelNode(0) +CppQuickFixOperation::CppQuickFixOperation(TextEditor::BaseTextEditor *editor) + : TextEditor::QuickFixOperation(editor), _topLevelNode(0) { } -QuickFixOperation::~QuickFixOperation() +CppQuickFixOperation::~CppQuickFixOperation() { } -CPlusPlus::AST *QuickFixOperation::topLevelNode() const -{ return _topLevelNode; } - -void QuickFixOperation::setTopLevelNode(CPlusPlus::AST *topLevelNode) -{ _topLevelNode = topLevelNode; } - -const Utils::ChangeSet &QuickFixOperation::changeSet() const -{ return _changeSet; } - -Document::Ptr QuickFixOperation::document() const -{ return _document; } - -void QuickFixOperation::setDocument(CPlusPlus::Document::Ptr document) -{ _document = document; } +CppQuickFixOperation::Range CppQuickFixOperation::topLevelRange() const +{ + if (topLevelNode()) + return createRange(topLevelNode()); -Snapshot QuickFixOperation::snapshot() const -{ return _snapshot; } + return Range(); +} -void QuickFixOperation::setSnapshot(const CPlusPlus::Snapshot &snapshot) +int CppQuickFixOperation::match(TextEditor::QuickFixState *state) { - _snapshot = snapshot; + CppQuickFixState *s = static_cast<CppQuickFixState *>(state); + return match(s->path); } -CPPEditor *QuickFixOperation::editor() const -{ return _editor; } +CPlusPlus::AST *CppQuickFixOperation::topLevelNode() const +{ return _topLevelNode; } -void QuickFixOperation::setEditor(CPPEditor *editor) -{ _editor = editor; } +void CppQuickFixOperation::setTopLevelNode(CPlusPlus::AST *topLevelNode) +{ _topLevelNode = topLevelNode; } -QTextCursor QuickFixOperation::textCursor() const -{ return _textCursor; } +Document::Ptr CppQuickFixOperation::document() const +{ return _document; } -void QuickFixOperation::setTextCursor(const QTextCursor &cursor) -{ _textCursor = cursor; } +void CppQuickFixOperation::setDocument(CPlusPlus::Document::Ptr document) +{ _document = document; } -int QuickFixOperation::selectionStart() const -{ return _textCursor.selectionStart(); } +Snapshot CppQuickFixOperation::snapshot() const +{ return _snapshot; } -int QuickFixOperation::selectionEnd() const -{ return _textCursor.selectionEnd(); } +void CppQuickFixOperation::setSnapshot(const CPlusPlus::Snapshot &snapshot) +{ _snapshot = snapshot; } -const CPlusPlus::Token &QuickFixOperation::tokenAt(unsigned index) const +const CPlusPlus::Token &CppQuickFixOperation::tokenAt(unsigned index) const { return _document->translationUnit()->tokenAt(index); } -int QuickFixOperation::startOf(unsigned index) const +int CppQuickFixOperation::startOf(unsigned index) const { unsigned line, column; _document->translationUnit()->getPosition(tokenAt(index).begin(), &line, &column); - return _textCursor.document()->findBlockByNumber(line - 1).position() + column - 1; + return editor()->document()->findBlockByNumber(line - 1).position() + column - 1; } -int QuickFixOperation::startOf(const CPlusPlus::AST *ast) const +int CppQuickFixOperation::startOf(const CPlusPlus::AST *ast) const { return startOf(ast->firstToken()); } -int QuickFixOperation::endOf(unsigned index) const +int CppQuickFixOperation::endOf(unsigned index) const { unsigned line, column; _document->translationUnit()->getPosition(tokenAt(index).end(), &line, &column); - return _textCursor.document()->findBlockByNumber(line - 1).position() + column - 1; + return editor()->document()->findBlockByNumber(line - 1).position() + column - 1; } -int QuickFixOperation::endOf(const CPlusPlus::AST *ast) const +int CppQuickFixOperation::endOf(const CPlusPlus::AST *ast) const { return endOf(ast->lastToken() - 1); } -void QuickFixOperation::startAndEndOf(unsigned index, int *start, int *end) const +void CppQuickFixOperation::startAndEndOf(unsigned index, int *start, int *end) const { unsigned line, column; CPlusPlus::Token token(tokenAt(index)); _document->translationUnit()->getPosition(token.begin(), &line, &column); - *start = _textCursor.document()->findBlockByNumber(line - 1).position() + column - 1; + *start = editor()->document()->findBlockByNumber(line - 1).position() + column - 1; *end = *start + token.length(); } -bool QuickFixOperation::isCursorOn(unsigned tokenIndex) const +bool CppQuickFixOperation::isCursorOn(unsigned tokenIndex) const { QTextCursor tc = textCursor(); int cursorBegin = tc.selectionStart(); @@ -954,7 +951,7 @@ bool QuickFixOperation::isCursorOn(unsigned tokenIndex) const return false; } -bool QuickFixOperation::isCursorOn(const CPlusPlus::AST *ast) const +bool CppQuickFixOperation::isCursorOn(const CPlusPlus::AST *ast) const { QTextCursor tc = textCursor(); int cursorBegin = tc.selectionStart(); @@ -968,160 +965,89 @@ bool QuickFixOperation::isCursorOn(const CPlusPlus::AST *ast) const return false; } -QuickFixOperation::Range QuickFixOperation::createRange(AST *ast) const -{ - QTextCursor tc = _textCursor; - Range r(tc); - r.begin.setPosition(startOf(ast)); - r.end.setPosition(endOf(ast)); - return r; -} - -void QuickFixOperation::reindent(const Range &range) +CppQuickFixOperation::Range CppQuickFixOperation::createRange(AST *ast) const { - QTextCursor tc = range.begin; - tc.setPosition(range.end.position(), QTextCursor::KeepAnchor); - _editor->indentInsertedText(tc); + return range(startOf(ast), endOf(ast)); } -void QuickFixOperation::move(int start, int end, int to) -{ - _changeSet.move(start, end-start, to); -} - -void QuickFixOperation::move(unsigned tokenIndex, int to) +void CppQuickFixOperation::move(unsigned tokenIndex, int to) { int start, end; startAndEndOf(tokenIndex, &start, &end); move(start, end, to); } -void QuickFixOperation::move(const CPlusPlus::AST *ast, int to) +void CppQuickFixOperation::move(const CPlusPlus::AST *ast, int to) { move(startOf(ast), endOf(ast), to); } -void QuickFixOperation::replace(int start, int end, const QString &replacement) -{ - _changeSet.replace(start, end-start, replacement); -} - -void QuickFixOperation::replace(unsigned tokenIndex, const QString &replacement) +void CppQuickFixOperation::replace(unsigned tokenIndex, const QString &replacement) { int start, end; startAndEndOf(tokenIndex, &start, &end); replace(start, end, replacement); } -void QuickFixOperation::replace(const CPlusPlus::AST *ast, const QString &replacement) +void CppQuickFixOperation::replace(const CPlusPlus::AST *ast, const QString &replacement) { replace(startOf(ast), endOf(ast), replacement); } -void QuickFixOperation::insert(int at, const QString &text) -{ - _changeSet.insert(at, text); -} - -void QuickFixOperation::remove(int start, int end) -{ - _changeSet.remove(start, end-start); -} - -void QuickFixOperation::remove(unsigned tokenIndex) +void CppQuickFixOperation::remove(unsigned tokenIndex) { int start, end; startAndEndOf(tokenIndex, &start, &end); remove(start, end); } -void QuickFixOperation::remove(const CPlusPlus::AST *ast) +void CppQuickFixOperation::remove(const CPlusPlus::AST *ast) { remove(startOf(ast), endOf(ast)); } -void QuickFixOperation::flip(int start1, int end1, int start2, int end2) -{ - _changeSet.flip(start1, end1-start1, start2, end2-start2); -} - -void QuickFixOperation::flip(const CPlusPlus::AST *ast1, const CPlusPlus::AST *ast2) +void CppQuickFixOperation::flip(const CPlusPlus::AST *ast1, const CPlusPlus::AST *ast2) { flip(startOf(ast1), endOf(ast1), startOf(ast2), endOf(ast2)); } -void QuickFixOperation::copy(int start, int end, int to) -{ - _changeSet.copy(start, end-start, to); -} - -void QuickFixOperation::copy(unsigned tokenIndex, int to) +void CppQuickFixOperation::copy(unsigned tokenIndex, int to) { int start, end; startAndEndOf(tokenIndex, &start, &end); copy(start, end, to); } -void QuickFixOperation::copy(const CPlusPlus::AST *ast, int to) +void CppQuickFixOperation::copy(const CPlusPlus::AST *ast, int to) { copy(startOf(ast), endOf(ast), to); } -QString QuickFixOperation::textOf(int firstOffset, int lastOffset) const -{ - QTextCursor tc = _textCursor; - tc.setPosition(firstOffset); - tc.setPosition(lastOffset, QTextCursor::KeepAnchor); - return tc.selectedText(); -} - -QString QuickFixOperation::textOf(const AST *ast) const +QString CppQuickFixOperation::textOf(const AST *ast) const { return textOf(startOf(ast), endOf(ast)); } -QChar QuickFixOperation::charAt(int offset) const -{ - return textOf(offset, offset + 1).at(0); -} - -void QuickFixOperation::apply() -{ - Range range; - - if (_topLevelNode) - range = createRange(_topLevelNode); - - _textCursor.beginEditBlock(); - - _changeSet.apply(&_textCursor); - - if (_topLevelNode) - reindent(range); - - _textCursor.endEditBlock(); -} - -CPPQuickFixCollector::CPPQuickFixCollector() +CppQuickFixCollector::CppQuickFixCollector() : _modelManager(CppTools::CppModelManagerInterface::instance()), _editable(0), _editor(0) { } -CPPQuickFixCollector::~CPPQuickFixCollector() +CppQuickFixCollector::~CppQuickFixCollector() { } -TextEditor::ITextEditable *CPPQuickFixCollector::editor() const +TextEditor::ITextEditable *CppQuickFixCollector::editor() const { return _editable; } -int CPPQuickFixCollector::startPosition() const +int CppQuickFixCollector::startPosition() const { return _editable->position(); } -bool CPPQuickFixCollector::supportsEditor(TextEditor::ITextEditable *editor) +bool CppQuickFixCollector::supportsEditor(TextEditor::ITextEditable *editor) { return qobject_cast<CPPEditorEditable *>(editor) != 0; } -bool CPPQuickFixCollector::triggersCompletion(TextEditor::ITextEditable *) +bool CppQuickFixCollector::triggersCompletion(TextEditor::ITextEditable *) { return false; } -int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable) +int CppQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable) { Q_ASSERT(editable != 0); @@ -1144,18 +1070,18 @@ int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable) if (path.isEmpty()) return -1; - QSharedPointer<RewriteLogicalAndOp> rewriteLogicalAndOp(new RewriteLogicalAndOp()); - QSharedPointer<SplitIfStatementOp> splitIfStatementOp(new SplitIfStatementOp()); - QSharedPointer<MoveDeclarationOutOfIfOp> moveDeclarationOutOfIfOp(new MoveDeclarationOutOfIfOp()); - QSharedPointer<MoveDeclarationOutOfWhileOp> moveDeclarationOutOfWhileOp(new MoveDeclarationOutOfWhileOp()); - QSharedPointer<SplitSimpleDeclarationOp> splitSimpleDeclarationOp(new SplitSimpleDeclarationOp()); - QSharedPointer<AddBracesToIfOp> addBracesToIfOp(new AddBracesToIfOp()); - QSharedPointer<UseInverseOp> useInverseOp(new UseInverseOp()); - QSharedPointer<FlipBinaryOp> flipBinaryOp(new FlipBinaryOp()); - QSharedPointer<WrapStringLiteral> wrapStringLiteral(new WrapStringLiteral()); - QSharedPointer<CStringToNSString> wrapCString(new CStringToNSString()); - - QList<QuickFixOperationPtr> candidates; + QSharedPointer<RewriteLogicalAndOp> rewriteLogicalAndOp(new RewriteLogicalAndOp(_editor)); + QSharedPointer<SplitIfStatementOp> splitIfStatementOp(new SplitIfStatementOp(_editor)); + QSharedPointer<MoveDeclarationOutOfIfOp> moveDeclarationOutOfIfOp(new MoveDeclarationOutOfIfOp(_editor)); + QSharedPointer<MoveDeclarationOutOfWhileOp> moveDeclarationOutOfWhileOp(new MoveDeclarationOutOfWhileOp(_editor)); + QSharedPointer<SplitSimpleDeclarationOp> splitSimpleDeclarationOp(new SplitSimpleDeclarationOp(_editor)); + QSharedPointer<AddBracesToIfOp> addBracesToIfOp(new AddBracesToIfOp(_editor)); + QSharedPointer<UseInverseOp> useInverseOp(new UseInverseOp(_editor)); + QSharedPointer<FlipBinaryOp> flipBinaryOp(new FlipBinaryOp(_editor)); + QSharedPointer<WrapStringLiteral> wrapStringLiteral(new WrapStringLiteral(_editor)); + QSharedPointer<CStringToNSString> wrapCString(new CStringToNSString(_editor)); + + QList<CppQuickFixOperationPtr> candidates; candidates.append(rewriteLogicalAndOp); candidates.append(splitIfStatementOp); candidates.append(moveDeclarationOutOfIfOp); @@ -1168,19 +1094,21 @@ int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable) if (_editor->mimeType() == CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE) candidates.append(wrapCString); - QMap<int, QList<QuickFixOperationPtr> > matchedOps; + QMap<int, QList<CppQuickFixOperationPtr> > matchedOps; + + CppQuickFixState state; + state.path = path; - foreach (QuickFixOperationPtr op, candidates) { + foreach (CppQuickFixOperationPtr op, candidates) { op->setSnapshot(info.snapshot); op->setDocument(info.doc); - op->setEditor(_editor); op->setTextCursor(_editor->textCursor()); - int priority = op->match(path); + int priority = op->match(&state); if (priority != -1) matchedOps[priority].append(op); } - QMapIterator<int, QList<QuickFixOperationPtr> > it(matchedOps); + QMapIterator<int, QList<CppQuickFixOperationPtr> > it(matchedOps); it.toBack(); if (it.hasPrevious()) { it.previous(); @@ -1195,10 +1123,10 @@ int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable) return -1; } -void CPPQuickFixCollector::completions(QList<TextEditor::CompletionItem> *quickFixItems) +void CppQuickFixCollector::completions(QList<TextEditor::CompletionItem> *quickFixItems) { for (int i = 0; i < _quickFixes.size(); ++i) { - QuickFixOperationPtr op = _quickFixes.at(i); + CppQuickFixOperationPtr op = _quickFixes.at(i); TextEditor::CompletionItem item(this); item.text = op->description(); @@ -1207,24 +1135,24 @@ void CPPQuickFixCollector::completions(QList<TextEditor::CompletionItem> *quickF } } -void CPPQuickFixCollector::complete(const TextEditor::CompletionItem &item) +void CppQuickFixCollector::complete(const TextEditor::CompletionItem &item) { const int index = item.data.toInt(); if (index < _quickFixes.size()) { - QuickFixOperationPtr quickFix = _quickFixes.at(index); + CppQuickFixOperationPtr quickFix = _quickFixes.at(index); perform(quickFix); } } -void CPPQuickFixCollector::perform(QuickFixOperationPtr op) +void CppQuickFixCollector::perform(CppQuickFixOperationPtr op) { op->setTextCursor(_editor->textCursor()); op->createChangeSet(); op->apply(); } -void CPPQuickFixCollector::cleanup() +void CppQuickFixCollector::cleanup() { _quickFixes.clear(); } diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h index d10a1158635fc9a46baf1c015b8ae209c5b55001..34962f46ac6ab669459af0c7a786991575bbd387 100644 --- a/src/plugins/cppeditor/cppquickfix.h +++ b/src/plugins/cppeditor/cppquickfix.h @@ -31,6 +31,7 @@ #define CPPQUICKFIX_H #include <texteditor/icompletioncollector.h> +#include <texteditor/quickfix.h> #include <cplusplus/CppDocument.h> #include <ASTfwd.h> @@ -48,22 +49,18 @@ namespace CppEditor { namespace Internal { class CPPEditor; -class QuickFixOperation; -typedef QSharedPointer<QuickFixOperation> QuickFixOperationPtr; +class CppQuickFixOperation; +typedef QSharedPointer<CppQuickFixOperation> CppQuickFixOperationPtr; -class QuickFixOperation +class CppQuickFixOperation: public TextEditor::QuickFixOperation { - Q_DISABLE_COPY(QuickFixOperation) + Q_DISABLE_COPY(CppQuickFixOperation) public: - QuickFixOperation(); - virtual ~QuickFixOperation(); + CppQuickFixOperation(TextEditor::BaseTextEditor *editor); + virtual ~CppQuickFixOperation(); - virtual QString description() const = 0; virtual int match(const QList<CPlusPlus::AST *> &path) = 0; - virtual void createChangeSet() = 0; - - void apply(); CPlusPlus::Document::Ptr document() const; void setDocument(CPlusPlus::Document::Ptr document); @@ -71,16 +68,8 @@ public: CPlusPlus::Snapshot snapshot() const; void setSnapshot(const CPlusPlus::Snapshot &snapshot); - CPPEditor *editor() const; - void setEditor(CPPEditor *editor); - - QTextCursor textCursor() const; - void setTextCursor(const QTextCursor &cursor); - - int selectionStart() const; - int selectionEnd() const; - - const Utils::ChangeSet &changeSet() const; + virtual Range topLevelRange() const; + virtual int match(TextEditor::QuickFixState *state); protected: CPlusPlus::AST *topLevelNode() const; @@ -97,55 +86,44 @@ protected: bool isCursorOn(unsigned tokenIndex) const; bool isCursorOn(const CPlusPlus::AST *ast) const; - void move(int start, int end, int to); + using TextEditor::QuickFixOperation::move; + using TextEditor::QuickFixOperation::replace; + using TextEditor::QuickFixOperation::insert; + using TextEditor::QuickFixOperation::remove; + using TextEditor::QuickFixOperation::flip; + using TextEditor::QuickFixOperation::copy; + + using TextEditor::QuickFixOperation::textOf; + using TextEditor::QuickFixOperation::charAt; + void move(unsigned tokenIndex, int to); void move(const CPlusPlus::AST *ast, int to); - void replace(int start, int end, const QString &replacement); void replace(unsigned tokenIndex, const QString &replacement); void replace(const CPlusPlus::AST *ast, const QString &replacement); - void insert(int at, const QString &text); - void remove(int start, int end); void remove(unsigned tokenIndex); void remove(const CPlusPlus::AST *ast); - void flip(int start1, int end1, int start2, int end2); void flip(const CPlusPlus::AST *ast1, const CPlusPlus::AST *ast2); - void copy(int start, int end, int to); void copy(unsigned tokenIndex, int to); void copy(const CPlusPlus::AST *ast, int to); - QString textOf(int firstOffset, int lastOffset) const; QString textOf(const CPlusPlus::AST *ast) const; - QChar charAt(int offset) const; - - struct Range { - Range() {} - Range(const QTextCursor &tc): begin(tc), end(tc) {} - - QTextCursor begin; - QTextCursor end; - }; - Range createRange(CPlusPlus::AST *ast) const; // ### rename me - void reindent(const Range &range); private: CPlusPlus::Document::Ptr _document; CPlusPlus::Snapshot _snapshot; - QTextCursor _textCursor; - Utils::ChangeSet _changeSet; - CPPEditor *_editor; CPlusPlus::AST *_topLevelNode; }; -class CPPQuickFixCollector: public TextEditor::IQuickFixCollector +class CppQuickFixCollector: public TextEditor::IQuickFixCollector { Q_OBJECT public: - CPPQuickFixCollector(); - virtual ~CPPQuickFixCollector(); + CppQuickFixCollector(); + virtual ~CppQuickFixCollector(); - QList<QuickFixOperationPtr> quickFixes() const { return _quickFixes; } + QList<CppQuickFixOperationPtr> quickFixes() const { return _quickFixes; } virtual TextEditor::ITextEditable *editor() const; virtual int startPosition() const; @@ -157,13 +135,13 @@ public: virtual void cleanup(); public Q_SLOTS: - void perform(QuickFixOperationPtr op); + void perform(CppQuickFixOperationPtr op); private: CppTools::CppModelManagerInterface *_modelManager; TextEditor::ITextEditable *_editable; CPPEditor *_editor; - QList<QuickFixOperationPtr> _quickFixes; + QList<CppQuickFixOperationPtr> _quickFixes; }; } // end of namespace Internal diff --git a/src/plugins/texteditor/quickfix.cpp b/src/plugins/texteditor/quickfix.cpp index 3b41186d8828f01d8112642bc83a64b79070785b..c9de95b45a13c10c21824460dd7fee992dc81aad 100644 --- a/src/plugins/texteditor/quickfix.cpp +++ b/src/plugins/texteditor/quickfix.cpp @@ -110,9 +110,11 @@ int QuickFixOperation::position(int line, int column) const void QuickFixOperation::reindent(const Range &range) { - QTextCursor tc = range.begin; - tc.setPosition(range.end.position(), QTextCursor::KeepAnchor); - editor()->indentInsertedText(tc); + if (! range.isNull()) { + QTextCursor tc = range.begin; + tc.setPosition(range.end.position(), QTextCursor::KeepAnchor); + editor()->indentInsertedText(tc); + } } void QuickFixOperation::move(int start, int end, int to) diff --git a/src/plugins/texteditor/quickfix.h b/src/plugins/texteditor/quickfix.h index f48eeb74730d1b73d92941942bd1dee8f50e01e8..376c54c4a6048c5955b408f00745753bfb5c4f10 100644 --- a/src/plugins/texteditor/quickfix.h +++ b/src/plugins/texteditor/quickfix.h @@ -61,6 +61,8 @@ public: Range() {} Range(const QTextCursor &tc): begin(tc), end(tc) {} + bool isNull() const { return begin.isNull() || end.isNull(); } + QTextCursor begin; QTextCursor end; };