From 1702543d804a2d3d70bf2b6a68703c1f9db2e574 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Mon, 19 Jul 2010 19:12:24 +0200 Subject: [PATCH] Added a simple quickfix to declare local variable. --- src/plugins/cppeditor/cppquickfix.cpp | 69 +++++++++++++++++++++++++++ src/plugins/cppeditor/cppquickfix.h | 2 + 2 files changed, 71 insertions(+) diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp index 07e0a98983b..0cf74978cbd 100644 --- a/src/plugins/cppeditor/cppquickfix.cpp +++ b/src/plugins/cppeditor/cppquickfix.cpp @@ -1492,6 +1492,66 @@ private: Symbol *fwdClass; }; +class AddLocalDeclarationOp: public CppQuickFixOperation +{ +public: + AddLocalDeclarationOp(TextEditor::BaseTextEditor *editor) + : CppQuickFixOperation(editor), binaryAST(0) + { + } + + virtual QString description() const + { + return QApplication::translate("CppTools::QuickFix", "Add local declaration"); + } + + virtual int match(const QList<AST *> &path) + { + for (int index = path.size() - 1; index != -1; --index) { + if (BinaryExpressionAST *binary = path.at(index)->asBinaryExpression()) { + if (binary->left_expression && binary->right_expression && tokenAt(binary->binary_op_token).is(T_EQUAL)) { + if (isCursorOn(binary->left_expression) && binary->left_expression->asSimpleName() != 0) { + SimpleNameAST *nameAST = binary->left_expression->asSimpleName(); + if (context().lookup(nameAST->name, scopeAt(nameAST->firstToken())).isEmpty()) { + binaryAST = binary; + typeOfExpression.init(document(), snapshot(), context().bindings()); + return index; + } + } + } + } + } + + return -1; + } + + virtual void createChanges() + { + const QList<LookupItem> result = typeOfExpression(textOf(binaryAST->right_expression), + scopeAt(binaryAST->firstToken()), + TypeOfExpression::Preprocess); + + if (! result.isEmpty()) { + Overview oo; + QString ty = oo(result.first().type()); + if (! ty.isEmpty()) { + const QChar ch = ty.at(ty.size() - 1); + + if (ch.isLetterOrNumber() || ch == QLatin1Char(' ') || ch == QLatin1Char('>')) + ty += QLatin1Char(' '); + + Utils::ChangeSet changes; + changes.insert(startOf(binaryAST), ty); + refactoringChanges()->changeFile(fileName(), changes); + } + } + } + +private: + TypeOfExpression typeOfExpression; + BinaryExpressionAST *binaryAST; +}; + } // end of anonymous namespace @@ -1551,6 +1611,13 @@ const Snapshot &CppQuickFixOperation::snapshot() const const CPlusPlus::LookupContext &CppQuickFixOperation::context() const { return _refactoringChanges->context(); } +CPlusPlus::Scope *CppQuickFixOperation::scopeAt(unsigned index) const +{ + unsigned line, column; + document()->translationUnit()->getTokenStartPosition(index, &line, &column); + return document()->scopeAt(line, column); +} + const CPlusPlus::Token &CppQuickFixOperation::tokenAt(unsigned index) const { return _document->translationUnit()->tokenAt(index); } @@ -1693,6 +1760,7 @@ QList<TextEditor::QuickFixOperation::Ptr> CppQuickFixFactory::quickFixOperations QSharedPointer<ConvertNumericToDecimal> convertNumericToDecimal(new ConvertNumericToDecimal(editor)); QSharedPointer<CompleteSwitchCaseStatement> completeSwitchCaseStatement(new CompleteSwitchCaseStatement(editor)); QSharedPointer<FixForwardDeclarationOp> fixForwardDeclarationOp(new FixForwardDeclarationOp(editor)); + QSharedPointer<AddLocalDeclarationOp> addLocalDeclarationOp(new AddLocalDeclarationOp(editor)); QSharedPointer<DeclFromDef> declFromDef(new DeclFromDef(editor)); quickFixOperations.append(rewriteLogicalAndOp); @@ -1710,6 +1778,7 @@ QList<TextEditor::QuickFixOperation::Ptr> CppQuickFixFactory::quickFixOperations quickFixOperations.append(convertNumericToDecimal); quickFixOperations.append(completeSwitchCaseStatement); quickFixOperations.append(fixForwardDeclarationOp); + quickFixOperations.append(addLocalDeclarationOp); #if 0 quickFixOperations.append(declFromDef); diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h index 00c4f4a1df8..60c990fda0c 100644 --- a/src/plugins/cppeditor/cppquickfix.h +++ b/src/plugins/cppeditor/cppquickfix.h @@ -81,6 +81,8 @@ protected: const CPlusPlus::Token &tokenAt(unsigned index) const; + CPlusPlus::Scope *scopeAt(unsigned index) const; + int startOf(unsigned index) const; int startOf(const CPlusPlus::AST *ast) const; int endOf(unsigned index) const; -- GitLab