X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/fc8fc33d0c3a25e23e354fed740ff500fab218d9..b23692f3038296c94d25c84c55ed4c1bb49619cf:/Output.cpp diff --git a/Output.cpp b/Output.cpp index 2ff5ad7..22e2149 100644 --- a/Output.cpp +++ b/Output.cpp @@ -20,10 +20,11 @@ /* }}} */ #include "cycript.hpp" -#include "Parser.hpp" #include +#include "Syntax.hpp" + void CYOutput::Terminate() { operator ()(';'); mode_ = NoMode; @@ -183,6 +184,41 @@ void Catch::Output(CYOutput &out) const { } } +void CYClassExpression::Output(CYOutput &out, CYFlags flags) const { + bool protect((flags & CYNoClass) != 0); + if (protect) + out << '('; + out << "class"; + if (name_ != NULL) + out << ' ' << *name_; + out << *tail_;; + if (protect) + out << ')'; +} + +void CYClassStatement::Output(CYOutput &out, CYFlags flags) const { + out << "class" << ' ' << *name_ << *tail_; +} + +void CYClassTail::Output(CYOutput &out) const { + if (extends_ == NULL) + out << ' '; + else { + out << '\n'; + ++out.indent_; + out << "extends" << ' '; + extends_->Output(out, CYAssign::Precedence_ - 1, CYNoFlags); + out << '\n'; + --out.indent_; + } + + out << '{' << '\n'; + ++out.indent_; + + --out.indent_; + out << '}'; +} + void CYCompound::Output(CYOutput &out, CYFlags flags) const { if (next_ == NULL) expression_->Output(out, flags); @@ -193,6 +229,12 @@ void CYCompound::Output(CYOutput &out, CYFlags flags) const { } } +void CYComputed::PropertyName(CYOutput &out) const { + out << '['; + expression_->Output(out, CYAssign::Precedence_, CYNoFlags); + out << ']'; +} + void CYCondition::Output(CYOutput &out, CYFlags flags) const { test_->Output(out, Precedence() - 1, CYLeft(flags)); out << ' ' << '?' << ' '; @@ -226,11 +268,6 @@ void CYDebugger::Output(CYOutput &out, CYFlags flags) const { out << "debugger" << ';'; } -void CYDeclaration::ForIn(CYOutput &out, CYFlags flags) const { - out << "var" << ' '; - Output(out, CYRight(flags)); -} - void CYDeclaration::Output(CYOutput &out, CYFlags flags) const { out << *identifier_; //out.out_ << ':' << identifier_->usage_ << '#' << identifier_->offset_; @@ -240,11 +277,6 @@ void CYDeclaration::Output(CYOutput &out, CYFlags flags) const { } } -void CYForDeclarations::Output(CYOutput &out, CYFlags flags) const { - out << "var" << ' '; - declarations_->Output(out, CYRight(flags)); -} - void CYDeclarations::Output(CYOutput &out) const { Output(out, CYNoFlags); } @@ -311,17 +343,13 @@ void CYEmpty::Output(CYOutput &out, CYFlags flags) const { out.Terminate(); } -void CYExpress::Output(CYOutput &out, CYFlags flags) const { - expression_->Output(out, flags | CYNoBF); - out << ';'; -} - -void CYExpression::ClassName(CYOutput &out, bool object) const { - Output(out, CYAssign::Precedence_, CYNoFlags); +void CYEval::Output(CYOutput &out, CYFlags flags) const { + _assert(false); } -void CYExpression::ForIn(CYOutput &out, CYFlags flags) const { - Output(out, flags | CYNoRightHand); +void CYExpress::Output(CYOutput &out, CYFlags flags) const { + expression_->Output(out, flags | CYNoBFC); + out << ';'; } void CYExpression::Output(CYOutput &out) const { @@ -368,53 +396,74 @@ void CYFor::Output(CYOutput &out, CYFlags flags) const { code_->Single(out, CYRight(flags), CYCompactShort); } -void CYForOf::Output(CYOutput &out, CYFlags flags) const { - out << "for" << ' ' << "each" << ' ' << '('; - initialiser_->ForIn(out, CYNoIn); +void CYForLexical::Output(CYOutput &out, CYFlags flags) const { + out << (constant_ ? "const" : "let") << ' '; + declaration_->Output(out, CYRight(flags)); +} + +void CYForIn::Output(CYOutput &out, CYFlags flags) const { + out << "for" << ' ' << '('; + initialiser_->Output(out, CYNoIn | CYNoRightHand); out << ' ' << "in" << ' ' << *set_ << ')'; code_->Single(out, CYRight(flags), CYCompactShort); } -void CYForOfComprehension::Output(CYOutput &out) const { - out << "for" << ' ' << "each" << ' ' << '(' << *name_ << ' ' << "in" << ' ' << *set_ << ')' << next_; +void CYForInitialized::Output(CYOutput &out, CYFlags flags) const { + out << "for" << ' ' << '(' << "var" << ' '; + declaration_->Output(out, CYNoIn | CYNoRightHand); + out << ' ' << "in" << ' ' << *set_ << ')'; + code_->Single(out, CYRight(flags), CYCompactShort); } -void CYForIn::Output(CYOutput &out, CYFlags flags) const { +void CYForInComprehension::Output(CYOutput &out) const { out << "for" << ' ' << '('; - if (initialiser_ != NULL) - initialiser_->ForIn(out, CYNoIn); + declaration_->Output(out, CYNoIn | CYNoRightHand); out << ' ' << "in" << ' ' << *set_ << ')'; +} + +void CYForOf::Output(CYOutput &out, CYFlags flags) const { + out << "for" << ' ' << '('; + initialiser_->Output(out, CYNoRightHand); + out << ' ' << "of" << ' ' << *set_ << ')'; code_->Single(out, CYRight(flags), CYCompactShort); } -void CYForInComprehension::Output(CYOutput &out) const { - out << "for" << ' ' << '(' << *name_ << ' ' << "in" << ' ' << *set_ << ')'; +void CYForOfComprehension::Output(CYOutput &out) const { + out << "for" << ' ' << '('; + declaration_->Output(out, CYNoRightHand); + out << ' ' << "of" << ' ' << *set_ << ')' << next_; } -void CYFunction::Output(CYOutput &out, CYFlags flags) const { - // XXX: one could imagine using + here to save a byte - bool protect((flags & CYNoFunction) != 0); - if (protect) - out << '('; - out << "function"; - if (name_ != NULL) - out << ' ' << *name_; +void CYForVariable::Output(CYOutput &out, CYFlags flags) const { + out << "var" << ' '; + declaration_->Output(out, CYRight(flags)); +} + +void CYFunction::Output(CYOutput &out) const { out << '(' << parameters_ << ')' << ' '; out << '{' << '\n'; ++out.indent_; out << code_; --out.indent_; out << '\t' << '}'; - if (protect) - out << ')'; } void CYFunctionExpression::Output(CYOutput &out, CYFlags flags) const { - CYFunction::Output(out, flags); + // XXX: one could imagine using + here to save a byte + bool protect((flags & CYNoFunction) != 0); + if (protect) + out << '('; + out << "function"; + if (name_ != NULL) + out << ' ' << *name_; + CYFunction::Output(out); + if (protect) + out << ')'; } void CYFunctionStatement::Output(CYOutput &out, CYFlags flags) const { - CYFunction::Output(out, flags); + out << "function" << ' ' << *name_; + CYFunction::Output(out); } void CYFunctionParameter::Output(CYOutput &out) const { @@ -424,7 +473,7 @@ void CYFunctionParameter::Output(CYOutput &out) const { } const char *CYIdentifier::Word() const { - return replace_ == NULL || replace_ == this ? CYWord::Word() : replace_->Word(); + return next_ == NULL || next_ == this ? CYWord::Word() : next_->Word(); } void CYIf::Output(CYOutput &out, CYFlags flags) const { @@ -470,6 +519,11 @@ 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()) @@ -586,9 +640,10 @@ void CYTypeDefinition::Output(CYOutput &out, CYFlags flags) const { out << "typedef" << ' ' << *typed_; } -void CYLetStatement::Output(CYOutput &out, CYFlags flags) const { - out << "let" << ' ' << '(' << *declarations_ << ')'; - code_->Single(out, CYRight(flags), CYCompactShort); +void CYLet::Output(CYOutput &out, CYFlags flags) const { + out << "let" << ' '; + declarations_->Output(out, flags); // XXX: flags + out << ';'; } void CYModule::Output(CYOutput &out) const { @@ -659,14 +714,37 @@ void CYScript::Output(CYOutput &out) const { } void CYProperty::Output(CYOutput &out) const { + if (next_ != NULL || out.pretty_) + out << ','; + out << '\n' << next_; +} + +void CYPropertyGetter::Output(CYOutput &out) const { + out << "get" << ' '; + name_->PropertyName(out); + CYFunction::Output(out); + CYProperty::Output(out); +} + +void CYPropertyMethod::Output(CYOutput &out) const { + name_->PropertyName(out); + CYFunction::Output(out); + CYProperty::Output(out); +} + +void CYPropertySetter::Output(CYOutput &out) const { + out << "set" << ' '; + name_->PropertyName(out); + CYFunction::Output(out); + CYProperty::Output(out); +} + +void CYPropertyValue::Output(CYOutput &out) const { out << '\t'; name_->PropertyName(out); out << ':' << ' '; value_->Output(out, CYAssign::Precedence_, CYNoFlags); - if (next_ != NULL) - out << ',' << '\n' << *next_; - else - out << '\n'; + CYProperty::Output(out); } void CYRegEx::Output(CYOutput &out, CYFlags flags) const { @@ -776,6 +854,18 @@ const char *CYString::Word() const { return value; } +void CYSuperAccess::Output(CYOutput &out, CYFlags flags) const { + out << "super"; + if (const char *word = property_->Word()) + out << '.' << word; + else + out << '[' << *property_ << ']'; +} + +void CYSuperCall::Output(CYOutput &out, CYFlags flags) const { + out << "super" << '(' << arguments_ << ')'; +} + void CYSwitch::Output(CYOutput &out, CYFlags flags) const { out << "switch" << ' ' << '(' << *value_ << ')' << ' ' << '{' << '\n'; ++out.indent_; @@ -840,7 +930,7 @@ void CYTypeVoid::Output(CYOutput &out) const { void CYVar::Output(CYOutput &out, CYFlags flags) const { out << "var" << ' '; - declarations_->Output(out, flags); + declarations_->Output(out, flags); // XXX: flags out << ';'; } @@ -858,14 +948,6 @@ void CYWith::Output(CYOutput &out, CYFlags flags) const { code_->Single(out, CYRight(flags), CYCompactShort); } -void CYWord::ClassName(CYOutput &out, bool object) const { - if (object) - out << "objc_getClass("; - out << '"' << Word() << '"'; - if (object) - out << ')'; -} - void CYWord::Output(CYOutput &out) const { out << Word(); if (out.options_.verbose_) {