diff --git a/lldb/include/lldb/Symbol/CompilerDeclContext.h b/lldb/include/lldb/Symbol/CompilerDeclContext.h --- a/lldb/include/lldb/Symbol/CompilerDeclContext.h +++ b/lldb/include/lldb/Symbol/CompilerDeclContext.h @@ -69,14 +69,6 @@ /// 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 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -202,10 +202,6 @@ // 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 --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -302,6 +302,8 @@ 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 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -165,6 +165,8 @@ 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 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h @@ -155,6 +155,8 @@ 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 --- a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h @@ -40,6 +40,8 @@ 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.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -711,8 +711,6 @@ 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/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -3727,22 +3727,6 @@ 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/Symbol/CompilerDeclContext.cpp b/lldb/source/Symbol/CompilerDeclContext.cpp --- a/lldb/source/Symbol/CompilerDeclContext.cpp +++ b/lldb/source/Symbol/CompilerDeclContext.cpp @@ -46,13 +46,6 @@ 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 --- 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 @@ } 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 {}; }