📄 qscriptprettypretty.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtScript module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qscriptprettypretty_p.h"#ifndef QT_NO_SCRIPT#include "qscriptengine_p.h"#include "qscriptvalueimpl_p.h"#include "qscriptcontext_p.h"#include "qscriptmember_p.h"#include "qscriptobject_p.h"#include "qscriptast_p.h"#include <QtCore/QString>#include <QtCore/QTextStream>#include <QtCore/QtDebug>using namespace QScript;PrettyPretty::PrettyPretty(QScriptEngine *e, QTextStream &o): eng(QScriptEnginePrivate::get(e)), out(o), m_indentLevel(0){}PrettyPretty::~PrettyPretty(){}QTextStream &PrettyPretty::operator () (AST::Node *node, int level){ int was = indentLevel(level); newlineAndIndent(); accept(node); indentLevel(was); return out;}QTextStream &PrettyPretty::newlineAndIndent(){ enum { IND = 4 }; out << endl << QString().fill(QLatin1Char(' '), m_indentLevel * IND); return out;}void PrettyPretty::accept(AST::Node *node){ AST::Node::acceptChild(node, this);}bool PrettyPretty::visit(AST::ThisExpression *node){ Q_UNUSED(node); out << "this"; return true;}void PrettyPretty::endVisit(AST::ThisExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::IdentifierExpression *node){ out << eng->toString(node->name); return true;}void PrettyPretty::endVisit(AST::IdentifierExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::NullExpression *node){ Q_UNUSED(node); out << "null"; return false;}void PrettyPretty::endVisit(AST::NullExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::TrueLiteral *node){ Q_UNUSED(node); out << "true"; return false;}void PrettyPretty::endVisit(AST::TrueLiteral *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::FalseLiteral *node){ Q_UNUSED(node); out << "false"; return false;}void PrettyPretty::endVisit(AST::FalseLiteral *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::StringLiteral *node){ QString lit = eng->toString(node->value); lit.replace(QLatin1String("\\"), QLatin1String("\\\\")); out << "\"" << lit << "\""; return false;}void PrettyPretty::endVisit(AST::StringLiteral *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::NumericLiteral *node){ out << QString::number(node->value); return true;}void PrettyPretty::endVisit(AST::NumericLiteral *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::RegExpLiteral *node){ out << "/" << eng->toString(node->pattern) << "/"; if (node->flags) eng->toString(node->flags); return true;}void PrettyPretty::endVisit(AST::RegExpLiteral *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::ArrayLiteral *node){ out << "["; accept(node->elements); out << "]"; return false;}void PrettyPretty::endVisit(AST::ArrayLiteral *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::ObjectLiteral *node){ out << "{"; if (node->properties) { pushIndentLevel(); AST::PropertyNameAndValueList *prop; for (prop = node->properties; prop != 0; prop = prop->next) { newlineAndIndent(); accept(prop); if (prop->next) out << ","; } popIndentLevel(); newlineAndIndent(); } out << "}"; return false;}void PrettyPretty::endVisit(AST::ObjectLiteral *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::ElementList *node){ accept(node->expression); for (node = node->next; node != 0; node = node->next) { out << ", "; accept(node->expression); } return false;}void PrettyPretty::endVisit(AST::ElementList *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::Elision *node){ Q_UNUSED(node); qDebug("*** elision"); return true;}void PrettyPretty::endVisit(AST::Elision *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::PropertyNameAndValueList *node){ accept(node->name); out << ": "; accept(node->value); return false;}void PrettyPretty::endVisit(AST::PropertyNameAndValueList *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::IdentifierPropertyName *node){ out << eng->toString(node->id); return false;}void PrettyPretty::endVisit(AST::IdentifierPropertyName *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::StringLiteralPropertyName *node){ QString lit = eng->toString(node->id); lit.replace(QLatin1String("\\"), QLatin1String("\\\\")); out << lit; return false;}void PrettyPretty::endVisit(AST::StringLiteralPropertyName *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::NumericLiteralPropertyName *node){ out << node->id; return false;}void PrettyPretty::endVisit(AST::NumericLiteralPropertyName *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::ArrayMemberExpression *node){ accept(node->base); out << "["; accept(node->expression); out << "]"; return false;}void PrettyPretty::endVisit(AST::ArrayMemberExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::FieldMemberExpression *node){ accept(node->base); out << "." << eng->toString(node->name); return false;}void PrettyPretty::endVisit(AST::FieldMemberExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::NewMemberExpression *node){ out << "new "; accept(node->base); out << "("; accept(node->arguments); out << ")"; return false;}void PrettyPretty::endVisit(AST::NewMemberExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::NewExpression *node){ Q_UNUSED(node); out << "new "; return true;}void PrettyPretty::endVisit(AST::NewExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::CallExpression *node){ accept(node->base); out << "("; accept(node->arguments); out << ")"; return false;}void PrettyPretty::endVisit(AST::CallExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::ArgumentList *node){ accept(node->expression); for (node = node->next; node != 0; node = node->next) { out << ", "; accept(node->expression); } return false;}void PrettyPretty::endVisit(AST::ArgumentList *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::PostIncrementExpression *node){ Q_UNUSED(node); return true;}void PrettyPretty::endVisit(AST::PostIncrementExpression *node){ Q_UNUSED(node); out << "++";}bool PrettyPretty::visit(AST::PostDecrementExpression *node){ Q_UNUSED(node); return true;}void PrettyPretty::endVisit(AST::PostDecrementExpression *node){ Q_UNUSED(node); out << "--";}bool PrettyPretty::visit(AST::DeleteExpression *node){ Q_UNUSED(node); out << "delete "; return true;}void PrettyPretty::endVisit(AST::DeleteExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::VoidExpression *node){ Q_UNUSED(node); qDebug("*** voidexpression"); return true;}void PrettyPretty::endVisit(AST::VoidExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::TypeOfExpression *node){ Q_UNUSED(node); out << "typeof "; return true;}void PrettyPretty::endVisit(AST::TypeOfExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::PreIncrementExpression *node){ Q_UNUSED(node); out << "++"; return true;}void PrettyPretty::endVisit(AST::PreIncrementExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::PreDecrementExpression *node){ Q_UNUSED(node); out << "--"; return true;}void PrettyPretty::endVisit(AST::PreDecrementExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::UnaryPlusExpression *node){ Q_UNUSED(node); out << "+"; return true;}void PrettyPretty::endVisit(AST::UnaryPlusExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::UnaryMinusExpression *node){ Q_UNUSED(node); out << "-"; return true;}void PrettyPretty::endVisit(AST::UnaryMinusExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::TildeExpression *node){ Q_UNUSED(node); out << "~"; return true;}void PrettyPretty::endVisit(AST::TildeExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::NotExpression *node){ Q_UNUSED(node); out << "!"; return true;}void PrettyPretty::endVisit(AST::NotExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::BinaryExpression *node){ accept(node->left); QString s; switch (node->op) { case QSOperator::Add: s = QLatin1String("+"); break; case QSOperator::And: s = QLatin1String("&&"); break; case QSOperator::InplaceAnd: s = QLatin1String("&="); break; case QSOperator::Assign: s = QLatin1String("="); break; case QSOperator::BitAnd: s = QLatin1String("&"); break; case QSOperator::BitOr: s = QLatin1String("|"); break; case QSOperator::BitXor: s = QLatin1String("^"); break; case QSOperator::InplaceSub: s = QLatin1String("-="); break; case QSOperator::Div: s = QLatin1String("/"); break; case QSOperator::InplaceDiv: s = QLatin1String("/="); break; case QSOperator::Equal: s = QLatin1String("=="); break; case QSOperator::Ge: s = QLatin1String(">="); break; case QSOperator::Gt: s = QLatin1String(">"); break; case QSOperator::In: s = QLatin1String("in"); break; case QSOperator::InplaceAdd: s = QLatin1String("+="); break; case QSOperator::InstanceOf: s = QLatin1String("instanceof"); break; case QSOperator::Le: s = QLatin1String("<="); break; case QSOperator::LShift: s = QLatin1String("<<"); break; case QSOperator::InplaceLeftShift: s = QLatin1String("<<="); break; case QSOperator::Lt: s = QLatin1String("<"); break; case QSOperator::Mod: s = QLatin1String("%"); break; case QSOperator::InplaceMod: s = QLatin1String("%="); break; case QSOperator::Mul: s = QLatin1String("*"); break; case QSOperator::InplaceMul: s = QLatin1String("*="); break; case QSOperator::NotEqual: s = QLatin1String("!="); break; case QSOperator::Or: s = QLatin1String("||"); break; case QSOperator::InplaceOr: s = QLatin1String("|="); break; case QSOperator::RShift: s = QLatin1String(">>"); break; case QSOperator::InplaceRightShift: s = QLatin1String(">>="); break; case QSOperator::StrictEqual: s = QLatin1String("==="); break; case QSOperator::StrictNotEqual: s = QLatin1String("!=="); break; case QSOperator::Sub: s = QLatin1String("-"); break; case QSOperator::URShift: s = QLatin1String(">>>"); break; case QSOperator::InplaceURightShift: s = QLatin1String(">>>="); break; case QSOperator::InplaceXor: s = QLatin1String("^="); break; default: Q_ASSERT (0); } out << " " << s << " "; accept(node->right); return false;}void PrettyPretty::endVisit(AST::BinaryExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::ConditionalExpression *node){ accept(node->expression); out << " ? "; accept(node->ok); out << " : "; accept(node->ko); return false;}void PrettyPretty::endVisit(AST::ConditionalExpression *node){ Q_UNUSED(node);}bool PrettyPretty::visit(AST::Expression *node){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -