X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/9a39f7051ad983d4377917e66222727dcbe6c099..b0385401f63fe31f3cc1459ed159747a445852d6:/Output.cpp diff --git a/Output.cpp b/Output.cpp index 17f7bde..5074005 100644 --- a/Output.cpp +++ b/Output.cpp @@ -1,21 +1,21 @@ /* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2013 Jay Freeman (saurik) + * Copyright (C) 2009-2015 Jay Freeman (saurik) */ -/* GNU General Public License, Version 3 {{{ */ +/* GNU Affero General Public License, Version 3 {{{ */ /* - * Cycript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * Cycript is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Cycript. If not, see . + * GNU Affero General Public License for more details. + + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . **/ /* }}} */ @@ -118,8 +118,7 @@ void CYArgument::Output(CYOutput &out) const { if (value_ != NULL) value_->Output(out, CYAssign::Precedence_, CYNoFlags); if (next_ != NULL) { - if (next_->name_ == NULL) - out << ','; + out << ','; out << ' ' << *next_; } } @@ -138,24 +137,14 @@ void CYAssignment::Output(CYOutput &out, CYFlags flags) const { rhs_->Output(out, Precedence(), CYRight(flags)); } -void CYBlock::Output(CYOutput &out) const { +void CYBlock::Output(CYOutput &out, CYFlags flags) const { out << '{' << '\n'; ++out.indent_; - if (statements_ != NULL) - statements_->Multiple(out); + out << code_; --out.indent_; out << '\t' << '}'; } -void CYBlock::Output(CYOutput &out, CYFlags flags) const { - if (statements_ == NULL) - out.Terminate(); - else if (statements_->next_ == NULL) - statements_->Single(out, flags); - else - Output(out); -} - void CYBoolean::Output(CYOutput &out, CYFlags flags) const { out << (Value() ? "true" : "false"); } @@ -181,7 +170,12 @@ namespace cy { namespace Syntax { void Catch::Output(CYOutput &out) const { - out << ' ' << "catch" << ' ' << '(' << *name_ << ')' << ' ' << code_; + out << ' ' << "catch" << ' ' << '(' << *name_ << ')' << ' '; + out << '{' << '\n'; + ++out.indent_; + out << code_; + --out.indent_; + out << '\t' << '}'; } } } @@ -194,19 +188,13 @@ void CYComment::Output(CYOutput &out, CYFlags flags) const { } void CYCompound::Output(CYOutput &out, CYFlags flags) const { - if (CYExpression *expression = expressions_) - if (CYExpression *next = expression->next_) { - expression->Output(out, CYLeft(flags)); - CYFlags center(CYCenter(flags)); - while (next != NULL) { - expression = next; - out << ',' << ' '; - next = expression->next_; - CYFlags right(next != NULL ? center : CYRight(flags)); - expression->Output(out, right); - } - } else - expression->Output(out, flags); + if (next_ == NULL) + expression_->Output(out, flags); + else { + expression_->Output(out, CYLeft(flags)); + out << ',' << ' '; + next_->Output(out, CYRight(flags)); + } } void CYCondition::Output(CYOutput &out, CYFlags flags) const { @@ -231,8 +219,7 @@ void CYClause::Output(CYOutput &out) const { else out << "default"; out << ':' << '\n'; - if (statements_ != NULL) - statements_->Multiple(out); + out << code_; out << next_; } @@ -256,7 +243,7 @@ void CYDeclaration::Output(CYOutput &out, CYFlags flags) const { void CYForDeclarations::Output(CYOutput &out, CYFlags flags) const { out << "var"; - Output(out, CYRight(flags)); + declarations_->Output(out, CYRight(flags)); } void CYDeclarations::Output(CYOutput &out) const { @@ -336,12 +323,21 @@ void CYExpression::Output(CYOutput &out, int precedence, CYFlags flags) const { Output(out, flags); } +void CYExternal::Output(CYOutput &out, CYFlags flags) const { + out << "extern" << abi_ << typed_ << ';'; +} + void CYFatArrow::Output(CYOutput &out, CYFlags flags) const { - out << '(' << parameters_ << ')' << ' ' << "=>" << ' ' << code_; + out << '(' << parameters_ << ')' << ' ' << "=>" << ' ' << '{' << code_ << '}'; } void CYFinally::Output(CYOutput &out) const { - out << ' ' << "finally" << ' ' << code_; + out << ' ' << "finally" << ' '; + out << '{' << '\n'; + ++out.indent_; + out << code_; + --out.indent_; + out << '\t' << '}'; } void CYFor::Output(CYOutput &out, CYFlags flags) const { @@ -391,8 +387,12 @@ void CYFunction::Output(CYOutput &out, CYFlags flags) const { out << "function"; if (name_ != NULL) out << ' ' << *name_; - out << '(' << parameters_ << ')'; - out << ' ' << code_; + out << '(' << parameters_ << ')' << ' '; + out << '{' << '\n'; + ++out.indent_; + out << code_; + --out.indent_; + out << '\t' << '}'; if (protect) out << ')'; } @@ -447,6 +447,10 @@ void CYIfComprehension::Output(CYOutput &out) const { out << "if" << ' ' << '(' << *test_ << ')' << next_; } +void CYImport::Output(CYOutput &out, CYFlags flags) const { + out << "@import"; +} + void CYIndirectMember::Output(CYOutput &out, CYFlags flags) const { object_->Output(out, Precedence(), CYLeft(flags)); if (const char *word = property_->Word()) @@ -474,6 +478,16 @@ void CYLabel::Output(CYOutput &out, CYFlags flags) const { statement_->Single(out, CYRight(flags)); } +void CYParenthetical::Output(CYOutput &out, CYFlags flags) const { + out << '('; + expression_->Output(out, CYCompound::Precedence_, CYNoFlags); + out << ')'; +} + +void CYStatement::Output(CYOutput &out) const { + Multiple(out); +} + void CYTypeArrayOf::Output(CYOutput &out, CYIdentifier *identifier) const { next_->Output(out, Precedence(), identifier); out << '['; @@ -481,6 +495,12 @@ void CYTypeArrayOf::Output(CYOutput &out, CYIdentifier *identifier) const { out << ']'; } +void CYTypeBlockWith::Output(CYOutput &out, CYIdentifier *identifier) const { + out << '(' << '^'; + next_->Output(out, Precedence(), identifier); + out << ')' << '(' << parameters_ << ')'; +} + void CYTypeConstant::Output(CYOutput &out, CYIdentifier *identifier) const { out << "const"; next_->Output(out, Precedence(), identifier); @@ -517,7 +537,7 @@ void CYTypeModifier::Output(CYOutput &out, int precedence, CYIdentifier *identif } void CYTypedIdentifier::Output(CYOutput &out) const { - type_->Output(out, 0, CYNoFlags); + specifier_->Output(out); modifier_->Output(out, 0, identifier_); } @@ -548,6 +568,12 @@ void CYLetStatement::Output(CYOutput &out, CYFlags flags) const { code_->Single(out, CYRight(flags)); } +void CYModule::Output(CYOutput &out) const { + out << part_; + if (next_ != NULL) + out << '.' << next_; +} + namespace cy { namespace Syntax { @@ -606,8 +632,7 @@ void CYPrefix::Output(CYOutput &out, CYFlags flags) const { } void CYProgram::Output(CYOutput &out) const { - if (statements_ != NULL) - statements_->Multiple(out); + out << code_; } void CYProperty::Output(CYOutput &out) const { @@ -640,7 +665,11 @@ void CYRubyBlock::Output(CYOutput &out, CYFlags flags) const { void CYRubyProc::Output(CYOutput &out, CYFlags flags) const { // XXX: this is not outputting the parameters + out << '{' << '\n'; + ++out.indent_; out << code_; + --out.indent_; + out << '\t' << '}'; } void CYStatement::Multiple(CYOutput &out, CYFlags flags) const { @@ -737,11 +766,45 @@ void Throw::Output(CYOutput &out, CYFlags flags) const { } void Try::Output(CYOutput &out, CYFlags flags) const { - out << "try" << ' ' << code_ << catch_ << finally_; + out << "try" << ' '; + out << '{' << '\n'; + ++out.indent_; + out << code_; + --out.indent_; + out << '\t' << '}'; + out << catch_ << finally_; } } } +void CYTypeError::Output(CYOutput &out) const { + out << "@error"; +} + +void CYTypeLong::Output(CYOutput &out) const { + out << "long" << specifier_; +} + +void CYTypeShort::Output(CYOutput &out) const { + out << "short" << specifier_; +} + +void CYTypeSigned::Output(CYOutput &out) const { + out << "signed" << specifier_; +} + +void CYTypeUnsigned::Output(CYOutput &out) const { + out << "unsigned" << specifier_; +} + +void CYTypeVariable::Output(CYOutput &out) const { + out << *name_; +} + +void CYTypeVoid::Output(CYOutput &out) const { + out << "void"; +} + void CYVar::Output(CYOutput &out, CYFlags flags) const { out << "var"; declarations_->Output(out, flags);