diff options
Diffstat (limited to 'source/Plugins/Language/Go')
-rw-r--r-- | source/Plugins/Language/Go/GoFormatterFunctions.cpp | 247 | ||||
-rw-r--r-- | source/Plugins/Language/Go/GoFormatterFunctions.h | 12 | ||||
-rw-r--r-- | source/Plugins/Language/Go/GoLanguage.cpp | 164 | ||||
-rw-r--r-- | source/Plugins/Language/Go/GoLanguage.h | 51 |
4 files changed, 215 insertions, 259 deletions
diff --git a/source/Plugins/Language/Go/GoFormatterFunctions.cpp b/source/Plugins/Language/Go/GoFormatterFunctions.cpp index 1d7cd76b9739..0f78f643321b 100644 --- a/source/Plugins/Language/Go/GoFormatterFunctions.cpp +++ b/source/Plugins/Language/Go/GoFormatterFunctions.cpp @@ -21,153 +21,132 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -namespace -{ -class GoSliceSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ - public: - GoSliceSyntheticFrontEnd(ValueObject &valobj) - : SyntheticChildrenFrontEnd(valobj) - { - Update(); +namespace { +class GoSliceSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + GoSliceSyntheticFrontEnd(ValueObject &valobj) + : SyntheticChildrenFrontEnd(valobj) { + Update(); + } + + ~GoSliceSyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override { return m_len; } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + if (idx < m_len) { + ValueObjectSP &cached = m_children[idx]; + if (!cached) { + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + lldb::addr_t object_at_idx = m_base_data_address; + object_at_idx += idx * m_type.GetByteSize(nullptr); + cached = CreateValueObjectFromAddress( + idx_name.GetString(), object_at_idx, + m_backend.GetExecutionContextRef(), m_type); + } + return cached; } - - ~GoSliceSyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override - { - return m_len; + return ValueObjectSP(); + } + + bool Update() override { + size_t old_count = m_len; + + ConstString array_const_str("array"); + ValueObjectSP array_sp = + m_backend.GetChildMemberWithName(array_const_str, true); + if (!array_sp) { + m_children.clear(); + return old_count == 0; } - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - if (idx < m_len) - { - ValueObjectSP &cached = m_children[idx]; - if (!cached) - { - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - lldb::addr_t object_at_idx = m_base_data_address; - object_at_idx += idx * m_type.GetByteSize(nullptr); - cached = CreateValueObjectFromAddress(idx_name.GetData(), object_at_idx, - m_backend.GetExecutionContextRef(), m_type); - } - return cached; - } - return ValueObjectSP(); + m_type = array_sp->GetCompilerType().GetPointeeType(); + m_base_data_address = array_sp->GetPointerValue(); + + ConstString len_const_str("len"); + ValueObjectSP len_sp = + m_backend.GetChildMemberWithName(len_const_str, true); + if (len_sp) { + m_len = len_sp->GetValueAsUnsigned(0); + m_children.clear(); } - bool - Update() override - { - size_t old_count = m_len; - - ConstString array_const_str("array"); - ValueObjectSP array_sp = m_backend.GetChildMemberWithName(array_const_str, true); - if (!array_sp) - { - m_children.clear(); - return old_count == 0; - } - m_type = array_sp->GetCompilerType().GetPointeeType(); - m_base_data_address = array_sp->GetPointerValue(); - - ConstString len_const_str("len"); - ValueObjectSP len_sp = m_backend.GetChildMemberWithName(len_const_str, true); - if (len_sp) - { - m_len = len_sp->GetValueAsUnsigned(0); - m_children.clear(); - } - - return old_count == m_len; - } + return old_count == m_len; + } - bool - MightHaveChildren() override - { - return true; - } + bool MightHaveChildren() override { return true; } - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - return ExtractIndexFromString(name.AsCString()); - } + size_t GetIndexOfChildWithName(const ConstString &name) override { + return ExtractIndexFromString(name.AsCString()); + } - private: - CompilerType m_type; - lldb::addr_t m_base_data_address; - size_t m_len; - std::map<size_t, lldb::ValueObjectSP> m_children; +private: + CompilerType m_type; + lldb::addr_t m_base_data_address; + size_t m_len; + std::map<size_t, lldb::ValueObjectSP> m_children; }; } // anonymous namespace -bool -lldb_private::formatters::GoStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &opts) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - if (valobj.IsPointerType()) - { - Error err; - ValueObjectSP deref = valobj.Dereference(err); - if (!err.Success()) - return false; - return GoStringSummaryProvider(*deref, stream, opts); - } - - ConstString str_name("str"); - ConstString len_name("len"); - - ValueObjectSP data_sp = valobj.GetChildMemberWithName(str_name, true); - ValueObjectSP len_sp = valobj.GetChildMemberWithName(len_name, true); - if (!data_sp || !len_sp) - return false; - bool success; - lldb::addr_t valobj_addr = data_sp->GetValueAsUnsigned(0, &success); - - if (!success) - return false; - - uint64_t length = len_sp->GetValueAsUnsigned(0); - if (length == 0) - { - stream.Printf("\"\""); - return true; - } - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(valobj_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetSourceSize(length); - options.SetNeedsZeroTermination(false); - options.SetLanguage(eLanguageTypeGo); - - if (!StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF8>(options)) - { - stream.Printf("Summary Unavailable"); - return true; - } - +bool lldb_private::formatters::GoStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &opts) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + if (valobj.IsPointerType()) { + Error err; + ValueObjectSP deref = valobj.Dereference(err); + if (!err.Success()) + return false; + return GoStringSummaryProvider(*deref, stream, opts); + } + + ConstString str_name("str"); + ConstString len_name("len"); + + ValueObjectSP data_sp = valobj.GetChildMemberWithName(str_name, true); + ValueObjectSP len_sp = valobj.GetChildMemberWithName(len_name, true); + if (!data_sp || !len_sp) + return false; + bool success; + lldb::addr_t valobj_addr = data_sp->GetValueAsUnsigned(0, &success); + + if (!success) + return false; + + uint64_t length = len_sp->GetValueAsUnsigned(0); + if (length == 0) { + stream.Printf("\"\""); return true; + } + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + options.SetLocation(valobj_addr); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetSourceSize(length); + options.SetNeedsZeroTermination(false); + options.SetLanguage(eLanguageTypeGo); + + if (!StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF8>(options)) { + stream.Printf("Summary Unavailable"); + return true; + } + + return true; } SyntheticChildrenFrontEnd * -lldb_private::formatters::GoSliceSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return nullptr; - - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return nullptr; - return new GoSliceSyntheticFrontEnd(*valobj_sp); +lldb_private::formatters::GoSliceSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + if (!valobj_sp) + return nullptr; + + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return nullptr; + return new GoSliceSyntheticFrontEnd(*valobj_sp); } diff --git a/source/Plugins/Language/Go/GoFormatterFunctions.h b/source/Plugins/Language/Go/GoFormatterFunctions.h index ae1eda0f0c54..596eb2ae71f6 100644 --- a/source/Plugins/Language/Go/GoFormatterFunctions.h +++ b/source/Plugins/Language/Go/GoFormatterFunctions.h @@ -28,14 +28,14 @@ #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Target.h" -namespace lldb_private -{ -namespace formatters -{ +namespace lldb_private { +namespace formatters { -bool GoStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); +bool GoStringSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); -SyntheticChildrenFrontEnd *GoSliceSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); +SyntheticChildrenFrontEnd * +GoSliceSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); } // namespace formatters } // namespace lldb_private diff --git a/source/Plugins/Language/Go/GoLanguage.cpp b/source/Plugins/Language/Go/GoLanguage.cpp index ed010ffa4b2e..85c41d1fe917 100644 --- a/source/Plugins/Language/Go/GoLanguage.cpp +++ b/source/Plugins/Language/Go/GoLanguage.cpp @@ -18,129 +18,109 @@ // Project includes #include "GoLanguage.h" +#include "Plugins/Language/Go/GoFormatterFunctions.h" #include "lldb/Core/ConstString.h" #include "lldb/Core/PluginManager.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Symbol/GoASTContext.h" -#include "Plugins/Language/Go/GoFormatterFunctions.h" using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -void -GoLanguage::Initialize() -{ - PluginManager::RegisterPlugin(GetPluginNameStatic(), "Go Language", CreateInstance); +void GoLanguage::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), "Go Language", + CreateInstance); } -void -GoLanguage::Terminate() -{ - PluginManager::UnregisterPlugin(CreateInstance); +void GoLanguage::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); } -lldb_private::ConstString -GoLanguage::GetPluginNameStatic() -{ - static ConstString g_name("Go"); - return g_name; +lldb_private::ConstString GoLanguage::GetPluginNameStatic() { + static ConstString g_name("Go"); + return g_name; } //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ -lldb_private::ConstString -GoLanguage::GetPluginName() -{ - return GetPluginNameStatic(); +lldb_private::ConstString GoLanguage::GetPluginName() { + return GetPluginNameStatic(); } -uint32_t -GoLanguage::GetPluginVersion() -{ - return 1; -} +uint32_t GoLanguage::GetPluginVersion() { return 1; } //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ -Language * -GoLanguage::CreateInstance(lldb::LanguageType language) -{ - if (language == eLanguageTypeGo) - return new GoLanguage(); - return nullptr; +Language *GoLanguage::CreateInstance(lldb::LanguageType language) { + if (language == eLanguageTypeGo) + return new GoLanguage(); + return nullptr; } HardcodedFormatters::HardcodedSummaryFinder -GoLanguage::GetHardcodedSummaries() -{ - static std::once_flag g_initialize; - static HardcodedFormatters::HardcodedSummaryFinder g_formatters; +GoLanguage::GetHardcodedSummaries() { + static std::once_flag g_initialize; + static HardcodedFormatters::HardcodedSummaryFinder g_formatters; - std::call_once(g_initialize, []() -> void - { - g_formatters.push_back( - [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, - FormatManager &) -> TypeSummaryImpl::SharedPointer - { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat( - TypeSummaryImpl::Flags().SetDontShowChildren(true), - lldb_private::formatters::GoStringSummaryProvider, "Go string summary provider")); - if (GoASTContext::IsGoString(valobj.GetCompilerType())) - { - return formatter_sp; - } - if (GoASTContext::IsGoString(valobj.GetCompilerType().GetPointeeType())) - { - return formatter_sp; - } - return nullptr; - }); - g_formatters.push_back( - [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, - FormatManager &) -> TypeSummaryImpl::SharedPointer - { - static lldb::TypeSummaryImplSP formatter_sp( - new StringSummaryFormat(TypeSummaryImpl::Flags().SetHideItemNames(true), - "(len ${var.len}, cap ${var.cap})")); - if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) - { - return formatter_sp; - } - if (GoASTContext::IsGoSlice(valobj.GetCompilerType().GetPointeeType())) - { - return formatter_sp; - } - return nullptr; - }); - }); - return g_formatters; + std::call_once(g_initialize, []() -> void { + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &) -> TypeSummaryImpl::SharedPointer { + static CXXFunctionSummaryFormat::SharedPointer formatter_sp( + new CXXFunctionSummaryFormat( + TypeSummaryImpl::Flags().SetDontShowChildren(true), + lldb_private::formatters::GoStringSummaryProvider, + "Go string summary provider")); + if (GoASTContext::IsGoString(valobj.GetCompilerType())) { + return formatter_sp; + } + if (GoASTContext::IsGoString( + valobj.GetCompilerType().GetPointeeType())) { + return formatter_sp; + } + return nullptr; + }); + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &) -> TypeSummaryImpl::SharedPointer { + static lldb::TypeSummaryImplSP formatter_sp(new StringSummaryFormat( + TypeSummaryImpl::Flags().SetHideItemNames(true), + "(len ${var.len}, cap ${var.cap})")); + if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) { + return formatter_sp; + } + if (GoASTContext::IsGoSlice( + valobj.GetCompilerType().GetPointeeType())) { + return formatter_sp; + } + return nullptr; + }); + }); + return g_formatters; } HardcodedFormatters::HardcodedSyntheticFinder -GoLanguage::GetHardcodedSynthetics() -{ - static std::once_flag g_initialize; - static HardcodedFormatters::HardcodedSyntheticFinder g_formatters; +GoLanguage::GetHardcodedSynthetics() { + static std::once_flag g_initialize; + static HardcodedFormatters::HardcodedSyntheticFinder g_formatters; - std::call_once(g_initialize, []() -> void - { - g_formatters.push_back( - [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, - FormatManager &fmt_mgr) -> SyntheticChildren::SharedPointer - { - static CXXSyntheticChildren::SharedPointer formatter_sp( - new CXXSyntheticChildren(SyntheticChildren::Flags(), "slice synthetic children", - lldb_private::formatters::GoSliceSyntheticFrontEndCreator)); - if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) - { - return formatter_sp; - } - return nullptr; - }); - }); + std::call_once(g_initialize, []() -> void { + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &fmt_mgr) -> SyntheticChildren::SharedPointer { + static CXXSyntheticChildren::SharedPointer formatter_sp( + new CXXSyntheticChildren( + SyntheticChildren::Flags(), "slice synthetic children", + lldb_private::formatters::GoSliceSyntheticFrontEndCreator)); + if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) { + return formatter_sp; + } + return nullptr; + }); + }); - return g_formatters; + return g_formatters; } diff --git a/source/Plugins/Language/Go/GoLanguage.h b/source/Plugins/Language/Go/GoLanguage.h index 67dd04c2a22e..4dc8ed0745c4 100644 --- a/source/Plugins/Language/Go/GoLanguage.h +++ b/source/Plugins/Language/Go/GoLanguage.h @@ -18,47 +18,44 @@ #include "llvm/ADT/StringRef.h" // Project includes -#include "lldb/lldb-private.h" #include "lldb/Core/ConstString.h" #include "lldb/Target/Language.h" +#include "lldb/lldb-private.h" -namespace lldb_private -{ +namespace lldb_private { -class GoLanguage : public Language -{ - public: - GoLanguage() = default; +class GoLanguage : public Language { +public: + GoLanguage() = default; - ~GoLanguage() override = default; + ~GoLanguage() override = default; - lldb::LanguageType - GetLanguageType() const override - { - return lldb::eLanguageTypeGo; - } + lldb::LanguageType GetLanguageType() const override { + return lldb::eLanguageTypeGo; + } - HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override; + HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override; - HardcodedFormatters::HardcodedSyntheticFinder GetHardcodedSynthetics() override; + HardcodedFormatters::HardcodedSyntheticFinder + GetHardcodedSynthetics() override; - //------------------------------------------------------------------ - // Static Functions - //------------------------------------------------------------------ - static void Initialize(); + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void Initialize(); - static void Terminate(); + static void Terminate(); - static lldb_private::Language *CreateInstance(lldb::LanguageType language); + static lldb_private::Language *CreateInstance(lldb::LanguageType language); - static lldb_private::ConstString GetPluginNameStatic(); + static lldb_private::ConstString GetPluginNameStatic(); - //------------------------------------------------------------------ - // PluginInterface protocol - //------------------------------------------------------------------ - ConstString GetPluginName() override; + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + ConstString GetPluginName() override; - uint32_t GetPluginVersion() override; + uint32_t GetPluginVersion() override; }; } // namespace lldb_private |