• 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_AST_PRETTYPRINTER_H_
6 #define V8_AST_PRETTYPRINTER_H_
7 
8 #include "src/allocation.h"
9 #include "src/ast/ast.h"
10 
11 namespace v8 {
12 namespace internal {
13 
14 class CallPrinter : public AstVisitor {
15  public:
16   explicit CallPrinter(Isolate* isolate, bool is_builtin);
17   virtual ~CallPrinter();
18 
19   // The following routine prints the node with position |position| into a
20   // string. The result string is alive as long as the CallPrinter is alive.
21   const char* Print(FunctionLiteral* program, int position);
22 
23   void Print(const char* format, ...);
24 
25   void Find(AstNode* node, bool print = false);
26 
27 // Individual nodes
28 #define DECLARE_VISIT(type) void Visit##type(type* node) override;
29   AST_NODE_LIST(DECLARE_VISIT)
30 #undef DECLARE_VISIT
31 
32  private:
33   void Init();
34   char* output_;  // output string buffer
35   int size_;      // output_ size
36   int pos_;       // current printing position
37   int position_;  // position of ast node to print
38   bool found_;
39   bool done_;
40   bool is_builtin_;
41 
42   DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
43 
44  protected:
45   void PrintLiteral(Object* value, bool quote);
46   void PrintLiteral(const AstRawString* value, bool quote);
47   void FindStatements(ZoneList<Statement*>* statements);
48   void FindArguments(ZoneList<Expression*>* arguments);
49 };
50 
51 
52 #ifdef DEBUG
53 
54 class PrettyPrinter: public AstVisitor {
55  public:
56   explicit PrettyPrinter(Isolate* isolate);
57   virtual ~PrettyPrinter();
58 
59   // The following routines print a node into a string.
60   // The result string is alive as long as the PrettyPrinter is alive.
61   const char* Print(AstNode* node);
62   const char* PrintExpression(FunctionLiteral* program);
63   const char* PrintProgram(FunctionLiteral* program);
64 
65   void Print(const char* format, ...);
66 
67   // Print a node to stdout.
68   static void PrintOut(Isolate* isolate, AstNode* node);
69 
70   // Individual nodes
71 #define DECLARE_VISIT(type) void Visit##type(type* node) override;
72   AST_NODE_LIST(DECLARE_VISIT)
73 #undef DECLARE_VISIT
74 
75  private:
76   char* output_;  // output string buffer
77   int size_;  // output_ size
78   int pos_;  // current printing position
79 
80  protected:
81   void Init();
Output()82   const char* Output() const { return output_; }
83 
84   virtual void PrintStatements(ZoneList<Statement*>* statements);
85   void PrintLabels(ZoneList<const AstRawString*>* labels);
86   virtual void PrintArguments(ZoneList<Expression*>* arguments);
87   void PrintLiteral(Handle<Object> value, bool quote);
88   void PrintLiteral(const AstRawString* value, bool quote);
89   void PrintParameters(Scope* scope);
90   void PrintDeclarations(ZoneList<Declaration*>* declarations);
91   void PrintFunctionLiteral(FunctionLiteral* function);
92   void PrintCaseClause(CaseClause* clause);
93   void PrintObjectLiteralProperty(ObjectLiteralProperty* property);
94 
95   DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
96 };
97 
98 
99 // Prints the AST structure
100 class AstPrinter: public PrettyPrinter {
101  public:
102   explicit AstPrinter(Isolate* isolate);
103   virtual ~AstPrinter();
104 
105   const char* PrintProgram(FunctionLiteral* program);
106 
107   // Individual nodes
108 #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
109   AST_NODE_LIST(DECLARE_VISIT)
110 #undef DECLARE_VISIT
111 
112  private:
113   friend class IndentedScope;
114   void PrintIndented(const char* txt);
115   void PrintIndentedVisit(const char* s, AstNode* node);
116 
117   void PrintStatements(ZoneList<Statement*>* statements);
118   void PrintDeclarations(ZoneList<Declaration*>* declarations);
119   void PrintParameters(Scope* scope);
120   void PrintArguments(ZoneList<Expression*>* arguments);
121   void PrintCaseClause(CaseClause* clause);
122   void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote);
123   void PrintLiteralWithModeIndented(const char* info,
124                                     Variable* var,
125                                     Handle<Object> value);
126   void PrintLabelsIndented(ZoneList<const AstRawString*>* labels);
127   void PrintProperties(ZoneList<ObjectLiteral::Property*>* properties);
128 
inc_indent()129   void inc_indent() { indent_++; }
dec_indent()130   void dec_indent() { indent_--; }
131 
132   int indent_;
133 };
134 
135 #endif  // DEBUG
136 
137 }  // namespace internal
138 }  // namespace v8
139 
140 #endif  // V8_AST_PRETTYPRINTER_H_
141