#include "UserFunctionBuilder.h" #include "bscript/compiler/ast/Expression.h" #include "bscript/compiler/ast/FunctionBody.h" #include "bscript/compiler/ast/FunctionParameterDeclaration.h" #include "bscript/compiler/ast/FunctionParameterList.h" #include "bscript/compiler/ast/Expression.h" #include "bscript/compiler/ast/UserFunction.h" using EscriptGrammar::EscriptParser; namespace Pol::Bscript::Compiler { UserFunctionBuilder::UserFunctionBuilder( const SourceFileIdentifier& source_file_identifier, BuilderWorkspace& workspace ) : CompoundStatementBuilder( source_file_identifier, workspace ) { } std::unique_ptr UserFunctionBuilder::function_declaration( EscriptParser::FunctionDeclarationContext* ctx ) { std::string name = text( ctx->IDENTIFIER() ); std::vector> parameters; if ( auto function_parameters = ctx->functionParameters() ) { if ( auto param_list = function_parameters->functionParameterList() ) { for ( auto param : param_list->functionParameter() ) { std::string parameter_name = text( param->IDENTIFIER() ); std::unique_ptr parameter_declaration; bool byref = param->BYREF() != nullptr; bool unused = param->UNUSED() != nullptr; if ( auto expr_ctx = param->expression() ) { auto default_value = expression( expr_ctx ); parameter_declaration = std::make_unique( location_for( *param ), std::move( parameter_name ), byref, unused, std::move( default_value ) ); } else { parameter_declaration = std::make_unique( location_for( *param ), std::move( parameter_name ), byref, unused ); } parameters.push_back( std::move( parameter_declaration ) ); } } } auto parameter_list = std::make_unique( location_for( *ctx ), std::move( parameters ) ); auto body = std::make_unique( location_for( *ctx ), block_statements( ctx->block() ) ); bool exported = ctx->EXPORTED() != nullptr; return std::make_unique( location_for( *ctx ), exported, std::move( name ), std::move( parameter_list ), std::move( body ), location_for( *ctx->ENDFUNCTION() ) ); } } // namespace Pol::Bscript::Compiler