+ CYFunction::Output(out);
+ if (protect)
+ out << ')';
+}
+
+void CYFunctionStatement::Output(CYOutput &out, CYFlags flags) const {
+ out << "function" << ' ' << *name_;
+ CYFunction::Output(out);
+}
+
+void CYFunctionParameter::Output(CYOutput &out) const {
+ binding_->Output(out, CYNoFlags);
+ if (next_ != NULL)
+ out << ',' << ' ' << *next_;
+}
+
+const char *CYIdentifier::Word() const {
+ return next_ == NULL || next_ == this ? CYWord::Word() : next_->Word();
+}
+
+void CYIf::Output(CYOutput &out, CYFlags flags) const {
+ bool protect(false);
+ if (false_ == NULL && (flags & CYNoDangle) != 0) {
+ protect = true;
+ out << '{';
+ }
+
+ out << "if" << ' ' << '(' << *test_ << ')';
+
+ CYFlags right(protect ? CYNoFlags : CYRight(flags));
+
+ CYFlags jacks(CYNoDangle);
+ if (false_ == NULL)
+ jacks |= right;
+ else
+ jacks |= protect ? CYNoFlags : CYCenter(flags);
+
+ unsigned line(out.position_.line);
+ unsigned indent(out.indent_);
+ true_->Single(out, jacks, CYCompactShort);
+
+ if (false_ != NULL) {
+ if (out.position_.line != line && out.recent_ == indent)
+ out << ' ';
+ else
+ out << '\n' << '\t';
+
+ out << "else";
+ false_->Single(out, right, CYCompactLong);
+ }
+
+ if (protect)
+ out << '}';
+}
+
+void CYIfComprehension::Output(CYOutput &out) const {
+ out << "if" << ' ' << '(' << *test_ << ')' << next_;
+}
+
+void CYImport::Output(CYOutput &out, CYFlags flags) const {
+ out << "@import";
+}
+
+void CYIndirect::Output(CYOutput &out, CYFlags flags) const {
+ out << "*";
+ rhs_->Output(out, Precedence(), CYRight(flags));
+}
+
+void CYIndirectMember::Output(CYOutput &out, CYFlags flags) const {
+ object_->Output(out, Precedence(), CYLeft(flags));
+ if (const char *word = property_->Word())
+ out << "->" << word;
+ else
+ out << "->" << '[' << *property_ << ']';
+}
+
+void CYInfix::Output(CYOutput &out, CYFlags flags) const {
+ const char *name(Operator());
+ bool protect((flags & CYNoIn) != 0 && strcmp(name, "in") == 0);
+ if (protect)
+ out << '(';
+ CYFlags left(protect ? CYNoFlags : CYLeft(flags));
+ lhs_->Output(out, Precedence(), left);
+ out << ' ' << name << ' ';
+ CYFlags right(protect ? CYNoFlags : CYRight(flags));
+ rhs_->Output(out, Precedence() - 1, right);
+ if (protect)
+ out << ')';
+}
+
+void CYLabel::Output(CYOutput &out, CYFlags flags) const {
+ out << *name_ << ':';
+ statement_->Single(out, CYRight(flags), CYCompactShort);
+}
+
+void CYParenthetical::Output(CYOutput &out, CYFlags flags) const {