moc: store the FQN in JSON superClass objects
Tooling can then use this information to find the correct base class, even absent C++ scoping information. Pick-to: 6.6 6.5 Task-number: QTBUG-101141 Change-Id: I5350da8d2d9aaf5ec86027357131ebac1eb50372 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> (cherry picked from commit 672a824639a927e7e3061e84dfa35e06eb26a7fa) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
aca842ceb2
commit
28a88b5986
@ -26,6 +26,15 @@ static QByteArray normalizeType(const QByteArray &ba)
|
|||||||
return ba.size() ? normalizeTypeInternal(ba.constBegin(), ba.constEnd()) : ba;
|
return ba.size() ? normalizeTypeInternal(ba.constBegin(), ba.constEnd()) : ba;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QByteArray &Moc::toFullyQualified(const QByteArray &name) const noexcept
|
||||||
|
{
|
||||||
|
if (auto it = knownQObjectClasses.find(name); it != knownQObjectClasses.end())
|
||||||
|
return it.value();
|
||||||
|
if (auto it = knownGadgets.find(name); it != knownGadgets.end())
|
||||||
|
return it.value();
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
bool Moc::parseClassHead(ClassDef *def)
|
bool Moc::parseClassHead(ClassDef *def)
|
||||||
{
|
{
|
||||||
// figure out whether this is a class declaration, or only a
|
// figure out whether this is a class declaration, or only a
|
||||||
@ -87,12 +96,12 @@ bool Moc::parseClassHead(ClassDef *def)
|
|||||||
else
|
else
|
||||||
test(PUBLIC);
|
test(PUBLIC);
|
||||||
test(VIRTUAL);
|
test(VIRTUAL);
|
||||||
const QByteArray type = parseType().name;
|
const Type type = parseType();
|
||||||
// ignore the 'class Foo : BAR(Baz)' case
|
// ignore the 'class Foo : BAR(Baz)' case
|
||||||
if (test(LPAREN)) {
|
if (test(LPAREN)) {
|
||||||
until(RPAREN);
|
until(RPAREN);
|
||||||
} else {
|
} else {
|
||||||
def->superclassList += SuperClass{type, access};
|
def->superclassList.push_back({type.name, toFullyQualified(type.name), access});
|
||||||
}
|
}
|
||||||
} while (test(COMMA));
|
} while (test(COMMA));
|
||||||
|
|
||||||
@ -2041,6 +2050,8 @@ QJsonObject ClassDef::toJson() const
|
|||||||
for (const auto &super: std::as_const(superclassList)) {
|
for (const auto &super: std::as_const(superclassList)) {
|
||||||
QJsonObject superCls;
|
QJsonObject superCls;
|
||||||
superCls["name"_L1] = QString::fromUtf8(super.classname);
|
superCls["name"_L1] = QString::fromUtf8(super.classname);
|
||||||
|
if (super.classname != super.qualified)
|
||||||
|
superCls["fullyQualifiedName"_L1] = QString::fromUtf8(super.qualified);
|
||||||
FunctionDef::accessToJson(&superCls, super.access);
|
FunctionDef::accessToJson(&superCls, super.access);
|
||||||
superClasses.append(superCls);
|
superClasses.append(superCls);
|
||||||
}
|
}
|
||||||
|
@ -157,6 +157,7 @@ struct BaseDef {
|
|||||||
|
|
||||||
struct SuperClass {
|
struct SuperClass {
|
||||||
QByteArray classname;
|
QByteArray classname;
|
||||||
|
QByteArray qualified;
|
||||||
FunctionDef::Access access;
|
FunctionDef::Access access;
|
||||||
};
|
};
|
||||||
Q_DECLARE_TYPEINFO(SuperClass, Q_RELOCATABLE_TYPE);
|
Q_DECLARE_TYPEINFO(SuperClass, Q_RELOCATABLE_TYPE);
|
||||||
@ -240,6 +241,8 @@ public:
|
|||||||
return index > def->begin && index < def->end - 1;
|
return index > def->begin && index < def->end - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QByteArray &toFullyQualified(const QByteArray &name) const noexcept;
|
||||||
|
|
||||||
void prependNamespaces(BaseDef &def, const QList<NamespaceDef> &namespaceList) const;
|
void prependNamespaces(BaseDef &def, const QList<NamespaceDef> &namespaceList) const;
|
||||||
|
|
||||||
Type parseType();
|
Type parseType();
|
||||||
|
@ -30,6 +30,7 @@ set(JSON_HEADERS
|
|||||||
moc_include.h
|
moc_include.h
|
||||||
namespace.h
|
namespace.h
|
||||||
namespaced-flags.h
|
namespaced-flags.h
|
||||||
|
namespaced-base-class.h
|
||||||
no-keywords.h
|
no-keywords.h
|
||||||
non-gadget-parent-class.h
|
non-gadget-parent-class.h
|
||||||
oldstyle-casts.h
|
oldstyle-casts.h
|
||||||
|
@ -1319,6 +1319,35 @@
|
|||||||
"inputFile": "namespace.h",
|
"inputFile": "namespace.h",
|
||||||
"outputRevision": 68
|
"outputRevision": 68
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"classes": [
|
||||||
|
{
|
||||||
|
"className": "Base",
|
||||||
|
"object": true,
|
||||||
|
"qualifiedClassName": "QTBUG_101141::Base",
|
||||||
|
"superClasses": [
|
||||||
|
{
|
||||||
|
"access": "public",
|
||||||
|
"name": "QObject"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"className": "Derived",
|
||||||
|
"object": true,
|
||||||
|
"qualifiedClassName": "QTBUG_101141::Derived",
|
||||||
|
"superClasses": [
|
||||||
|
{
|
||||||
|
"access": "public",
|
||||||
|
"fullyQualifiedName": "QTBUG_101141::Base",
|
||||||
|
"name": "Base"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputFile": "namespaced-base-class.h",
|
||||||
|
"outputRevision": 68
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"classes": [
|
"classes": [
|
||||||
{
|
{
|
||||||
|
20
tests/auto/tools/moc/namespaced-base-class.h
Normal file
20
tests/auto/tools/moc/namespaced-base-class.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// Copyright (C) 2016 The Qt Company Ltd.
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
|
#ifndef TST_MOC_NAMESPACED_BASE_CLASS_H
|
||||||
|
#define TST_MOC_NAMESPACED_BASE_CLASS_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
namespace QTBUG_101141 {
|
||||||
|
class Base : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
};
|
||||||
|
|
||||||
|
class Derived : public Base
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TST_MOC_NAMESPACED_BASE_CLASS_H
|
Loading…
x
Reference in New Issue
Block a user