⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nodes2string.cpp

📁 khtml在gtk上的移植版本
💻 CPP
字号:
// -*- c-basic-offset: 2 -*-/* *  This file is part of the KDE libraries *  Copyright (C) 2002 Harri Porten (porten@kde.org) *  Copyright (C) 2003 Apple Computer, Inc. * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Library General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. * *  This library 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 *  Library General Public License for more details. * *  You should have received a copy of the GNU Library General Public License *  along with this library; see the file COPYING.LIB.  If not, write to *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330, *  Boston, MA 02111-1307, USA. * */#include "nodes.h"namespace KJS {  /**   * A simple text streaming class that helps with code indentation.   */  class SourceStream {  public:    enum Format {      Endl, Indent, Unindent    };    UString toString() const { return str; }    SourceStream& operator<<(const Identifier &);    SourceStream& operator<<(const UString &);    SourceStream& operator<<(const char *);    SourceStream& operator<<(char);    SourceStream& operator<<(Format f);    SourceStream& operator<<(const Node *);  private:    UString str; /* TODO: buffer */    UString ind;  };};using namespace KJS;SourceStream& SourceStream::operator<<(char c){  str += UString(c);  return *this;}SourceStream& SourceStream::operator<<(const char *s){  str += UString(s);  return *this;}SourceStream& SourceStream::operator<<(const UString &s){  str += s;  return *this;}SourceStream& SourceStream::operator<<(const Identifier &s){  str += s.ustring();  return *this;}SourceStream& SourceStream::operator<<(const Node *n){  if (n)    n->streamTo(*this);  return *this;}SourceStream& SourceStream::operator<<(Format f){  switch (f) {    case Endl:      str += "\n" + ind;      break;    case Indent:      ind += "  ";      break;    case Unindent:      ind = ind.substr(0, ind.size() - 2);      break;  }  return *this;}UString Node::toString() const{  SourceStream str;  streamTo(str);  return str.toString();}void NullNode::streamTo(SourceStream &s) const { s << "null"; }void BooleanNode::streamTo(SourceStream &s) const{  s << (value ? "true" : "false");}void NumberNode::streamTo(SourceStream &s) const { s << UString::from(value); }void StringNode::streamTo(SourceStream &s) const{  s << '"' << value << '"';}void RegExpNode::streamTo(SourceStream &s) const { s <<  pattern; }void ThisNode::streamTo(SourceStream &s) const { s << "this"; }void ResolveNode::streamTo(SourceStream &s) const { s << ident; }void ElementNode::streamTo(SourceStream &s) const{  for (const ElementNode *n = this; n; n = n->list) {    for (int i = 0; i < n->elision; i++)      s << ",";    s << n->node;  }}void ArrayNode::streamTo(SourceStream &s) const{  s << "[" << element;  for (int i = 0; i < elision; i++)    s << ",";  s << "]";}void ObjectLiteralNode::streamTo(SourceStream &s) const{  if (list)    s << "{ " << list << " }";  else    s << "{ }";}void PropertyValueNode::streamTo(SourceStream &s) const{  for (const PropertyValueNode *n = this; n; n = n->list)    s << n->name << ": " << n->assign;}void PropertyNode::streamTo(SourceStream &s) const{  if (str.isNull())    s << UString::from(numeric);  else    s << str;}void AccessorNode1::streamTo(SourceStream &s) const{  s << expr1 << "[" << expr2 << "]";}void AccessorNode2::streamTo(SourceStream &s) const{  s << expr << "." << ident;}void ArgumentListNode::streamTo(SourceStream &s) const{  s << expr;  for (ArgumentListNode *n = list; n; n = n->list)    s << ", " << n->expr;}void ArgumentsNode::streamTo(SourceStream &s) const{  s << "(" << list << ")";}void NewExprNode::streamTo(SourceStream &s) const{  s << "new " << expr << args;}void FunctionCallNode::streamTo(SourceStream &s) const{  s << expr << args;}void PostfixNode::streamTo(SourceStream &s) const{  s << expr;  if (oper == OpPlusPlus)    s << "++";  else    s << "--";}void DeleteNode::streamTo(SourceStream &s) const{  s << "delete " << expr;}void VoidNode::streamTo(SourceStream &s) const{  s << "void " << expr;}void TypeOfNode::streamTo(SourceStream &s) const{  s << "typeof " << expr;}void PrefixNode::streamTo(SourceStream &s) const{  s << expr << (oper == OpPlusPlus ? "++" : "--");}void UnaryPlusNode::streamTo(SourceStream &s) const{  s << "+" << expr;}void NegateNode::streamTo(SourceStream &s) const{  s << "-" << expr;}void BitwiseNotNode::streamTo(SourceStream &s) const{  s << "~" << expr;}void LogicalNotNode::streamTo(SourceStream &s) const{  s << "!" << expr;}void MultNode::streamTo(SourceStream &s) const{  s << term1 << oper << term2;}void AddNode::streamTo(SourceStream &s) const{  s << term1 << oper << term2;}void ShiftNode::streamTo(SourceStream &s) const{  s << term1;  if (oper == OpLShift)    s << "<<";  else if (oper == OpRShift)    s << ">>";  else    s << ">>>";  s << term2;}void RelationalNode::streamTo(SourceStream &s) const{  s << expr1;  switch (oper) {  case OpLess:    s << " < ";    break;  case OpGreater:    s << " > ";    break;  case OpLessEq:    s << " <= ";    break;  case OpGreaterEq:    s << " >= ";    break;  case OpInstanceOf:    s << " instanceof ";    break;  case OpIn:    s << " in ";    break;  default:    ;  }  s << expr2;}void EqualNode::streamTo(SourceStream &s) const{  s << expr1; switch (oper) { case OpEqEq:   s << " == ";   break; case OpNotEq:   s << " != ";   break; case OpStrEq:   s << " === ";   break; case OpStrNEq:   s << " !== ";   break; default:   ; }  s << expr2;}void BitOperNode::streamTo(SourceStream &s) const{  s << expr1;  if (oper == OpBitAnd)    s << " & ";  else if (oper == OpBitXOr)    s << " ^ ";  else    s << " | ";  s << expr2;}void BinaryLogicalNode::streamTo(SourceStream &s) const{  s << expr1 << (oper == OpAnd ? " && " : " || ") << expr2;}void ConditionalNode::streamTo(SourceStream &s) const{  s << logical << " ? " << expr1 << " : " << expr2;}void AssignNode::streamTo(SourceStream &s) const{  s << left;  const char *opStr;  switch (oper) {  case OpEqual:    opStr = " = ";    break;  case OpMultEq:    opStr = " *= ";    break;  case OpDivEq:    opStr = " /= ";    break;  case OpPlusEq:    opStr = " += ";    break;  case OpMinusEq:    opStr = " -= ";    break;  case OpLShift:    opStr = " <<= ";    break;  case OpRShift:    opStr = " >>= ";    break;  case OpURShift:    opStr = " >>= ";    break;  case OpAndEq:    opStr = " &= ";    break;  case OpXOrEq:    opStr = " ^= ";    break;  case OpOrEq:    opStr = " |= ";    break;  case OpModEq:    opStr = " %= ";    break;  default:    opStr = " ?= ";  }  s << opStr << expr;}void CommaNode::streamTo(SourceStream &s) const{  s << expr1 << ", " << expr2;}void StatListNode::streamTo(SourceStream &s) const{  for (const StatListNode *n = this; n; n = n->list)    s << n->statement;}void AssignExprNode::streamTo(SourceStream &s) const{  s << " = " << expr;}void VarDeclNode::streamTo(SourceStream &s) const{  s << ident << init;}void VarDeclListNode::streamTo(SourceStream &s) const{  s << var;  for (VarDeclListNode *n = list; n; n = n->list)    s << ", " << n->var;}void VarStatementNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "var " << list << ";";}void BlockNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "{" << SourceStream::Indent    << source << SourceStream::Unindent << SourceStream::Endl << "}";}void EmptyStatementNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << ";";}void ExprStatementNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << expr << ";";}void IfNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "if (" << expr << ")" << SourceStream::Indent    << statement1 << SourceStream::Unindent;  if (statement2)    s << SourceStream::Endl << "else" << SourceStream::Indent      << statement2 << SourceStream::Unindent;}void DoWhileNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "do " << SourceStream::Indent    << statement << SourceStream::Unindent << SourceStream::Endl    << "while (" << expr << ");";}void WhileNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "while (" << expr << ")" << SourceStream::Indent    << statement << SourceStream::Unindent;}void ForNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "for ("    << expr1  // TODO: doesn't properly do "var i = 0"    << "; " << expr2    << "; " << expr3    << ")" << SourceStream::Indent << statement << SourceStream::Unindent;}void ForInNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "for (";  if (varDecl)    s << "var " << varDecl;  if (init)    s << " = " << init;  s << " in " << expr << ")" << SourceStream::Indent    << statement << SourceStream::Unindent;}void ContinueNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "continue";  if (!ident.isNull())    s << " " << ident;  s << ";";}void BreakNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "break";  if (!ident.isNull())    s << " " << ident;  s << ";";}void ReturnNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "return";  if (value)    s << " " << value;  s << ";";}void WithNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "with (" << expr << ") "    << statement;}void CaseClauseNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl;  if (expr)    s << "case " << expr;  else    s << "default";  s << ":" << SourceStream::Indent;  if (list)    s << list;  s << SourceStream::Unindent;}void ClauseListNode::streamTo(SourceStream &s) const{  for (const ClauseListNode *n = this; n; n = n->next())    s << n->clause();}void CaseBlockNode::streamTo(SourceStream &s) const{  for (const ClauseListNode *n = list1; n; n = n->next())    s << n->clause();  if (def)    s << def;  for (const ClauseListNode *n = list2; n; n = n->next())    s << n->clause();}void SwitchNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "switch (" << expr << ") {"    << SourceStream::Indent << block << SourceStream::Unindent    << SourceStream::Endl << "}";}void LabelNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << label << ":" << SourceStream::Indent    << statement << SourceStream::Unindent;}void ThrowNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "throw " << expr << ";";}void CatchNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "catch (" << ident << ")" << block;}void FinallyNode::streamTo(SourceStream &s) const{  s << SourceStream::Endl << "finally " << block;}void TryNode::streamTo(SourceStream &s) const{  s << "try " << block    << _catch    << _final;}void ParameterNode::streamTo(SourceStream &s) const{  s << id;  for (ParameterNode *n = next; n; n = n->next)    s << ", " << n->id;}void FuncDeclNode::streamTo(SourceStream &s) const {  s << "function " << ident << "(";  if (param)    s << param;  s << ")" << body;}void FuncExprNode::streamTo(SourceStream &s) const{  s << "function " << "("    << param    << ")" << body;}void SourceElementsNode::streamTo(SourceStream &s) const{  for (const SourceElementsNode *n = this; n; n = n->elements)    s << n->element;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -