Reimplemented the C++ quick fix operations using TextEditor::QuickFixOperation.

This commit is contained in:
Roberto Raggi
2010-06-03 14:15:56 +02:00
parent 2bb081c495
commit a40349c09b
8 changed files with 158 additions and 248 deletions

View File

@@ -1586,8 +1586,8 @@ bool CPPEditor::event(QEvent *e)
void CPPEditor::performQuickFix(int index) void CPPEditor::performQuickFix(int index)
{ {
CPPQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector(); CppQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector();
QuickFixOperationPtr op = m_quickFixes.at(index); CppQuickFixOperationPtr op = m_quickFixes.at(index);
quickFixCollector->perform(op); quickFixCollector->perform(op);
//op->createChangeSet(); //op->createChangeSet();
//setChangeSet(op->changeSet()); //setChangeSet(op->changeSet());
@@ -1604,7 +1604,7 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e)
Core::ActionContainer *mcontext = am->actionContainer(CppEditor::Constants::M_CONTEXT); Core::ActionContainer *mcontext = am->actionContainer(CppEditor::Constants::M_CONTEXT);
QMenu *contextMenu = mcontext->menu(); QMenu *contextMenu = mcontext->menu();
CPPQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector(); CppQuickFixCollector *quickFixCollector = CppPlugin::instance()->quickFixCollector();
QSignalMapper mapper; QSignalMapper mapper;
connect(&mapper, SIGNAL(mapped(int)), this, SLOT(performQuickFix(int))); connect(&mapper, SIGNAL(mapped(int)), this, SLOT(performQuickFix(int)));
@@ -1614,7 +1614,7 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e)
m_quickFixes = quickFixCollector->quickFixes(); m_quickFixes = quickFixCollector->quickFixes();
for (int index = 0; index < m_quickFixes.size(); ++index) { 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()); QAction *action = menu->addAction(op->description());
mapper.setMapping(action, index); mapper.setMapping(action, index);
connect(action, SIGNAL(triggered()), &mapper, SLOT(map())); connect(action, SIGNAL(triggered()), &mapper, SLOT(map()));

View File

@@ -309,7 +309,7 @@ private:
SemanticHighlighter *m_semanticHighlighter; SemanticHighlighter *m_semanticHighlighter;
SemanticInfo m_lastSemanticInfo; SemanticInfo m_lastSemanticInfo;
QList<QuickFixOperationPtr> m_quickFixes; QList<CppQuickFixOperationPtr> m_quickFixes;
bool m_initialized; bool m_initialized;
}; };

View File

@@ -191,7 +191,7 @@ bool CppPlugin::sortedMethodOverview() const
return m_sortedMethodOverview; return m_sortedMethodOverview;
} }
CPPQuickFixCollector *CppPlugin::quickFixCollector() const CppQuickFixCollector *CppPlugin::quickFixCollector() const
{ return m_quickFixCollector; } { return m_quickFixCollector; }
bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage) 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 CppEditorFactory(this));
addAutoReleasedObject(new CppHoverHandler); addAutoReleasedObject(new CppHoverHandler);
m_quickFixCollector = new CPPQuickFixCollector; m_quickFixCollector = new CppQuickFixCollector;
addAutoReleasedObject(m_quickFixCollector); addAutoReleasedObject(m_quickFixCollector);
CppFileWizard::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard); CppFileWizard::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard);

View File

@@ -46,7 +46,7 @@ namespace CppEditor {
namespace Internal { namespace Internal {
class CPPEditor; class CPPEditor;
class CPPQuickFixCollector; class CppQuickFixCollector;
class CppPlugin : public ExtensionSystem::IPlugin class CppPlugin : public ExtensionSystem::IPlugin
{ {
@@ -67,7 +67,7 @@ public:
bool sortedMethodOverview() const; bool sortedMethodOverview() const;
CPPQuickFixCollector *quickFixCollector() const; CppQuickFixCollector *quickFixCollector() const;
signals: signals:
void methodOverviewSortingChanged(bool sort); void methodOverviewSortingChanged(bool sort);
@@ -98,7 +98,7 @@ private:
QAction *m_findUsagesAction; QAction *m_findUsagesAction;
QAction *m_updateCodeModelAction; QAction *m_updateCodeModelAction;
CPPQuickFixCollector *m_quickFixCollector; CppQuickFixCollector *m_quickFixCollector;
QTimer *m_quickFixTimer; QTimer *m_quickFixTimer;
QPointer<TextEditor::ITextEditable> m_currentTextEditable; QPointer<TextEditor::ITextEditable> m_currentTextEditable;

View File

@@ -58,17 +58,23 @@ using namespace CPlusPlus;
namespace { namespace {
class CppQuickFixState: public TextEditor::QuickFixState
{
public:
QList<CPlusPlus::AST *> path;
};
/* /*
Rewrite Rewrite
a op b -> !(a invop b) a op b -> !(a invop b)
(a op b) -> !(a invop b) (a op b) -> !(a invop b)
!(a op b) -> (a invob b) !(a op b) -> (a invob b)
*/ */
class UseInverseOp: public QuickFixOperation class UseInverseOp: public CppQuickFixOperation
{ {
public: public:
UseInverseOp() UseInverseOp(TextEditor::BaseTextEditor *editor)
: binary(0), nested(0), negation(0) : CppQuickFixOperation(editor), binary(0), nested(0), negation(0)
{} {}
virtual QString description() const virtual QString description() const
@@ -156,11 +162,11 @@ private:
As As
b flipop a b flipop a
*/ */
class FlipBinaryOp: public QuickFixOperation class FlipBinaryOp: public CppQuickFixOperation
{ {
public: public:
FlipBinaryOp() FlipBinaryOp(TextEditor::BaseTextEditor *editor)
: binary(0) : CppQuickFixOperation(editor), binary(0)
{} {}
@@ -232,11 +238,11 @@ private:
As As
!(a || b) !(a || b)
*/ */
class RewriteLogicalAndOp: public QuickFixOperation class RewriteLogicalAndOp: public CppQuickFixOperation
{ {
public: public:
RewriteLogicalAndOp() RewriteLogicalAndOp(TextEditor::BaseTextEditor *editor)
: left(0), right(0), pattern(0) : CppQuickFixOperation(editor), left(0), right(0), pattern(0)
{} {}
virtual QString description() const virtual QString description() const
@@ -293,11 +299,11 @@ private:
BinaryExpressionAST *pattern; BinaryExpressionAST *pattern;
}; };
class SplitSimpleDeclarationOp: public QuickFixOperation class SplitSimpleDeclarationOp: public CppQuickFixOperation
{ {
public: public:
SplitSimpleDeclarationOp() SplitSimpleDeclarationOp(TextEditor::BaseTextEditor *editor)
: declaration(0) : CppQuickFixOperation(editor), declaration(0)
{} {}
virtual QString description() const virtual QString description() const
@@ -399,11 +405,11 @@ private:
Add curly braces to a if statement that doesn't already contain a Add curly braces to a if statement that doesn't already contain a
compound statement. compound statement.
*/ */
class AddBracesToIfOp: public QuickFixOperation class AddBracesToIfOp: public CppQuickFixOperation
{ {
public: public:
AddBracesToIfOp() AddBracesToIfOp(TextEditor::BaseTextEditor *editor)
: _statement(0) : CppQuickFixOperation(editor), _statement(0)
{} {}
virtual QString description() const virtual QString description() const
@@ -459,11 +465,11 @@ private:
Type name = foo; Type name = foo;
if (name) {...} if (name) {...}
*/ */
class MoveDeclarationOutOfIfOp: public QuickFixOperation class MoveDeclarationOutOfIfOp: public CppQuickFixOperation
{ {
public: public:
MoveDeclarationOutOfIfOp() MoveDeclarationOutOfIfOp(TextEditor::BaseTextEditor *editor)
: condition(0), pattern(0), core(0) : CppQuickFixOperation(editor), condition(0), pattern(0), core(0)
{} {}
virtual QString description() const virtual QString description() const
@@ -522,11 +528,11 @@ private:
Type name; Type name;
while ((name = foo()) != 0) {...} while ((name = foo()) != 0) {...}
*/ */
class MoveDeclarationOutOfWhileOp: public QuickFixOperation class MoveDeclarationOutOfWhileOp: public CppQuickFixOperation
{ {
public: public:
MoveDeclarationOutOfWhileOp() MoveDeclarationOutOfWhileOp(TextEditor::BaseTextEditor *editor)
: condition(0), pattern(0), core(0) : CppQuickFixOperation(editor), condition(0), pattern(0), core(0)
{} {}
virtual QString description() const virtual QString description() const
@@ -607,11 +613,11 @@ private:
else if (something_else) else if (something_else)
x; x;
*/ */
class SplitIfStatementOp: public QuickFixOperation class SplitIfStatementOp: public CppQuickFixOperation
{ {
public: public:
SplitIfStatementOp() SplitIfStatementOp(TextEditor::BaseTextEditor *editor)
: condition(0), pattern(0) : CppQuickFixOperation(editor), condition(0), pattern(0)
{} {}
virtual QString description() const virtual QString description() const
@@ -717,11 +723,11 @@ private:
With With
QLatin1String("abcd") QLatin1String("abcd")
*/ */
class WrapStringLiteral: public QuickFixOperation class WrapStringLiteral: public CppQuickFixOperation
{ {
public: public:
WrapStringLiteral() WrapStringLiteral(TextEditor::BaseTextEditor *editor)
: stringLiteral(0), isObjCStringLiteral(false) : CppQuickFixOperation(editor), stringLiteral(0), isObjCStringLiteral(false)
{} {}
virtual QString description() const virtual QString description() const
@@ -785,11 +791,11 @@ private:
bool isObjCStringLiteral; bool isObjCStringLiteral;
}; };
class CStringToNSString: public QuickFixOperation class CStringToNSString: public CppQuickFixOperation
{ {
public: public:
CStringToNSString() CStringToNSString(TextEditor::BaseTextEditor *editor)
: stringLiteral(0), qlatin1Call(0) : CppQuickFixOperation(editor), stringLiteral(0), qlatin1Call(0)
{} {}
virtual QString description() const virtual QString description() const
@@ -856,91 +862,82 @@ private:
} // end of anonymous namespace } // end of anonymous namespace
QuickFixOperation::QuickFixOperation() CppQuickFixOperation::CppQuickFixOperation(TextEditor::BaseTextEditor *editor)
: _editor(0), _topLevelNode(0) : TextEditor::QuickFixOperation(editor), _topLevelNode(0)
{ } { }
QuickFixOperation::~QuickFixOperation() CppQuickFixOperation::~CppQuickFixOperation()
{ } { }
CPlusPlus::AST *QuickFixOperation::topLevelNode() const CppQuickFixOperation::Range CppQuickFixOperation::topLevelRange() 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; }
Snapshot QuickFixOperation::snapshot() const
{ return _snapshot; }
void QuickFixOperation::setSnapshot(const CPlusPlus::Snapshot &snapshot)
{ {
_snapshot = snapshot; if (topLevelNode())
return createRange(topLevelNode());
return Range();
} }
CPPEditor *QuickFixOperation::editor() const int CppQuickFixOperation::match(TextEditor::QuickFixState *state)
{ return _editor; } {
CppQuickFixState *s = static_cast<CppQuickFixState *>(state);
return match(s->path);
}
void QuickFixOperation::setEditor(CPPEditor *editor) CPlusPlus::AST *CppQuickFixOperation::topLevelNode() const
{ _editor = editor; } { return _topLevelNode; }
QTextCursor QuickFixOperation::textCursor() const void CppQuickFixOperation::setTopLevelNode(CPlusPlus::AST *topLevelNode)
{ return _textCursor; } { _topLevelNode = topLevelNode; }
void QuickFixOperation::setTextCursor(const QTextCursor &cursor) Document::Ptr CppQuickFixOperation::document() const
{ _textCursor = cursor; } { return _document; }
int QuickFixOperation::selectionStart() const void CppQuickFixOperation::setDocument(CPlusPlus::Document::Ptr document)
{ return _textCursor.selectionStart(); } { _document = document; }
int QuickFixOperation::selectionEnd() const Snapshot CppQuickFixOperation::snapshot() const
{ return _textCursor.selectionEnd(); } { return _snapshot; }
const CPlusPlus::Token &QuickFixOperation::tokenAt(unsigned index) const void CppQuickFixOperation::setSnapshot(const CPlusPlus::Snapshot &snapshot)
{ _snapshot = snapshot; }
const CPlusPlus::Token &CppQuickFixOperation::tokenAt(unsigned index) const
{ return _document->translationUnit()->tokenAt(index); } { return _document->translationUnit()->tokenAt(index); }
int QuickFixOperation::startOf(unsigned index) const int CppQuickFixOperation::startOf(unsigned index) const
{ {
unsigned line, column; unsigned line, column;
_document->translationUnit()->getPosition(tokenAt(index).begin(), &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()); return startOf(ast->firstToken());
} }
int QuickFixOperation::endOf(unsigned index) const int CppQuickFixOperation::endOf(unsigned index) const
{ {
unsigned line, column; unsigned line, column;
_document->translationUnit()->getPosition(tokenAt(index).end(), &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); 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; unsigned line, column;
CPlusPlus::Token token(tokenAt(index)); CPlusPlus::Token token(tokenAt(index));
_document->translationUnit()->getPosition(token.begin(), &line, &column); _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(); *end = *start + token.length();
} }
bool QuickFixOperation::isCursorOn(unsigned tokenIndex) const bool CppQuickFixOperation::isCursorOn(unsigned tokenIndex) const
{ {
QTextCursor tc = textCursor(); QTextCursor tc = textCursor();
int cursorBegin = tc.selectionStart(); int cursorBegin = tc.selectionStart();
@@ -954,7 +951,7 @@ bool QuickFixOperation::isCursorOn(unsigned tokenIndex) const
return false; return false;
} }
bool QuickFixOperation::isCursorOn(const CPlusPlus::AST *ast) const bool CppQuickFixOperation::isCursorOn(const CPlusPlus::AST *ast) const
{ {
QTextCursor tc = textCursor(); QTextCursor tc = textCursor();
int cursorBegin = tc.selectionStart(); int cursorBegin = tc.selectionStart();
@@ -968,160 +965,89 @@ bool QuickFixOperation::isCursorOn(const CPlusPlus::AST *ast) const
return false; return false;
} }
QuickFixOperation::Range QuickFixOperation::createRange(AST *ast) const CppQuickFixOperation::Range CppQuickFixOperation::createRange(AST *ast) const
{ {
QTextCursor tc = _textCursor; return range(startOf(ast), endOf(ast));
Range r(tc);
r.begin.setPosition(startOf(ast));
r.end.setPosition(endOf(ast));
return r;
} }
void QuickFixOperation::reindent(const Range &range) void CppQuickFixOperation::move(unsigned tokenIndex, int to)
{
QTextCursor tc = range.begin;
tc.setPosition(range.end.position(), QTextCursor::KeepAnchor);
_editor->indentInsertedText(tc);
}
void QuickFixOperation::move(int start, int end, int to)
{
_changeSet.move(start, end-start, to);
}
void QuickFixOperation::move(unsigned tokenIndex, int to)
{ {
int start, end; int start, end;
startAndEndOf(tokenIndex, &start, &end); startAndEndOf(tokenIndex, &start, &end);
move(start, end, to); 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); move(startOf(ast), endOf(ast), to);
} }
void QuickFixOperation::replace(int start, int end, const QString &replacement) void CppQuickFixOperation::replace(unsigned tokenIndex, const QString &replacement)
{
_changeSet.replace(start, end-start, replacement);
}
void QuickFixOperation::replace(unsigned tokenIndex, const QString &replacement)
{ {
int start, end; int start, end;
startAndEndOf(tokenIndex, &start, &end); startAndEndOf(tokenIndex, &start, &end);
replace(start, end, replacement); 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); replace(startOf(ast), endOf(ast), replacement);
} }
void QuickFixOperation::insert(int at, const QString &text) void CppQuickFixOperation::remove(unsigned tokenIndex)
{
_changeSet.insert(at, text);
}
void QuickFixOperation::remove(int start, int end)
{
_changeSet.remove(start, end-start);
}
void QuickFixOperation::remove(unsigned tokenIndex)
{ {
int start, end; int start, end;
startAndEndOf(tokenIndex, &start, &end); startAndEndOf(tokenIndex, &start, &end);
remove(start, end); remove(start, end);
} }
void QuickFixOperation::remove(const CPlusPlus::AST *ast) void CppQuickFixOperation::remove(const CPlusPlus::AST *ast)
{ {
remove(startOf(ast), endOf(ast)); remove(startOf(ast), endOf(ast));
} }
void QuickFixOperation::flip(int start1, int end1, int start2, int end2) void CppQuickFixOperation::flip(const CPlusPlus::AST *ast1, const CPlusPlus::AST *ast2)
{
_changeSet.flip(start1, end1-start1, start2, end2-start2);
}
void QuickFixOperation::flip(const CPlusPlus::AST *ast1, const CPlusPlus::AST *ast2)
{ {
flip(startOf(ast1), endOf(ast1), startOf(ast2), endOf(ast2)); flip(startOf(ast1), endOf(ast1), startOf(ast2), endOf(ast2));
} }
void QuickFixOperation::copy(int start, int end, int to) void CppQuickFixOperation::copy(unsigned tokenIndex, int to)
{
_changeSet.copy(start, end-start, to);
}
void QuickFixOperation::copy(unsigned tokenIndex, int to)
{ {
int start, end; int start, end;
startAndEndOf(tokenIndex, &start, &end); startAndEndOf(tokenIndex, &start, &end);
copy(start, end, to); 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); copy(startOf(ast), endOf(ast), to);
} }
QString QuickFixOperation::textOf(int firstOffset, int lastOffset) const QString CppQuickFixOperation::textOf(const AST *ast) const
{
QTextCursor tc = _textCursor;
tc.setPosition(firstOffset);
tc.setPosition(lastOffset, QTextCursor::KeepAnchor);
return tc.selectedText();
}
QString QuickFixOperation::textOf(const AST *ast) const
{ {
return textOf(startOf(ast), endOf(ast)); return textOf(startOf(ast), endOf(ast));
} }
QChar QuickFixOperation::charAt(int offset) const CppQuickFixCollector::CppQuickFixCollector()
{
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()
: _modelManager(CppTools::CppModelManagerInterface::instance()), _editable(0), _editor(0) : _modelManager(CppTools::CppModelManagerInterface::instance()), _editable(0), _editor(0)
{ } { }
CPPQuickFixCollector::~CPPQuickFixCollector() CppQuickFixCollector::~CppQuickFixCollector()
{ } { }
TextEditor::ITextEditable *CPPQuickFixCollector::editor() const TextEditor::ITextEditable *CppQuickFixCollector::editor() const
{ return _editable; } { return _editable; }
int CPPQuickFixCollector::startPosition() const int CppQuickFixCollector::startPosition() const
{ return _editable->position(); } { return _editable->position(); }
bool CPPQuickFixCollector::supportsEditor(TextEditor::ITextEditable *editor) bool CppQuickFixCollector::supportsEditor(TextEditor::ITextEditable *editor)
{ return qobject_cast<CPPEditorEditable *>(editor) != 0; } { return qobject_cast<CPPEditorEditable *>(editor) != 0; }
bool CPPQuickFixCollector::triggersCompletion(TextEditor::ITextEditable *) bool CppQuickFixCollector::triggersCompletion(TextEditor::ITextEditable *)
{ return false; } { return false; }
int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable) int CppQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable)
{ {
Q_ASSERT(editable != 0); Q_ASSERT(editable != 0);
@@ -1144,18 +1070,18 @@ int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable)
if (path.isEmpty()) if (path.isEmpty())
return -1; return -1;
QSharedPointer<RewriteLogicalAndOp> rewriteLogicalAndOp(new RewriteLogicalAndOp()); QSharedPointer<RewriteLogicalAndOp> rewriteLogicalAndOp(new RewriteLogicalAndOp(_editor));
QSharedPointer<SplitIfStatementOp> splitIfStatementOp(new SplitIfStatementOp()); QSharedPointer<SplitIfStatementOp> splitIfStatementOp(new SplitIfStatementOp(_editor));
QSharedPointer<MoveDeclarationOutOfIfOp> moveDeclarationOutOfIfOp(new MoveDeclarationOutOfIfOp()); QSharedPointer<MoveDeclarationOutOfIfOp> moveDeclarationOutOfIfOp(new MoveDeclarationOutOfIfOp(_editor));
QSharedPointer<MoveDeclarationOutOfWhileOp> moveDeclarationOutOfWhileOp(new MoveDeclarationOutOfWhileOp()); QSharedPointer<MoveDeclarationOutOfWhileOp> moveDeclarationOutOfWhileOp(new MoveDeclarationOutOfWhileOp(_editor));
QSharedPointer<SplitSimpleDeclarationOp> splitSimpleDeclarationOp(new SplitSimpleDeclarationOp()); QSharedPointer<SplitSimpleDeclarationOp> splitSimpleDeclarationOp(new SplitSimpleDeclarationOp(_editor));
QSharedPointer<AddBracesToIfOp> addBracesToIfOp(new AddBracesToIfOp()); QSharedPointer<AddBracesToIfOp> addBracesToIfOp(new AddBracesToIfOp(_editor));
QSharedPointer<UseInverseOp> useInverseOp(new UseInverseOp()); QSharedPointer<UseInverseOp> useInverseOp(new UseInverseOp(_editor));
QSharedPointer<FlipBinaryOp> flipBinaryOp(new FlipBinaryOp()); QSharedPointer<FlipBinaryOp> flipBinaryOp(new FlipBinaryOp(_editor));
QSharedPointer<WrapStringLiteral> wrapStringLiteral(new WrapStringLiteral()); QSharedPointer<WrapStringLiteral> wrapStringLiteral(new WrapStringLiteral(_editor));
QSharedPointer<CStringToNSString> wrapCString(new CStringToNSString()); QSharedPointer<CStringToNSString> wrapCString(new CStringToNSString(_editor));
QList<QuickFixOperationPtr> candidates; QList<CppQuickFixOperationPtr> candidates;
candidates.append(rewriteLogicalAndOp); candidates.append(rewriteLogicalAndOp);
candidates.append(splitIfStatementOp); candidates.append(splitIfStatementOp);
candidates.append(moveDeclarationOutOfIfOp); candidates.append(moveDeclarationOutOfIfOp);
@@ -1168,19 +1094,21 @@ int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable)
if (_editor->mimeType() == CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE) if (_editor->mimeType() == CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)
candidates.append(wrapCString); candidates.append(wrapCString);
QMap<int, QList<QuickFixOperationPtr> > matchedOps; QMap<int, QList<CppQuickFixOperationPtr> > matchedOps;
foreach (QuickFixOperationPtr op, candidates) { CppQuickFixState state;
state.path = path;
foreach (CppQuickFixOperationPtr op, candidates) {
op->setSnapshot(info.snapshot); op->setSnapshot(info.snapshot);
op->setDocument(info.doc); op->setDocument(info.doc);
op->setEditor(_editor);
op->setTextCursor(_editor->textCursor()); op->setTextCursor(_editor->textCursor());
int priority = op->match(path); int priority = op->match(&state);
if (priority != -1) if (priority != -1)
matchedOps[priority].append(op); matchedOps[priority].append(op);
} }
QMapIterator<int, QList<QuickFixOperationPtr> > it(matchedOps); QMapIterator<int, QList<CppQuickFixOperationPtr> > it(matchedOps);
it.toBack(); it.toBack();
if (it.hasPrevious()) { if (it.hasPrevious()) {
it.previous(); it.previous();
@@ -1195,10 +1123,10 @@ int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable)
return -1; return -1;
} }
void CPPQuickFixCollector::completions(QList<TextEditor::CompletionItem> *quickFixItems) void CppQuickFixCollector::completions(QList<TextEditor::CompletionItem> *quickFixItems)
{ {
for (int i = 0; i < _quickFixes.size(); ++i) { for (int i = 0; i < _quickFixes.size(); ++i) {
QuickFixOperationPtr op = _quickFixes.at(i); CppQuickFixOperationPtr op = _quickFixes.at(i);
TextEditor::CompletionItem item(this); TextEditor::CompletionItem item(this);
item.text = op->description(); 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(); const int index = item.data.toInt();
if (index < _quickFixes.size()) { if (index < _quickFixes.size()) {
QuickFixOperationPtr quickFix = _quickFixes.at(index); CppQuickFixOperationPtr quickFix = _quickFixes.at(index);
perform(quickFix); perform(quickFix);
} }
} }
void CPPQuickFixCollector::perform(QuickFixOperationPtr op) void CppQuickFixCollector::perform(CppQuickFixOperationPtr op)
{ {
op->setTextCursor(_editor->textCursor()); op->setTextCursor(_editor->textCursor());
op->createChangeSet(); op->createChangeSet();
op->apply(); op->apply();
} }
void CPPQuickFixCollector::cleanup() void CppQuickFixCollector::cleanup()
{ {
_quickFixes.clear(); _quickFixes.clear();
} }

View File

@@ -31,6 +31,7 @@
#define CPPQUICKFIX_H #define CPPQUICKFIX_H
#include <texteditor/icompletioncollector.h> #include <texteditor/icompletioncollector.h>
#include <texteditor/quickfix.h>
#include <cplusplus/CppDocument.h> #include <cplusplus/CppDocument.h>
#include <ASTfwd.h> #include <ASTfwd.h>
@@ -48,22 +49,18 @@ namespace CppEditor {
namespace Internal { namespace Internal {
class CPPEditor; class CPPEditor;
class QuickFixOperation; class CppQuickFixOperation;
typedef QSharedPointer<QuickFixOperation> QuickFixOperationPtr; typedef QSharedPointer<CppQuickFixOperation> CppQuickFixOperationPtr;
class QuickFixOperation class CppQuickFixOperation: public TextEditor::QuickFixOperation
{ {
Q_DISABLE_COPY(QuickFixOperation) Q_DISABLE_COPY(CppQuickFixOperation)
public: public:
QuickFixOperation(); CppQuickFixOperation(TextEditor::BaseTextEditor *editor);
virtual ~QuickFixOperation(); virtual ~CppQuickFixOperation();
virtual QString description() const = 0;
virtual int match(const QList<CPlusPlus::AST *> &path) = 0; virtual int match(const QList<CPlusPlus::AST *> &path) = 0;
virtual void createChangeSet() = 0;
void apply();
CPlusPlus::Document::Ptr document() const; CPlusPlus::Document::Ptr document() const;
void setDocument(CPlusPlus::Document::Ptr document); void setDocument(CPlusPlus::Document::Ptr document);
@@ -71,16 +68,8 @@ public:
CPlusPlus::Snapshot snapshot() const; CPlusPlus::Snapshot snapshot() const;
void setSnapshot(const CPlusPlus::Snapshot &snapshot); void setSnapshot(const CPlusPlus::Snapshot &snapshot);
CPPEditor *editor() const; virtual Range topLevelRange() const;
void setEditor(CPPEditor *editor); virtual int match(TextEditor::QuickFixState *state);
QTextCursor textCursor() const;
void setTextCursor(const QTextCursor &cursor);
int selectionStart() const;
int selectionEnd() const;
const Utils::ChangeSet &changeSet() const;
protected: protected:
CPlusPlus::AST *topLevelNode() const; CPlusPlus::AST *topLevelNode() const;
@@ -97,55 +86,44 @@ protected:
bool isCursorOn(unsigned tokenIndex) const; bool isCursorOn(unsigned tokenIndex) const;
bool isCursorOn(const CPlusPlus::AST *ast) 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(unsigned tokenIndex, int to);
void move(const CPlusPlus::AST *ast, 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(unsigned tokenIndex, const QString &replacement);
void replace(const CPlusPlus::AST *ast, 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(unsigned tokenIndex);
void remove(const CPlusPlus::AST *ast); 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 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(unsigned tokenIndex, int to);
void copy(const CPlusPlus::AST *ast, int to); void copy(const CPlusPlus::AST *ast, int to);
QString textOf(int firstOffset, int lastOffset) const;
QString textOf(const CPlusPlus::AST *ast) 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 Range createRange(CPlusPlus::AST *ast) const; // ### rename me
void reindent(const Range &range);
private: private:
CPlusPlus::Document::Ptr _document; CPlusPlus::Document::Ptr _document;
CPlusPlus::Snapshot _snapshot; CPlusPlus::Snapshot _snapshot;
QTextCursor _textCursor;
Utils::ChangeSet _changeSet;
CPPEditor *_editor;
CPlusPlus::AST *_topLevelNode; CPlusPlus::AST *_topLevelNode;
}; };
class CPPQuickFixCollector: public TextEditor::IQuickFixCollector class CppQuickFixCollector: public TextEditor::IQuickFixCollector
{ {
Q_OBJECT Q_OBJECT
public: public:
CPPQuickFixCollector(); CppQuickFixCollector();
virtual ~CPPQuickFixCollector(); virtual ~CppQuickFixCollector();
QList<QuickFixOperationPtr> quickFixes() const { return _quickFixes; } QList<CppQuickFixOperationPtr> quickFixes() const { return _quickFixes; }
virtual TextEditor::ITextEditable *editor() const; virtual TextEditor::ITextEditable *editor() const;
virtual int startPosition() const; virtual int startPosition() const;
@@ -157,13 +135,13 @@ public:
virtual void cleanup(); virtual void cleanup();
public Q_SLOTS: public Q_SLOTS:
void perform(QuickFixOperationPtr op); void perform(CppQuickFixOperationPtr op);
private: private:
CppTools::CppModelManagerInterface *_modelManager; CppTools::CppModelManagerInterface *_modelManager;
TextEditor::ITextEditable *_editable; TextEditor::ITextEditable *_editable;
CPPEditor *_editor; CPPEditor *_editor;
QList<QuickFixOperationPtr> _quickFixes; QList<CppQuickFixOperationPtr> _quickFixes;
}; };
} // end of namespace Internal } // end of namespace Internal

View File

@@ -110,10 +110,12 @@ int QuickFixOperation::position(int line, int column) const
void QuickFixOperation::reindent(const Range &range) void QuickFixOperation::reindent(const Range &range)
{ {
if (! range.isNull()) {
QTextCursor tc = range.begin; QTextCursor tc = range.begin;
tc.setPosition(range.end.position(), QTextCursor::KeepAnchor); tc.setPosition(range.end.position(), QTextCursor::KeepAnchor);
editor()->indentInsertedText(tc); editor()->indentInsertedText(tc);
} }
}
void QuickFixOperation::move(int start, int end, int to) void QuickFixOperation::move(int start, int end, int to)
{ {

View File

@@ -61,6 +61,8 @@ public:
Range() {} Range() {}
Range(const QTextCursor &tc): begin(tc), end(tc) {} Range(const QTextCursor &tc): begin(tc), end(tc) {}
bool isNull() const { return begin.isNull() || end.isNull(); }
QTextCursor begin; QTextCursor begin;
QTextCursor end; QTextCursor end;
}; };