diff options
-rw-r--r-- | sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp index cf489eb2e..ee34b29ae 100644 --- a/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp +++ b/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp @@ -247,8 +247,16 @@ bool BuilderPrivate::addClass(const CXCursor &cursor, CodeModel::ClassType t) if (isClassCursor(semPar)) { const CursorClassHash::const_iterator it = m_cursorClassHash.constFind(semPar); if (it == m_cursorClassHash.constEnd()) { - const QString message = QStringLiteral("Unable to find parent of inner class ") + className; - const Diagnostic d(message, cursor, CXDiagnostic_Error); + QString message; + QTextStream(&message) << "Unable to find containing class \"" + << getCursorSpelling(semPar) << "\" of inner class \"" + << className << "\"."; + // PYSIDE-1501: Has been observed to fail for inner class of + // template with separated implementation where a forward + // declaration of the outer template is reported (Boost). + const auto severity = semPar.kind == CXCursor_ClassTemplate + ? CXDiagnostic_Warning : CXDiagnostic_Error; + const Diagnostic d(message, cursor, severity); qWarning() << d; m_baseVisitor->appendDiagnostic(d); return false; @@ -965,16 +973,17 @@ BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor) case CXCursor_ClassDecl: case CXCursor_UnionDecl: case CXCursor_StructDecl: - if (d->m_withinFriendDecl || clang_isCursorDefinition(cursor) == 0) + if (d->m_withinFriendDecl || clang_isCursorDefinition(cursor) == 0 + || !d->addClass(cursor, codeModelClassTypeFromCursor(cursor.kind))) { return Skip; - if (!d->addClass(cursor, codeModelClassTypeFromCursor(cursor.kind))) - return Error; + } break; case CXCursor_ClassTemplate: case CXCursor_ClassTemplatePartialSpecialization: - if (d->m_withinFriendDecl || clang_isCursorDefinition(cursor) == 0) + if (d->m_withinFriendDecl || clang_isCursorDefinition(cursor) == 0 + || !d->addClass(cursor, CodeModel::Class)) { return Skip; - d->addClass(cursor, CodeModel::Class); + } d->m_currentClass->setName(d->m_currentClass->name() + templateBrackets()); d->m_scope.back() += templateBrackets(); break; |