aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-02-19 10:16:28 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-02-19 10:20:14 +0100
commitd38f930e41fb4b1123bab3a243fd04b3a74281e2 (patch)
tree3ffa0dbc1d7eb18df3ae651187381ab95aa2edf3 /sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
parent02018700e86a7eea18eac2952b819a9b77606d1b (diff)
parenteaaba5fa6a0920f06783915d0ba9b4661023bbc1 (diff)
Merge remote-tracking branch 'origin/5.14' into 5.15
Diffstat (limited to 'sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp')
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp36
1 files changed, 28 insertions, 8 deletions
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
index 78f34c87f..7c188535f 100644
--- a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
@@ -190,7 +190,7 @@ public:
TypeInfo *t) const;
bool addTemplateInstantiationsRecursion(const CXType &type, TypeInfo *t) const;
- void addTypeDef(const CXCursor &cursor, const TypeInfo &ti);
+ void addTypeDef(const CXCursor &cursor, const CXType &cxType);
TemplateParameterModelItem createTemplateParameter(const CXCursor &cursor) const;
TemplateParameterModelItem createNonTypeTemplateParameter(const CXCursor &cursor) const;
@@ -540,11 +540,12 @@ TypeInfo BuilderPrivate::createTypeInfo(const CXType &type) const
return it.value();
}
-void BuilderPrivate::addTypeDef(const CXCursor &cursor, const TypeInfo &ti)
+void BuilderPrivate::addTypeDef(const CXCursor &cursor, const CXType &cxType)
{
- TypeDefModelItem item(new _TypeDefModelItem(m_model, getCursorSpelling(cursor)));
+ const QString target = getCursorSpelling(cursor);
+ TypeDefModelItem item(new _TypeDefModelItem(m_model, target));
setFileName(cursor, item.data());
- item->setType(ti);
+ item->setType(createTypeInfo(cxType));
item->setScope(m_scope);
m_scopeStack.back()->addTypeDef(item);
m_cursorTypedefHash.insert(cursor, item);
@@ -788,6 +789,19 @@ static NamespaceType namespaceType(const CXCursor &cursor)
return NamespaceType::Default;
}
+static QString enumType(const CXCursor &cursor)
+{
+ QString name = getCursorSpelling(cursor); // "enum Foo { v1, v2 };"
+ if (name.isEmpty()) {
+ // PYSIDE-1228: For "typedef enum { v1, v2 } Foo;", type will return
+ // "Foo" as expected. Care must be taken to exclude real anonymous enums.
+ name = getTypeName(clang_getCursorType(cursor));
+ if (name.contains(QLatin1String("(anonymous")))
+ name.clear();
+ }
+ return name;
+}
+
BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor)
{
switch (cursor.kind) {
@@ -830,7 +844,7 @@ BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor)
d->m_scope.back() += templateBrackets();
break;
case CXCursor_EnumDecl: {
- QString name = getCursorSpelling(cursor);
+ QString name = enumType(cursor);
EnumKind kind = CEnum;
if (name.isEmpty()) {
kind = AnonymousEnum;
@@ -980,11 +994,17 @@ BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor)
case CXCursor_TypeAliasTemplateDecl: { // May contain nested CXCursor_TemplateTypeParameter
const CXType type = clang_getCanonicalType(clang_getCursorType(cursor));
if (type.kind > CXType_Unexposed)
- d->addTypeDef(cursor, d->createTypeInfo(type));
+ d->addTypeDef(cursor, type);
}
return Skip;
- case CXCursor_TypedefDecl:
- d->addTypeDef(cursor, d->createTypeInfo(clang_getTypedefDeclUnderlyingType(cursor)));
+ case CXCursor_TypedefDecl: {
+ auto underlyingType = clang_getTypedefDeclUnderlyingType(cursor);
+ d->addTypeDef(cursor, underlyingType);
+ // For "typedef enum/struct {} Foo;", skip the enum/struct
+ // definition nested into the typedef (PYSIDE-1228).
+ if (underlyingType.kind == CXType_Elaborated)
+ return Skip;
+ }
break;
case CXCursor_TypeRef:
if (!d->m_currentFunction.isNull()) {