#include "bscript/compiler/ast/IndexBinding.h" #include #include "bscript/compiler/ast/ElementIndexes.h" #include "bscript/compiler/ast/Node.h" #include "bscript/compiler/ast/NodeVisitor.h" #include "clib/clib.h" namespace Pol::Bscript::Compiler { IndexBinding::IndexBinding( const SourceLocation& loc, std::unique_ptr indices, std::vector> bindings ) : Node( loc ) { children.reserve( bindings.size() + 1 ); children.push_back( std::move( indices ) ); children.insert( children.end(), std::make_move_iterator( bindings.begin() ), std::make_move_iterator( bindings.end() ) ); } void IndexBinding::accept( NodeVisitor& visitor ) { visitor.visit_index_binding( *this ); } void IndexBinding::describe_to( std::string& w ) const { w += "index-binding"; } ElementIndexes& IndexBinding::indexes() { return child( 0 ); } std::vector> IndexBinding::bindings() { std::vector> params; for ( auto& param : children | std::views::drop( 1 ) ) { params.emplace_back( *param.get() ); } return params; } u8 IndexBinding::binding_count() const { // Subtract one, for the ElementIndexes at the first child. return Clib::clamp_convert( children.size() - 1 ); } } // namespace Pol::Bscript::Compiler