Home | History | Annotate | Download | only in ast
      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 
     13 namespace v8 {
     14 namespace internal {
     15 
     16 class CallPrinter final : public AstVisitor<CallPrinter> {
     17  public:
     18   explicit CallPrinter(Isolate* isolate, bool is_user_js);
     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_user_js_;
     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 
     55 class 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