aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2024-05-16 17:44:26 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2024-05-17 13:04:43 +0000
commit072d9103c308b7882e7426bfdec4430b5ad3d2be (patch)
tree3899f8fa751c282cadc770701a5dd89ad76058a1 /src/plugins
parentae89f7991777377e4a21c66aa228029e0ed481bf (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.txt1
-rw-r--r--src/plugins/cppeditor/cppeditor.qbs2
-rw-r--r--src/plugins/cppeditor/quickfixes/cppquickfixes.cpp112
-rw-r--r--src/plugins/cppeditor/quickfixes/cppquickfixes.h16
-rw-r--r--src/plugins/cppeditor/quickfixes/splitsimpledeclaration.cpp144
-rw-r--r--src/plugins/cppeditor/quickfixes/splitsimpledeclaration.h8
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