Goose  Artifact [ba2aacd1bf]

Artifact ba2aacd1bfa52efbdf67d3a0904f58a28d43415184391483ab45443dab5fa8a9:

  • File bs/sema/overloadset.cpp — part of check-in [7b9f645074] at 2021-01-21 21:05:48 on branch trunk — Removed the vector "typechecking rule", whose existence made no sense. Typechecking rules should operate only on values and pattern of values. Typechecking multiple values against multiple params is now done through a specific function instead. (user: achavasse size: 1242)

#include "builtins/builtins.h"

using namespace goose::sema;

bool OverloadSet::add( const Env& e, const Value& callee )
{
    auto pInvRule = GetInvocationRule( e, callee );
    assert( pInvRule );
    return add( e, callee, pInvRule );
}

bool OverloadSet::add( const Env& e, const Value& callee, const ptr< InvocationRule >& pInvRule )
{
    auto signature = pInvRule->getSignature( callee );
    assert( signature );

    auto sigDecomp = Decompose( *signature,
        Val< pvec >()
    );

    assert( sigDecomp );

    bool success = false;
    m_trie = m_trie->merge( *sigDecomp->get(), [&]( auto&& previous ) -> Overload
    {
        if( previous.callee )
            return move( previous );

        success = true;
        return { pInvRule, callee };
    } );

    return success;
}

OverloadSet::TCGen OverloadSet::typeCheck( const Term& callPat, const TypeCheckingContext& tcc ) const
{
    auto callDecomp = Decompose( callPat,
        Val< pvec >()
    );

    if( !callDecomp )
        co_return;

    for( auto&& [callVec,uniCallVec,ovl,tcc] : m_trie->typeCheck( *callDecomp->get(), tcc ) )
    {
        auto uniCall = TERM( make_shared< Vector >( uniCallVec ) );

        co_yield { move( uniCall ), ovl, tcc };
    }
}