From 319a5ccd86be2c3030e948964217f178f94ce020 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 12 Dec 2024 16:58:25 +0100 Subject: [PATCH] CppEditor: Fix InsertVirtualMethods quickfix ... for base classes pulled in via using declarations. This is probably just a hack, like everything connected to the weird ClassOrNamespace class. Fixes: QTCREATORBUG-32162 Change-Id: Id7fbcf569fca231284ad0026cc040b16ac04960c Reviewed-by: Christian Stenger --- .../quickfixes/cppinsertvirtualmethods.cpp | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/plugins/cppeditor/quickfixes/cppinsertvirtualmethods.cpp b/src/plugins/cppeditor/quickfixes/cppinsertvirtualmethods.cpp index 25324bcd46d..005c3625928 100644 --- a/src/plugins/cppeditor/quickfixes/cppinsertvirtualmethods.cpp +++ b/src/plugins/cppeditor/quickfixes/cppinsertvirtualmethods.cpp @@ -559,9 +559,17 @@ public: while (!baseClassQueue.isEmpty()) { ClassOrNamespace *clazz = baseClassQueue.dequeue(); visitedBaseClasses.insert(clazz); - const QList bases = clazz->usings(); - for (const ClassOrNamespace *baseClass : bases) { + QList bases = clazz->usings(); + while (!bases.isEmpty()) { + const ClassOrNamespace *baseClass = bases.takeFirst(); const QList symbols = baseClass->symbols(); + + // See QTCREATORBUG-32162. + if (symbols.isEmpty() && baseClass->usings().size() == 1) { + bases.prepend(baseClass->usings().first()); + continue; + } + for (Symbol *symbol : symbols) { Class *base = symbol->asClass(); if (base @@ -1852,6 +1860,21 @@ void InsertVirtualMethodsTest::test_data() "};\n\n" "struct Derived2 : Derived1\n" "};\n"); + + QTest::newRow("base class via using") + << InsertVirtualMethodsDialog::ModeOnlyDeclarations << false << true + << _(R"cpp( + namespace A { struct Base { virtual void foo() = 0; }; } // namespace A + using A::Base; + struct @Derived : Base {};)cpp") + << _(R"cpp( + namespace A { struct Base { virtual void foo() = 0; }; } // namespace A + using A::Base; + struct @Derived : Base { + // Base interface + public: + void foo() override; + };)cpp"); } void InsertVirtualMethodsTest::test()