178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_PRETTYPRINTER_H_
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_PRETTYPRINTER_H_
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h"
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
1271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass PrettyPrinter: public AstVisitor {
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  explicit PrettyPrinter(Zone* zone);
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~PrettyPrinter();
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // The following routines print a node into a string.
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // The result string is alive as long as the PrettyPrinter is alive.
230b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  const char* Print(AstNode* node);
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* PrintExpression(FunctionLiteral* program);
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* PrintProgram(FunctionLiteral* program);
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  void Print(const char* format, ...);
289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Print a node to stdout.
306d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  static void PrintOut(Zone* zone, AstNode* node);
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Individual nodes
339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#define DECLARE_VISIT(type) virtual void Visit##type(type* node);
349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  AST_NODE_LIST(DECLARE_VISIT)
359d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#undef DECLARE_VISIT
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  char* output_;  // output string buffer
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int size_;  // output_ size
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int pos_;  // current printing position
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected:
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Init();
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* Output() const { return output_; }
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual void PrintStatements(ZoneList<Statement*>* statements);
4708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  void PrintLabels(ZoneList<const AstRawString*>* labels);
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual void PrintArguments(ZoneList<Expression*>* arguments);
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintLiteral(Handle<Object> value, bool quote);
5008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  void PrintLiteral(const AstRawString* value, bool quote);
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintParameters(Scope* scope);
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintDeclarations(ZoneList<Declaration*>* declarations);
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintFunctionLiteral(FunctionLiteral* function);
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintCaseClause(CaseClause* clause);
55a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  void PrintObjectLiteralProperty(ObjectLiteralProperty* property);
56a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
57a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Prints the AST structure
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass AstPrinter: public PrettyPrinter {
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
646d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  explicit AstPrinter(Zone* zone);
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~AstPrinter();
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* PrintProgram(FunctionLiteral* program);
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Individual nodes
709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#define DECLARE_VISIT(type) virtual void Visit##type(type* node);
719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  AST_NODE_LIST(DECLARE_VISIT)
729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#undef DECLARE_VISIT
73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class IndentedScope;
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintIndented(const char* txt);
770b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  void PrintIndentedVisit(const char* s, AstNode* node);
7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintStatements(ZoneList<Statement*>* statements);
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintDeclarations(ZoneList<Declaration*>* declarations);
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintParameters(Scope* scope);
8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintArguments(ZoneList<Expression*>* arguments);
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintCaseClause(CaseClause* clause);
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote);
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void PrintLiteralWithModeIndented(const char* info,
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                    Variable* var,
8744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                                    Handle<Object> value);
8808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  void PrintLabelsIndented(ZoneList<const AstRawString*>* labels);
8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void inc_indent() { indent_++; }
9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void dec_indent() { indent_--; }
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int indent_;
9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // DEBUG
9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_PRETTYPRINTER_H_
101