aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/cppeditor/cppinsertvirtualmethods.cpp5
-rw-r--r--src/plugins/cppeditor/cppquickfix_test.cpp6
-rw-r--r--src/plugins/cppeditor/cppquickfixes.cpp58
3 files changed, 34 insertions, 35 deletions
diff --git a/src/plugins/cppeditor/cppinsertvirtualmethods.cpp b/src/plugins/cppeditor/cppinsertvirtualmethods.cpp
index 209ad213a9..1b23618b62 100644
--- a/src/plugins/cppeditor/cppinsertvirtualmethods.cpp
+++ b/src/plugins/cppeditor/cppinsertvirtualmethods.cpp
@@ -538,6 +538,11 @@ public:
m_classAST = path.at(index)->asClassSpecifier();
}
}
+
+ // Also offer the operation if we are on some "empty" part of the class declaration.
+ if (!m_classAST)
+ m_classAST = path.at(pathSize - 1)->asClassSpecifier();
+
if (!m_classAST || !m_classAST->base_clause_list)
return;
diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp
index a023342e3f..da2e62e676 100644
--- a/src/plugins/cppeditor/cppquickfix_test.cpp
+++ b/src/plugins/cppeditor/cppquickfix_test.cpp
@@ -3108,13 +3108,13 @@ void CppEditorPlugin::test_quickfix_GenerateGettersSetters_data()
QTest::addColumn<QByteArray>("expected");
const QByteArray onlyReset = R"(
-class @Foo {
+class Foo {
public:
int bar() const;
void setBar(int bar);
private:
int m_bar;
-};)";
+@};)";
const QByteArray onlyResetAfter = R"(
class @Foo {
@@ -6374,7 +6374,7 @@ void CppEditorPlugin::test_quickfix_MoveAllFuncDefOutside_MemberFuncToCpp()
// Header File
original =
- "class Fo@o {\n"
+ "class Foo {@\n"
" int numberA() const\n"
" {\n"
" return 5;\n"
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp
index 867740aea8..1e0fbd9f07 100644
--- a/src/plugins/cppeditor/cppquickfixes.cpp
+++ b/src/plugins/cppeditor/cppquickfixes.cpp
@@ -641,6 +641,28 @@ QString memberBaseName(const QString &name)
return baseName;
}
+// Returns a non-null value if and only if the cursor is on the name of a (proper) class
+// declaration or at some place inside the body of a class declaration that does not
+// correspond to an AST of its own, i.e. on "empty space".
+ClassSpecifierAST *astForClassOperations(const CppQuickFixInterface &interface)
+{
+ const QList<AST *> &path = interface.path();
+ if (path.isEmpty())
+ return nullptr;
+ if (const auto classSpec = path.last()->asClassSpecifier()) // Cursor inside class decl?
+ return classSpec;
+
+ // Cursor on a class name?
+ if (path.size() < 2)
+ return nullptr;
+ const SimpleNameAST * const nameAST = path.at(path.size() - 1)->asSimpleName();
+ if (!nameAST || !interface.isCursorOn(nameAST))
+ return nullptr;
+ if (const auto classSpec = path.at(path.size() - 2)->asClassSpecifier())
+ return classSpec;
+ return nullptr;
+}
+
} // anonymous namespace
namespace {
@@ -3476,15 +3498,7 @@ public:
{
setDescription(CppQuickFixFactory::tr("Create Implementations for Member Functions"));
- const QList<AST *> &path = interface.path();
- if (path.size() < 2)
- return;
-
- // Determine if cursor is on a class
- const SimpleNameAST * const nameAST = path.at(path.size() - 1)->asSimpleName();
- if (!nameAST || !interface.isCursorOn(nameAST))
- return;
- m_classAST = path.at(path.size() - 2)->asClassSpecifier();
+ m_classAST = astForClassOperations(interface);
if (!m_classAST)
return;
const Class * const theClass = m_classAST->symbol;
@@ -4834,19 +4848,10 @@ public:
{
setDescription(CppQuickFixFactory::tr("Create Getter and Setter Member Functions"));
- const QList<AST *> &path = interface.path();
- if (path.size() < 2)
- return;
-
- // Determine if cursor is on a class
- const SimpleNameAST *const nameAST = path.at(path.size() - 1)->asSimpleName();
- if (!nameAST || !interface.isCursorOn(nameAST))
- return;
- m_classAST = path.at(path.size() - 2)->asClassSpecifier();
+ m_classAST = astForClassOperations(interface);
if (!m_classAST)
return;
-
- Class *const theClass = m_classAST->symbol;
+ Class * const theClass = m_classAST->symbol;
if (!theClass)
return;
@@ -6682,18 +6687,7 @@ private:
void MoveAllFuncDefOutside::match(const CppQuickFixInterface &interface, QuickFixOperations &result)
{
- const QList<AST *> &path = interface.path();
- const int pathSize = path.size();
- if (pathSize < 2)
- return;
-
- // Determine if cursor is on a class which is not a base class
- ClassSpecifierAST *classAST = nullptr;
- if (SimpleNameAST *nameAST = path.at(pathSize - 1)->asSimpleName()) {
- if (!interface.isCursorOn(nameAST))
- return;
- classAST = path.at(pathSize - 2)->asClassSpecifier();
- }
+ ClassSpecifierAST * const classAST = astForClassOperations(interface);
if (!classAST)
return;