[cxx-interop] Support ObjC classes in generic context in reverse interop

We have the sufficient type metadata on the Swift side so this PR only
makes sure the type traits are correctly generated.

rdar://145211212
This commit is contained in:
Gabor Horvath
2025-02-20 13:07:06 +00:00
parent 63b7f05d74
commit a6c6a005d7
4 changed files with 46 additions and 3 deletions

View File

@@ -35,6 +35,7 @@
#include "swift/Strings.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclObjC.h"
#include "clang/Basic/Module.h"
#include "llvm/Support/raw_ostream.h"
@@ -285,10 +286,20 @@ public:
}
void emitReferencedClangTypeMetadata(const TypeDecl *typeDecl) {
if (!isa<clang::TypeDecl>(typeDecl->getClangDecl()))
const auto *clangDecl = typeDecl->getClangDecl();
if (const auto *objCInt = dyn_cast<clang::ObjCInterfaceDecl>(clangDecl)) {
auto clangType = clangDecl->getASTContext()
.getObjCInterfaceType(objCInt)
.getCanonicalType();
auto it = seenClangTypes.insert(clangType.getTypePtr());
if (it.second)
ClangValueTypePrinter::printClangTypeSwiftGenericTraits(os, typeDecl, &M,
printer);
return;
}
if (!isa<clang::TypeDecl>(clangDecl))
return;
// Get the underlying clang type from a type alias decl or record decl.
auto clangDecl = typeDecl->getClangDecl();
auto clangType = clangDecl->getASTContext()
.getTypeDeclType(cast<clang::TypeDecl>(clangDecl))
.getCanonicalType();
@@ -314,6 +325,8 @@ public:
forwardDeclareCxxValueTypeIfNeeded(NTD);
else if (isa<StructDecl>(TD) && NTD->hasClangNode())
emitReferencedClangTypeMetadata(NTD);
else if (isa<ClassDecl>(TD) && TD->isObjC())
emitReferencedClangTypeMetadata(NTD);
} else if (auto TAD = dyn_cast<TypeAliasDecl>(TD)) {
if (TAD->hasClangNode())
emitReferencedClangTypeMetadata(TAD);