llvm-project/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp
Charles Zablit b3d130279f
[lldb] Upgrade GetIndexOfChildWithName to use llvm::Expected (#136693)
This patch replaces the use of `UINT32_MAX` as the error return value of
`GetIndexOfChildWithName` with `llvm::Expected`.


# Tasks to do in another PR

1. Replace `CalculateNumChildrenIgnoringErrors` with
`CalculateNumChildren`. See [this
comment](https://github.com/llvm/llvm-project/pull/136693#discussion_r2056319358).
2. Update `lldb_private::formatters::ExtractIndexFromString` to use
`llvm::Expected`. See [this
comment](https://github.com/llvm/llvm-project/pull/136693#discussion_r2054217536).
3. Create a new class which carries both user and internal errors. See
[this
comment](https://github.com/llvm/llvm-project/pull/136693#discussion_r2056439608).
2025-04-30 11:44:19 +01:00

87 lines
2.6 KiB
C++

//===-- 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