Home | History | Annotate | Download | only in src
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_PRETTYPRINTER_H_
      6 #define V8_PRETTYPRINTER_H_
      7 
      8 #include "src/allocation.h"
      9 #include "src/ast.h"
     10 
     11 namespace v8 {
     12 namespace internal {
     13 
     14 #ifdef DEBUG
     15 
     16 class PrettyPrinter: public AstVisitor {
     17  public:
     18   explicit PrettyPrinter(Zone* zone);
     19   virtual ~PrettyPrinter();
     20 
     21   // The following routines print a node into a string.
     22   // The result string is alive as long as the PrettyPrinter is alive.
     23   const char* Print(AstNode* node);
     24   const char* PrintExpression(FunctionLiteral* program);
     25   const char* PrintProgram(FunctionLiteral* program);
     26 
     27   void Print(const char* format, ...);
     28 
     29   // Print a node to stdout.
     30   static void PrintOut(Zone* zone, AstNode* node);
     31 
     32   // Individual nodes
     33 #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
     34   AST_NODE_LIST(DECLARE_VISIT)
     35 #undef DECLARE_VISIT
     36 
     37  private:
     38   char* output_;  // output string buffer
     39   int size_;  // output_ size
     40   int pos_;  // current printing position
     41 
     42  protected:
     43   void Init();
     44   const char* Output() const { return output_; }
     45 
     46   virtual void PrintStatements(ZoneList<Statement*>* statements);
     47   void PrintLabels(ZoneStringList* labels);
     48   virtual void PrintArguments(ZoneList<Expression*>* arguments);
     49   void PrintLiteral(Handle<Object> value, bool quote);
     50   void PrintParameters(Scope* scope);
     51   void PrintDeclarations(ZoneList<Declaration*>* declarations);
     52   void PrintFunctionLiteral(FunctionLiteral* function);
     53   void PrintCaseClause(CaseClause* clause);
     54 
     55   DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
     56 };
     57 
     58 
     59 // Prints the AST structure
     60 class AstPrinter: public PrettyPrinter {
     61  public:
     62   explicit AstPrinter(Zone* zone);
     63   virtual ~AstPrinter();
     64 
     65   const char* PrintProgram(FunctionLiteral* program);
     66 
     67   // Individual nodes
     68 #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
     69   AST_NODE_LIST(DECLARE_VISIT)
     70 #undef DECLARE_VISIT
     71 
     72  private:
     73   friend class IndentedScope;
     74   void PrintIndented(const char* txt);
     75   void PrintIndentedVisit(const char* s, AstNode* node);
     76 
     77   void PrintStatements(ZoneList<Statement*>* statements);
     78   void PrintDeclarations(ZoneList<Declaration*>* declarations);
     79   void PrintParameters(Scope* scope);
     80   void PrintArguments(ZoneList<Expression*>* arguments);
     81   void PrintCaseClause(CaseClause* clause);
     82   void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote);
     83   void PrintLiteralWithModeIndented(const char* info,
     84                                     Variable* var,
     85                                     Handle<Object> value);
     86   void PrintLabelsIndented(ZoneStringList* labels);
     87 
     88   void inc_indent() { indent_++; }
     89   void dec_indent() { indent_--; }
     90 
     91   int indent_;
     92 };
     93 
     94 #endif  // DEBUG
     95 
     96 } }  // namespace v8::internal
     97 
     98 #endif  // V8_PRETTYPRINTER_H_
     99