[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
This commit is contained in:
parent
abe0362dd8
commit
c327f99254
|
@ -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).
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -326,6 +326,8 @@ public:
|
|||
return ConstString();
|
||||
}
|
||||
|
||||
virtual ConstString GetInstanceVariableName() { return {}; }
|
||||
|
||||
protected:
|
||||
// Classes that inherit from Language can see and modify these
|
||||
|
||||
|
|
|
@ -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(); }
|
||||
};
|
||||
|
|
|
@ -155,6 +155,8 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
ConstString GetInstanceVariableName() override { return ConstString("self"); }
|
||||
|
||||
// PluginInterface protocol
|
||||
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<std::string>
|
||||
TypeSystemClang::GetCXXClassName(const CompilerType &type) {
|
||||
if (!type)
|
||||
|
|
|
@ -711,8 +711,6 @@ public:
|
|||
|
||||
bool SupportsLanguage(lldb::LanguageType language) override;
|
||||
|
||||
ConstString GetInstanceVariableName(lldb::LanguageType language) override;
|
||||
|
||||
static std::optional<std::string> GetCXXClassName(const CompilerType &type);
|
||||
|
||||
// Type Completion
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user