2026-07-25 23:01:18 +02:00
|
|
|
#include "bscript/compiler/ast/ClassDeclaration.h"
|
2024-08-10 15:27:25 +02:00
|
|
|
|
2024-08-14 12:56:36 +02:00
|
|
|
#include "bscript/compiler/ast/ClassParameterDeclaration.h"
|
2024-08-10 15:27:25 +02:00
|
|
|
#include "bscript/compiler/ast/ClassParameterList.h"
|
|
|
|
|
#include "bscript/compiler/ast/NodeVisitor.h"
|
2025-09-05 23:23:59 +02:00
|
|
|
#include "bscript/compiler/ast/UninitializedFunctionDeclaration.h"
|
2024-08-10 15:27:25 +02:00
|
|
|
#include "bscript/compiler/ast/UserFunction.h"
|
2024-09-06 11:11:34 +02:00
|
|
|
#include "bscript/compiler/file/SourceFileIdentifier.h"
|
2024-08-18 11:03:01 +02:00
|
|
|
#include "bscript/compiler/model/ClassLink.h"
|
|
|
|
|
#include "bscript/compiler/model/FunctionLink.h"
|
2024-08-10 15:27:25 +02:00
|
|
|
|
2025-09-05 23:23:59 +02:00
|
|
|
#include <ranges>
|
|
|
|
|
|
2024-08-10 15:27:25 +02:00
|
|
|
namespace Pol::Bscript::Compiler
|
|
|
|
|
{
|
2025-09-05 23:23:59 +02:00
|
|
|
ClassDeclaration::ClassDeclaration(
|
|
|
|
|
const SourceLocation& source_location, std::string name,
|
|
|
|
|
std::unique_ptr<ClassParameterList> parameters, std::shared_ptr<FunctionLink> constructor_link,
|
|
|
|
|
ClassMethodMap methods, Node* class_body,
|
|
|
|
|
std::vector<std::shared_ptr<ClassLink>> base_class_links,
|
|
|
|
|
std::vector<std::unique_ptr<UninitializedFunctionDeclaration>> uninit_functions )
|
|
|
|
|
: Node( source_location ),
|
2024-08-11 23:01:38 +02:00
|
|
|
name( std::move( name ) ),
|
2025-09-05 23:23:59 +02:00
|
|
|
methods( std::move( methods ) ),
|
2024-08-14 12:56:36 +02:00
|
|
|
class_body( class_body ),
|
2024-08-28 20:48:07 +02:00
|
|
|
constructor_link( std::move( constructor_link ) ),
|
2024-08-18 11:03:01 +02:00
|
|
|
base_class_links( std::move( base_class_links ) )
|
2024-08-10 15:27:25 +02:00
|
|
|
{
|
2025-09-05 23:23:59 +02:00
|
|
|
children.reserve( 1 + uninit_functions.size() );
|
|
|
|
|
children.push_back( std::move( parameters ) );
|
|
|
|
|
std::ranges::move( uninit_functions, std::back_inserter( children ) );
|
2024-08-10 15:27:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 );
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-14 12:56:36 +02:00
|
|
|
std::vector<std::reference_wrapper<ClassParameterDeclaration>> ClassDeclaration::parameters()
|
2024-08-10 15:27:25 +02:00
|
|
|
{
|
2024-08-14 12:56:36 +02:00
|
|
|
std::vector<std::reference_wrapper<ClassParameterDeclaration>> params;
|
2024-08-10 15:27:25 +02:00
|
|
|
|
2024-08-14 12:56:36 +02:00
|
|
|
child<ClassParameterList>( 0 ).get_children<ClassParameterDeclaration>( params );
|
2024-08-10 15:27:25 +02:00
|
|
|
|
|
|
|
|
return params;
|
|
|
|
|
}
|
2024-09-06 11:11:34 +02:00
|
|
|
|
2025-09-05 23:23:59 +02:00
|
|
|
std::vector<std::reference_wrapper<UninitializedFunctionDeclaration>>
|
|
|
|
|
ClassDeclaration::uninit_functions()
|
|
|
|
|
{
|
|
|
|
|
std::vector<std::reference_wrapper<UninitializedFunctionDeclaration>> params;
|
|
|
|
|
|
|
|
|
|
// The first child is a `ClassParameterList`, so skip it.
|
|
|
|
|
for ( auto& param : children | std::views::drop( 1 ) )
|
|
|
|
|
{
|
|
|
|
|
params.emplace_back( *static_cast<UninitializedFunctionDeclaration*>( param.get() ) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return params;
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-06 11:11:34 +02:00
|
|
|
std::string ClassDeclaration::type_tag() const
|
|
|
|
|
{
|
|
|
|
|
return fmt::format( "{}@{}", name, source_location.source_file_identifier->pathname );
|
|
|
|
|
}
|
2024-08-10 15:27:25 +02:00
|
|
|
} // namespace Pol::Bscript::Compiler
|