[Lldb-commits] [PATCH] D80556: [lldb] Don't complete ObjCInterfaceDecls in ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName
Raphael Isemann via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed May 27 03:45:02 PDT 2020
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);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80556.266478.patch
Type: text/x-patch
Size: 3582 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200527/61427c95/attachment.bin>
More information about the lldb-commits
mailing list