forked from qt-creator/qt-creator
CppEditor: Find implementations for pure virtual declaration
Clearly, if a user presses F2 on the declaration of an (unimplemented) pure virtual function, they want to go to an implementation in a derived class. Fixes: QTCREATORBUG-10160 Change-Id: Ie8c4ff0001ab2c98a2d0e2ebc8d954cc928578c0 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -1413,6 +1413,31 @@ void CppEditorPlugin::test_FollowSymbolUnderCursor_virtualFunctionCall_data()
|
|||||||
<< OverrideItem(QLatin1String("CD1::virt"), 11)
|
<< OverrideItem(QLatin1String("CD1::virt"), 11)
|
||||||
<< OverrideItem(QLatin1String("CD2::virt"), 14));
|
<< OverrideItem(QLatin1String("CD2::virt"), 14));
|
||||||
|
|
||||||
|
/// Check: Cursor on unimplemented base declaration.
|
||||||
|
QTest::newRow("allOverrides from base declaration") << _(
|
||||||
|
"struct A { virtual void $@virt() = 0; };\n"
|
||||||
|
"\n"
|
||||||
|
"struct B : A { void virt(); };\n"
|
||||||
|
"void B::virt() {}\n"
|
||||||
|
"\n"
|
||||||
|
"struct C : B { void virt(); };\n"
|
||||||
|
"void C::virt() {}\n"
|
||||||
|
"\n"
|
||||||
|
"struct CD1 : C { void virt(); };\n"
|
||||||
|
"void CD1::virt() {}\n"
|
||||||
|
"\n"
|
||||||
|
"struct CD2 : C { void virt(); };\n"
|
||||||
|
"void CD2::virt() {}\n"
|
||||||
|
"\n"
|
||||||
|
"int f(A *o) { o->virt(); }\n"
|
||||||
|
"\n")
|
||||||
|
<< (OverrideItemList()
|
||||||
|
<< OverrideItem(QLatin1String("A::virt = 0"), 1)
|
||||||
|
<< OverrideItem(QLatin1String("B::virt"), 4)
|
||||||
|
<< OverrideItem(QLatin1String("C::virt"), 7)
|
||||||
|
<< OverrideItem(QLatin1String("CD1::virt"), 10)
|
||||||
|
<< OverrideItem(QLatin1String("CD2::virt"), 13));
|
||||||
|
|
||||||
/// Check: Static type is derived class pointer, only overrides of sub classes are presented.
|
/// Check: Static type is derived class pointer, only overrides of sub classes are presented.
|
||||||
QTest::newRow("possibleOverrides1") << _(
|
QTest::newRow("possibleOverrides1") << _(
|
||||||
"struct A { virtual void virt() = 0; };\n"
|
"struct A { virtual void virt() = 0; };\n"
|
||||||
|
|||||||
@@ -111,8 +111,17 @@ VirtualFunctionHelper::VirtualFunctionHelper(TypeOfExpression &typeOfExpression,
|
|||||||
bool VirtualFunctionHelper::canLookupVirtualFunctionOverrides(Function *function)
|
bool VirtualFunctionHelper::canLookupVirtualFunctionOverrides(Function *function)
|
||||||
{
|
{
|
||||||
m_function = function;
|
m_function = function;
|
||||||
if (!m_function || !m_baseExpressionAST || !m_expressionDocument || !m_document || !m_scope
|
|
||||||
|| m_scope->isClass() || m_scope->isFunction() || m_snapshot.isEmpty()) {
|
if (!m_document || m_snapshot.isEmpty() || !m_function || !m_scope)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (m_scope->isClass() && m_function->isPureVirtual()) {
|
||||||
|
m_staticClassOfFunctionCallExpression = m_scope->asClass();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_baseExpressionAST || !m_expressionDocument
|
||||||
|
|| m_scope->isClass() || m_scope->isFunction()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user