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;