18 friend std::ostream&
operator<<(std::ostream& os,
const S& s) {
return s.node->stream(s.tab, os); }
26 ,
f([&
tab](
std::ostream& os, const
Ptr<T>& ptr) { ptr->stream(
tab, os); }) {}
30 std::function<void(std::ostream&,
const Ptr<T>&)>
f;
35 stream(tab, std::cout) << std::endl;
45 for (
const auto&
import :
imports())
46 import->stream(tab, os);
47 for (
const auto& decl :
decls())
48 tab.
println(os,
"{}",
S(tab, decl.get()));
66 return os <<
"<invalid identifier pattern>";
84 case Tag::L_i:
return print(os,
"{}",
tok().lit_i());
85 case Tag::L_f:
return os << std::bit_cast<double>(
tok().lit_u());
91 default: os <<
"TODO";
100 for (
const auto& decl :
decls())
101 tab.
println(os,
"{}",
S(tab, decl.get()));
105 for (
const auto& decl :
decls())
106 tab.
println(os,
"{}",
S(tab, decl.get()));
114 return print(os,
"{} -> {}",
S(tab, dom()),
S(tab, codom()));
143 if (tag() != Tag::Nil)
print(os,
"{} ", tag());
144 print(os,
"{}",
S(tab, dom()));
145 if (codom())
print(os,
" -> {}",
S(tab, codom()));
188 for (
auto sep =
"";
const auto& aliases :
subs()) {
189 print(os,
"{}{ = }", sep,
R(tab, aliases));
220 if (!
doms().front()->ptrn()->isa<TuplePtrn>()) os <<
' ';
224 if (
body()->isa<DeclExpr>()) {
225 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 * arity() 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)