From 8545851927e64cdcc0de4d188e0b97449f6ab9ce Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 24 Nov 2009 12:48:36 +0100 Subject: [PATCH] Split create/apply change set. --- src/plugins/cppeditor/cppquickfix.cpp | 52 ++++++++++++++------------- src/plugins/cppeditor/cppquickfix.h | 9 +++-- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp index 335ac040d6b..b09468d23e7 100644 --- a/src/plugins/cppeditor/cppquickfix.cpp +++ b/src/plugins/cppeditor/cppquickfix.cpp @@ -139,14 +139,13 @@ public: return -1; } - virtual void apply() + virtual void createChangeSet() { + setTopLevelNode(pattern); replace(pattern->binary_op_token, QLatin1String("||")); replace(left->unary_op_token, QLatin1String("!(")); replace(right->unary_op_token, QLatin1String("")); insert(endOf(pattern), QLatin1String(")")); - - applyChanges(pattern); } private: @@ -230,8 +229,9 @@ public: return -1; } - virtual void apply() + virtual void createChangeSet() { + setTopLevelNode(declaration); SpecifierListAST *specifiers = declaration->decl_specifier_list; const QString declSpecifiers = textOf(startOf(specifiers->firstToken()), endOf(specifiers->lastToken() - 1)); @@ -250,8 +250,6 @@ public: } insert(endOf(declaration->semicolon_token), text); - - applyChanges(declaration); } private: @@ -303,11 +301,11 @@ public: return -1; } - virtual void apply() + virtual void createChangeSet() { + setTopLevelNode(_statement); insert(endOf(_statement->firstToken() - 1), QLatin1String(" {")); insert(endOf(_statement->lastToken() - 1), "\n}"); - applyChanges(_statement); } private: @@ -358,8 +356,9 @@ public: return -1; } - virtual void apply() + virtual void createChangeSet() { + setTopLevelNode(pattern); const QString name = textOf(core); QString declaration = textOf(condition); declaration += QLatin1String(";\n"); @@ -367,8 +366,6 @@ public: insert(startOf(pattern), declaration); insert(endOf(pattern->lparen_token), name); replace(condition, name); - - applyChanges(pattern); } private: @@ -431,8 +428,9 @@ public: return -1; } - virtual void apply() + virtual void createChangeSet() { + setTopLevelNode(pattern); const QString name = textOf(core); const QString initializer = textOf(condition->declarator->initializer); QString declaration = textOf(startOf(condition), endOf(condition->declarator->equals_token - 1)); @@ -448,8 +446,6 @@ public: insert(startOf(pattern), declaration); insert(endOf(pattern->lparen_token), name); replace(condition, newCondition); - - applyChanges(pattern); } private: @@ -529,7 +525,7 @@ public: return -1; } - virtual void apply() + virtual void createChangeSet() { Token binaryToken = tokenAt(condition->binary_op_token); @@ -541,6 +537,7 @@ public: void splitAndCondition() { + setTopLevelNode(pattern); StatementAST *ifTrueStatement = pattern->statement; // take the right-expression from the condition. @@ -558,12 +555,11 @@ public: insert(endOf(pattern->rparen_token), nestedIfStatement); insert(endOf(ifTrueStatement), "\n}"); // finish the compound statement - - applyChanges(pattern); } void splitOrCondition() { + setTopLevelNode(pattern); StatementAST *ifTrueStatement = pattern->statement; CompoundStatementAST *compoundStatement = ifTrueStatement->asCompoundStatement(); @@ -592,8 +588,6 @@ public: elseIfStatement += body; insert(endOf(pattern), elseIfStatement); - - applyChanges(pattern); } private: @@ -607,7 +601,8 @@ private: QuickFixOperation::QuickFixOperation(CPlusPlus::Document::Ptr doc, const CPlusPlus::Snapshot &snapshot, CPPEditor *editor) - : _doc(doc), _snapshot(snapshot), _editor(editor) + : _doc(doc), _snapshot(snapshot), + _editor(editor), _topLevelNode(0) { } QuickFixOperation::~QuickFixOperation() @@ -616,6 +611,12 @@ QuickFixOperation::~QuickFixOperation() CPPEditor *QuickFixOperation::editor() const { return _editor; } +CPlusPlus::AST *QuickFixOperation::topLevelNode() const +{ return _topLevelNode; } + +void QuickFixOperation::setTopLevelNode(CPlusPlus::AST *topLevelNode) +{ _topLevelNode = topLevelNode; } + const Utils::ChangeSet &QuickFixOperation::changeSet() const { return _changeSet; } @@ -752,18 +753,18 @@ QString QuickFixOperation::textOf(AST *ast) const return textOf(startOf(ast), endOf(ast)); } -void QuickFixOperation::applyChanges(AST *ast) +void QuickFixOperation::applyChangeSet() { Range range; - if (ast) - range = createRange(ast); + if (_topLevelNode) + range = createRange(_topLevelNode); _textCursor.beginEditBlock(); _changeSet.write(&_textCursor); - if (ast) + if (_topLevelNode) reindent(range); _textCursor.endEditBlock(); @@ -867,7 +868,8 @@ void CPPQuickFixCollector::complete(const TextEditor::CompletionItem &item) void CPPQuickFixCollector::perform(QuickFixOperationPtr op) { op->setTextCursor(_editor->textCursor()); - op->apply(); + op->createChangeSet(); + op->applyChangeSet(); } void CPPQuickFixCollector::cleanup() diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h index 3dde2727e96..4e5a7f8d85d 100644 --- a/src/plugins/cppeditor/cppquickfix.h +++ b/src/plugins/cppeditor/cppquickfix.h @@ -77,7 +77,11 @@ public: CPPEditor *editor() const; const Utils::ChangeSet &changeSet() const; - virtual void apply() = 0; + CPlusPlus::AST *topLevelNode() const; + void setTopLevelNode(CPlusPlus::AST *topLevelNode); + + virtual void createChangeSet() = 0; + void applyChangeSet(); protected: const CPlusPlus::Token &tokenAt(unsigned index) const; @@ -112,14 +116,13 @@ protected: Range createRange(CPlusPlus::AST *ast) const; // ### rename me void reindent(const Range &range); - void applyChanges(CPlusPlus::AST *ast = 0); - private: CPlusPlus::Document::Ptr _doc; CPlusPlus::Snapshot _snapshot; QTextCursor _textCursor; Utils::ChangeSet _changeSet; CPPEditor *_editor; + CPlusPlus::AST *_topLevelNode; }; class CPPQuickFixCollector: public TextEditor::IQuickFixCollector -- GitLab