Support add/delete annotation elements

Issue: #IAS8XN

Signed-off-by: Nazarov Konstantin <nazarov.konstantin@huawei.com>
Change-Id: I27fad211bc40a469505b19bbea60df1861f6cca6
This commit is contained in:
Nazarov Konstantin 2024-09-20 20:39:58 +08:00
parent 7fd7038ee3
commit 97385e96aa
3 changed files with 38 additions and 0 deletions

View File

@ -258,4 +258,15 @@ void AnnotationData::SetOrAddElementByIndex(size_t ele_idx, AnnotationElement &&
}
elements_[ele_idx] = std::forward<AnnotationElement>(element);
}
void AnnotationData::DeleteAnnotationElementByName(const std::string_view &annotation_elem_name)
{
auto annotation_elem_iter = std::find_if(elements_.begin(), elements_.end(),
[&](pandasm::AnnotationElement &annotation_element) -> bool {
return annotation_element.GetName() == annotation_elem_name;
});
if (annotation_elem_iter != elements_.end()) {
(void)elements_.erase(annotation_elem_iter);
}
}
} // namespace panda::pandasm

View File

@ -61,6 +61,8 @@ public:
elements_.push_back(std::forward<AnnotationElement>(element));
}
void DeleteAnnotationElementByName(const std::string_view &annotation_elem_name);
void SetOrAddElementByIndex(size_t ele_idx, AnnotationElement &&element);
private:
@ -363,6 +365,9 @@ public:
case '@':
type = Type::METHOD_HANDLE;
break;
case '#':
type = Type::LITERALARRAY;
break;
case '0':
default:
type = Type::UNKNOWN;

View File

@ -208,6 +208,17 @@ public:
annotations_.insert(annotations_.end(), annotations.begin(), annotations.end());
}
void DeleteAnnotationElementByName(std::string_view annotation_name, std::string_view annotation_elem_name)
{
auto annotation_iter = std::find_if(annotations_.begin(), annotations_.end(),
[&](pandasm::AnnotationData &annotation) -> bool {
return annotation.GetName() == annotation_name;
});
if (annotation_iter != annotations_.end()) {
annotation_iter->DeleteAnnotationElementByName(annotation_elem_name);
}
}
void DeleteAnnotationByName(const std::string_view &annotation_name)
{
auto annotation_iter = std::find_if(annotations_.begin(), annotations_.end(),
@ -219,6 +230,17 @@ public:
}
}
void AddAnnotationElementByName(const std::string_view &annotation_name, AnnotationElement &&element)
{
auto annotation_iter = std::find_if(annotations_.begin(), annotations_.end(),
[&](pandasm::AnnotationData &annotation) -> bool {
return annotation.GetName() == annotation_name;
});
if (annotation_iter != annotations_.end()) {
annotation_iter->AddElement(std::move(element));
}
}
void SetOrAddAnnotationElementByIndex(size_t anno_idx, size_t ele_idx, AnnotationElement &&element)
{
ASSERT(anno_idx < annotations_.size());