#include "bscript/compiler/ast/ClassDeclaration.h" #include "bscript/compiler/ast/ClassParameterDeclaration.h" #include "bscript/compiler/ast/ClassParameterList.h" #include "bscript/compiler/ast/NodeVisitor.h" #include "bscript/compiler/ast/UninitializedFunctionDeclaration.h" #include "bscript/compiler/ast/UserFunction.h" #include "bscript/compiler/file/SourceFileIdentifier.h" #include "bscript/compiler/model/ClassLink.h" #include "bscript/compiler/model/FunctionLink.h" #include namespace Pol::Bscript::Compiler { ClassDeclaration::ClassDeclaration( const SourceLocation& source_location, std::string name, std::unique_ptr parameters, std::shared_ptr constructor_link, ClassMethodMap methods, Node* class_body, std::vector> base_class_links, std::vector> uninit_functions ) : Node( source_location ), name( std::move( name ) ), methods( std::move( methods ) ), class_body( class_body ), constructor_link( std::move( constructor_link ) ), base_class_links( std::move( base_class_links ) ) { children.reserve( 1 + uninit_functions.size() ); children.push_back( std::move( parameters ) ); std::ranges::move( uninit_functions, std::back_inserter( children ) ); } void ClassDeclaration::accept( NodeVisitor& visitor ) { visitor.visit_class_declaration( *this ); } void ClassDeclaration::describe_to( std::string& w ) const { fmt::format_to( std::back_inserter( w ), "class-declaration({})", name ); } std::vector> ClassDeclaration::parameters() { std::vector> params; child( 0 ).get_children( params ); return params; } std::vector> ClassDeclaration::uninit_functions() { std::vector> params; // The first child is a `ClassParameterList`, so skip it. for ( auto& param : children | std::views::drop( 1 ) ) { params.emplace_back( *static_cast( param.get() ) ); } return params; } std::string ClassDeclaration::type_tag() const { return fmt::format( "{}@{}", name, source_location.source_file_identifier->pathname ); } } // namespace Pol::Bscript::Compiler