From 2130c446e2c21f1f41a4e83ac8ad7da486318702 Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Mon, 18 May 2020 16:55:09 +0200 Subject: [PATCH] Adds SourceUnit::replaceNode(_old, _new) --- libsolidity/ast/AST.cpp | 18 ++++++++++++++++++ libsolidity/ast/AST.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index 3edb08476..9bc5c030d 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -27,6 +27,8 @@ #include #include +#include +#include #include #include @@ -72,6 +74,22 @@ set SourceUnit::referencedSourceUnits(bool _recurse, set _oldNode, ASTPointer _newNode) +{ + solAssert( + boost::range::find_if( + m_nodes, + [&](auto const& node) { return node->id() == _oldNode->id(); } + ) != m_nodes.end(), + "" + ); + boost::range::replace_if( + m_nodes, + [&](auto const& node) { return node->id() == _oldNode->id(); }, + _newNode + ); +} + ImportAnnotation& ImportDirective::annotation() const { return initAnnotation(); diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 92b3324ab..cecf6afb9 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -173,6 +173,9 @@ public: std::optional const& licenseString() const { return m_licenseString; } std::vector> nodes() const { return m_nodes; } + /// Replaces given top-level AST node with a new AST node. + void replaceNode(ASTPointer _oldNode, ASTPointer _newNode); + /// @returns a set of referenced SourceUnits. Recursively if @a _recurse is true. std::set referencedSourceUnits(bool _recurse = false, std::set _skipList = std::set()) const;