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()));
137 print(os,
"{} {}", tag(),
S(tab, dom()));
138 if (codom())
print(os,
" -> {}",
S(tab, codom()));
181 for (
auto sep =
"";
const auto& aliases :
subs()) {
182 print(os,
"{}{ = }", sep,
R(tab, aliases));
213 if (!
doms().front()->ptrn()->isa<TuplePtrn>()) os <<
' ';
217 if (
body()->isa<DeclExpr>()) {
218 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
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const auto & subs() const
const Expr * type() const
std::ostream & stream(Tab &, std::ostream &) const override
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
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * type() const
const Expr * value() 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 Expr * body() const
const Ptrn * ptrn() const
std::ostream & stream(Tab &, std::ostream &) const override
std::ostream & stream(Tab &, std::ostream &) const override
const Expr * scrutinee() const
const Arm * arm(size_t i) const
const auto & arms() const
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 Expr * body() const
const IdPtrn * shape() const
std::ostream & stream(Tab &, std::ostream &) const override
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 auto & types() 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)