18 friend std::ostream&
operator<<(std::ostream& os,
const S& s) {
return s.node->stream(s.tab, os); }
21template<
class T>
struct R {
25 ,
f([&
tab](
std::ostream& os, const
Ptr<T>& ptr) { ptr->stream(
tab, os); }) {}
29 std::function<void(std::ostream&,
const Ptr<T>&)>
f;
34 stream(tab, std::cout) << std::endl;
44 for (
const auto&
import :
imports())
import->stream(tab, os);
45 for (
const auto& decl :
decls()) tab.
println(os,
"{}",
S(tab, decl.get()));
63 return os <<
"<invalid identifier pattern>";
81 case Tag::L_i:
return print(os,
"{}",
tok().lit_i());
82 case Tag::L_f:
return os << std::bit_cast<double>(
tok().lit_u());
88 default: os <<
"TODO";
97 for (
const auto& decl :
decls()) tab.
println(os,
"{}",
S(tab, decl.get()));
101 for (
const auto& decl :
decls()) tab.
println(os,
"{}",
S(tab, decl.get()));
109 return print(os,
"{} -> {}",
S(tab, dom()),
S(tab, codom()));
119 print(os,
"{} {}", tag(),
S(tab, dom()));
120 if (codom())
print(os,
" -> {}",
S(tab, codom()));
139 return print(os,
"{}{}; {}{}", arr ?
"«" :
"‹",
S(tab,
shape()),
S(tab,
body()), arr ?
"»" :
"›");
166 for (
auto sep =
"";
const auto& aliases :
subs()) {
167 print(os,
"{}{ = }", sep,
R(tab, aliases));
198 if (!
doms().front()->ptrn()->isa<TuplePtrn>()) os <<
' ';
202 if (
body()->isa<DeclExpr>()) {
203 os <<
" =" << std::endl;
Keeps track of indentation level.
std::ostream & println(std::ostream &os, const char *s, Args &&... args)
Same as Tab::print but appends a std::endl to os.
std::ostream & print(std::ostream &os, const char *s, Args &&... args)
std::ostream & stream(Tab &, std::ostream &) const override
const Ptrn * ptrn() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * callee() const
const Expr * body() const
std::ostream & stream(Tab &, std::ostream &) const override
const IdPtrn * shape() const
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const auto & subs() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * type() const
const Expr * codom() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * expr() const
std::ostream & stream(Tab &, std::ostream &) const override
const auto & decls() const
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * type() const
std::ostream & stream(Tab &, std::ostream &) const
const Expr * index() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * tuple() const
const Expr * value() const
const Expr * filter() const
std::ostream & stream(Tab &, std::ostream &) const override
const Ptrs< Dom > & doms() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * codom() const
const LamDecl * lam() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * value() const
const Ptrn * ptrn() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * type() const
std::ostream & stream(Tab &, std::ostream &) const override
const auto & decls() const
const auto & imports() const
std::ostream & stream(Tab &, std::ostream &) const override
virtual std::ostream & stream(Tab &, std::ostream &) const =0
std::ostream & stream(Tab &, std::ostream &) const override
const IdPtrn * ret() const
const Ptrn * ptrn() const
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * body() const
const Expr * type() const
std::ostream & stream(Tab &, std::ostream &) const override
const Ptrn * ptrn() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * body() const
const Expr * callee() const
const TuplePtrn * ptrn() const
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const auto & elems() const
const auto & ptrns() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * level() const
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * inhabitant() const
std::ostream & stream(Tab &, std::ostream &) const override
fe::Arena::Ptr< const T > Ptr
std::deque< Ptr< T > > Ptrs
std::ostream & print(std::ostream &os, const char *s)
Base case.
std::ostream & println(std::ostream &os, const char *fmt, Args &&... args)
As above but end with std::endl.
std::function< void(std::ostream &, const Ptr< T > &)> f
R(Tab &tab, const Ptrs< T > &range)
S(Tab &tab, const Node *node)
friend std::ostream & operator<<(std::ostream &os, const S &s)