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
11namespace v8 {
12namespace internal {
13
14#ifdef DEBUG
15
16class 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(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
62class 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
90  void inc_indent() { 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