This revision was automatically updated to reflect the committed changes. Closed by commit rG019bd6485c52: [lldb] Don't complete ObjCInterfaceDecls in ClangExternalASTSourceCallbacks… (authored by teemperor). Herald added a project: LLDB. Herald added a subscriber: lldb-commits.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D80556/new/ https://reviews.llvm.org/D80556 Files: lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm lldb/unittests/Symbol/TestTypeSystemClang.cpp Index: lldb/unittests/Symbol/TestTypeSystemClang.cpp =================================================================== --- lldb/unittests/Symbol/TestTypeSystemClang.cpp +++ lldb/unittests/Symbol/TestTypeSystemClang.cpp @@ -688,3 +688,37 @@ auto *record = llvm::cast<CXXRecordDecl>(ClangUtil::GetAsTagDecl(t)); EXPECT_TRUE(record->hasUserDeclaredCopyConstructor()); } + +TEST_F(TestTypeSystemClang, AddMethodToObjCObjectType) { + // Create an interface decl and mark it as having external storage. + CompilerType c = m_ast->CreateObjCClass("A", m_ast->GetTranslationUnitDecl(), + OptionalClangModuleID(), + /*IsForwardDecl*/ false, + /*IsInternal*/ false); + ObjCInterfaceDecl *interface = m_ast->GetAsObjCInterfaceDecl(c); + m_ast->SetHasExternalStorage(c.GetOpaqueQualType(), true); + EXPECT_TRUE(interface->hasExternalLexicalStorage()); + + // Add a method to the interface. + std::vector<CompilerType> args; + CompilerType func_type = + m_ast->CreateFunctionType(m_ast->GetBasicType(lldb::eBasicTypeInt), + args.data(), args.size(), /*variadic*/ false, + /*quals*/ 0, clang::CallingConv::CC_C); + bool variadic = false; + bool artificial = false; + bool objc_direct = false; + clang::ObjCMethodDecl *method = TypeSystemClang::AddMethodToObjCObjectType( + c, "-[A foo]", func_type, lldb::eAccessPublic, artificial, variadic, + objc_direct); + ASSERT_NE(method, nullptr); + + // The interface decl should still have external lexical storage. + EXPECT_TRUE(interface->hasExternalLexicalStorage()); + + // Test some properties of the created ObjCMethodDecl. + EXPECT_FALSE(method->isVariadic()); + EXPECT_TRUE(method->isImplicit()); + EXPECT_FALSE(method->isDirectMethod()); + EXPECT_EQ(method->getDeclName().getObjCSelector().getAsString(), "foo"); +} Index: lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm =================================================================== --- lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm +++ lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm @@ -46,7 +46,7 @@ // RUN: lldb-test symbols -dump-clang-ast -find type --language=ObjC++ \ // RUN: -compiler-context 'Module:A,Struct:SomeClass' %t.o \ // RUN: | FileCheck %s --check-prefix=CHECK-OBJC -// CHECK-OBJC: ObjCInterfaceDecl {{.*}} imported in A SomeClass +// CHECK-OBJC: ObjCInterfaceDecl {{.*}} imported in A <undeserialized declarations> SomeClass // CHECK-OBJC-NEXT: |-ObjCIvarDecl // CHECK-OBJC-NEXT: |-ObjCMethodDecl 0x[[NUMBER:[0-9a-f]+]]{{.*}} imported in A // CHECK-OBJC-NEXT: `-ObjCPropertyDecl {{.*}} imported in A number 'int' readonly Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp @@ -53,7 +53,8 @@ // Objective-C methods are not added into the LookupPtr when they originate // from an external source. SetExternalVisibleDeclsForName() adds them. if (auto *oid = llvm::dyn_cast<clang::ObjCInterfaceDecl>(DC)) { - for (auto *omd : oid->methods()) + clang::ObjCContainerDecl::method_range noload_methods(oid->noload_decls()); + for (auto *omd : noload_methods) if (omd->getDeclName() == Name) decls.push_back(omd); }
Index: lldb/unittests/Symbol/TestTypeSystemClang.cpp =================================================================== --- lldb/unittests/Symbol/TestTypeSystemClang.cpp +++ lldb/unittests/Symbol/TestTypeSystemClang.cpp @@ -688,3 +688,37 @@ auto *record = llvm::cast<CXXRecordDecl>(ClangUtil::GetAsTagDecl(t)); EXPECT_TRUE(record->hasUserDeclaredCopyConstructor()); } + +TEST_F(TestTypeSystemClang, AddMethodToObjCObjectType) { + // Create an interface decl and mark it as having external storage. + CompilerType c = m_ast->CreateObjCClass("A", m_ast->GetTranslationUnitDecl(), + OptionalClangModuleID(), + /*IsForwardDecl*/ false, + /*IsInternal*/ false); + ObjCInterfaceDecl *interface = m_ast->GetAsObjCInterfaceDecl(c); + m_ast->SetHasExternalStorage(c.GetOpaqueQualType(), true); + EXPECT_TRUE(interface->hasExternalLexicalStorage()); + + // Add a method to the interface. + std::vector<CompilerType> args; + CompilerType func_type = + m_ast->CreateFunctionType(m_ast->GetBasicType(lldb::eBasicTypeInt), + args.data(), args.size(), /*variadic*/ false, + /*quals*/ 0, clang::CallingConv::CC_C); + bool variadic = false; + bool artificial = false; + bool objc_direct = false; + clang::ObjCMethodDecl *method = TypeSystemClang::AddMethodToObjCObjectType( + c, "-[A foo]", func_type, lldb::eAccessPublic, artificial, variadic, + objc_direct); + ASSERT_NE(method, nullptr); + + // The interface decl should still have external lexical storage. + EXPECT_TRUE(interface->hasExternalLexicalStorage()); + + // Test some properties of the created ObjCMethodDecl. + EXPECT_FALSE(method->isVariadic()); + EXPECT_TRUE(method->isImplicit()); + EXPECT_FALSE(method->isDirectMethod()); + EXPECT_EQ(method->getDeclName().getObjCSelector().getAsString(), "foo"); +} Index: lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm =================================================================== --- lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm +++ lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm @@ -46,7 +46,7 @@ // RUN: lldb-test symbols -dump-clang-ast -find type --language=ObjC++ \ // RUN: -compiler-context 'Module:A,Struct:SomeClass' %t.o \ // RUN: | FileCheck %s --check-prefix=CHECK-OBJC -// CHECK-OBJC: ObjCInterfaceDecl {{.*}} imported in A SomeClass +// CHECK-OBJC: ObjCInterfaceDecl {{.*}} imported in A <undeserialized declarations> SomeClass // CHECK-OBJC-NEXT: |-ObjCIvarDecl // CHECK-OBJC-NEXT: |-ObjCMethodDecl 0x[[NUMBER:[0-9a-f]+]]{{.*}} imported in A // CHECK-OBJC-NEXT: `-ObjCPropertyDecl {{.*}} imported in A number 'int' readonly Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp @@ -53,7 +53,8 @@ // Objective-C methods are not added into the LookupPtr when they originate // from an external source. SetExternalVisibleDeclsForName() adds them. if (auto *oid = llvm::dyn_cast<clang::ObjCInterfaceDecl>(DC)) { - for (auto *omd : oid->methods()) + clang::ObjCContainerDecl::method_range noload_methods(oid->noload_decls()); + for (auto *omd : noload_methods) if (omd->getDeclName() == Name) decls.push_back(omd); }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits