Goose  Diff

Differences From Artifact [3d9369ddcb]:

  • File bs/sema/uni-basicrules.cpp — part of check-in [bf81e30984] at 2021-09-18 17:00:20 on branch trunk —
    • Refactored LocationId into a separate class and actually use it everywhere instead of uint32_t, this makes it easier to make generic wrappers for APIs
    • g0 api: more work on the CIR api
    (user: achavasse size: 5076)

To Artifact [2e1ba66ff5]:

  • File bs/sema/uni-basicrules.cpp — part of check-in [95bdac72ca] at 2022-07-05 22:10:27 on branch trunk — TypeChecking: keep track of nested repetition indices for each sub context (user: zlodo size: 5126)

1
2
3
4
5

6
7

8
9
10
11
12
13
14
1
2
3
4

5
6

7
8
9
10
11
12
13
14




-
+

-
+







#include "sema.h"

namespace goose::sema
{
    TCGen UnifyVectors( VecGenerator lvg, VecGenerator rvg, const Vector& solutionVec, TypeCheckingContext tcc )
    TCGen UnifyVectors( TCVecGenerator lvg, TCVecGenerator rvg, const Vector& solutionVec, TypeCheckingContext tcc )
    {
        for( auto&& [u,tcc] : Unify( lvg(), rvg(), tcc ) )
        for( auto&& [u,tcc] : Unify( lvg( tcc.LHSSubContext() ), rvg( tcc.RHSSubContext() ), tcc ) )
        {
            auto vec = Vector::MakeAppend( solutionVec, move( u ) );

            if( lvg.fixedPartFinished() && rvg.fixedPartFinished() )
                co_yield { TERM( make_shared< Vector >( move( vec ) ) ), tcc };
            else
                co_yield UnifyVectors( lvg, rvg, vec, tcc );
100
101
102
103
104
105
106
107
108


109
110
111
112
113
114
115
116
117
118
119
120
100
101
102
103
104
105
106


107
108
109
110
111
112
113
114
115
116
117
118
119
120







-
-
+
+












        {
            assert( holds_alternative< pvec >( lhs ) );
            assert( holds_alternative< pvec >( rhs ) );

            const auto& lVector = get< pvec >( lhs );
            const auto& rVector = get< pvec >( rhs );

            VecGenerator lvg( *lVector );
            VecGenerator rvg( *rVector );
            TCVecGenerator lvg( *lVector );
            TCVecGenerator rvg( *rVector );

            if( lvg.fixedPartFinished() && rvg.fixedPartFinished() )
            {
                co_yield { lhs, tcc };
                co_return;
            }

            Vector sol;
            co_yield UnifyVectors( lvg, rvg, sol, tcc );
        } );
    }
}