diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-02-19 10:16:28 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-02-19 10:20:14 +0100 |
commit | d38f930e41fb4b1123bab3a243fd04b3a74281e2 (patch) | |
tree | 3ffa0dbc1d7eb18df3ae651187381ab95aa2edf3 /sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp | |
parent | 02018700e86a7eea18eac2952b819a9b77606d1b (diff) | |
parent | eaaba5fa6a0920f06783915d0ba9b4661023bbc1 (diff) |
Merge remote-tracking branch 'origin/5.14' into 5.15
Change-Id: I827c17bc77d4da46abc6db2a91a8cc9296b4c0e0
Diffstat (limited to 'sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp')
-rw-r--r-- | sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp | 36 |
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()) { |