summaryrefslogtreecommitdiff
path: root/src/plugins/cppeditor/cppquickfixes.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cppeditor/cppquickfixes.h')
-rw-r--r--src/plugins/cppeditor/cppquickfixes.h393
1 files changed, 393 insertions, 0 deletions
diff --git a/src/plugins/cppeditor/cppquickfixes.h b/src/plugins/cppeditor/cppquickfixes.h
new file mode 100644
index 0000000000..967f8a83bf
--- /dev/null
+++ b/src/plugins/cppeditor/cppquickfixes.h
@@ -0,0 +1,393 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef CPPQUICKFIXES_H
+#define CPPQUICKFIXES_H
+
+#include "cppquickfix.h"
+
+#include <cpptools/cpprefactoringchanges.h>
+#include <extensionsystem/iplugin.h>
+
+#include <AST.h>
+#include <ASTMatcher.h>
+
+QT_BEGIN_NAMESPACE
+class QByteArray;
+class QString;
+template <class> class QList;
+QT_END_NAMESPACE
+
+using namespace CppTools;
+using namespace CPlusPlus;
+using namespace TextEditor;
+
+namespace CppEditor {
+namespace Internal {
+
+void registerQuickFixes(ExtensionSystem::IPlugin *plugIn);
+
+/*!
+ Adds an include for an undefined identifier.
+
+ Activates on: the undefined identifier
+*/
+class AddIncludeForUndefinedIdentifier : public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Can be triggered on a class forward declaration to add the matching #include.
+
+ Activates on: the name of a forward-declared class or struct
+*/
+class AddIncludeForForwardDeclaration: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Rewrite
+ a op b
+
+ As
+ b flipop a
+
+ Activates on: <= < > >= == != && ||
+*/
+class FlipLogicalOperands: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Rewrite
+ a op b -> !(a invop b)
+ (a op b) -> !(a invop b)
+ !(a op b) -> (a invob b)
+
+ Activates on: <= < > >= == !=
+*/
+class InverseLogicalComparison: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Rewrite
+ !a && !b
+
+ As
+ !(a || b)
+
+ Activates on: &&
+*/
+class RewriteLogicalAnd: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+
+private:
+ ASTMatcher matcher;
+};
+
+/*!
+ Replace
+ "abcd"
+ QLatin1String("abcd")
+ QLatin1Literal("abcd")
+
+ With
+ @"abcd"
+
+ Activates on: the string literal, if the file type is a Objective-C(++) file.
+*/
+class ConvertCStringToNSString: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Base class for converting numeric literals between decimal, octal and hex.
+ Does the base check for the specific ones and parses the number.
+
+ Test cases:
+ 0xFA0Bu;
+ 0X856A;
+ 298.3;
+ 199;
+ 074;
+ 199L;
+ 074L;
+ -199;
+ -017;
+ 0783; // invalid octal
+ 0; // border case, allow only hex<->decimal
+
+ Activates on: numeric literals
+*/
+class ConvertNumericLiteral: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Replace
+ "abcd"
+
+ With
+ tr("abcd") or
+ QCoreApplication::translate("CONTEXT", "abcd") or
+ QT_TRANSLATE_NOOP("GLOBAL", "abcd")
+
+ depending on what is available.
+
+ Activates on: the string literal
+*/
+class TranslateStringLiteral: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Replace
+ "abcd" -> QLatin1String("abcd")
+ @"abcd" -> QLatin1String("abcd") (Objective C)
+ 'a' -> QLatin1Char('a')
+ 'a' -> "a"
+ "a" -> 'a' or QLatin1Char('a') (Single character string constants)
+ "\n" -> '\n', QLatin1Char('\n')
+
+ Except if they are already enclosed in
+ QLatin1Char, QT_TRANSLATE_NOOP, tr,
+ trUtf8, QLatin1Literal, QLatin1String
+
+ Activates on: the string or character literal
+*/
+
+class WrapStringLiteral: public CppQuickFixFactory
+{
+public:
+ enum ActionFlags {
+ EncloseInQLatin1CharAction = 0x1,
+ EncloseInQLatin1StringAction = 0x2,
+ EncloseInQStringLiteralAction = 0x4,
+ EncloseActionMask = EncloseInQLatin1CharAction
+ | EncloseInQLatin1StringAction | EncloseInQStringLiteralAction,
+ TranslateTrAction = 0x8,
+ TranslateQCoreApplicationAction = 0x10,
+ TranslateNoopAction = 0x20,
+ TranslationMask = TranslateTrAction
+ | TranslateQCoreApplicationAction | TranslateNoopAction,
+ RemoveObjectiveCAction = 0x40,
+ ConvertEscapeSequencesToCharAction = 0x100,
+ ConvertEscapeSequencesToStringAction = 0x200,
+ SingleQuoteAction = 0x400,
+ DoubleQuoteAction = 0x800
+ };
+
+ enum Type { TypeString, TypeObjCString, TypeChar, TypeNone };
+
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+
+ static QString replacement(unsigned actions);
+ static QByteArray stringToCharEscapeSequences(const QByteArray &content);
+ static QByteArray charToStringEscapeSequences(const QByteArray &content);
+
+ static ExpressionAST *analyze(const QList<AST *> &path, const CppRefactoringFilePtr &file,
+ Type *type,
+ QByteArray *enclosingFunction = 0,
+ CallAST **enclosingFunctionCall = 0);
+};
+
+/*!
+ Turns "an_example_symbol" into "anExampleSymbol" and
+ "AN_EXAMPLE_SYMBOL" into "AnExampleSymbol".
+
+ Activates on: identifiers
+*/
+class ConvertToCamelCase : public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Replace
+ if (Type name = foo()) {...}
+
+ With
+ Type name = foo;
+ if (name) {...}
+
+ Activates on: the name of the introduced variable
+*/
+class MoveDeclarationOutOfIf: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Replace
+ while (Type name = foo()) {...}
+
+ With
+ Type name;
+ while ((name = foo()) != 0) {...}
+
+ Activates on: the name of the introduced variable
+*/
+class MoveDeclarationOutOfWhile: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Replace
+ if (something && something_else) {
+ }
+
+ with
+ if (something)
+ if (something_else)
+ }
+
+ and
+ if (something || something_else)
+ x;
+
+ with
+ if (something)
+ x;
+ else if (something_else)
+ x;
+
+ Activates on: && or ||
+*/
+class SplitIfStatement: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Rewrite
+ int *a, b;
+
+ As
+ int *a;
+ int b;
+
+ Activates on: the type or the variable names.
+*/
+class SplitSimpleDeclaration: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+
+private:
+ static bool checkDeclaration(SimpleDeclarationAST *declaration);
+};
+
+/*!
+ Rewrites
+ a = foo();
+
+ As
+ Type a = foo();
+
+ Where Type is the return type of foo()
+
+ Activates on: the assignee, if the type of the right-hand side of the assignment is known.
+*/
+class AddLocalDeclaration: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Add curly braces to a if statement that doesn't already contain a
+ compound statement. I.e.
+
+ if (a)
+ b;
+ becomes
+ if (a)
+ b;
+
+ Activates on: the if
+*/
+class AddBracesToIf: public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Switches places of the parameter declaration under cursor
+ with the next or the previous one in the parameter declaration list
+
+ Activates on: parameter declarations
+*/
+class RearrangeParamDeclarationList : public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+/*!
+ Reformats a pointer, reference or rvalue reference type/declaration.
+
+ Works also with selections (except when the cursor is not on any AST).
+
+ Activates on: simple declarations, parameters and return types of function
+ declarations and definitions, control flow statements (if,
+ while, for, foreach) with declarations.
+*/
+class ReformatPointerDeclaration : public CppQuickFixFactory
+{
+public:
+ void match(const CppQuickFixInterface &interface, QuickFixOperations &result);
+};
+
+} // namespace Internal
+} // namespace CppEditor
+
+#endif // CPPQUICKFIXES_H