diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2024-05-16 17:44:26 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2024-05-17 13:04:43 +0000 |
commit | 072d9103c308b7882e7426bfdec4430b5ad3d2be (patch) | |
tree | 3899f8fa751c282cadc770701a5dd89ad76058a1 /src/plugins | |
parent | ae89f7991777377e4a21c66aa228029e0ed481bf (diff) |
CppEditor: Move SplitSimpleDeclaration quickfix into its own files
Change-Id: I74f656ed29ae2eb15afa89a0ad01c91333b99345
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/cppeditor/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppeditor.qbs | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/quickfixes/cppquickfixes.cpp | 112 | ||||
-rw-r--r-- | src/plugins/cppeditor/quickfixes/cppquickfixes.h | 16 | ||||
-rw-r--r-- | src/plugins/cppeditor/quickfixes/splitsimpledeclaration.cpp | 144 | ||||
-rw-r--r-- | src/plugins/cppeditor/quickfixes/splitsimpledeclaration.h | 8 |
6 files changed, 157 insertions, 126 deletions
diff --git a/src/plugins/cppeditor/CMakeLists.txt b/src/plugins/cppeditor/CMakeLists.txt index 23e6fe7faf..11fc129745 100644 --- a/src/plugins/cppeditor/CMakeLists.txt +++ b/src/plugins/cppeditor/CMakeLists.txt @@ -123,6 +123,7 @@ add_qtc_plugin(CppEditor quickfixes/removeusingnamespace.cpp quickfixes/removeusingnamespace.h quickfixes/rewritecomment.cpp quickfixes/rewritecomment.cpp quickfixes/rewritecontrolstatements.cpp quickfixes/rewritecontrolstatements.h + quickfixes/splitsimpledeclaration.cpp quickfixes/splitsimpledeclaration.h resourcepreviewhoverhandler.cpp resourcepreviewhoverhandler.h searchsymbols.cpp searchsymbols.h semantichighlighter.cpp semantichighlighter.h diff --git a/src/plugins/cppeditor/cppeditor.qbs b/src/plugins/cppeditor/cppeditor.qbs index 562d9d474a..939a009d43 100644 --- a/src/plugins/cppeditor/cppeditor.qbs +++ b/src/plugins/cppeditor/cppeditor.qbs @@ -275,6 +275,8 @@ QtcPlugin { "rewritecomment.h", "rewritecontrolstatements.cpp", "rewritecontrolstatements.h", + "splitsimpledeclaration.cpp", + "splitsimpledeclaration.h", ] } diff --git a/src/plugins/cppeditor/quickfixes/cppquickfixes.cpp b/src/plugins/cppeditor/quickfixes/cppquickfixes.cpp index 05cc6909ce..f6c12f0649 100644 --- a/src/plugins/cppeditor/quickfixes/cppquickfixes.cpp +++ b/src/plugins/cppeditor/quickfixes/cppquickfixes.cpp @@ -12,7 +12,6 @@ #include "../cpprefactoringchanges.h" #include "../cpptoolsreuse.h" #include "../insertionpointlocator.h" -#include "../symbolfinder.h" #include "assigntolocalvariable.h" #include "bringidentifierintoscope.h" #include "completeswitchstatement.h" @@ -34,6 +33,7 @@ #include "removeusingnamespace.h" #include "rewritecomment.h" #include "rewritecontrolstatements.h" +#include "splitsimpledeclaration.h" #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> @@ -134,113 +134,6 @@ const QList<CppQuickFixFactory *> &CppQuickFixFactory::cppQuickFixFactories() namespace Internal { -static bool checkDeclarationForSplit(SimpleDeclarationAST *declaration) -{ - if (!declaration->semicolon_token) - return false; - - if (!declaration->decl_specifier_list) - return false; - - for (SpecifierListAST *it = declaration->decl_specifier_list; it; it = it->next) { - SpecifierAST *specifier = it->value; - if (specifier->asEnumSpecifier() || specifier->asClassSpecifier()) - return false; - } - - return declaration->declarator_list && declaration->declarator_list->next; -} - -namespace { - -class SplitSimpleDeclarationOp: public CppQuickFixOperation -{ -public: - SplitSimpleDeclarationOp(const CppQuickFixInterface &interface, int priority, - SimpleDeclarationAST *decl) - : CppQuickFixOperation(interface, priority) - , declaration(decl) - { - setDescription(Tr::tr("Split Declaration")); - } - - void perform() override - { - CppRefactoringChanges refactoring(snapshot()); - CppRefactoringFilePtr currentFile = refactoring.cppFile(filePath()); - - ChangeSet changes; - - SpecifierListAST *specifiers = declaration->decl_specifier_list; - int declSpecifiersStart = currentFile->startOf(specifiers->firstToken()); - int declSpecifiersEnd = currentFile->endOf(specifiers->lastToken() - 1); - int insertPos = currentFile->endOf(declaration->semicolon_token); - - DeclaratorAST *prevDeclarator = declaration->declarator_list->value; - - for (DeclaratorListAST *it = declaration->declarator_list->next; it; it = it->next) { - DeclaratorAST *declarator = it->value; - - changes.insert(insertPos, QLatin1String("\n")); - changes.copy(declSpecifiersStart, declSpecifiersEnd, insertPos); - changes.insert(insertPos, QLatin1String(" ")); - changes.move(currentFile->range(declarator), insertPos); - changes.insert(insertPos, QLatin1String(";")); - - const int prevDeclEnd = currentFile->endOf(prevDeclarator); - changes.remove(prevDeclEnd, currentFile->startOf(declarator)); - - prevDeclarator = declarator; - } - - currentFile->setChangeSet(changes); - currentFile->apply(); - } - -private: - SimpleDeclarationAST *declaration; -}; - -} // anonymous namespace - -void SplitSimpleDeclaration::doMatch(const CppQuickFixInterface &interface, - QuickFixOperations &result) -{ - CoreDeclaratorAST *core_declarator = nullptr; - const QList<AST *> &path = interface.path(); - CppRefactoringFilePtr file = interface.currentFile(); - const int cursorPosition = file->cursor().selectionStart(); - - for (int index = path.size() - 1; index != -1; --index) { - AST *node = path.at(index); - - if (CoreDeclaratorAST *coreDecl = node->asCoreDeclarator()) { - core_declarator = coreDecl; - } else if (SimpleDeclarationAST *simpleDecl = node->asSimpleDeclaration()) { - if (checkDeclarationForSplit(simpleDecl)) { - SimpleDeclarationAST *declaration = simpleDecl; - - const int startOfDeclSpecifier = file->startOf(declaration->decl_specifier_list->firstToken()); - const int endOfDeclSpecifier = file->endOf(declaration->decl_specifier_list->lastToken() - 1); - - if (cursorPosition >= startOfDeclSpecifier && cursorPosition <= endOfDeclSpecifier) { - // the AST node under cursor is a specifier. - result << new SplitSimpleDeclarationOp(interface, index, declaration); - return; - } - - if (core_declarator && interface.isCursorOn(core_declarator)) { - // got a core-declarator under the text cursor. - result << new SplitSimpleDeclarationOp(interface, index, declaration); - return; - } - } - - return; - } - } -} - namespace { class ConvertNumericLiteralOp: public CppQuickFixOperation @@ -747,8 +640,6 @@ void createCppQuickFixes() new ConvertNumericLiteral; - new SplitSimpleDeclaration; - new RearrangeParamDeclarationList; new ReformatPointerDeclaration; @@ -773,6 +664,7 @@ void createCppQuickFixes() registerAssignToLocalVariableQuickfix(); registerCompleteSwitchStatementQuickfix(); registerConvertToMetaMethodCallQuickfix(); + registerSplitSimpleDeclarationQuickfix(); new ExtraRefactoringOperations; } diff --git a/src/plugins/cppeditor/quickfixes/cppquickfixes.h b/src/plugins/cppeditor/quickfixes/cppquickfixes.h index e7c12fefec..2227d0a8a8 100644 --- a/src/plugins/cppeditor/quickfixes/cppquickfixes.h +++ b/src/plugins/cppeditor/quickfixes/cppquickfixes.h @@ -71,22 +71,6 @@ private: }; /*! - Rewrite - int *a, b; - - As - int *a; - int b; - - Activates on: the type or the variable names. -*/ -class SplitSimpleDeclaration: public CppQuickFixFactory -{ -public: - void doMatch(const CppQuickFixInterface &interface, QuickFixOperations &result) override; -}; - -/*! Switches places of the parameter declaration under cursor with the next or the previous one in the parameter declaration list diff --git a/src/plugins/cppeditor/quickfixes/splitsimpledeclaration.cpp b/src/plugins/cppeditor/quickfixes/splitsimpledeclaration.cpp new file mode 100644 index 0000000000..c74bcc4867 --- /dev/null +++ b/src/plugins/cppeditor/quickfixes/splitsimpledeclaration.cpp @@ -0,0 +1,144 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "splitsimpledeclaration.h" + +#include "../cppeditortr.h" +#include "../cpprefactoringchanges.h" +#include "cppquickfix.h" + +using namespace CPlusPlus; +using namespace Utils; + +namespace CppEditor::Internal { +namespace { + +static bool checkDeclarationForSplit(SimpleDeclarationAST *declaration) +{ + if (!declaration->semicolon_token) + return false; + + if (!declaration->decl_specifier_list) + return false; + + for (SpecifierListAST *it = declaration->decl_specifier_list; it; it = it->next) { + SpecifierAST *specifier = it->value; + if (specifier->asEnumSpecifier() || specifier->asClassSpecifier()) + return false; + } + + return declaration->declarator_list && declaration->declarator_list->next; +} + +class SplitSimpleDeclarationOp : public CppQuickFixOperation +{ +public: + SplitSimpleDeclarationOp(const CppQuickFixInterface &interface, int priority, + SimpleDeclarationAST *decl) + : CppQuickFixOperation(interface, priority) + , declaration(decl) + { + setDescription(Tr::tr("Split Declaration")); + } + + void perform() override + { + CppRefactoringChanges refactoring(snapshot()); + CppRefactoringFilePtr currentFile = refactoring.cppFile(filePath()); + + ChangeSet changes; + + SpecifierListAST *specifiers = declaration->decl_specifier_list; + int declSpecifiersStart = currentFile->startOf(specifiers->firstToken()); + int declSpecifiersEnd = currentFile->endOf(specifiers->lastToken() - 1); + int insertPos = currentFile->endOf(declaration->semicolon_token); + + DeclaratorAST *prevDeclarator = declaration->declarator_list->value; + + for (DeclaratorListAST *it = declaration->declarator_list->next; it; it = it->next) { + DeclaratorAST *declarator = it->value; + + changes.insert(insertPos, QLatin1String("\n")); + changes.copy(declSpecifiersStart, declSpecifiersEnd, insertPos); + changes.insert(insertPos, QLatin1String(" ")); + changes.move(currentFile->range(declarator), insertPos); + changes.insert(insertPos, QLatin1String(";")); + + const int prevDeclEnd = currentFile->endOf(prevDeclarator); + changes.remove(prevDeclEnd, currentFile->startOf(declarator)); + + prevDeclarator = declarator; + } + + currentFile->setChangeSet(changes); + currentFile->apply(); + } + +private: + SimpleDeclarationAST *declaration; +}; + +/*! + Rewrite + int *a, b; + + As + int *a; + int b; + + Activates on: the type or the variable names. +*/ +class SplitSimpleDeclaration : public CppQuickFixFactory +{ +#ifdef WITH_TESTS +public: + static QObject *createTest() { return new QObject; } +#endif + +private: + void doMatch(const CppQuickFixInterface &interface, QuickFixOperations &result) override + { + CoreDeclaratorAST *core_declarator = nullptr; + const QList<AST *> &path = interface.path(); + CppRefactoringFilePtr file = interface.currentFile(); + const int cursorPosition = file->cursor().selectionStart(); + + for (int index = path.size() - 1; index != -1; --index) { + AST *node = path.at(index); + + if (CoreDeclaratorAST *coreDecl = node->asCoreDeclarator()) { + core_declarator = coreDecl; + } else if (SimpleDeclarationAST *simpleDecl = node->asSimpleDeclaration()) { + if (checkDeclarationForSplit(simpleDecl)) { + SimpleDeclarationAST *declaration = simpleDecl; + + const int startOfDeclSpecifier = file->startOf(declaration->decl_specifier_list->firstToken()); + const int endOfDeclSpecifier = file->endOf(declaration->decl_specifier_list->lastToken() - 1); + + if (cursorPosition >= startOfDeclSpecifier && cursorPosition <= endOfDeclSpecifier) { + // the AST node under cursor is a specifier. + result << new SplitSimpleDeclarationOp(interface, index, declaration); + return; + } + + if (core_declarator && interface.isCursorOn(core_declarator)) { + // got a core-declarator under the text cursor. + result << new SplitSimpleDeclarationOp(interface, index, declaration); + return; + } + } + + return; + } + } + } +}; + +} // namespace + +void registerSplitSimpleDeclarationQuickfix() +{ + CppQuickFixFactory::registerFactory<SplitSimpleDeclaration>(); +} + +} // namespace CppEditor::Internal diff --git a/src/plugins/cppeditor/quickfixes/splitsimpledeclaration.h b/src/plugins/cppeditor/quickfixes/splitsimpledeclaration.h new file mode 100644 index 0000000000..8c3100a9f4 --- /dev/null +++ b/src/plugins/cppeditor/quickfixes/splitsimpledeclaration.h @@ -0,0 +1,8 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +namespace CppEditor::Internal { +void registerSplitSimpleDeclarationQuickfix(); +} // namespace CppEditor::Internal |