From: Dave Lee Date: Fri, 17 Mar 2023 02:19:05 +0000 (-0700) Subject: [lldb] Refactor deduction of the instance variable's name (NFC) X-Git-Tag: upstream/17.0.6~14067 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c327f9925428870e6288fa65bb709dcc3c0a0f31;p=platform%2Fupstream%2Fllvm.git [lldb] Refactor deduction of the instance variable's name (NFC) Move responsibility of providing the instance variable name (`this`, `self`) from `TypeSystem` to `Language`. `Language` the natural place for this, but also has downstream benefits. Some languages have multiple `TypeSystem` implementations (ex Swift), and by placing this logic in the `Language`, redundancy is avoided. This change relies on the tests from D145348 and D146320. Differential Revision: https://reviews.llvm.org/D146548 --- diff --git a/lldb/include/lldb/Symbol/CompilerDeclContext.h b/lldb/include/lldb/Symbol/CompilerDeclContext.h index 63e5f7b..61a9c9c 100644 --- a/lldb/include/lldb/Symbol/CompilerDeclContext.h +++ b/lldb/include/lldb/Symbol/CompilerDeclContext.h @@ -69,14 +69,6 @@ public: /// Determines the original language of the decl context. lldb::LanguageType GetLanguage(); - /// Determines the name of the instance variable for the this decl context. - /// - /// For C++ the name is "this", for Objective-C the name is "self". - /// - /// \return - /// Returns a string for the name of the instance variable. - ConstString GetInstanceVariableName(lldb::LanguageType language); - /// Check if the given other decl context is contained in the lookup /// of this decl context (for example because the other context is a nested /// inline namespace). diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 0777d4d..a16f4af 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -202,10 +202,6 @@ public: // TypeSystems can support more than one language virtual bool SupportsLanguage(lldb::LanguageType language) = 0; - /// The name of the variable used for explicitly accessing data scoped to the - /// current instance (or type). C++ uses "this", ObjC uses "self". - virtual ConstString GetInstanceVariableName(lldb::LanguageType language) = 0; - // Type Completion virtual bool GetCompleteType(lldb::opaque_compiler_type_t type) = 0; diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h index 8cc1e72..59ea17b 100644 --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -326,6 +326,8 @@ public: return ConstString(); } + virtual ConstString GetInstanceVariableName() { return {}; } + protected: // Classes that inherit from Language can see and modify these diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h index 8099964..a3e78c3 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -165,6 +165,8 @@ public: ConstString FindBestAlternateFunctionMangledName( const Mangled mangled, const SymbolContext &sym_ctx) const override; + ConstString GetInstanceVariableName() override { return ConstString("this"); } + // PluginInterface protocol llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } }; diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h index b61348a..1344e97 100644 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h @@ -155,6 +155,8 @@ public: return false; } + ConstString GetInstanceVariableName() override { return ConstString("self"); } + // PluginInterface protocol llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } }; diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h index 20184fd..5fb256d 100644 --- a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h @@ -40,6 +40,8 @@ public: static lldb_private::Language *CreateInstance(lldb::LanguageType language); + ConstString GetInstanceVariableName() override { return ConstString("self"); } + static llvm::StringRef GetPluginNameStatic() { return "objcplusplus"; } // PluginInterface protocol diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index a739494..b661ec4 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -3727,22 +3727,6 @@ bool TypeSystemClang::SupportsLanguage(lldb::LanguageType language) { return TypeSystemClangSupportsLanguage(language); } -ConstString -TypeSystemClang::GetInstanceVariableName(lldb::LanguageType language) { - switch (language) { - case LanguageType::eLanguageTypeC_plus_plus: - case LanguageType::eLanguageTypeC_plus_plus_03: - case LanguageType::eLanguageTypeC_plus_plus_11: - case LanguageType::eLanguageTypeC_plus_plus_14: - return ConstString("this"); - case LanguageType::eLanguageTypeObjC: - case LanguageType::eLanguageTypeObjC_plus_plus: - return ConstString("self"); - default: - return {}; - } -} - std::optional TypeSystemClang::GetCXXClassName(const CompilerType &type) { if (!type) diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index baddf62..414b519 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -711,8 +711,6 @@ public: bool SupportsLanguage(lldb::LanguageType language) override; - ConstString GetInstanceVariableName(lldb::LanguageType language) override; - static std::optional GetCXXClassName(const CompilerType &type); // Type Completion diff --git a/lldb/source/Symbol/CompilerDeclContext.cpp b/lldb/source/Symbol/CompilerDeclContext.cpp index 36b9131..a188e60 100644 --- a/lldb/source/Symbol/CompilerDeclContext.cpp +++ b/lldb/source/Symbol/CompilerDeclContext.cpp @@ -46,13 +46,6 @@ lldb::LanguageType CompilerDeclContext::GetLanguage() { return {}; } -ConstString -CompilerDeclContext::GetInstanceVariableName(lldb::LanguageType language) { - if (IsValid()) - return m_type_system->GetInstanceVariableName(language); - return {}; -} - bool CompilerDeclContext::IsContainedInLookup(CompilerDeclContext other) const { if (!IsValid()) return false; diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index 5d4fb1c..0a00802 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/source/Symbol/SymbolContext.cpp @@ -19,10 +19,12 @@ #include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/Variable.h" +#include "lldb/Target/Language.h" #include "lldb/Target/Target.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/StreamString.h" +#include "lldb/lldb-enumerations.h" using namespace lldb; using namespace lldb_private; @@ -540,13 +542,17 @@ Block *SymbolContext::GetFunctionBlock() { } ConstString SymbolContext::GetInstanceVariableName() { + LanguageType lang_type = eLanguageTypeUnknown; + if (Block *function_block = GetFunctionBlock()) - if (CompilerDeclContext decl_ctx = function_block->GetDeclContext()) { - auto language = decl_ctx.GetLanguage(); - if (language == eLanguageTypeUnknown) - language = GetLanguage(); - return decl_ctx.GetInstanceVariableName(language); - } + if (CompilerDeclContext decl_ctx = function_block->GetDeclContext()) + lang_type = decl_ctx.GetLanguage(); + + if (lang_type == eLanguageTypeUnknown) + lang_type = GetLanguage(); + + if (auto *lang = Language::FindPlugin(lang_type)) + return lang->GetInstanceVariableName(); return {}; }