[presubmit] Enable readability/namespace linter checking.
[platform/upstream/v8.git] / src / prettyprinter.h
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 class CallPrinter : public AstVisitor {
15  public:
16   CallPrinter(Isolate* isolate, Zone* zone);
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
41   DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
42
43  protected:
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);
48 };
49
50
51 #ifdef DEBUG
52
53 class PrettyPrinter: public AstVisitor {
54  public:
55   PrettyPrinter(Isolate* isolate, Zone* zone);
56   virtual ~PrettyPrinter();
57
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);
63
64   void Print(const char* format, ...);
65
66   // Print a node to stdout.
67   static void PrintOut(Isolate* isolate, Zone* zone, AstNode* node);
68
69   // Individual nodes
70 #define DECLARE_VISIT(type) void Visit##type(type* node) override;
71   AST_NODE_LIST(DECLARE_VISIT)
72 #undef DECLARE_VISIT
73
74  private:
75   char* output_;  // output string buffer
76   int size_;  // output_ size
77   int pos_;  // current printing position
78
79  protected:
80   void Init();
81   const char* Output() const { return output_; }
82
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);
93
94   DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
95 };
96
97
98 // Prints the AST structure
99 class AstPrinter: public PrettyPrinter {
100  public:
101   AstPrinter(Isolate* isolate, Zone* zone);
102   virtual ~AstPrinter();
103
104   const char* PrintProgram(FunctionLiteral* program);
105
106   // Individual nodes
107 #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
108   AST_NODE_LIST(DECLARE_VISIT)
109 #undef DECLARE_VISIT
110
111  private:
112   friend class IndentedScope;
113   void PrintIndented(const char* txt);
114   void PrintIndentedVisit(const char* s, AstNode* node);
115
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,
123                                     Variable* var,
124                                     Handle<Object> value);
125   void PrintLabelsIndented(ZoneList<const AstRawString*>* labels);
126   void PrintProperties(ZoneList<ObjectLiteral::Property*>* properties);
127
128   void inc_indent() { indent_++; }
129   void dec_indent() { indent_--; }
130
131   int indent_;
132 };
133
134 #endif  // DEBUG
135
136 }  // namespace internal
137 }  // namespace v8
138
139 #endif  // V8_PRETTYPRINTER_H_