• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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();
Output()44    const char* Output() const { return output_; }
45  
46    virtual void PrintStatements(ZoneList<Statement*>* statements);
47    void PrintLabels(ZoneList<const AstRawString*>* labels);
48    virtual void PrintArguments(ZoneList<Expression*>* arguments);
49    void PrintLiteral(Handle<Object> value, bool quote);
50    void PrintLiteral(const AstRawString* value, bool quote);
51    void PrintParameters(Scope* scope);
52    void PrintDeclarations(ZoneList<Declaration*>* declarations);
53    void PrintFunctionLiteral(FunctionLiteral* function);
54    void PrintCaseClause(CaseClause* clause);
55    void PrintObjectLiteralProperty(ObjectLiteralProperty* property);
56  
57    DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
58  };
59  
60  
61  // Prints the AST structure
62  class AstPrinter: public PrettyPrinter {
63   public:
64    explicit AstPrinter(Zone* zone);
65    virtual ~AstPrinter();
66  
67    const char* PrintProgram(FunctionLiteral* program);
68  
69    // Individual nodes
70  #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
71    AST_NODE_LIST(DECLARE_VISIT)
72  #undef DECLARE_VISIT
73  
74   private:
75    friend class IndentedScope;
76    void PrintIndented(const char* txt);
77    void PrintIndentedVisit(const char* s, AstNode* node);
78  
79    void PrintStatements(ZoneList<Statement*>* statements);
80    void PrintDeclarations(ZoneList<Declaration*>* declarations);
81    void PrintParameters(Scope* scope);
82    void PrintArguments(ZoneList<Expression*>* arguments);
83    void PrintCaseClause(CaseClause* clause);
84    void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote);
85    void PrintLiteralWithModeIndented(const char* info,
86                                      Variable* var,
87                                      Handle<Object> value);
88    void PrintLabelsIndented(ZoneList<const AstRawString*>* labels);
89  
inc_indent()90    void inc_indent() { indent_++; }
dec_indent()91    void dec_indent() { indent_--; }
92  
93    int indent_;
94  };
95  
96  #endif  // DEBUG
97  
98  } }  // namespace v8::internal
99  
100  #endif  // V8_PRETTYPRINTER_H_
101