From 769d6282bd6e333bde599699eef68c2df3025fc5 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 9 Jun 2009 14:50:32 +0200 Subject: [PATCH] Some work on rewriting conditionals. --- .../cpptools/cpptoolseditorsupport.cpp | 86 ++++++++++++++++--- 1 file changed, 76 insertions(+), 10 deletions(-) diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp index 1d69f3f7eb3..8352b40806c 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.cpp +++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp @@ -111,6 +111,47 @@ public: } }; +class RewriteConditional: public QuickFixOperation +{ + QString _source; + BinaryExpressionAST *_binaryExpression; + +public: + RewriteConditional(const QString &source, BinaryExpressionAST *node, + Document::Ptr doc, const Snapshot &snapshot) + : QuickFixOperation(doc, snapshot), + _source(source), + _binaryExpression(node) + { } + + virtual QString description() const + { return QString::fromUtf8("Rewrite conditional (%1)").arg(_source.simplified()); } + + virtual void apply(QTextCursor tc) + { + setTextCursor(tc); + + tc.beginEditBlock(); + + UnaryExpressionAST *left_unary_expr = _binaryExpression->left_expression->asUnaryExpression(); + UnaryExpressionAST *right_unary_expr = _binaryExpression->right_expression->asUnaryExpression(); + + QTextCursor left_not_op = cursor(left_unary_expr->unary_op_token); + QTextCursor right_not_op = cursor(right_unary_expr->unary_op_token); + QTextCursor log_and_op = cursor(_binaryExpression->binary_op_token); + + QTextCursor begin_of_expr = moveAtStartOfToken(_binaryExpression->firstToken()); + QTextCursor end_of_expr = moveAtEndOfToken(_binaryExpression->lastToken() - 1); + + left_not_op.removeSelectedText(); + right_not_op.removeSelectedText(); + log_and_op.insertText(QLatin1String("||")); + begin_of_expr.insertText(QLatin1String("!(")); + end_of_expr.insertText(QLatin1String(")")); + + tc.endEditBlock(); + } +}; class CheckDocument: protected ASTVisitor { QTextCursor _textCursor; @@ -154,23 +195,48 @@ protected: return true; } - /* - virtual bool visit(ForStatementAST *ast) + QTextCursor moveAtStartOfToken(unsigned index) const { - if (! checkPosition(ast)) - return true; + unsigned line, col; + getTokenStartPosition(index, &line, &col); + QTextCursor tc = _textCursor; + tc.setPosition(tc.document()->findBlockByNumber(line - 1).position() + col - 1); + return tc; + } + + QTextCursor moveAtEndOfToken(unsigned index) const + { + const Token &tk = tokenAt(index); - if (ast->initializer && ast->initializer->asDeclarationStatement() != 0) { - if (checkPosition(ast->initializer)) { - // move initializer - _nodes.append(ast); + unsigned line, col; + getTokenStartPosition(index, &line, &col); + QTextCursor tc = _textCursor; + tc.setPosition(tc.document()->findBlockByNumber(line - 1).position() + col + tk.length - 1); + return tc; + } + + virtual bool visit(BinaryExpressionAST *ast) + { + if (ast->left_expression && ast->right_expression && tokenKind(ast->binary_op_token) == T_AMPER_AMPER && + checkPosition(ast)) { + UnaryExpressionAST *left_unary_expr = ast->left_expression->asUnaryExpression(); + UnaryExpressionAST *right_unary_expr = ast->right_expression->asUnaryExpression(); + if (left_unary_expr && left_unary_expr->expression && tokenKind(left_unary_expr->unary_op_token) == T_NOT && + right_unary_expr && right_unary_expr->expression && tokenKind(right_unary_expr->unary_op_token) == T_NOT) { + // replace !a && !b with !(a || b) + QTextCursor beg = moveAtStartOfToken(ast->firstToken()); + QTextCursor end = moveAtEndOfToken(ast->lastToken() - 1); + beg.setPosition(end.position(), QTextCursor::KeepAnchor); + QString source = beg.selectedText(); + + QuickFixOperationPtr op(new RewriteConditional(source, ast, _doc, _snapshot)); + _quickFixes.append(op); + return true; } } return true; } - */ - virtual bool visit(CastExpressionAST *ast) { -- GitLab