#include "builtins/builtins.h"
using namespace goose::sema;
namespace goose::builtins
{
class LocVarInvocationRule : public InvocationRule
{
public:
bool canBeInvoked( const Context& c, const Value& callee ) const final
{
auto lv = *FromValue< LocalVar >( callee );
auto val = BuildComputedValue( lv.type(),
GetAddrFromLocalVar( lv ),
cir::Load( lv.type() ) );
return sema::CanBeInvoked( c, val );
}
Value resolveInvocation( Context& c, LocationId locationId, const Value& callee, const Term& args ) const final
{
auto lv = *FromValue< LocalVar >( callee );
auto val = BuildComputedValue( lv.type(),
GetAddrFromLocalVar( lv ),
cir::Load( lv.type() ) );
return sema::GetInvocationRule( *c.env(), val )->resolveInvocation( c, locationId, val, args );
}
};
void SetupLocalVarInvocationRule( Env& e )
{
e.invocationRuleSet()->addRule(
ValueToEIR( Value(
GetValueType< LocalVar >( ANYTERM( _ ) ),
ANYTERM( _ ) ) ),
make_shared< LocVarInvocationRule >() );
}
}