#ifndef EMPATHY_BUILTINS_HELPERS_H
#define EMPATHY_BUILTINS_HELPERS_H
#include "parse/parse.h"
namespace empathy::builtins
{
extern void RegisterRule( sema::Env& env, const StringId& name, parse::Rule&& rule );
template< typename F >
void RegisterPrefixOp( sema::Env& env, const StringId& name, uint32_t precedence, F&& func )
{
parse::RegisterPrefixOp( env, name, AppendToVectorTerm( RootIdentity(), TERM( name ) ), precedence, forward< F >( func ) );
}
template< typename F >
void RegisterPostfixOp( sema::Env& env, const StringId& name, uint32_t precedence, F&& func )
{
parse::RegisterPostfixOp( env, name, AppendToVectorTerm( RootIdentity(), TERM( name ) ), precedence, forward< F >( func ) );
}
template< typename F >
void RegisterLeftAssInfixOp( sema::Env& env, const StringId& name, uint32_t precedence, F&& func )
{
parse::RegisterLeftAssInfixOp( env, name, AppendToVectorTerm( RootIdentity(), TERM( name ) ), precedence, forward< F >( func ) );
}
template< typename F >
void RegisterRightAssInfixOp( sema::Env& env, const StringId& name, uint32_t precedence, F&& func )
{
parse::RegisterRightAssInfixOp( env, name, AppendToVectorTerm( RootIdentity(), TERM( name ) ), precedence, forward< F >( func ) );
}
// Utility function used to parse flow control statements, such as if and loops.
// This parses a sub statement, which can be enclosed in a brace block or not.
// It will get its own scope, with visibility rules setup to see the current
// scope.
// It returns a pointer to the final basic block generated by the statement.
ptr< llr::BasicBlock > ParseSubStatement( parse::Parser& p, uint32_t precedence );
enum class ValUnifyError
{
NoSolution,
Ambiguous
};
// Unify the provided value with a value placeholder of the specified type,
// and return the result or an error code.
variant< Value, ValUnifyError > ConvertValueToType( const Context& c, const Value& val, const Term& type );
}
#endif