ClangCodeModel: Classify Q_PROPERTY functions as Qt-invokable

Fixes: QTCREATORBUG-28971
Change-Id: Ia60a82aa83ad89fbf6b5d1332d413de029510b34
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2023-04-12 18:12:58 +02:00
parent 8a0b3815df
commit f67f02066c
3 changed files with 28 additions and 0 deletions

View File

@@ -172,6 +172,20 @@ bool ClangdAstNode::hasChildWithRole(const QString &role) const
[&role](const ClangdAstNode &c) { return c.role() == role; });
}
bool ClangdAstNode::hasChild(const std::function<bool(const ClangdAstNode &)> &predicate,
bool recursive) const
{
std::function<bool(const ClangdAstNode &)> fullPredicate = predicate;
if (recursive) {
fullPredicate = [&predicate](const ClangdAstNode &n) {
if (predicate(n))
return true;
return n.hasChild(predicate, true);
};
}
return Utils::contains(children().value_or(QList<ClangdAstNode>()), fullPredicate);
}
QString ClangdAstNode::operatorString() const
{
if (kind() == "BinaryOperator")

View File

@@ -77,6 +77,7 @@ public:
bool childContainsRange(int index, const LanguageServerProtocol::Range &range) const;
bool hasChildWithRole(const QString &role) const;
bool hasChild(const std::function<bool(const ClangdAstNode &child)> &predicate, bool recursive) const;
QString operatorString() const;
enum class FileStatus { Ours, Foreign, Mixed, Unknown };

View File

@@ -595,6 +595,19 @@ static Usage::Tags getUsageType(const ClangdAstPath &path, const QString &search
tags |= Usage::Tag::Operator;
}
}
if (pathIt->kind() == "CXXMethod") {
const ClangdAstNode &classNode = *std::next(pathIt);
if (classNode.hasChild([&](const ClangdAstNode &n) {
if (n.kind() != "StaticAssert")
return false;
return n.hasChild([&](const ClangdAstNode &n) {
return n.arcanaContains("Q_PROPERTY"); }, true)
&& n.hasChild([&](const ClangdAstNode &n) {
return n.arcanaContains(" " + searchTerm); }, true);
}, false)) {
tags |= Usage::Tag::MocInvokable;
}
}
return tags;
}
if (pathIt->kind() == "MemberInitializer")