| //===-- LibCxxRangesRefView.cpp -------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "LibCxx.h" | |
| #include "lldb/DataFormatters/FormattersHelpers.h" | |
| #include "lldb/Utility/ConstString.h" | |
| #include "lldb/ValueObject/ValueObject.h" | |
| #include "llvm/ADT/APSInt.h" | |
| using namespace lldb; | |
| using namespace lldb_private; | |
| using namespace lldb_private::formatters; | |
| namespace lldb_private { | |
| namespace formatters { | |
| class LibcxxStdRangesRefViewSyntheticFrontEnd | |
| : public SyntheticChildrenFrontEnd { | |
| public: | |
| LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); | |
| ~LibcxxStdRangesRefViewSyntheticFrontEnd() override = default; | |
| llvm::Expected<uint32_t> CalculateNumChildren() override { | |
| // __range_ will be the sole child of this type | |
| return 1; | |
| } | |
| lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override { | |
| // Since we only have a single child, return it | |
| assert(idx == 0); | |
| return m_range_sp; | |
| } | |
| lldb::ChildCacheState Update() override; | |
| llvm::Expected<size_t> GetIndexOfChildWithName(ConstString name) override { | |
| // We only have a single child | |
| return 0; | |
| } | |
| private: | |
| /// Pointer to the dereferenced __range_ member | |
| lldb::ValueObjectSP m_range_sp = nullptr; | |
| }; | |
| lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd:: | |
| LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) | |
| : SyntheticChildrenFrontEnd(*valobj_sp) { | |
| if (valobj_sp) | |
| Update(); | |
| } | |
| lldb::ChildCacheState | |
| lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::Update() { | |
| ValueObjectSP range_ptr = | |
| GetChildMemberWithName(m_backend, {ConstString("__range_")}); | |
| if (!range_ptr) | |
| return lldb::ChildCacheState::eRefetch; | |
| lldb_private::Status error; | |
| m_range_sp = range_ptr->Dereference(error); | |
| return error.Success() ? lldb::ChildCacheState::eReuse | |
| : lldb::ChildCacheState::eRefetch; | |
| } | |
| lldb_private::SyntheticChildrenFrontEnd * | |
| LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *, | |
| lldb::ValueObjectSP valobj_sp) { | |
| if (!valobj_sp) | |
| return nullptr; | |
| CompilerType type = valobj_sp->GetCompilerType(); | |
| if (!type.IsValid()) | |
| return nullptr; | |
| return new LibcxxStdRangesRefViewSyntheticFrontEnd(valobj_sp); | |
| } | |
| } // namespace formatters | |
| } // namespace lldb_private |