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#include "src/base/compiler-specific.h"
11#include "src/string-builder.h"
12
13namespace v8 {
14namespace internal {
15
16class CallPrinter final : public AstVisitor<CallPrinter> {
17 public:
18  explicit CallPrinter(Isolate* isolate, bool is_builtin);
19
20  // The following routine prints the node with position |position| into a
21  // string.
22  Handle<String> Print(FunctionLiteral* program, int position);
23
24// Individual nodes
25#define DECLARE_VISIT(type) void Visit##type(type* node);
26  AST_NODE_LIST(DECLARE_VISIT)
27#undef DECLARE_VISIT
28
29 private:
30  void Print(const char* str);
31  void Print(Handle<String> str);
32
33  void Find(AstNode* node, bool print = false);
34
35  Isolate* isolate_;
36  int num_prints_;
37  IncrementalStringBuilder builder_;
38  int position_;  // position of ast node to print
39  bool found_;
40  bool done_;
41  bool is_builtin_;
42
43  DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
44
45 protected:
46  void PrintLiteral(Handle<Object> value, bool quote);
47  void PrintLiteral(const AstRawString* value, bool quote);
48  void FindStatements(ZoneList<Statement*>* statements);
49  void FindArguments(ZoneList<Expression*>* arguments);
50};
51
52
53#ifdef DEBUG
54
55class AstPrinter final : public AstVisitor<AstPrinter> {
56 public:
57  explicit AstPrinter(Isolate* isolate);
58  ~AstPrinter();
59
60  // The following routines print a node into a string.
61  // The result string is alive as long as the AstPrinter is alive.
62  const char* Print(AstNode* node);
63  const char* PrintProgram(FunctionLiteral* program);
64
65  void PRINTF_FORMAT(2, 3) 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);
72  AST_NODE_LIST(DECLARE_VISIT)
73#undef DECLARE_VISIT
74
75 private:
76  friend class IndentedScope;
77
78  void Init();
79
80  void PrintLabels(ZoneList<const AstRawString*>* labels);
81  void PrintLiteral(const AstRawString* value, bool quote);
82  void PrintLiteral(Handle<Object> value, bool quote);
83  void PrintIndented(const char* txt);
84  void PrintIndentedVisit(const char* s, AstNode* node);
85
86  void PrintStatements(ZoneList<Statement*>* statements);
87  void PrintDeclarations(Declaration::List* declarations);
88  void PrintParameters(DeclarationScope* scope);
89  void PrintArguments(ZoneList<Expression*>* arguments);
90  void PrintCaseClause(CaseClause* clause);
91  void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote);
92  void PrintLiteralWithModeIndented(const char* info,
93                                    Variable* var,
94                                    Handle<Object> value);
95  void PrintLabelsIndented(ZoneList<const AstRawString*>* labels);
96  void PrintObjectProperties(ZoneList<ObjectLiteral::Property*>* properties);
97  void PrintClassProperties(ZoneList<ClassLiteral::Property*>* properties);
98  void PrintTryStatement(TryStatement* try_statement);
99
100  void inc_indent() { indent_++; }
101  void dec_indent() { indent_--; }
102
103  DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
104
105  Isolate* isolate_;
106  char* output_;  // output string buffer
107  int size_;      // output_ size
108  int pos_;       // current printing position
109  int indent_;
110};
111
112#endif  // DEBUG
113
114}  // namespace internal
115}  // namespace v8
116
117#endif  // V8_AST_PRETTYPRINTER_H_
118