ClangCodeModel: Tighten the check for qualified member function call

Just checking for the base cast is not enough.

Change-Id: I455533b7da31cf5c52d8c1b9dd93b3bb2fb58929
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-05-28 16:06:07 +02:00
parent d4c36f43b0
commit 692995ec88
2 changed files with 15 additions and 10 deletions

View File

@@ -156,11 +156,15 @@ public:
{ {
if (!isMemberFunctionCall()) if (!isMemberFunctionCall())
return false; return false;
const Utils::optional<QList<AstNode>> childList = children(); bool hasBaseCast = false;
if (!childList) bool hasRecordType = false;
return true; const QList<AstNode> childList = children().value_or(QList<AstNode>());
for (const AstNode &c : qAsConst(*childList)) { for (const AstNode &c : childList) {
if (c.detailIs("UncheckedDerivedToBase")) if (!hasBaseCast && c.detailIs("UncheckedDerivedToBase"))
hasBaseCast = true;
if (!hasRecordType && c.role() == "specifier" && c.kind() == "TypeSpec")
hasRecordType = true;
if (hasBaseCast && hasRecordType)
return false; return false;
} }
return true; return true;

View File

@@ -446,9 +446,6 @@ F2TestCase::F2TestCase(CppEditorAction action,
}); });
t.start(10000); t.start(10000);
l.exec(); l.exec();
QEXPECT_FAIL("noSiblings_references", "FIXME: check why this fails", Abort);
QEXPECT_FAIL("noSiblings_pointers", "FIXME: check why this fails", Abort);
QEXPECT_FAIL("noSiblings_noBaseExpression", "FIXME: check why this fails", Abort);
QVERIFY(immediateProposal); QVERIFY(immediateProposal);
QVERIFY(finalProposal); QVERIFY(finalProposal);
immediateVirtualSymbolResults = VirtualFunctionTestAssistProvider::itemList( immediateVirtualSymbolResults = VirtualFunctionTestAssistProvider::itemList(
@@ -507,8 +504,12 @@ F2TestCase::F2TestCase(CppEditorAction action,
expectedImmediate << OverrideItem(QLatin1String("collecting overrides ...")); expectedImmediate << OverrideItem(QLatin1String("collecting overrides ..."));
} }
QCOMPARE(immediateVirtualSymbolResults, expectedImmediate); QCOMPARE(immediateVirtualSymbolResults, expectedImmediate);
if (useClangd) if (useClangd) {
QEXPECT_FAIL("allOverrides from base declaration", "FIXME: check why this fails", Abort); QEXPECT_FAIL("allOverrides from base declaration", "FIXME: too many results", Abort);
QEXPECT_FAIL("noSiblings_references", "FIXME: too many results", Abort);
QEXPECT_FAIL("noSiblings_pointers", "FIXME: too many results", Abort);
QEXPECT_FAIL("noSiblings_noBaseExpression", "FIXME: too many results", Abort);
}
QCOMPARE(finalVirtualSymbolResults.size(), expectedVirtualFunctionProposal.size()); QCOMPARE(finalVirtualSymbolResults.size(), expectedVirtualFunctionProposal.size());
QCOMPARE(finalVirtualSymbolResults, expectedVirtualFunctionProposal); QCOMPARE(finalVirtualSymbolResults, expectedVirtualFunctionProposal);
} }