@@ -4305,8 +4305,11 @@ CompilerType SwiftASTContext::GetAsClangType(ConstString mangled_name) {
4305
4305
// that look like they might be come from Objective-C (or C) as
4306
4306
// Clang types. LLDB's Objective-C part is very robust against
4307
4307
// malformed object pointers, so this isn't very risky.
4308
+ Module *module = GetModule ();
4309
+ if (!module)
4310
+ return {};
4308
4311
auto type_system_or_err =
4309
- GetModule () ->GetTypeSystemForLanguage (eLanguageTypeObjC);
4312
+ module ->GetTypeSystemForLanguage (eLanguageTypeObjC);
4310
4313
if (!type_system_or_err) {
4311
4314
llvm::consumeError (type_system_or_err.takeError ());
4312
4315
return {};
@@ -4327,8 +4330,10 @@ CompilerType SwiftASTContext::GetAsClangType(ConstString mangled_name) {
4327
4330
// Import the Clang type into the Clang context.
4328
4331
if (!clang_type)
4329
4332
return {};
4330
- clang_type =
4331
- clang_ast_parser->GetClangASTImporter ().CopyType (*clang_ctx, clang_type);
4333
+
4334
+ if (clang_type.GetTypeSystem () != clang_ctx)
4335
+ clang_type = clang_ast_parser->GetClangASTImporter ().CopyType (*clang_ctx,
4336
+ clang_type);
4332
4337
// Swift doesn't know pointers. Convert top-level
4333
4338
// Objective-C object types to object pointers for Clang.
4334
4339
auto qual_type =
@@ -4401,6 +4406,31 @@ swift::TypeBase *SwiftASTContext::ReconstructType(ConstString mangled_typename,
4401
4406
*ast_ctx, mangled_typename.GetStringRef ())
4402
4407
.getPointer ();
4403
4408
4409
+ // Objective-C classes sometimes have private subclasses that are invisible to the Swift compiler because they are declared and defined in a .m file. If we can't reconstruct an ObjC type, walk up the type hierarchy until we find something we can import, or until we run out of types
4410
+ while (!found_type) {
4411
+ CompilerType clang_type = GetAsClangType (mangled_typename);
4412
+ if (!clang_type)
4413
+ break ;
4414
+
4415
+ auto *clang_ctx =
4416
+ llvm::dyn_cast_or_null<TypeSystemClang>(clang_type.GetTypeSystem ());
4417
+ if (!clang_ctx)
4418
+ break ;
4419
+ auto *interface_decl = TypeSystemClang::GetAsObjCInterfaceDecl (clang_type);
4420
+ if (!interface_decl)
4421
+ break ;
4422
+ auto *super_interface_decl = interface_decl->getSuperClass ();
4423
+ if (!super_interface_decl)
4424
+ break ;
4425
+ CompilerType super_type = clang_ctx->GetTypeForDecl (super_interface_decl);
4426
+ if (!super_type)
4427
+ break ;
4428
+ auto super_mangled_typename = super_type.GetMangledTypeName ();
4429
+ found_type = swift::Demangle::getTypeForMangling (
4430
+ *ast_ctx, super_mangled_typename.GetStringRef ())
4431
+ .getPointer ();
4432
+ }
4433
+
4404
4434
if (found_type) {
4405
4435
swift::TypeBase *ast_type =
4406
4436
ConvertSILFunctionTypesToASTFunctionTypes (found_type).getPointer ();
0 commit comments