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.
5 #ifndef V8_PRETTYPRINTER_H_
6 #define V8_PRETTYPRINTER_H_
8 #include "src/allocation.h"
14 class CallPrinter : public AstVisitor {
16 CallPrinter(Isolate* isolate, Zone* zone);
17 virtual ~CallPrinter();
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);
23 void Print(const char* format, ...);
25 void Find(AstNode* node, bool print = false);
28 #define DECLARE_VISIT(type) void Visit##type(type* node) override;
29 AST_NODE_LIST(DECLARE_VISIT)
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
41 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
44 void PrintLiteral(Handle<Object> value, bool quote);
45 void PrintLiteral(const AstRawString* value, bool quote);
46 void FindStatements(ZoneList<Statement*>* statements);
47 void FindArguments(ZoneList<Expression*>* arguments);
53 class PrettyPrinter: public AstVisitor {
55 PrettyPrinter(Isolate* isolate, Zone* zone);
56 virtual ~PrettyPrinter();
58 // The following routines print a node into a string.
59 // The result string is alive as long as the PrettyPrinter is alive.
60 const char* Print(AstNode* node);
61 const char* PrintExpression(FunctionLiteral* program);
62 const char* PrintProgram(FunctionLiteral* program);
64 void Print(const char* format, ...);
66 // Print a node to stdout.
67 static void PrintOut(Isolate* isolate, Zone* zone, AstNode* node);
70 #define DECLARE_VISIT(type) void Visit##type(type* node) override;
71 AST_NODE_LIST(DECLARE_VISIT)
75 char* output_; // output string buffer
76 int size_; // output_ size
77 int pos_; // current printing position
81 const char* Output() const { return output_; }
83 virtual void PrintStatements(ZoneList<Statement*>* statements);
84 void PrintLabels(ZoneList<const AstRawString*>* labels);
85 virtual void PrintArguments(ZoneList<Expression*>* arguments);
86 void PrintLiteral(Handle<Object> value, bool quote);
87 void PrintLiteral(const AstRawString* value, bool quote);
88 void PrintParameters(Scope* scope);
89 void PrintDeclarations(ZoneList<Declaration*>* declarations);
90 void PrintFunctionLiteral(FunctionLiteral* function);
91 void PrintCaseClause(CaseClause* clause);
92 void PrintObjectLiteralProperty(ObjectLiteralProperty* property);
94 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
98 // Prints the AST structure
99 class AstPrinter: public PrettyPrinter {
101 AstPrinter(Isolate* isolate, Zone* zone);
102 virtual ~AstPrinter();
104 const char* PrintProgram(FunctionLiteral* program);
107 #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
108 AST_NODE_LIST(DECLARE_VISIT)
112 friend class IndentedScope;
113 void PrintIndented(const char* txt);
114 void PrintIndentedVisit(const char* s, AstNode* node);
116 void PrintStatements(ZoneList<Statement*>* statements);
117 void PrintDeclarations(ZoneList<Declaration*>* declarations);
118 void PrintParameters(Scope* scope);
119 void PrintArguments(ZoneList<Expression*>* arguments);
120 void PrintCaseClause(CaseClause* clause);
121 void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote);
122 void PrintLiteralWithModeIndented(const char* info,
124 Handle<Object> value);
125 void PrintLabelsIndented(ZoneList<const AstRawString*>* labels);
126 void PrintProperties(ZoneList<ObjectLiteral::Property*>* properties);
128 void inc_indent() { indent_++; }
129 void dec_indent() { indent_--; }
136 } // namespace internal
139 #endif // V8_PRETTYPRINTER_H_